简介
CI/CD 代表 **持续集成(Continuous Integration)**和 **持续交付(Continuous Delivery)**的缩写。这是一种软件开发实践,旨在通过自动化和频繁的代码集成、测试以及部署,提高软件开发的效率和质量。
- 持续集成(Continuous Integration,CI): 开发人员在代码仓库中提交代码时,自动触发构建和测试过程。这有助于确保新代码与现有代码协同工作,并且不会引入破坏性的错误。持续集成的目标是频繁地整合代码,以便及早地发现和解决问题。
- 持续交付(Continuous Delivery,CD): 一旦代码通过了持续集成的测试阶段,它可以自动地部署到测试环境或者生产环境中。持续交付的目标是确保软件随时都可以交付给用户,以便快速响应需求变化。
- 持续部署(Continuous Deployment): 这是 CI/CD 中的一种更进一步的实践,它涉及到将通过持续集成和持续交付的代码自动部署到生产环境,从而使新功能和改进可以立即被最终用户使用。
GitLab CI/CD
GitLab CI/CD 是 GitLab 提供的一套集成的持续集成和持续交付工具,用于自动化构建、测试和部署应用程序。它与 GitLab 的源代码仓库集成在一起,为开发团队提供了在代码提交时自动执行各种操作的能力。GitLab CI/CD 可以帮助团队加速软件交付流程,确保代码质量,以及简化部署过程。
主要组成
- Runner: 用于执行构建和部署的运行时环境,可以在不同的操作系统和架构上运行。GitLab Runner 通过与 GitLab 服务器通信,接收作业(Job)并执行相应的操作。
- Pipeline: 定义了一系列的阶段(Stages)和作业(Jobs),用于描述 CI/CD 流水线。流水线中的每个阶段和作业都可以执行一系列的操作,例如构建、测试、部署等。
- Artifact: 构建过程中生成的中间产物,可以被传递到后续的作业中,或者存储供后续的部署使用。
工作原理
- 触发器: CI/CD 流水线的开始通常由代码仓库中的代码提交触发。这可以是通过开发人员直接提交代码,或者是通过合并请求(Merge Request)的方式。当有新的提交或合并请求时,GitLab 触发 CI/CD 流水线的执行。
- 流水线定义: CI/CD 流水线由一系列的阶段(Stages)和作业(Jobs)组成,这些定义在代码仓库中的
.gitlab-ci.yml配置文件中。该文件描述了每个阶段和作业的执行步骤、依赖关系和其他配置。 - Runner 的注册和选择: 在 CI/CD 流水线执行之前,需要有至少一个 GitLab Runner 注册到 GitLab 服务器。Runner 可以是直接运行在物理机器上,也可以是运行在容器中。当 CI/CD 流水线触发时,GitLab 会选择一个可用的 Runner 来执行流水线中的作业。
- 作业执行: 流水线中的作业会按照定义的顺序依次执行。每个作业运行在独立的环境中,可以包括构建、测试、部署等步骤。Runner 负责从代码仓库获取代码,执行作业,并将结果报告回 GitLab 服务器。
- Artifact 的传递: 在作业执行过程中,可以生成一些中间产物(Artifact),比如编译后的二进制文件、打包后的应用程序等。这些 Artifact 可以被 传递给后续的作业,实现流水线中各个阶段之间的数据共享。
- 持续集成(CI)阶段: 在 CI 阶段,通常会包括代码编译、单元测试、代码静态分析等操作。这有助于确保新代码的质量,并及早地发现潜在的问题。
- 持续交付(CD)阶段: 如果 CI 阶段通过,流水线可以进入 CD 阶段。这个阶段可能包括集成测试、部署到预生产环境、自动化测试等。如果一切顺利,代码可以自动地部署到生产环境。
- 通知和报告: 在整个流水线执行完成后,GitLab CI/CD 会生成相应的报告,包括每个作业的执行结果、代码覆盖率、部署状态等。这些报告可以通过 GitLab 的界面查看,也可以通过邮件等方式通知相关的团队成员。
- 自动化和反馈循环: 整个流水线的自动化过程不仅提高了软件交付的效率,还为团队提供了及时的反馈。如果有问题出现,团队可以及时修复,并迅速重新触发 CI/CD 流水线。
GitLab Runner
简介
GitLab Runner 是 GitLab CI/CD 的执行引擎,负责运行 CI/CD 流水线中定义的作业。它可以在不同的环境中运行,包括本地开发机、云服务、容器等。Runner 会与 GitLab 服务器通信,接收作业并执行相关的操作。
主要特点
- 容器化支持: Runner 可以在容器中运行,支持 Docker 和 Kubernetes。这使得它能够轻松地与容器化的应用程序和 微服务架构集成,实现更好的灵活性和资源隔离。
- 并行执行: GitLab Runner 允许并行执行多个作业,提高了整个 CI/CD 流水线的效率。它能够在多个执行环境中同时运行作业,从而更快地完成构建、测试和部署等任务。
- 作业的隔离性: 每个作业都在独立的环境中运行,防止不同作业之间相互影响。这种隔离性确保了 CI/CD 流水线中的安全性和可靠性。
- Artifact 支持: Runner 可以传递构建过程中生成的 Artifact 给后续的作业。这有助于确保流水线中的各个阶段之间能够有效地共享数据和结果。
- 灵活的配置: Runner 的配置可以通过 GitLab CI/CD 的配置文件进行定义。这种灵活性使得 Runner 能够适应不同的项目和流水线需求。
- 自动注册: Runner 支持自动注册到 GitLab 服务器,简化了配置和管理的过程。新的 Runner 可以轻松地加入 CI/CD 系统,而不需要手动的管理步骤。
- 缓存机制: Runner 支持缓存构建过程中的依赖项,减少了构建时间。通过智能地使用缓存,Runner 能够更加高效地执行作业。
主要功能
- 执行作业: 根据 GitLab CI/CD 流水线的定义,Runner 在相应的环境中执行各个作业,例如构建、测试、部署等。
- 环境隔离: 每个作业都运行在独立的环境中,防止不同作业之间的相互影响。
- Artifact 传递: 将产生的 Artifact(例如编译后的二进制文件、打包后的应用程序等)传递给后续的作业,确保流水线中各个阶段的协同工作。R
安装gitlab和runner
创建名为 gitlab.yaml 的yaml格式文件,类似如下:
version: '3.6'
services:
gitlab:
image: 'gitlab/gitlab-ce:latest'
container_name: gitlab_server
restart: always
hostname: 'gitlab.badhydra.com' #主機名,請確認DNS可以正確解析
networks:
gitlab_network:
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.badhydra.com'
# Add any other gitlab.rb configuration here, each on its own line
ports:
- '88:80'
- '4433:443'
- '2205:22'
volumes:
- '/data/app/gitlab/conf:/etc/gitlab' #用于存储应用程序数据
- '/data/app/gitlab/logs:/var/log/gitlab' #用于存储日志
- '/data/app/gitlab/data:/var/opt/gitlab' #用于存储 GitLab 配置文件
shm_size: '128m'
gitlab-runner:
image: 'gitlab/gitlab-runner:latest'
container_name: gitlab_runner
restart: always
networks:
gitlab_network:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /data/app/gitlab_runner/conf/:/etc/gitlab-runner
networks:
gitlab_network:
使用docker compose运行 gitlab_runner.yaml
docker compose -f ./gitlab_runner.yaml up -d
#安裝過程可能需要幾分鐘,可以使用 docker logs 查看
docker logs -f gitlab_server
docker logs -f gitlab_runner
登录gitlab
查看gitlab的密碼
docker exec -it gitlab_server grep 'Password:' /etc/gitlab/initial_root_password
使用浏览器登录gitlab
http://gitlab.xxxx.com #内网可以用IP登录 http://xxxxxx:88
#账号:root
#密码:initial_root_passwd返回的密码
类型和状态
类型
- Shared Runner(共享 Runner):
- 共享 Runner 是由 GitLab 提供并在多个项目之间共享使用的 Runner。这种类型的 Runner 适用于小型团队或者对资源要求较低的项目。
- 简单易用,无需为每个项目单独配 置 Runner。
- Specific Runner(特定 Runner):
- 特定 Runner 是为特定项目配置的 Runner,其资源和配置仅供该项目使用。每个项目可以配置自己的特定 Runner。
- 可以根据项目的需要进行定制化配置,独立的资源隔离。
- Group Runner(组 Runner):
- 组 Runner 是为 GitLab 项目组配置的 Runner,可以在项目组内的所有项目中共享使用。
- 适用于需要在项目组内多个项目之间共享资源的情况。
- Instance-level Runner(实例级别 Runner):
- 实例级别 Runner 是配置在整个 GitLab 实例上的 Runner,可供所有项目使用。
- 可以为整个 GitLab 实例提供全局性的 Runner,适用于大型企业级部署。
状态
- Active(活跃):
- Runner 处于活跃状态表示它可以接收并执行作业。这是正常运行状态。
- Paused(暂停):
- Runner 处于暂停状态表示它不会接收新的作业。可以通过暂停 Runner 来阻止新的作业执行,但不影响已经在运行的作业。
- Locked(锁定):
- Runner 处于锁定状态表示它被管理员手动锁定,不接收新的作业。这可能是由于维护、升级或其他管理操作而导致的。
- Untagged(未标记):
- Runner 未被标记为可接收作业的任何特定标签。Untagged Runner 可以接收任意标签的作业。
- Tagged(已标记):
- Runner 被标记为可接收特定标签的作业。标签通常用于指定某个 作业需要在具有特定特性的 Runner 上执行。
- Online(在线)/Offline(离线):
- Runner 处于在线状态表示它可以接收作业,处于离线状态表示它不能接收作业。这反映了 Runner 是否能够正常连接到 GitLab 服务器。
Runner注册
之前步骤中我们已经安装完gitlab 和 runner了。
步骤:
- 创建 runner
- 注册 runner
创建runner
管理员 > 管理中心 > CI/CD > Runner > 新建实例 Runner

