简介
自 GitLab 8.0 版本起,GitLab CI 已经无缝集成至 GitLab 平台之中。这意味着,只需在项目中创建一个 .gitlab-ci.yml
文件,并配置一个 Runner,就可以轻松实现持续集成。随着 GitLab 的不断迭代更新,GitLab CI 的功能也日益增强。本文旨在介绍如何利用 GitLab CI 实现项目的持续集成。
相关概念
在深入探讨 GitLab CI 的应用之前,让我们先了解几个与持续集成密切相关的基本概念。
Pipeline
Pipeline 可以理解为一次完整的构建过程,它可以包括多个步骤,比如安装依赖、执行测试、编译代码、部署到测试或生产环境等。无论是代码提交还是合并请求(Merge Request),都有可能触发 Pipeline 的执行,如下图所示:
+------------------+ +----------------+
| | trigger | |
| Commit / MR +---------->+ Pipeline |
| | | |
+------------------+ +----------------+
Stages
Stages 指的是构建过程中的不同阶段。在一次 Pipeline 中,我们可以定义多个 Stages,它们具有以下特征:
- 各个 Stages 按照预设顺序依次执行,前一阶段完成后,下一阶段才开始。
- 只有当所有 Stages 成功完成,整个构建任务(Pipeline)才算成功。
- 若任一阶段失败,则后续阶段不会被执行,整个构建任务(Pipeline)也将被视为失败。
因此,Stages 与 Pipeline 的关系可概括为:
+--------------------------------------------------------+
| |
| Pipeline |
| |
| +-----------+ +------------+ +------------+ |
| | Stage 1 |---->| Stage 2 |----->| Stage 3 | |
| +-----------+ +------------+ +------------+ |
| |
+--------------------------------------------------------+
Jobs
Jobs 则是指在特定 Stage 内执行的具体任务。在同一个 Stage 中,可以定义多个 Jobs,它们的特点是:
- 相同 Stage 下的 Jobs 会并行处理。
- 只有当同一 Stage 内的所有 Jobs 均成功完成,该 Stage 才算成功。
- 若任一 Job 出现失败,该 Stage 即告失败,从而导致整个构建任务(Pipeline)失败。
因此,Jobs 与 Stage 之间的关系可以表示为:
+------------------------------------------+
| |
| Stage 1 |
| |
| +---------+ +---------+ +---------+ |
| | Job 1 | | Job 2 | | Job 3 | |
| +---------+ +---------+ +---------+ |
| |
+------------------------------------------+
配置流程
一旦 Runner 设置完毕,下一步就是在项目根目录下添加 .gitlab-ci.yml
文件。通过此文件,每当有代码提交或合并请求发生时,相应的构建任务将自动启动。
您是否记得 Pipeline 是如何被触发的?实际上,正是通过代码提交或合并请求来启动 Pipeline 的。那么,.gitlab-ci.yml 文件与 Pipeline 之间存在怎样的联系呢?简而言之,.gitlab-ci.yml 文件的作用就是定义 Pipeline 的结构和行为。
基础语法
现在,让我们看一下 .gitlab-ci.yml 文件的基本编写方式:
# 定义构建阶段
stages:
- build
- test
# 定义任务
job1:
stage: test
script:
- echo "我是 job1"
- echo "我在 test 阶段"
# 定义任务
job2:
stage: build
script:
- echo "我是 job2"
- echo "我在 build 阶段"
如上所示,使用 stages
关键词定义构建阶段,而通过非关键词定义具体的任务(Jobs)。每个任务可以通过 stage
关键词指定其所属阶段。script
关键词则是每个任务的核心部分,用于指定任务执行的具体命令。
基于前面讨论的 Stages 和 Jobs 的关系,您能猜测上述示例的执行顺序吗?
我是 job2
我在 build 阶段
我是 job1
我在 test 阶段
没错,根据 stages
中的定义,build
阶段会先于 test
阶段执行,因此 stage:build
的任务将优先运行,随后才是 stage:test
的任务。
常见关键词
这里列出了一些常用的关键词,若您希望获取更详细的信息,请参考 [官方文档]。
- stages: 定义构建阶段,通常包括
build
,test
,deploy
三个默认阶段。 - types:
stages
的同义词。 - before_script: 定义所有任务执行前需运行的命令。
- after_script: (需 GitLab 8.7+ 和 GitLab Runner 1.2+)定义所有任务执行后需运行的命令。
- variables & Job.variables: (需 GitLab Runner 0.5.0+)设置环境变量。若在任务级别定义了环境变量,则该任务将优先使用这些变量。
- cache & Job.cache: (需 GitLab Runner 0.7.0+)定义需缓存的文件,以便在不同的任务或 Pipeline 间共享。这有助于避免重复执行如
npm install
等操作。 - Job.script: 必填项,定义任务执行的具体命令。
- Job.stage: 指定任务的阶段,默认为
test
。 - Job.artifacts: 定义任务产生的附件,例如编译后的二进制文件。当任务成功执行后,这些文件将被上传至 GitLab,用户可以从项目页面下载。注意区分 artifacts 和 cache 的用途。