在当今快速迭代的软件开发环境中,持续集成与持续部署(CI/CD)已成为提升团队效率的关键。GitLab CI/CD 作为一款内置在 GitLab 中的强大工具,不仅开源免费,还能与容器化部署Kubernetes(K8s)无缝集成,帮助开发者实现从代码提交到生产环境的自动化流水线。本文将从基础概念入手,手把手带你搭建第一条 Pipeline,并深入探讨如何结合 Docker 和 K8s 实现高效的容器编排。

GitLab CI/CD 核心概念解析

GitLab CI/CD 是 GitLab 内置的持续集成与持续部署系统,它支持从计划、编码、测试、部署到监控的完整 DevOps 生命周期。与 Jenkins 等独立 CI/CD 工具不同,GitLab CI/CD 与代码仓库深度整合,减少了配置和维护的复杂性。其核心优势包括:

  • 开源免费:CI/CD 是开源 GitLab 社区版和专有 GitLab 企业版的一部分(极狐)。
  • 易于学习:官方提供详细的学习操作文档,新手也能快速上手。
  • 无缝集成:CI/CD 是 GitLab 的一部分,支持从计划到部署,具有出色的用户体验。
  • 可扩展:可以根据需要添加任意数量的构建节点,轻松应对业务增长。
  • 更快的结果:每个构建可以拆分为多个作业,这些作业可以在多台计算机上并行运行。
  • 针对交付进行了优化:支持多个阶段、手动部署、环境变量和部署环境管理。

在 GitLab CI/CD 中,Pipeline(流水线)是核心执行单元。每个项目通过一个名为 .gitlab-ci.yml 的 YAML 文件来配置流水线。该文件定义了流水线的阶段(Stages)作业(Jobs)

  • Stages:一条流水线可以包含若干个阶段,例如 buildtestdeploy。一个阶段可以包含若干个作业。
  • Job:作业是具体要执行的任务,即命令脚本语句的集合。
  • Runner:Runner 是每个作业的执行节点。每个作业可以根据标签选择不同的构建节点,支持 Docker、Shell、Kubernetes 等多种执行器。

GitLab Runner 安装与配置

GitLab Runner 是一个开源项目,用于运行作业并将结果发送回 GitLab。它与 GitLab CI/CD 结合使用,是 CI/CD 的执行引擎。Runner 支持在 Linux、macOS 和 Windows 上运行,建议使用 Docker 容器化部署以保持环境一致性。注意:GitLab Runner 版本应与 GitLab 版本同步,避免因版本不一致导致兼容性问题。

Runner 分为三种类型:

  • shared:共享类型,运行整个平台项目的作业(gitlab 实例级别)。
  • group:项目组类型,运行特定 group 下的所有项目的作业。
  • specific:项目类型,运行指定项目的作业。

状态方面,Runner 支持 locked(锁定状态,无法运行项目作业)和 paused(暂停状态,暂时不会接受新的作业)。

安装步骤通常包括:安装 Runner 工具 → 使用 gitlab-runner 工具 → 使用 gitlab-runner 工具向 GitLab Server 注册 Runner 节点。

以下是在 CentOS 8 上安装 GitLab Runner 的示例:

## 安装runner
rpm -ivh gitlab-runner-15.0.3-1.x86_64.rpm
## 查看进程
[root@zeyang-nuc-service gitlab-runner]# ps aux  | grep -v grep | grep runner
root      694811  0.1  0.1 152232 35720 ?        Ssl  22:04   0:00 /usr/bin/gitlab-runner run --working-directory /home/gitlab-runner --config /etc/gitlab-runner/config.toml --service gitlab-runner --user gitlab-runner

安装完成后,需要获取 GitLab 地址和 Runner 注册 token(在 GitLab 项目设置 → CI/CD → Runner 中找到)。

注册 Runner 可以使用交互式或非交互模式。交互式运行 gitlab-runner register 命令:

[root@zeyang-nuc-service gitlab_runner]# gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=6688 revision=bbcb5aba version=15.3.0
Running in system-mode.
## 输入GitLab实例的URL
Enter the GitLab instance URL (for example, https://gitlab.com/):
http://192.168.1.200:8076
## 输入Runner注册Token
Enter the registration token:
q_m7Z9S7Bx9Mvq_dCJgR
## 填写该注册Runner的描述信息
Enter a description for the runner:
[zeyang-nuc-service]: build01
## 为该Runner配置一个标签(后续作业可以通过tag指定在哪个runner上面运行构建)
Enter tags for the runner (comma-separated):
build,go,linux,mvn
Enter optional maintenance note for the runner:
Registering runner... succeeded                     runner=q_m7Z9S7
## 为Runner选择一个执行器
Enter an executor: parallels, ssh, virtualbox, docker-ssh+machine, custom, docker, docker-ssh, shell, docker+machine, kubernetes:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

非交互模式注册:

gitlab-runner register \
  --non-interactive \
  --url "http://192.168.1.200:8076/" \
  --registration-token "q_m7Z9S7Bx9Mvq_dCJgR" \
  --executor "shell" \
  --description "buildrunner" \
  --tag-list "build,k8s,go" \
  --run-untagged="true" \
  --access-level="not_protected"

注册成功后,刷新 GitLab 管理页面即可看到新注册的 Runner。

Runner 的配置存储在 /etc/gitlab-runner/config.toml 文件中:

concurrent = 1    						## 可并行运行作业的数量, 0表示不限制;
check_interval = 0						## 检查新作业的时间间隔, 0表示默认 3秒;
[session_server]							## 允许用户与作业进行交互,例如web终端;
  session_timeout = 1800
[[runners]]
  name = "my first runner"            ## Runner名称;
  url = "http://192.168.1.200/"				## GitLab Server地址;
  token = "z6QEqyGpDrvzNgfxLiVh"			## Runner token;
  executor = "shell"									## Runner的执行器;
  [runners.custom_build_dir]					## 允许用户为作业定义自定义构建目录;
  [runners.cache]											## 分布式缓存目录;
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]

