使用.gitlab-ci.yml配置作业
本文档介绍的使用方法.gitlab-ci.yml
, GitLab Runner用来管理项目作业的文件。
从7.12版本开始,GitLab CI使用了YAML文件(.gitlab-ci.yml
)浏览工程项目的配置。它被放置在存储库的根目录中,包含如何构建项目的定义。
如果您想快速了解GitLab CI,请关注我们的快速入门指南.
注意:注意:如果你有镜像存储库,GitLab从中提取,您可能需要启用管道触发在您的项目设置>存储库>从远程存储库提取>触发镜像更新管道.
工作
YAML文件定义了一组作业,这些作业的约束规定了它们应该在什么时候运行。可以指定无限数量的作业,这些作业被定义为具有任意名称的顶级元素,并且始终必须至少包含脚本
条款。
job1:脚本:"execute-script-for-job1”job2:脚本:"execute-script-for-job2”
上面的示例是最简单的CI/CD配置,包含两个独立的作业,其中每个作业执行不同的命令。当然,命令可以直接执行代码(. / configure,让,让安装
)或运行脚本(test.sh
)。
工作是由跑步者并在Runner的环境中执行。重要的是,每个作业都是彼此独立运行的。
每个作业必须有一个唯一的名称,但有几个保留关键字
不能用作作业名称:
图像
服务
阶段
类型
before_script
after_script
变量
缓存
作业由定义作业行为的参数列表定义。
关键字 | 要求 | 描述 |
---|---|---|
脚本 | 是的 | 定义由Runner执行的shell脚本 |
图像 | 没有 | 使用docker映像,覆盖在使用Docker映像 |
服务 | 没有 | 使用docker服务,详见使用Docker映像 |
阶段 | 没有 | 定义一个作业阶段(默认值:测验 ) |
类型 | 没有 | 别名阶段 |
变量 | 没有 | 在作业级别上定义作业变量 |
只有 | 没有 | 定义为其创建作业的git引用列表 |
除了 | 没有 | 定义一个未为其创建作业的git引用列表 |
标签 | 没有 | 定义用于选择Runner的标记列表 |
allow_failure | 没有 | 允许作业失败。作业失败不会影响提交状态 |
当 | 没有 | 定义何时运行job。可以on_success ,on_failure ,总是 或手册 |
依赖关系 | 没有 | 定义作业所依赖的其他作业,以便在它们之间传递工件 |
工件 | 没有 | 定义列表工作的工件 |
缓存 | 没有 | 定义应在后续运行之间缓存的文件列表 |
before_script | 没有 | 重写在job之前执行的一组命令 |
after_script | 没有 | 重写在作业之后执行的一组命令 |
环境 | 没有 | 定义此作业执行部署到的环境的名称 |
报道 | 没有 | 定义给定作业的代码覆盖设置 |
重试 | 没有 | 定义一个作业在失败时可以自动重试的次数 |
页面
页面
是一个特殊的工作,用于上传静态内容到GitLab,可以用来为您的网站服务。它有一个特殊的语法,所以必须满足以下两个要求:
- 任何静态内容都必须放在
公共/
目录 工件
的路径公共/
必须定义目录
下面的示例简单地将所有文件从项目的根目录移动到公共/
目录中。的学派
变通办法是这样的cp
也不会复制公共/
对自身进行无限循环:
页:阶段:部署脚本:- mkdir .public- cp -r * .public- mv .public公共的构件:道路:——公共只有:——主
阅读更多GitLab Pages用户文档.
图像
而且服务
这允许指定一个自定义的Docker映像和一个服务列表,这些服务可以在作业期间使用。中介绍了此特性的配置单独的文件.
before_script
而且after_script
在GitLab 8.7中引入,需要GitLab Runner v1.2
before_script
用于定义在所有作业(包括deploy作业)之前,在恢复工件.这可以是一个数组或多行字符串。
after_script
用于定义将在所有作业(包括失败的作业)之后运行的命令。这必须是一个数组或多行字符串。
的before_script
而主要的脚本
连接并运行在单个上下文/容器中。的after_script
是单独运行的,因此根据执行程序的不同,在工作树之外所做的更改可能是不可见的,例如安装在before_script
.
可以覆盖全局定义的before_script
而且after_script
如果你设置per-job:
before_script:-全局前脚本工作:before_script:-执行这个脚本而不是全局的before脚本脚本:-我的命令after_script:-在我的脚本之后执行这个
阶段
阶段
用于定义作业可以使用的阶段,并且是全局定义的。
规格说明阶段
允许有灵活的多级管道。元素的顺序阶段
定义作业的执行顺序:
- 同一阶段的作业是并行运行的。
- 下一阶段的作业将在前一阶段的作业成功完成后运行。
让我们考虑下面的例子,它定义了三个阶段:
阶段:-构建-测验-部署
- 首先,所有的工作
构建
并行执行。 - 如果所有的工作
构建
取得成功,测验
作业是并行执行的。 - 如果所有的工作
测验
取得成功,部署
作业是并行执行的。 - 如果所有的工作
部署
如果成功,则将提交标记为通过了
. - 如果前面的任何作业失败,则将提交标记为
失败的
并且不执行进一步阶段的作业。
还有两种边缘情况值得一提:
- 如果没有
阶段
定义为.gitlab-ci.yml
,则构建
,测验
而且部署
默认情况下允许用作作业的阶段。 - 如果作业没有指定
阶段
,工作是分配的测验
阶段。
阶段
阶段
是按作业定义的,依赖于阶段
是全局定义的。它允许将作业分组到不同的阶段,以及相同的作业阶段
在平行
.例如:
阶段:-构建-测验-部署工作1:阶段:构建脚本:构建依赖项工作2:阶段:构建脚本:制作构建构件工作3:阶段:测验脚本:做测试工作4:阶段:部署脚本:使部署
类型
警告:弃用:类型
已弃用,并可能在未来的版本中删除。使用阶段代替。
脚本
脚本
是一份工作所需要的唯一关键字。它是一个shell脚本,由Runner执行。例如:
工作:脚本:"包执行rspec”
该参数也可以包含使用数组的几个命令:
工作:脚本:-uname --捆绑执行规范
有时,脚本
命令需要用单引号或双引号括起来。例如,包含冒号(:
)需要用引号括起来,以便YAML解析器知道将整个内容解释为字符串,而不是“key: value”对。使用特殊字符时要小心::
,{
,}
,[
,]
,,
,&
,*
,#
,?
,|
,-
,<
,>
,=
,!
,%
,@
,`
.
只有
而且除了
(简化)
只有
而且除了
是两个参数,用于设置作业策略以限制创建作业的时间:
只有
定义作业将为其运行的分支和标记的名称。除了
定义作业将要处理的分支和标记的名称不运行。
这里有一些规则适用于工作策略的使用:
只有
而且除了
是包容。如果两个只有
而且除了
在工作规范中定义,引用是由只有
而且除了
.只有
而且除了
允许使用正则表达式。只有
而且除了
允许指定一个存储库路径来为fork筛选作业。
此外,只有
而且除了
允许使用特殊的关键字:
价值 | 描述 |
---|---|
分支机构 |
当树枝被推时。 |
标签 |
当标签被推入时。 |
api |
当管道被第二个管道API触发时(不是触发器API)。 |
外部 |
当使用GitLab以外的CI服务时。 |
管道 |
对于多项目触发器,使用API with创建CI_JOB_TOKEN . |
推 |
类型触发管道git推 由用户决定。 |
日程安排 |
为将管道. |
触发器 |
对于使用触发器令牌创建的管道。 |
网络 |
对于使用以下方法创建的管道管道运行按钮在GitLab UI(在你的项目管道). |
在下面的例子中,工作
只会为开始的裁判跑吗问题- - - - - -
,而所有分支将被跳过:
工作:#使用regexp只有:-美元/ ^ -问题。* /#使用特殊关键字除了:-分支机构
在这个例子中,工作
将只对标记的引用运行,或者如果构建是通过API触发器或管道的时间表:
工作:使用特殊关键词只有:-标签-触发器-日程安排
存储库路径可用于仅为父存储库执行作业,而不用于fork:
工作:只有:-branches@gitlab-org gitlab-ce除了:-master@gitlab-org gitlab-ce
上面的示例将运行工作
对于所有的分支gitlab-org gitlab-ce
,除了主人。
只有
而且除了
(复杂的)
参考文献
而且kubernetes
在GitLab 10.0中引入的策略
变量
10.7引入的策略
警告:警告:这是一个α功能,并有可能随时更改,恕不另行通知!
从GitLab 10.0开始,就可以定义一个更详细的只有/除作业策略配置。
GitLab现在同时支持简单策略和复杂策略,因此可以使用数组和散列配置方案。
现在有三个密钥可用:参考文献
,kubernetes
而且变量
.Refs策略等于简化的only/except配置,而kubernetes策略只接受配置活跃的
关键字。
变量
关键字用于定义变量表达式。换句话说,您可以使用预定义变量/秘密变量/项目/组或环境范围变量来定义GitLab要计算的表达式,以决定是否应该创建作业。
请参阅下面的示例。对象的管道已调度或运行时才会创建作业主
分支,并且仅当kubernetes服务在项目中处于活动状态时。
工作:只有:参考文献:-主-日程安排kubernetes:活跃的
使用变量表达式的例子:
部署:只有:参考文献:-分支机构变量:-$RELEASE == "staging"-美元分期
了解关于变量表达式的更多信息单独的页面.
标签
标签
用于从允许运行此项目的所有运行程序列表中选择特定的运行程序。
例如,在注册Runner期间,您可以指定Runner的标记鲁比(人名)
,postgres
,发展
.
标签
允许你运行带有指定标签的运行器的作业:
工作:标签:-鲁比(人名)-postgres
以上的规范,将确保工作
是由兼具两者的奔跑者建造的吗鲁比(人名)
和postgres
标签定义的。
allow_failure
allow_failure
当您希望允许一个作业失败而不影响CI套件的其余部分时,可以使用。失败的作业不会影响提交状态。
当启用并且作业失败时,管道将会成功/绿色,但是在合并请求或提交或作业页面上将显示“CI构建已通过并带有警告”消息。它用于允许失败的作业,但失败表明应该在其他地方采取其他(手动)步骤。
在下面的例子中,job1
而且job2
会平行运行,但如果job1
如果失败,它将不会停止下一阶段的运行,因为它被标记为allow_failure:真
:
job1:阶段:测验脚本:-execute_script_that_will_failallow_failure:真正的job2:阶段:测验脚本:-execute_script_that_will_succeedjob3:阶段:部署脚本:-deploy_to_staging
当
当
用于实现在失败或即使失败也要运行的作业。
当
可以设置为以下值之一:
on_success
-仅当前一阶段的所有任务都成功时才执行job。这是默认值。on_failure
—仅当前一阶段至少有一个作业失败时才执行job。总是
-不考虑前一阶段作业的状态,执行job。手册
-手动执行job(在GitLab 8.10中添加)。读到手动操作在下面。
例如:
阶段:-构建-cleanup_build-测验-部署-清理build_job:阶段:构建脚本:-使构建cleanup_build_job:阶段:cleanup_build脚本:-失败时清理构建当:on_failuretest_job:阶段:测验脚本:-做测试deploy_job:阶段:部署脚本:-使部署当:手册cleanup_job:阶段:清理脚本:-工作后的清理工作当:总是
上面的脚本将:
- 执行
cleanup_build_job
只有当build_job
失败。 - 一直执行
cleanup_job
作为流水线上的最后一步,无论成败。 - 允许您手动执行
deploy_job
从GitLab的UI。
当:手动
注:
- 在GitLab 8.10中引入。
- 在GitLab 9.0中引入了阻塞手动操作。
- 在GitLab 9.2中引入了保护操作。
手动操作是一种特殊类型的作业,不是自动执行的,它们需要由用户显式地启动。手动操作的一个示例是部署到生产环境。手动操作可以从管道、作业、环境和部署视图启动。欲知详情,请浏览环境的文档.
手动操作可以是可选的,也可以是阻塞的。阻塞手动操作将在定义此操作的阶段阻塞管道的执行。当某人通过单击来执行阻塞手动操作时,可以恢复管道的执行玩按钮。
当管道被阻塞时,如果设置“当管道成功时合并”,则不会合并该管道。阻塞的管道也有一种特殊的状态,叫做手册.默认情况下,手动操作是非阻塞的。如果要做手动动作阻拦,则需要添加allow_failure:假
工作的定义.gitlab-ci.yml
.
可选的手动操作具有allow_failure:真
默认设置,并且它们的状态不影响整个管道状态。因此,如果手动操作失败,管道最终将成功。
手动操作被认为是写操作,因此受保护的分支当用户想要触发一个动作时使用。换句话说,为了触发分配给管道正在为之运行的分支的手动操作,用户需要具备合并到该分支的能力。
环境
注:
- 在GitLab 8.9中引入。
- 您可以阅读更多关于环境的内容,并在关于环境的文档.
环境
用于定义作业部署到特定环境。如果环境
且该名称下的环境不存在,则将自动创建一个新环境。
最简单的形式是环境
关键字可以这样定义:
部署到生产环境:阶段:部署脚本:git推送生产HEAD:master环境:名字:生产
在上面的例子中,部署到生产环境
作业将被标记为正在对生产
环境。
环境:名字
注:
- 在GitLab 8.11中引入。
- 在GitLab 8.11之前,环境的名称可以定义为字符串,例如
生产环境:
.现在推荐的方法是在名字
关键字。- 的
名字
参数可以使用任何已定义的CI变量,包括预定义的安全变量和.gitlab-ci.yml
变量
.但是不能使用下面定义的变量脚本
.
的环境
名称可以包含:
- 信
- 数字
- 空间
-
_
/
$
{
}
常见的名字有质量保证
,暂存
,生产
,但是您可以使用与您的工作流相匹配的任何名称。
方法之后定义环境的名称,而不是环境
关键字,也可以将其定义为单独的值。为此,使用名字
关键字在环境
:
部署到生产环境:阶段:部署脚本:git推送生产HEAD:master环境:名字:生产
环境:url
注:
- 在GitLab 8.11中引入。
- 在GitLab 8.11之前,URL只能在GitLab的UI中添加。现在推荐的方法是将其定义为
.gitlab-ci.yml
.- 的
url
参数可以使用任何已定义的CI变量,包括预定义的安全变量和.gitlab-ci.yml
变量
.但是不能使用下面定义的变量脚本
.
这是一个可选值,当设置它时,它会在GitLab的不同位置显示按钮,当单击这些按钮时,会将您带到定义的URL。
在下面的例子中,如果作业成功完成,它将在合并请求和环境/部署页面中创建指向的按钮https://prod.example.com
.
部署到生产环境:阶段:部署脚本:git推送生产HEAD:master环境:名字:生产url:https://prod.example.com
环境:on_stop
注:
- 介绍了在GitLab 8.13中。
- 从GitLab 8.14开始,当你有一个定义了停止动作的环境时,当关联的分支被删除时,GitLab将自动触发一个停止动作。
封闭(回采)环境可以通过on_stop
定义的关键字环境
.它声明了一个不同的作业来关闭环境。
读了环境:行动
部分的示例。
环境:行动
介绍了在GitLab 8.13中。
的行动
关键字是要与on_stop
并且在被调用来关闭环境的作业中定义。
举个例子:
review_app:阶段:部署脚本:使deploy-app环境:名字:审查on_stop:stop_review_appstop_review_app:阶段:部署脚本:使delete-app当:手册环境:名字:审查行动:停止
在上面的例子中,我们设置了review_app
要部署到的审查
环境,我们也定义了新的stop_review_app
下工作on_stop
.一旦review_app
作业成功完成后,将触发stop_review_app
下定义的工作当
.在这个例子中,我们把它设置为手册
所以它需要a手动操作通过GitLab的网页界面来运行。
的stop_review_app
的工作是要求定义以下关键字:
当
-参考环境:名字
环境:行动
阶段
应该和review_app
以便在删除分支时环境自动停止
动态的环境
注:
例如:
部署为评论应用程序:阶段:部署脚本:使部署环境:名字:审查/ $ CI_COMMIT_REF_NAMEurl:https:// CI_ENVIRONMENT_SLUG.example.com/美元
的部署为评论应用程序
作业将标记为部署,以动态创建审查/ $ CI_COMMIT_REF_NAME
环境中,CI_COMMIT_REF_NAME美元
是一个环境变量由跑步者设置。的CI_ENVIRONMENT_SLUG美元
变量基于环境名称,但适合包含在url中。在本例中,如果部署为评论应用程序
作业在名为战俘
,该环境可以通过如下URL访问https://review-pow.example.com/
.
当然,这意味着承载应用程序的底层服务器已正确配置。
常见的用例是为分支创建动态环境,并将它们用作Review Apps。你可以在这里看到一个使用Review Apps的简单例子https://gitlab.com/gitlab-examples/review-apps-nginx/.
缓存
注:
- 在GitLab Runner v0.7.0中引入。
缓存
可以全局和每个作业设置。- 在GitLab 9.0中,默认情况下启用了缓存,并在管道和作业之间共享缓存。
- 从GitLab 9.2开始,缓存将在之前恢复工件.
提示:了解更多:阅读缓存是如何工作的,并找到一些好的实践缓存依赖项文档.
缓存
用于指定应在作业之间缓存的文件和目录列表。您只能使用项目工作区中的路径。
如果缓存
定义在作业范围之外,这意味着它是全局设置的,所有作业都将使用该定义。
缓存:路径
使用路径
指令来选择哪些文件或目录将被缓存。通配符也可以使用。
缓存所有文件二进制文件
结束于. apk
和config
文件:
rspec:脚本:测验缓存:路径:-二进制文件/ * . apk-config
本地定义的缓存覆盖全局定义的选项。以下rspec
作业将只缓存二进制文件/
:
缓存:路径:-我的/文件rspec:脚本:测验缓存:关键:rspec路径:-二进制文件/
注意,由于缓存是在作业之间共享的,如果您为不同的作业使用不同的路径,则还应该设置不同的路径缓存:关键否则缓存内容将被覆盖。
缓存:关键
在GitLab Runner v1.0.0中引入。
由于缓存在作业之间共享,如果您为不同的作业使用不同的路径,则还应该设置不同的路径缓存:关键
否则缓存内容将被覆盖。
的关键
指令允许您定义作业之间缓存的相关性,允许对所有作业有一个缓存,每个作业缓存,每个分支缓存或任何其他适合您的工作流的方式。通过这种方式,您可以对缓存进行微调,允许您在不同的作业甚至不同的分支之间缓存数据。
的缓存:关键
变量可以使用的任意预定义的变量,默认键,如果没有设置,只是文字默认的
这意味着默认情况下,从GitLab 9.0开始,每个管道和作业之间都共享所有内容。
注意:注意:的缓存:关键
变量不能包含/
字符,或等效的uri编码% 2 f
;仅由点组成的值(.
,% 2 e
)也是被禁止的。
例如,要启用每个分支缓存:
缓存:关键:"CI_COMMIT_REF_SLUG美元”路径:-二进制文件/
如果你使用Windows批处理要运行您需要替换的shell脚本$
与%
:
缓存:关键:"% CI_COMMIT_REF_SLUG %”路径:-二进制文件/
如果你使用Windows PowerShell要运行您需要替换的shell脚本$
与env美元:
:
缓存:关键:"美元env: CI_COMMIT_REF_SLUG”路径:-二进制文件/
缓存:无路径的
集开始回升的:真
缓存Git存储库中所有未跟踪的文件:
rspec:脚本:测验缓存:开始回升的:真正的
缓存所有Git未跟踪的文件和文件二进制文件
:
rspec:脚本:测验缓存:开始回升的:真正的路径:-二进制文件/
缓存:政策
在GitLab 9.4中引入。
缓存作业的默认行为是在执行开始时下载文件,并在执行结束时重新上传文件。这允许为将来的运行持久化作业所做的任何更改,称为pull-push
缓存策略。
如果知道作业不会更改缓存的文件,则可以通过设置跳过上传步骤政策:拉
在工作说明中。通常,这将在较早阶段与普通缓存作业结合使用,以确保缓存不时更新:
阶段:-设置-测验准备:阶段:设置缓存:关键:宝石路径:-供应商/包脚本:-Bundle安装—部署rspec:阶段:测验缓存:关键:宝石路径:-供应商/包政策:拉脚本:-捆绑执行规范…
这有助于加快作业执行并减少缓存服务器上的负载,特别是当有大量使用缓存的作业并行执行时。
此外,如果有一个作业无条件地重新创建缓存而不引用其以前的内容,则可以使用政策:推
在该作业中跳过下载步骤。
工件
注:
- 在针对非windows平台的GitLab Runner v0.7.0中引入。
- GitLab Runner v.1.0.0中增加了对Windows的支持。
- 从GitLab 9.2开始,缓存会在工件之前恢复。
- 并不是所有的执行人都是支持.
- 默认情况下,仅为成功的作业收集作业工件。
工件
用于指定成功后应附加到作业的文件和目录列表。
任务成功完成后,工件将被发送到GitLab,并可在GitLab UI中下载。
构件:路径
您只能使用项目工作区中的路径。要在不同作业之间传递工件,请参见依赖关系.
发送所有文件二进制文件
而且config
:
工件:路径:-二进制文件/-config
要禁用工件传递,请将作业定义为empty依赖关系:
工作:阶段:构建脚本:使构建依赖关系:[]
您可能希望仅为标记版本创建构件,以避免用临时构件填满构建服务器存储。
仅为标记创建工件(default-job
不会创建工件):
default-job:脚本:-mvn test -U除了:-标签release-job:脚本:-mvn package -U工件:路径:-/ * . war目标只有:-标签
构件:名字
在GitLab 8.6和GitLab Runner v1.1.0中引入。
的名字
指令允许您定义创建的工件存档的名称。这样,每个存档都可以有一个唯一的名称,这在您想从GitLab下载存档时非常有用。的构件:名字
变量可以使用的任意预定义的变量.默认名称为工件
,就变成了artifacts.zip
当下载。
使用实例创建一个以当前作业名称命名的归档文件。
工作:工件:名字:"CI_JOB_NAME美元”路径:-二进制文件/
使用当前分支或标记的名称创建一个归档文件,只包含二进制目录:
工作:工件:名字:"CI_COMMIT_REF_NAME美元”路径:-二进制文件/
创建一个包含当前作业和当前分支或标记的归档文件,只包含二进制目录:
工作:工件:名字:"CI_JOB_NAME - CI_COMMIT_REF_NAME美元”路径:-二进制文件/
创建名称为当前文件的存档阶段分支机构名称:
工作:工件:名字:"CI_JOB_STAGE - CI_COMMIT_REF_NAME美元”路径:-二进制文件/
如果你使用Windows批处理要运行您需要替换的shell脚本$
与%
:
工作:工件:名字:"% CI_JOB_STAGE % - % CI_COMMIT_REF_NAME %”路径:-二进制文件/
如果你使用Windows PowerShell要运行您需要替换的shell脚本$
与env美元:
:
工作:工件:名字:"$ env: CI_JOB_STAGE - env美元:CI_COMMIT_REF_NAME”路径:-二进制文件/
构件:无路径的
构件:无路径的
用于将所有Git未跟踪的文件添加为工件(沿着在构件:路径
).
注意:注意:排除不应该成为其中一部分的文件夹/文件开始回升的
把它们加到.gitignore
.
发送所有Git未跟踪文件:
工件:开始回升的:真正的
发送所有Git未跟踪的文件和文件二进制文件
:
工件:开始回升的:真正的路径:-二进制文件/
工件:当
在GitLab 8.9和GitLab Runner v1.3.0中引入。
工件:当
用于在作业失败或尽管出现失败时上传工件。
工件:当
可以设置为以下值之一:
on_success
—任务成功后才上传工件。这是默认值。on_failure
—仅在任务失败时上传工件。总是
-无论作业状态如何,都可以上传工件。
仅在作业失败时上传工件:
工作:工件:当:on_failure
构件:expire_in
在GitLab 8.9和GitLab Runner v1.3.0中引入。
expire_in
允许您指定工件在过期和删除之前应该存在多长时间,从它们上传并存储到GitLab的时间开始计算。如果未定义过期时间,则默认为实例范围设置(默认为30天,在GitLab.com上是永久的)。
您可以使用保持按钮,覆盖过期并永久保存工件。
在它们到期后,默认情况下,工件每小时删除一次(通过cron作业),并且不再可访问。
的价值expire_in
是经过的时间。可解析值的例子:
- “3分4秒”
- “2小时20分钟”
- “2 h20min”
- “6 MOS 1天”
- '47年6 MOS和4d'
- “3周零2天”
在上传工件1周后过期:
工作:工件:expire_in:1周
依赖关系
在GitLab 8.6和GitLab Runner v1.1.1中引入。
此特性应该与工件
并允许您定义在不同作业之间传递的工件。
请注意,工件
从所有先前的阶段默认情况下传递。
要使用此特性,请定义依赖关系
在作业的上下文中,并传递一个以前所有作业的列表,从中可以下载工件。只能从当前阶段之前执行的阶段定义作业。如果从当前阶段或下一阶段定义作业,将显示错误。定义一个空数组将跳过下载该工作的任何工件。使用时不考虑前一个作业的状态依赖关系
,因此如果它失败了,或者它是一个没有运行的手动作业,也不会发生错误。
在下面的例子中,我们用工件定义了两个作业,构建:osx
而且linux构建:
.当测试:osx
执行时,文物从何而来构建:osx
将在构建的上下文中下载和提取。同样的情况也发生在linux测试:
还有来自linux构建:
.
这份工作部署
将下载工件从所有以前的工作,因为阶段优先级:
构建:osx:阶段:构建脚本:构建:osx工件:路径:-二进制文件/linux构建::阶段:构建脚本:linux构建:工件:路径:-二进制文件/测试:osx:阶段:测验脚本:使测试:osx依赖关系:-构建:osxlinux测试::阶段:测验脚本:linux测试:依赖关系:-linux构建:部署:阶段:部署脚本:使部署
当依赖的作业失败时
在GitLab 10.3中引入。
是否已将作业的工件设置为依赖项过期的或抹去,则依赖作业将失败。
注意:注意:您可以请求管理员按下开关并恢复旧的行为。
报道
介绍了在GitLab 8.17中。
报道
允许您配置如何从作业输出中提取代码覆盖率。
正则表达式是这里所期望的唯一有效类型的值。因此,使用周围环境/
是必须的,以便一致且显式地表示正则表达式字符串。如果您想从字面上匹配特殊字符,则必须转义它们。
举个简单的例子:
job1:脚本:rspec报道:'/代码覆盖范围:\ d + \ \ d + /。”
重试
介绍了在GitLab 9.5中。
重试
允许您配置在失败的情况下将重试作业的次数。
当一项工作失败时,就有了重试
属性指定的次数之前,将再次对其进行处理重试
关键字。
如果重试
设置为2,如果作业在第二次运行(第一次重试)中成功,则不会再次重试。重试
Value必须是一个正整数,等于或大于0,但小于或等于2(最多重试两次,总共运行三次)。
举个简单的例子:
测验:脚本:rspec重试:2
变量
在GitLab Runner v0.5.0中引入。
注意:注意:整数(以及字符串)对于变量的名称和值都是合法的。浮动是不合法的,不能使用。
GitLab CI/CD允许你在里面定义变量.gitlab-ci.yml
然后在工作环境中传递。它们可以在全局和每个作业中设置。当变量
关键字用于作业级别,它会覆盖全局YAML变量和预定义的变量。
它们存储在Git存储库中,用于存储不敏感的项目配置,例如:
变量:DATABASE_URL:"postgres: / / postgres@postgres / my_database”
这些变量以后可以在所有执行的命令和脚本中使用。yaml定义的变量也被设置为所有创建的服务容器,从而允许对它们进行微调。
要关闭特定作业中的全局定义变量,请定义一个空散列:
job_name:变量:{}
除了用户定义的变量,还有由跑步者自己设置.一个例子是CI_COMMIT_REF_NAME
它具有为其构建项目的分支或标记名称的值。除了你可以设置的变量.gitlab-ci.yml
,也有所谓的秘密的变量可以在GitLab的UI中设置。
Git策略
在GitLab 8.9中作为实验特性引入。在将来的版本中可能会更改或完全删除。
GIT_STRATEGY =没有
需要GitLab Runner v1.7+。
您可以设置GIT_STRATEGY
类中的全局或每个作业用于获取最新的应用程序代码变量
部分。如果不指定,将使用项目设置中的默认值。
有三个可能的值:克隆
,获取
,没有一个
.
克隆
是最慢的选择。它为每个作业从头克隆存储库,确保项目工作区始终是原始的。
变量:GIT_STRATEGY:克隆
获取
更快,因为它重用了项目工作区(退回到克隆
如果不存在的话)。git清洁
用于撤消上一个作业所做的任何更改,以及git获取
用于检索自上次作业运行以来所做的提交。
变量:GIT_STRATEGY:获取
没有一个
也重用项目工作区,但跳过所有Git操作(包括GitLab Runner的预克隆脚本,如果存在的话)。它主要用于专门操作工件的作业(例如,部署
).Git存储库数据可能是存在的,但它肯定是过时的,因此您应该只依赖从缓存或工件引入项目工作区的文件。
变量:GIT_STRATEGY:没有一个
Git子模块策略
需要GitLab Runner v1.10+。
的GIT_SUBMODULE_STRATEGY
变量用于控制在构建之前获取代码时是否/如何包含Git子模块。中的全局设置或每个作业设置变量
部分。
有三个可能的值:没有一个
,正常的
,递归
:
没有一个
意味着在获取项目代码时将不包括子模块。这是默认值,它匹配v1.10之前的行为。正常的
意味着只包含顶级子模块。它相当于:Git子模块同步Git子模块update——init
递归
表示将包含所有子模块(包括子模块的子模块)。它相当于:Git子模块sync——递归Git子模块update——init——递归
注意,要使此特性正确工作,必须配置子模块(在.gitmodules
):
- 一个公共可访问的存储库的HTTP(S) URL,或者
- 到同一GitLab服务器上另一个存储库的相对路径。看到Git子文档。
Git checkout
在GitLab Runner 9.3中引入
的GIT_CHECKOUT
时,可以使用变量GIT_STRATEGY
设置为克隆
或获取
若要指定git checkout
应该运行。如果未指定,默认为true。中的全局设置或每个作业设置变量
部分。
如果设置为假
,赛跑者将:
- 在做
获取
-更新存储库并在当前版本上保留工作副本, - 在做
克隆
-克隆存储库,并将工作副本保留在默认分支上。
将此设置设置为真正的
对双方都是这样吗克隆
而且获取
Runner将检出工作副本到与CI管道相关的修订:
变量:GIT_STRATEGY:克隆GIT_CHECKOUT:"错误的”脚本:-Git checkout master-git合并$CI_BUILD_REF_NAME
工作阶段尝试
它在GitLab中引入,需要GitLab Runner v1.9+。
您可以设置正在运行的作业将尝试执行以下每个阶段的尝试次数:
变量 | 描述 |
---|---|
GET_SOURCES_ATTEMPTS | 试图获取运行作业的源的次数 |
ARTIFACT_DOWNLOAD_ATTEMPTS | 试图下载运行作业的工件的次数 |
RESTORE_CACHE_ATTEMPTS | 运行作业时尝试恢复缓存的次数 |
默认情况下是一次尝试。
例子:
变量:GET_SOURCES_ATTEMPTS:3.
中的全局设置或每个作业设置变量
部分。
浅克隆
在GitLab 8.9中作为实验特性引入。可能会在以后的版本中更改或完全删除。
您可以使用指定获取和克隆的深度GIT_DEPTH
.这允许对存储库进行浅克隆,这可以显著加快具有大量提交或旧的大型二进制文件的存储库的克隆速度。该值被传递给git获取
而且git克隆
.
注意:如果使用深度为1,并且有一个作业队列或重试作业,则作业可能会失败。
因为Git的抓取和克隆是基于引用的,比如分支名,所以运行者不能克隆一个特定的提交SHA。如果队列中有多个作业,或者您正在重试一个旧作业,那么要测试的提交需要在克隆的Git历史记录中。设置的值太小GIT_DEPTH
可以使这些旧的提交无法运行。你会看到未解决的参考
在作业日志中。然后你应该重新考虑改变GIT_DEPTH
到一个更高的值。
依赖于git描述
什么时候可能不能正常工作GIT_DEPTH
因为只显示了部分Git历史。
只获取或克隆最后3次提交:
变量:GIT_DEPTH:"3”
方法中的全局设置或每个作业设置变量
部分。
特殊的YAML特性
可以使用特殊的YAML特性,如锚(&
)、别名(*
)和地图合并(<<
),这将允许您大大降低的复杂性.gitlab-ci.yml
.
阅读更多关于各种YAML的特性.
隐藏密钥(作业)
在GitLab 8.6和GitLab Runner v1.1.1中引入。
如果你想暂时“禁用”一个作业,而不是注释掉定义了该作业的所有行:
# hidden_job:#脚本:# -运行测试
您可以改用点(.
),不会被GitLab CI处理。在下面的例子中,.hidden_job
将被忽略:
.hidden_job:脚本:-运行测试
可以使用此特性忽略作业,或使用YAML的特殊功能并将隐藏键转换为模板。
锚
在GitLab 8.6和GitLab Runner v1.1.1中引入。
YAML有一个很方便的功能叫做“锚”,它可以让你轻松地在你的文档中复制内容。锚可以用来复制/继承属性,这是一个很好的例子隐藏的钥匙为您的作业提供模板。
下面的例子使用了锚和映射合并。它将创造两个就业机会,test1
而且test2
的参数,它将继承.job_template
他们各有各的风俗脚本
定义:
.job_template:&job_definition#定义名为job_definition的锚的隐藏键图像:ruby: 2.1服务:-postgres-复述,test1:<<:* job_definition#合并'job_definition'别名的内容脚本:-test1项目test2:<<:* job_definition#合并'job_definition'别名的内容脚本:-test2项目
&
设置锚的名称(job_definition
),<<
表示“将给定的哈希合并到当前哈希中”,并且*
包含命名锚(job_definition
再一次)。扩展版如下所示:
.job_template:图像:ruby: 2.1服务:-postgres-复述,test1:图像:ruby: 2.1服务:-postgres-复述,脚本:-test1项目test2:图像:ruby: 2.1服务:-postgres-复述,脚本:-test2项目
我们来看另一个例子。这次我们将使用锚来定义两组服务。这将创造两个就业机会,测试:postgres
而且测试:mysql
,那就分享吧脚本
指令定义在.job_template
,以及服务
指令定义在.postgres_services
而且.mysql_services
分别为:
.job_template:&job_definition脚本:-测试项目.postgres_services:服务:&postgres_definition-postgres-鲁比(人名).mysql_services:服务:&mysql_definition-mysql-鲁比(人名)测试:postgres:<<:* job_definition服务:* postgres_definition测试:mysql:<<:* job_definition服务:* mysql_definition
扩展版如下所示:
.job_template:脚本:-测试项目.postgres_services:服务:-postgres-鲁比(人名).mysql_services:服务:-mysql-鲁比(人名)测试:postgres:脚本:-测试项目服务:-postgres-鲁比(人名)测试:mysql:脚本:-测试项目服务:-mysql-鲁比(人名)
可以看到隐藏键可以方便地用作模板。
触发器
触发器可以使用API调用强制重建特定的分支、标记或提交。
不工作
如果您的提交消息包含(ci跳过)
或(跳过ci)
,使用任何大写,提交将被创建,但管道将被跳过。
验证.gitlab-ci.yml
GitLab CI的每个实例都有一个称为Lint的嵌入式调试工具,用于验证您的脚本的内容.gitlab-ci.yml
文件。你可以在页面下面找到Lintci /线头
您的项目名称空间(例如,http://gitlab-example.com/gitlab-org/project-123/-/ci/lint
)
使用保留关键字
如果在使用特定值(例如,真正的
或假
),试着引用它们,或将它们转换成另一种形式(例如:/bin/true
).
例子
参观例子的自述查看使用各种语言使用GitLab CI的示例列表。