GitLab CI/CD 是 GitLab 提供的持续集成服务,用于构建/测试代码并部署到生产环境。它通过 GitLab Runner 这个代理服务来运行我们在 .gitlab-ci.yml 文件中定义的作业。
GitLab Runner 是一个开源项目,用于运行您的作业并将结果发送回 GitLab。它与 GitLab CI 一起使用,GitLab CI 是 GitLab 随附的开源持续集成服务,用于协调作业。
GitLab Runner 有三种类型:
- shared:运行整个GitLab平台上的所有项目的job
- group: 运行特定group下的所有项目的job
- specific: 运行指定的某个项目的job
GitLab Runner 有两种状态:
- locked:无法运行任何job
- paused:不会运行任何新的job,已经running的job会继续执行
我们可以很方便的使用Docker来安装GitLab Runner。只需要运行以下命令:
docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
这将使用Docker运行一个GitLab Runner容器,并挂载两个卷:
- /srv/gitlab-runner/config:GitLab Runner的配置文件
- /var/run/docker.sock:Docker socket,用于Docker Executor
接下来,我们需要注册这个Runner,登陆GitLab,进入组Project的设置页面,选择Runners,展开 runners 后点击 Register a new runner 按钮。选择运行类型为specific Runner,输入Runner的名字,选择它属于的组等选项。点击 Register runner 按钮,得到一个 Runner 的指定 URL 和一个接受的令牌。
复制 Runner 要连接的 URL 和令牌,在 Runner 容器中执行:
gitlab-runner register
输入 URL、令牌和 Runner 的名字,GitLab Runner 就注册成功了!
在 .gitlab-ci.yml 中编写Job后,每次push代码到GitLab,就会触发CI流程,GitLab会调用对应的Runner来执行Job,从而完成编译、测试和部署的自动化流程。
综上,GitLab CI/CD 中 GitLab 本身相当于 Jenkins 的 Master,GitLab Runner 类似 Jenkins 的 Agent,用于实际运行 Job。GitLab CI/CD 的完整流程是:
- 编写 .gitlab-ci.yml 文件,指定触发CI/CD的分支
- Push 代码到上述分支,触发CI/CD流程,生成Pipeline
- GitLab Runner 拉取代码,运行Pipeline中的Job
- Runner 初始化Executor,执行Job,产物挂载到Nginx根目录
- 完成自动化部署
gitlab-runner register
–non-interactive
–url “http://192.168.1.200/”
–registration-token “Bd6gzBK5evJqa9wN99Nf”
–executor “shell”
–description “buildrunner”
–tag-list “build,k8s,go”
–run-untagged=“true”
–locked=“false”
–access-level=“not_protected”
这段代码是用于注册GitLab Runner的命令。我们可以解析如下:
–non-interactive:以非交互方式注册Runner,不提示输入
–url:GitLab实例URL,用于注册该Runner
–registration-token:项目设置页面生成的Runner注册Token
–executor:指定Runner使用的执行器,这里是Shell执行器
–description:为该Runner添加描述,方便管理识别
–tag-list:为该Runner添加标签,后续job可以指定运行在包含某标签的Runner上
–run-untagged:该Runner是否能运行未标记的job
–locked:该Runner是否被锁定,锁定时无法运行job
–access-level:该Runner的访问级别,用于控制可以运行其job的项目
通过这个命令,我们就完成了一个GitLab Runner的注册与配置。注册后,该Runner就可以运行我们GitLab中的CI/CD,执行.gitlab-ci.yml中定义的Job了。
注册Runner有几点需要注意:
- 我们需要有个人访问Token或项目访问Token的权限来注册Runner。
- 选择Executor时,需要考虑我们的作业是基于什么技术实现的。常用的有Shell、Docker等。
- 为Runner添加恰当的标签,这样我们可以灵活控制某类job运行在包含特定标签的Runner上。
- 设置Runner的访问级别,避免该Runner被无关项目误用,影响系统性能。
- Runner一旦注册,就需要定期检查其运行状态,并及时更新维护。
熟练掌握Runner的注册与管理,是使用GitLab CI/CD的基础。我们可以根据实际的应用场景选择不同类型的Runner,给予恰当的权限,高效稳定地运行我们的CI/CD作业
GitLab Runner支持多种类型的Executor,除了shell外,还有:
- docker:使用Docker executor可以运行job在Docker环境中,我们可以指定Docker镜像等。这在需要构建Docker镜像的CI流程中很有用。
- docker-ssh:使用SSH连接到Docker宿主机,在其上使用Docker executor运行job。这在Runner没有Docker环境但需运行Docker job的场景下可用。
- parallels:使用Parallels Desktop虚拟机运行macOS job。
- ssh:使用SSH连接远程主机,在其上运行job。这在Runner服务器上没有执行环境但有其他服务器可用的场景下可用。
- virtualbox:使用VirtualBox虚拟机运行job。
- docker+machine:使用Docker Machine在云平台上启动Docker主机,并在其上使用Docker executor运行job。
- kubernetes:在Kubernetes集群上运行job。
除此之外,还有 carcinoma、docker-ssh+machine、parallels-ssh 等 executor 类型。
所以,总的来说,主要有:
- Shell:最基本的executor,直接在Runner上运行shell命令。
- Docker:使用Docker运行容器化的job。
- 虚拟机:使用Parallels Desktop或VirtualBox等在虚拟机上运行job。
- SSH:通过SSH连接其他服务器运行job。
- Kubernetes:在K8s集群上运行job的Pod。
- 云平台Docker主机:使用Docker Machine在云平台启用Docker主机,然后在其上运行job。
根据我们的使用场景,可以选择最合适的Executor类型。如果仅需要简单的shell脚本或构建语言(Go、Python等),选择Shell Executor即可。如果需要构建Docker镜像或运行容器,选择Docker Executor。需要运行macOS下的job可选择Parallels,需要使用远程主机环境可以选择SSH等。
sudo gitlab-runner start
这条命令是用于启动已注册的GitLab Runner的。
当我们注册好Runner后,它并不会自动启动。我们需要使用此命令手动启动Runner,才能使其开始执行job。
启动Runner有几点需要注意:
- 建议以服务的方式启动Runner,即使用systemctl start gitlab-runner,而不是手动运行启动命令。这可以确保Runner在机器重启后自动启动。
- 如果Runner注册时使用的URL、Token等信息发生变化,需要重注册Runner。否则启动时可能会出现找不到Runner或验证失败的错误。
- 如果 Runner长时间关闭,会有定期清理旧job记录的机制。启动时如果检测到有未完成的旧job,会尝试重新执行,这可能导致出现未预料的情况,需要注意。
- 启动时要确认所需环境都已正确配置,如Docker、虚拟机等。否则后续job执行时会出现各种错误。
- 启动成功后,会在logs目录下生成gitlab-runner.log文件,我们需要定期查看该日志确保Runner运行正常以及job正确执行。
- 可以使用gitlab-runner status命令查看Runner当前状态,包括:
- down:处于关闭状态
- running:正在运行job
- idle:空闲,可以接收并运行新的job
所以,总的来说,启动 GitLab Runner 需要注意: - 建议使用服务的方式启动,确保重启自动启动
- 重要信息发生变化需重注册Runner
- 长时间关闭需注意旧job重启情况
- 确认所需环境都正确配置
- 定期查看日志确保正常运行
- 使用status命令查看当前状态
熟练掌握Runner的启动、停止、状态查看等管理技能,可以更好地保证我们的CI/CD系统稳定运行