新建一个 runner
关键项简介:
- 标签:build,deploy
- 标签允许在 CI/CD 配置中指定某个作业(Job)应该由带有特定标签的 Runner 执行。这样可以使你的 CI/CD 流水线更加灵活,能够根据不同的需求选择合适的 Runner
- 可以通过标签将 Runner 分类,以便更精细地控制资源的分配和利用。
- 标签可以是任何字符串,但最好遵循一致的命名规范,以方便管理和理解。
- Runner 可以分配多个标签。这样,一个 Runner 可以被多个不同的作业选择,只要这些作业在 CI/CD 配置中指定了相应的标签。
- 标签在创建runner后可以再次更改。

创建成功,显示如下信息,复制保存生成的信息,如下:
#注册命令
gitlab-runner register --url http://gitlab.badhydra.com --token glrt-tSRkBrndoguEn58XVyUR
#runner令牌
glrt-tSRkBrndoguEn58XVyUR
注意:
runner令牌要妥善保存。

注册 Runner
注册shell类型runner
进入gitlab_runner 容器
sudo docker exec -it gitlab_runner /bin/bash
输入获得的注册命令
参数选择:
- name:runner001
- executor:shell
- 配置文件保存位置:/etc/gitlab-runner/config.toml
- executor可以通过更改配置文件更改
gitlab-runner register --url http://gitlab.badhydra.com --token glrt-tSRkBrndoguEn58XVyUR
#交互信息
Runtime platform arch=amd64 os=linux pid=99 revision=f5da3c5a version=16.6.1
Running in system-mode.
Enter the GitLab instance URL (for example, https://gitlab.com/):
[http://gitlab.badhydra.com]:
Verifying runner... is valid runner=tSRkBrndo
Enter a name for the runner. This is stored only in the local config.toml file:
[a8998746904d]: runner001
Enter an executor: docker-autoscaler, docker+machine, custom, docker, parallels, shell, ssh, virtualbox, instance, docker-windows, kubernetes:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"
验证是否注册成功
登录gitlab web页面,查看 Runner 状态,注册成功的话会显示 在线,类似下图:

注册docker类型runner
在gitlab web 页面新建一个runner

进入gitlab_runner 容器
sudo docker exec -it gitlab_runner /bin/bash
输入获得的注册命令
- name:runner002
- executor:docker
- Docker image:docker:stable
gitlab-runner register --url https://gitlab.badhydra.com --token glrt-k6VaimyKUJG4QUqybvQj
#交互信息
Runtime platform arch=amd64 os=linux pid=606 revision=f5da3c5a version=16.6.1
Running in system-mode.
Enter the GitLab instance URL (for example, https://gitlab.com/):
[http://gitlab.badhydra.com]:
Verifying runner... is valid runner=k6VaimyKU
Enter a name for the runner. This is stored only in the local config.toml file:
[a8998746904d]: runner002
Enter an executor: custom, ssh, virtualbox, docker-autoscaler, instance, kubernetes, docker, docker-windows, parallels, shell, docker+machine:
docker
Enter the default Docker image (for example, ruby:2.7):
Enter the default Docker image (for example, ruby:2.7):
docker:stable
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"
更改特权模式
要启动构建和服务容器,需要使用 privileged 模式,可以在runner配置文件config.toml中开启特权模式
sudo vim /data/app/gitlab_runner/conf/config.toml
#修改privileged
[runners.docker]
tls_verify = false
image = "docker:stable"
privileged = true #将false修改成true
非交互式创建 Runner
在完成创建 Runner 容器之后注册,类似以下操作:
sudo gitlab-runner register \
--non-interactive \
--url "https://gitlab.badhydra.com/" \ #地址
--token "$RUNNER_TOKEN" \ #Runner令牌
--executor "shell" \ #执行器为shell
--docker-image alpine:latest \
--description "docker-runner"
或者可以在创建 Runner docker时 同时注册 Runner,类似以下操作:
docker run --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \ #挂载目录
--non-interactive \
--executor "docker" \ #执行器为docker
--docker-image alpine:latest \
--url "https://gitlab.badhydra.com/"\ #地址
--token "$RUNNER_TOKEN" \ #Runner令牌
--description "docker-runner"
说明:
更详细的注册操作可以查看文末的官网文档链接
示例:运行一个流水线
创建CI文件
步骤:
- 在项目根目录创建一个名为:.gitlab-ci.yml 的yml格式的文件,复制以下内容。
- 将添加了 .gitlab-ci.yml 文件的代码 push 到 gitlab 上。
#.gitlab-ci.yml
stages:
- build
- deploy
build:
stage: build
tags:
- build #带有该标签的runner会执行该阶段操作
only:
- test #只构建test这个分支
script:
- echo "npm run build" #输出一句话
deploy:
stage: deploy
tags:
- deploy
only:
- test
script:
- echo "hello deploy"
关键项简介
stages:
- build
- deploy
stages:定义流水线阶段。上述代码分别是build和deploy。流水线会按照这两个阶段的顺序执行,先执行build阶段,然后再执行deploy阶段。
build:
stage: build
tags:
- build
only:
- test #只构建test这个分支
build:定义了build阶段中的一个作业(job),名为build。tags:该作业属于build阶段,使用了build标签,表示只有带有build标签的 Runner 才会执行这个作业。only: - test表示只有在test分支上的提交(push)触发时才会执行这个作业。其他分支上的提交不会触发build阶段的这个作业。script下面的命令echo "npm run build"表示在执行这个作业时运行的命令
注意:
- CI 文件名称必须是:.gitlab-ci.yml
- CI 文件后缀必须是 :yml ,不能是 yaml
查看流水线信息
流水线状态
push代码后,会自动调用runner运行流水线。
登录 gitlab 网页查看流水线状态,如下图,#60 这个编号流水线是刚刚推送的代码,状态是已通过,说明编写的 CI 文件 没问题。
- 状态:
- 已通过,说明运行正常。
- 已失败,说明流水线配置有问题。

流水线图示
点进流水线可以查看到流水线图示信息,如下图:

查看作业信息
作业状态
进入”CI/CD > 作业 “可以查看每个作业的状态信息

作业详细信息
点击对应作业可以查看该作业的详细操作信息

流水线语法
语法检查工具
gitlab自带CI语法检查工具:CI Lint
CI/CD > 流水线 > 右上角有 CI Lint 选项
