.gitlab-ci.yml
.gitlab-ci.yml 用来配置 CI 用你的项目中做哪些操作,这个文件位于仓库的根目录。
当有新内容 push 到仓库,或者有代码合并后, GitLab 会查找是否有 .gitlab-ci.yml 文件,如果文件存在, Runners 将会根据该文件的内容开始 build 本次 commit 。
.gitlab-ci.yml 使用 YAML 语法, 需要格外注意缩进格式,要用空格来缩进,不能用 tabs 来缩进。
.gitlab-ci.yml 配置参数
关键字 | 描述 |
---|---|
variables | 定义环境变量 |
script | 必须参数,运行器需要执行的脚本 |
image | 使用Docker image镜像 |
services | 使用Docker services(服务)镜像 |
stages | 定义流水线所有的阶段 |
stage | 定义作业所处流水线的阶段(默认test阶段) |
only | 定义哪些分支运行,限制作业在什么上创建 |
except | 限制作业在什么时候不创建 |
tags | 作业使用的Runner运行器的标签 |
when | 什么时候运行作业 |
environment | 作用部署的环境名称 |
cache | 指定需要在job之间缓存的文件或目录 |
artifacts | 归档文件列表,指定成功后应附加到job的文件和目录的列表 |
dependencies | 当前作业依赖的其他作业,你可以使用依赖作业的归档文件 |
coverage | 作业的代码覆盖率 |
retry | 作业失败时,可以自动执行多少次 |
parallel | 指定并行运行的作业实例 |
trigger | 定义下游流水线的触发器 |
include | 作业加载其他YAML文件 |
pages | 上传GitLab Pages的结果 |
before_script | 作业执行前需要执行的命令 |
after_script | 作业执行后需要执行的命令 |
allow_failure | 允许作业失败,失败的作业不影响提交的状态 |
参数详情
variables 变量
variables 变量的优先级
变量的优先顺序是(从最高到最低):
触发变量或预定的流水线变量。
项目级别变量或受保护变量。
组级别变量或受保护变量。
YAML定义的作业级变量。
YAML定义的全局变量。
部署环境变量。
预定义的环境变量。
script
script 是作业中唯一必须的关键字参数,是运行器需要执行的脚本。
script:
- mvn package docker:build -q -Dmaven.test.skip=false .......
image
image 指定使用Docker镜像。如 iamge:name
services
services 指定使用Docker镜像服务。如 services:name
Stages
stages 定义流水线全局可使用的阶段,阶段允许有灵活的多级管道,阶段元素的排序定义了作业执行的顺序。
stage
stage 定义流水线中每个作业所处的阶段,处于相同阶段的作业并行执行。
when
when 关键字用于实现在作业失败时或发生故障时运行的作业 (when is used to implement jobs that are run in case of failure or despite the failure.)。
when 可以设置以下值:
on_success :只有前面的阶段的所有作业都成功时才执行,这是默认值。
on_failure :当前面阶段的作业至少有一个失败时才执行。
always : 无论前面的作业是否成功,一直执行本作业。
manual :手动执行作业,作业不会自动执行,需要人工手动点击启动作业。
delayed : 延迟执行作业,配合 start_in 关键字一起作用, start_in 设置的值必须小于或等于1小时,start_in 设置的值示例: 10 seconds 、 30 minutes 、 1 hour ,前面的作业结束时计时器马上开始计时。
tags
tags 关键字用于指定 GitLab Runner 运行器使用哪一个运行器来执行作业。
Jobs
Jobs 表示构建工作,表示某个 Stage 里面执行的工作。我们可以在 Stages 里面定义多个 Jobs ,这些 Jobs 会有以下特点:
before_script
before_script 用于定义在所有作业之前需要执行的命令,比如更新代码、安装依赖、打印调试信息之类的事情。
before_script:
- echo "Before script section"
- echo "For example you might run an update here or install a build dependency"
- echo "Or perhaps you might print out some debugging details"
after_script
after_script 用于定义在所有作业(即使失败)之后需要执行的命令,比如清空工作空间。
after_script:
- echo "After script section"
- echo "For example you might do some cleanup here"
allow_failure
only 和 except
only 和 except 用于在创建作业时对作业的限制策略。
策略规则:
only 和 except 中可以使用特殊的关键字:
关键字 | 描述释义 |
---|---|
branches | 当一个分支被push上来 |
tags | 当一个打了tag标记的Release被提交时 |
api | 当一个pipline被第二个piplines api所触发调起(不是触发器API) |
external | 当使用了GitLab以外的外部CI服务,如Jenkins |
pipelines | 针对多项目触发器而言,当使用CI_JOB_TOKEN, 并使用gitlab所提供的api创建多个pipelines的时候 |
pushes | 当pipeline被用户的git push操作所触发的时候 |
schedules | 针对预定好的pipline计划而言(每日构建一类) |
triggers | 用触发器token创建piplines的时候 |
web | 在GitLab WEB页面上Pipelines标签页下,按下run pipline的时候 |
merge_requests | 当合并请求创建或更新的时候 |
chats | 当使用GitLab ChatOps 创建作业的时候 |
only 和 except 高级用法
only 和 except 支持高级策略,refs 、 variables 、 changes 、 kubernetes 四个关键字可以使用。
如果同时使用多个关键字,中间的逻辑是 逻辑与AND 。
only:refs/except:refs
refs 策略可以使用 only 和 except 基本用法中的关键字。
下面这个例子中,deploy作业仅当流水线是计划作业或者在master主干运行:
deploy:
only:
refs:
- master
- schedules
only:kubernetes/except:kubernetes
kubernetes 策略仅支持 active 关键字。
下面这个例子中,deploy作业仅当kubernetes服务启动后才会运行:
deploy:
only:
kubernetes: active
only:variables/except:variables
variables 关键字用来定义变量表达式,你可以使用预定义变量、项目、组、环境变量来评估一个作业是否需要创建或运行。
下面这个例子使用了变量表达式:
deploy:
script: cap staging deploy
only:
refs:
- branches
variables:
- $RELEASE == "staging"
- $STAGING
下面这个例子,会根据提交日志信息来排除某些作业:
end-to-end:
script: rake test:end-to-end
except:
variables:
- $CI_COMMIT_MESSAGE =~ /skip-end-to-end-tests/
only:changes/except:changes
下面这个例子中,deploy作业仅当流水线是计划作业或者在master主干运行:
docker build:
script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
only:
changes:
- Dockerfile
- docker/scripts/*
- dockerfiles/**/*
- more_scripts/*.{rb,py,sh}
上面这个例子中,一旦 Dockerfile 文件发生变化,或者 docker/scripts/ 目录下的文件发生变化,或者 dockerfiles/ 目录下的文件或目录发生变化,或者 more_scripts/ 目录下 rb,py,sh 等脚本文件发生变化时,就会触发Docker构建。
如下示例:
test:
script: npm run test
only:
changes:
- "*.json"
- "**/*.sql"
在上面的示例中,glob模式匹配 的字符串需要使用双引号包裹起来,否则会导致 .gitlab-ci.yml 解析错误。
下面这个例子,当md文件发生变化时,会忽略CI作业:
build:
script: npm run build
except:
changes:
- "*.md"
-
在合并请求中使用 change 策略:
docker build service one:
script: docker build -t my-service-one-image:$CI_COMMIT_REF_SLUG .
only:
refs:
- merge_requests
changes:
- Dockerfile
- service-one/**/*
上面这个例子中,一旦合并请求中修改了 Dockerfile 文件或者修改了 service 目录下的文件,都会触发Docker构建。
示例
#定义 stages(阶段)。任务将按此顺序执行。
stages:
- build
- test
- deploy
#定义 job(任务)
job1:
stage: test
tags:
-XX #只有标签为XX的runner才会执行这个任务
only:
- dev #只有dev分支提交代码才会执行这个任务。也可以是分支名称或触发器名称
- /^future-.*$/ #正则表达式,只有future-开头的分支才会执行
script:
- echo "I am job1"
- echo "I am in test stage"
#定义 job
job2:
stage: test #如果此处没有定义stage,其默认也是test
only:
- master #只有master分支提交代码才会执行这个任务
script:
- echo "I am job2"
- echo "I am in test stage"
allow_failure: true #允许失败,即不影响下步构建
#定义 job
job3:
stage: build
except:
- dev #除了dev分支,其它分支提交代码都会执行这个任务
script:
- echo "I am job3"
- echo "I am in build stage"
#定义 job
. job4:#对于临时不想执行的job,可以选择在前面加个".",这样就会跳过此步任务,否则你除了要注释掉这个job4外,还需要注释上面为deploy的stage
stage: deploy
script:
- echo "I am job4"
#下面几个都相当于全局变量,都可以添加到具体job中,这时会被子job的覆盖
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" # 启用每个任务和每个分支缓存。
untracked: true #缓存所有Git未跟踪的文件