Gitlab CI/CD配置详解:从工作流程到配置文件实战
Gitlab CI/CD配置详解:从工作流程到配置文件实战
Gitlab作为一款广泛使用的代码托管平台,其内置的CI/CD工具可以自动化完成代码构建、测试和部署等任务。本文将详细介绍Gitlab CI/CD的工作流程、配置文件的参数和编写方法,并提供具体的示例。
Gitlab CI/CD工作流程
参考下图先了解CI/CD的具体工作流和概念,黄色部分为主要涉及的概念,将在后文重点说明:
- 你当前的代码库托管在Gitlab上,且已经为代码仓库配置了Gitlab-runner服务,它是用来实际执行CI任务的服务器;
- 提交代码,且根目录中包含一个名为
.gitlab-ci.yml
文件,该文件是用来指定构建、测试和部署流程、以及CI触发条件的脚本,其概念类似于docker-compose.yml文件; - Gitlab检测到
.gitlab-ci.yml
文件,若当前提交符合文件中指定的触发条件,则会使用配置的Gitlab-runner服务运行该脚本进行测试等工作; - 若
.gitlab-ci.yml
中定义的某个自动化脚本运行失败,将判定为此次CI不通过,则需要提交者修复问题代码后重复提交,直至自动化CI通过。 - 没有问题的提交才能被项目负责人merge到主分支,进行后续的部署工作(此文暂不涉及CD自动化部署)
配置文件介绍
.gitlab-ci.yml
文件主要的作用是用来指定构建、测试和部署流程、以及CI触发条件的脚本。在文件中的定义要运行的脚本,要包含的其他配置文件和模板,依赖项和缓存,要按顺序运行的命令和要并行运行的命令,将应用程序部署到的位置。
无论您是想自动运行脚本还是手动触发其中的任何一个。脚本被分组到作业中,作业作为更大管道的一部分运行。您可以将多个独立作业分组到按定义顺序运行的阶段。
CI/CD 配置至少需要一项未隐藏的作业。您应该按照适合您的应用程序并符合您希望执行的测试的顺序组织您的工作。为了可视化该过程,假设您添加到作业的脚本与您在计算机上运行的 CLI 命令相同。
当您将 .gitlab-ci.yml
文件添加到存储库时,GitLab 会检测到它,并且名为 GitLab Runner 的应用程序会运行作业中定义的脚本。
参数列表
值 | 是否必须 | 描述 |
---|---|---|
script | 必须 | 定义由Runner执行的shell脚本或命令 |
extends | 非必须 | 定义此作业将继承的配置条目 |
image | 非必须 | 需要使用的docker镜像,请查阅该文档 |
services | 非必须 | 定义所需的docker服务,请查阅该文档 |
stage | 非必须 | 定义一个工作场景阶段,默认是test |
type | 非必须 | stage的别名,不赞成使用 |
variables | 非必须 | 在job级别上定义的变量 |
only | 非必须 | 定义job所引用的git分支 |
except | 非必须 | 定义job所不适用的git分支 |
tags | 非必须 | 定义job所适用的runner,tags为runner标签 |
allow_failure | 非必须 | when 用于实现在发生故障或发生故障时运行的作业。when 可以设置为以下值之一:on_success-仅当先前阶段中的所有作业都成功(或因为已标记,被视为成功allow_failure)时才执行作业 。这是默认值。on_failure -仅在前一阶段中的至少一项作业失败时才执行作业。always -执行作业,而不管先前阶段的作业状态如何。manual-手动执行作业(在GitLab 8.10中已添加).delayed-一定时间后执行作业(在GitLab 11.14中已添加)。 |
when | 非必须 | 定义了job什么时候执行,可以是on_success、on_failure、always和manual |
dependencies | 非必须 | 定义了该job依赖哪一个job,如果设置该项,可以通过artifacts设置 |
artifacts | 非必须 | 工件,在依赖项之间传递的东西,类似cache,但原理与cache不同 |
cache | 非必须 | 定义需要被缓存的文件、文件夹列表 |
before_script | 非必须 | 覆盖在作业之前执行的脚本或命令 |
after_script | 非必须 | 覆盖在作业之后执行的脚本或命令 |
environment | 非必须 | 定义让job完成部署的环境名称 |
coverage | 非必须 | 定义job设置代码覆盖率 |
stages | 非必须 | 定义pipeline的全部阶段(stage),阶段内所有任务并行执行,全部执行成功开始下一阶段任务,任何阶段内任意job执行失败都会导致pipeline失败,所有stage,job执行成功后pipeline会显示pass。如果未定义stages,则默认有build、test、deploy三个阶段,如果未定义stage,则默认test阶段 |
rules | 非必须 | 用于评估和确定作业的选定属性,以及是否创建该作业。不能与only/except 一起使用 |
include | 非必须 | 允许此作业包括外部YAML文件。也可用:include:local,include:file,include:template,和include:remote。 |
interruptible | 非必须 | 定义在通过新的运行使其冗余时是否可以取消作业。 |
resource_group | 非必须 | 限制作业并发。 |
timeout | 非必须 | 定义自定义作业级别的超时,该超时优先于项目范围的设置。 |
编写说明
.gitlab-ci.yml
文件中指定了CI的触发条件、工作内容、工作流程,编写和理解此文件是CI实战中最重要的一步,该文件指定的任务内容总体构成了1个pipeline、1个pipeline包含不同的stage执行阶段、每个stage包含不同的具体job脚本任务。
Pipeline说明
一个.gitlab-ci.yml
文件触发后会形成一个pipeline任务流由gitlab-runner来运行处理,pipeline中stage、job概念如下,需要按照项目实际情况定义不同stage和job,自己绘制了一个流程示意图帮助理解:
示例
stages:
- build
- test
build-code-job:
stage: build
script:
- echo "Check the ruby version, then build some Ruby project files:"
- ruby -v
- rake
test-code-job1:
stage: test
script:
- echo "If the files are built successfully, test some files with one command:"
- rake test1
test-code-job2:
stage: test
script:
- echo "If the files are built successfully, test other files with a different command:"
- rake test2
参考文献
- gitlab服务之gitlab-ci.yml配置文件详解-侯体宗的博客
- GitLab之gitlab-ci.yml配置文件最全参数解读 - 知乎
- Gitlab-CI使用及.gitlab-ci.yml配置入门 - 测试开发喵 - 博客园