使用.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,可以用来为您的网站服务。它有一个特殊的语法,所以必须满足以下两个要求:

  1. 任何静态内容都必须放在公共/目录
  2. 工件的路径公共/必须定义目录

下面的示例简单地将所有文件从项目的根目录移动到公共/目录中。的学派变通办法是这样的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-在我的脚本之后执行这个

阶段

阶段用于定义作业可以使用的阶段,并且是全局定义的。

规格说明阶段允许有灵活的多级管道。元素的顺序阶段定义作业的执行顺序:

  1. 同一阶段的作业是并行运行的。
  2. 下一阶段的作业将在前一阶段的作业成功完成后运行。

让我们考虑下面的例子,它定义了三个阶段:

阶段-构建-测验-部署
  1. 首先,所有的工作构建并行执行。
  2. 如果所有的工作构建取得成功,测验作业是并行执行的。
  3. 如果所有的工作测验取得成功,部署作业是并行执行的。
  4. 如果所有的工作部署如果成功,则将提交标记为通过了
  5. 如果前面的任何作业失败,则将提交标记为失败的并且不执行进一步阶段的作业。

还有两种边缘情况值得一提:

  1. 如果没有阶段定义为.gitlab-ci.yml,则构建,测验而且部署默认情况下允许用作作业的阶段。
  2. 如果作业没有指定阶段,工作是分配的测验阶段。

阶段

阶段是按作业定义的,依赖于阶段是全局定义的。它允许将作业分组到不同的阶段,以及相同的作业阶段平行.例如:

阶段-构建-测验-部署工作1阶段构建脚本构建依赖项工作2阶段构建脚本制作构建构件工作3阶段测验脚本做测试工作4阶段部署脚本使部署

类型

警告:弃用:类型已弃用,并可能在未来的版本中删除。使用阶段代替。

脚本

脚本是一份工作所需要的唯一关键字。它是一个shell脚本,由Runner执行。例如:

工作脚本执行rspec”

该参数也可以包含使用数组的几个命令:

工作脚本-uname --捆绑执行规范

有时,脚本命令需要用单引号或双引号括起来。例如,包含冒号()需要用引号括起来,以便YAML解析器知道将整个内容解释为字符串,而不是“key: value”对。使用特殊字符时要小心:,,,,,,,,,,?,|,-,<,>,,,,@,

只有而且除了(简化)

只有而且除了是两个参数,用于设置作业策略以限制创建作业的时间:

  1. 只有定义作业将为其运行的分支和标记的名称。
  2. 除了定义作业将要处理的分支和标记的名称运行。

这里有一些规则适用于工作策略的使用:

  • 只有而且除了是包容。如果两个只有而且除了在工作规范中定义,引用是由只有而且除了
  • 只有而且除了允许使用正则表达式。
  • 只有而且除了允许指定一个存储库路径来为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

用于实现在失败或即使失败也要运行的作业。

可以设置为以下值之一:

  1. on_success-仅当前一阶段的所有任务都成功时才执行job。这是默认值。
  2. on_failure—仅当前一阶段至少有一个作业失败时才执行job。
  3. 总是-不考虑前一阶段作业的状态,执行job。
  4. 手册-手动执行job(在GitLab 8.10中添加)。读到手动操作在下面。

例如:

阶段-构建-cleanup_build-测验-部署-清理build_job阶段构建脚本-使构建cleanup_build_job阶段cleanup_build脚本-失败时清理构建on_failuretest_job阶段测验脚本-做测试deploy_job阶段部署脚本-使部署手册cleanup_job阶段清理脚本-工作后的清理工作总是

上面的脚本将:

  1. 执行cleanup_build_job只有当build_job失败。
  2. 一直执行cleanup_job作为流水线上的最后一步,无论成败。
  3. 允许您手动执行deploy_job从GitLab的UI。

当:手动

注:

  • 在GitLab 8.10中引入。
  • 在GitLab 9.0中引入了阻塞手动操作。
  • 在GitLab 9.2中引入了保护操作。

手动操作是一种特殊类型的作业,不是自动执行的,它们需要由用户显式地启动。手动操作的一个示例是部署到生产环境。手动操作可以从管道、作业、环境和部署视图启动。欲知详情,请浏览环境的文档