高级配置可参考官方文档。常用命令包括启动、停止、查看状态等:

gitlab-runner register  #默认交互模式下使用,非交互模式添加 --non-interactive
gitlab-runner list      #此命令列出了保存在配置文件中的所有运行程序
gitlab-runner verify    #此命令检查注册的runner是否可以连接,但不验证GitLab服务是否正在使用runner。 --delete 删除
gitlab-runner unregister   #该命令使用GitLab取消已注册的runner。
#使用令牌注销
gitlab-runner unregister --url http://gitlab.example.com/ --token t0k3n
#使用名称注销(同名删除第一个)
gitlab-runner unregister --name test-runner
#注销所有
gitlab-runner unregister --all-runners

️ 开发第一条 Pipeline:从 .gitlab-ci.yml 开始

要开启 GitLab CI/CD,首先将代码存储到 GitLab,然后在代码库的默认根目录添加一个 .gitlab-ci.yml 文件。该文件定义了流水线的阶段和运行步骤。你也可以在项目设置中自定义 CI 文件的位置。

以下是一个简单的示例:

stages:
  - build
  - test
  - deploy
build1:
  tags:
    - go
  stage: build
  script:
    - echo "${CI_COMMIT_AUTHOR}  ${CI_COMMIT_BRANCH}  ${CI_PROJECT_ID}"
test1:
  tags:
    - go
  stage: test
  script:
    - echo "Do a test here"
    - echo "For example run a test suite"
test2:
  tags:
    - go
  stage: test
  script:
    - echo "Do another parallel test here"
    - echo "For example run a lint test"
deploy1:
  tags:
    - go
  stage: deploy
  script:
    - echo "Do your deploy here"

创建文件时,需要:1️⃣ 填写文件名 .gitlab-ci.yml;2️⃣ 选择文件类型;3️⃣ 选择一个项目模板(或从零开始)。

提交文件后,流水线会自动触发。在 GitLab 项目的 CI/CD → Pipelines 页面可以查看运行状态和日志。

页面功能说明:

  • 1️⃣ 清除 Runner 的缓存
  • 2️⃣ 进行 CI 文件语法校验
  • 3️⃣ 手动触发运行流水线
  • 4️⃣ 查看各个阶段的运行日志

此外,GitLab 还提供了 Pipeline 编辑器,可以更直观地编辑和预览流水线配置。

Pipeline 开发工具与最佳实践

为了提升开发效率,GitLab 提供了多种 Pipeline 开发工具:

  • 可视化编辑器:通过 Visualize 对 CI 文件中的定义进行可视化展示。
  • 语法检测校验(Lint):检测当前 CI 文件是否存在语法错误,并根据提示进行修正。
  • 作业运行日志:在 Jobs 界面查看每个作业的详细日志。

环境变量 是 Pipeline 中不可或缺的部分。GitLab 提供了丰富的预定义变量,分为几类:

  • 代码类CI_COMMIT_AUTHOR(提交人)、CI_COMMIT_BRANCH(提交分支)、CI_COMMIT_MESSAGECI_COMMIT_REF_NAMECI_COMMIT_SHORT_SHA
  • 作业类CI_JOB_IDCI_JOB_NAMECI_JOB_STAGECI_JOB_URL
  • 流水线类CI_PIPELINE_IDCI_PIPELINE_SOURCECI_PIPELINE_TRIGGEREDCI_PIPELINE_URL

完整的预定义变量列表可参考官方文档。这些变量在容器化部署中尤其有用,例如你可以通过 CI_COMMIT_SHORT_SHA 作为 Docker 镜像的标签,实现版本追踪。

Pipeline 设置 中,你可以导航到 Settings > CI/CD 进行配置:

  • General pipelines:设置管道权限、取消冗余管道、跳过历史部署作业。
  • 自定义 CI 文件:为项目指定非默认路径的 .gitlab-ci.yml
  • 流水线状态标志:支持 Markdown、HTML、AsciiDoc 格式,用于在项目主页展示流水线状态。

实践建议

  • 将 Runner 部署为 Docker 容器,便于管理和扩展。
  • 使用 Kubernetes 执行器 实现作业的动态容器编排,减少资源浪费。
  • 为每个作业设置明确的 tags,确保作业被正确的 Runner 执行。
  • 利用 Docker 镜像缓存 加速构建过程。
[AFFILIATE_SLOT_1]

当你的项目需要更复杂的容器编排时,可以结合 Kubernetes(K8s) 作为 Runner 的执行环境。GitLab Runner 的 Kubernetes 执行器会自动为每个作业创建 Pod,执行完毕后自动销毁,从而实现高效的资源利用。这种模式特别适合微服务架构和容器化部署场景。

总结与进阶方向

本文从 GitLab CI/CD 的核心概念出发,详细讲解了 Runner 的安装配置、第一条 Pipeline 的创建方法以及开发工具的使用。通过结合 DockerKubernetes,你可以构建出高效、可扩展的 CI/CD 流水线。记住,容器编排容器化部署是现代 DevOps 的基石,掌握这些技能将极大提升你的开发效率。建议读者进一步学习 GitLab CI/CD 的 多阶段部署环境管理手动部署 等高级特性,让你的流水线更加健壮。

[AFFILIATE_SLOT_2]

带学员+V helloword00823