什么是 .gitlab-ci 文件
Posted on Wed, 25 Dec 2024 13:47:30 +0800 by LiangMingJian
概述
GitLab CI 使用 .gitlab-ci.yml 文件来管理项目配置,用来配置 CI 将要在你项目中完成的操作,这个文件位于仓库的根目录下。
当新内容 push 到仓库或者有代码合并后, GitLab 会查找是否有 .gitlab-ci.yml 文件,如果文件存在,Runners 将会根据该文件的内容开始执行构建。
示例
# 定义 stages(阶段)。任务将按此顺序执行。
stages:
- build
- test
# 定义 job(任务)
job1:
stage: test
tags:
- XX # 只有标签为XX的runner才会执行这个任务
only:
- dev # 只有dev分支提交代码才会执行这个任务。也可以是分支名称或触发器名称
- /^future-.*$/ # 正则表达式,只有future-开头的分支才会执行
script:
- echo "I am job1"
- echo "I am in test stage"
job2:
stage: test # 如果此处没有定义stage,其默认也是test
only:
- master # 只有master分支提交代码才会执行这个任务
script:
- echo "I am job2"
- echo "I am in test stage"
allow_failure: true # 允许失败,即不影响下步构建
.job3:
# 对于临时不想执行的job,可以选择在前面加个".",这样就会跳过此步任务,否则你除了要注释掉这个job3外,还需要注释上面为build的stage
stage: build
except:
- dev # 除了dev分支,其它分支提交代码都会执行这个任务
script:
- echo "I am job3"
- echo "I am in build stage"
# 下面几个都相当于全局变量
before_script:
- echo "每个job之前都会执行"
- export MVN_HOME
- export JAVA_HOME
- java -version
- sh /home/gitlab-runner/kill.sh
after_script:
- echo "每个job之后都会执行"
variables:
# 变量
DATABASE_URL: "postgres://postgres@postgres/my_database"
# 在job中可以用${DATABASE_URL}来使用这个变量。常用的预定义变量有CI_COMMIT_REF_NAME(项目所在的分支或标签名称),CI_JOB_NAME(任务名称),CI_JOB_STAGE(任务阶段)
GIT_STRATEGY: "none"
# GIT策略,定义拉取代码的方式,有3种:clone/fetch/none,默认为clone,速度最慢,每步job都会重新clone一次代码。我们一般将它设置为none,在具体任务里设置为fetch就可以满足需求,毕竟不是每步都需要新代码,那也不符合我们测试的流程
cache:
# 缓存
#因为缓存为不同管道和任务间共享,可能会覆盖,所以有时需要设置key
key: ${CI_COMMIT_REF_NAME}
# 启用每分支缓存。
# key: "$CI_JOB_NAME/$CI_COMMIT_REF_NAME" # 启用每个任务和每个分支缓存。需要注意的是,如果是在windows中运行这个脚本,需要把$换成%
untracked: true
# 缓存所有Git未跟踪的文件
paths:
# 以下2个文件夹会被缓存起来,下次构建会解压出来
- node_modules/
- dist/
支持的语法
Stages
Stages 表示构建阶段,默认有3个 stages : build,test,deploy 。我们可以在一次 Pipeline 中定义多个 Stages ,这些 Stages 有以下特点:
- 所有 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage 才会开始
- 只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功
- 如果任何一个 Stage 失败,那么后面的 Stages 不会执行,该构建任务 (Pipeline) 失败
Jobs
Jobs 表示构建工作,表示某个 Stage 里面执行的工作。我们可以在 Stages 里面定义多个 Jobs ,Jobs 是由 Runners 接管并且由服务器中 runner 执行。这些 Jobs 有以下特点:
- 每一个 Jobs 的执行过程都是独立运行的
- 相同 Stage 中的 Jobs 会并行执行
- 相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功
- 如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败
约束
YAML 文件定义了一系列带有约束说明的任务。这些任务都是以任务名开始并且至少要包含 script 部分。
job1:
script: "execute-script-for-job1"
job2:
script: "execute-script-for-job2"
跳过job
如果你的 commit 信息包涵 ci skip 或者 skip ci ,不论大小写,这个 commit 创建时,不会执行 job 任务。
开始
before_script:
- echo "每个job之前都会执行"
结束
after_script:
- echo "每个job之后都会执行"
保留字段
这些保留字段不能被定义为 job 名称。
- image和services:这两个关键字允许使用一个自定义的 Docker 镜像和一系列的服务,并且可以用于整个 job 周期
- before_script:before_script 用来定义所有 job 之前运行的命令
- after_script:after_script 用来定义所有 job 之后运行的命令
- stages:stages 用来定义可以被 job 调用的 stages。stages 的规范允许有灵活的多级 pipelines。stages 中的元素顺序决定了对应 job 的执行顺序
- types:与 stages 同义
- variables:变量
- cache:用来指定需要在 job 之间缓存的文件或目录。只能使用该项目工作空间内的路径。
- jobs:工作
- script:脚本
only and except
only 和 except 是两个参数用分支策略来限制jobs构建:
- only 定义哪些分支和标签的 git 项目将会被 job 执行。
- except 定义哪些分支和标签的 git 项目将不会被 job 执行。
下面是 refs 策略的使用规则:
- only 和 except 可同时使用。如果 only 和 except 在一个 job 配置中同时存在,则以 only 为准,跳过 except。
- only 和 except 可以使用正则表达式。
- only 和 except 允许使用特殊的关键字:branches,tags和triggers。
- only 和 except 允许使用指定仓库地址但不是 forks 的仓库。
tags
tags 可以从允许运行此项目的所有 Runners 中选择特定的 Runners 来执行 jobs。
在注册 Runner 的过程中,我们可以设置 Runner 的标签,比如 ruby,postgres,development。
tags 可通过 tags 来指定特殊的 Runners 来运行 jobs。
allow_failure
allow_failure 可以用于当你想设置一个 job 失败的之后并不影响后续的 CI 组件的时候。失败的 jobs 不会影响到 commit 状态。
当开启了允许 job 失败,所有的 intents 和 purposes 里的 pipeline 都是成功/绿色,但是也会有一个"CI build passed with warnings"信息显示在 merge request 或 commit 或 job page。这被允许失败的作业使用,但是如果失败表示其他地方应采取其他(手动)步骤。
when
when is used to implement jobs that are run in case of failure or despite the failure.
when 可以设置以下值:
- on_success - 只有前面 stages 的所有工作成功时才执行。 这是默认值。
- on_failure - 当前面 stages 中任意一个 jobs 失败后执行。
- always - 无论前面 stages 中 jobs 状态如何都执行。
- manual- 手动执行(GitLab8.10增加)。更多请查看手动操作。
Manual actions
手动操作指令是不自动执行的特殊类型的 job;它们必须要人为启动。手动操作指令可以从 pipeline,build,environment 和 deployment 视图中启动。