手动操作可以是可选的,也可以是阻塞的。阻塞手动操作将在定义此操作的阶段阻塞管道的执行。当某人通过单击来执行阻塞手动操作时,可以恢复管道的执行按钮。

当管道被阻塞时,如果设置“当管道成功时合并”,则不会合并该管道。阻塞的管道也有一种特殊的状态,叫做手册.默认情况下,手动操作是非阻塞的。如果要做手动动作阻拦,则需要添加allow_failure:假工作的定义.gitlab-ci.yml

可选的手动操作具有allow_failure:真默认设置,并且它们的状态不影响整个管道状态。因此,如果手动操作失败,管道最终将成功。

手动操作被认为是写操作,因此受保护的分支当用户想要触发一个动作时使用。换句话说,为了触发分配给管道正在为之运行的分支的手动操作,用户需要具备合并到该分支的能力。

环境

注:

环境用于定义作业部署到特定环境。如果环境且该名称下的环境不存在,则将自动创建一个新环境。

最简单的形式是环境关键字可以这样定义:

部署到生产环境阶段部署脚本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环境名字生产urlhttps://prod.example.com

环境:on_stop

注:

  • 介绍了在GitLab 8.13中。
  • 从GitLab 8.14开始,当你有一个定义了停止动作的环境时,当关联的分支被删除时,GitLab将自动触发一个停止动作。

封闭(回采)环境可以通过on_stop定义的关键字环境.它声明了一个不同的作业来关闭环境。

读了环境:行动部分的示例。

环境:行动

介绍了在GitLab 8.13中。

行动关键字是要与on_stop并且在被调用来关闭环境的作业中定义。

举个例子:

review_app阶段部署脚本使deploy-app环境名字审查on_stopstop_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以便在删除分支时环境自动停止

动态的环境

注:

  • 介绍了在GitLab 8.12和GitLab Runner 1.6中。
  • CI_ENVIRONMENT_SLUG美元介绍了在GitLab 8.15中。
  • 名字而且url参数可以使用任何已定义的CI变量,包括预定义的安全变量和.gitlab-ci.yml变量.但是不能使用下面定义的变量脚本

例如:

部署为评论应用程序阶段部署脚本使部署环境名字审查/ $ CI_COMMIT_REF_NAMEurlhttps:// 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开始,缓存将在之前恢复工件

提示:了解更多:阅读缓存是如何工作的,并找到一些好的实践缓存依赖项文档

缓存用于指定应在作业之间缓存的文件和目录列表。您只能使用项目工作区中的路径。

如果缓存定义在作业范围之外,这意味着它是全局设置的,所有作业都将使用该定义。

缓存:路径

使用路径指令来选择哪些文件或目录将被缓存。通配符也可以使用。

缓存所有文件二进制文件结束于. apkconfig文件:

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中引入。

工件:当用于在作业失败或尽管出现失败时上传工件。

工件:当可以设置为以下值之一:

  1. on_success—任务成功后才上传工件。这是默认值。
  2. on_failure—仅在任务失败时上传工件。
  3. 总是-无论作业状态如何,都可以上传工件。

仅在作业失败时上传工件:

工作工件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_in1周

依赖关系

在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_URLpostgres: / / 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_ATTEMPTS3.

中的全局设置或每个作业设置变量部分。

浅克隆

在GitLab 8.9中作为实验特性引入。可能会在以后的版本中更改或完全删除。

您可以使用指定获取和克隆的深度GIT_DEPTH.这允许对存储库进行浅克隆,这可以显著加快具有大量提交或旧的大型二进制文件的存储库的克隆速度。该值被传递给git获取而且git克隆

注意:如果使用深度为1,并且有一个作业队列或重试作业,则作业可能会失败。

因为Git的抓取和克隆是基于引用的,比如分支名,所以运行者不能克隆一个特定的提交SHA。如果队列中有多个作业,或者您正在重试一个旧作业,那么要测试的提交需要在克隆的Git历史记录中。设置的值太小GIT_DEPTH可以使这些旧的提交无法运行。你会看到未解决的参考在作业日志中。然后你应该重新考虑改变GIT_DEPTH到一个更高的值。

依赖于git描述什么时候可能不能正常工作GIT_DEPTH因为只显示了部分Git历史。

只获取或克隆最后3次提交:

变量GIT_DEPTH3”

方法中的全局设置或每个作业设置变量部分。

特殊的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的示例列表。

Baidu
map