Gitlab CI/CD管道配置参考
在每个项目中,使用名为.gitlab-ci.yml的yaml文件配置Gitlab CI/CD管道。
.gitlab-ci.yml文件定义了管道的结构和顺序,并确定:
使用Gitlab Runner执行什么。
遇到特殊情况时要做什么决定?例如,当一个进程成功或失败时。
本主题介绍CI/CD管道配置。有关其他CI/CD配置信息,请参阅:
Gitlab CI/CD变量,用于配置管道运行的环境。
Gitlab Runner高级配置,用于配置Gitlab Runner。
我们有配置管道的完整示例:
要快速介绍Gitlab CI,请遵循我们的快速入门指南。
有关示例的集合,请参见Gitlab CI/CD示例。
要查看企业中使用的大型.gitlab-ci.yml文件,请参见gitlab ce的.gitlab-ci.yml文件。
如果你有一个镜像存储库,其中有gitlab,你可能需要在项目的Settings > Repository > Pull from a remote repository > Trigger镜像更新管道。
1. 介绍
管道配置从job开始。jobs是.gitlab-ci.yml文件最基本的元素。
工作包括:
定义了在什么条件下应该执行它们的约束。
具有任意名称的顶级元素,必须至少包含script子句。
不限于可定义的数量。
例如:
job1: |
上面的示例是最简单的CI/CD配置,有两个独立的job,其中每个job执行不同的命令。当然,命令可以直接执行代码(./configure;make;make install)或者在存储库中运行script(test.sh)。
工作由Runners挑选并在Runner的环境。重要的是,每个job都在运行彼此独立。
2. 验证 .gitlab-ci.yml
Gitlab CI的每个实例都有一个名为lint的嵌入式调试工具,用于验证.gitlab-ci.yml文件的内容。您可以在您的页面ci/lint下找到lint。项目命名空间。例如,https://gitlab.example.com/gitlab-org/project-123//ci/lint。
3. Unavailable names for jobs
每个job必须有一个唯一的名称,但有一些保留的关键字不能用作job名称:
image |
4. 使用保留关键字
如果在使用特定值(例如,true or false)时出现验证错误,请尝试:
–引用它们。
–将它们更改为其他形式。例如,/bin/true。
5. 配置参数
job定义为定义job行为的参数列表。
下表列出了job的可用参数:
Keyword | 描述 |
script | 由运行程序执行的shell脚本。 |
image | 使用Docker图像。还提供:image:name和image:entrypoint。 |
services | 使用Docker服务图像。还提供:services:name、services:alias、services:entrypoint和services:command。 |
before_script | 重写在job之前执行的一组命令。 |
after_script | 重写在job后执行的一组命令。 |
stages | 定义管道中的阶段。 |
stage | 定义job阶段(default: test)。 |
only | 限制创建 when jobs。还可用:only:refs,only:kubernetes,only:variables,only:changes。 |
except | 限制未创建 when jobs。还可用:except:refs,except:kubernetes,except:variables和except:changes。 |
tags | 用于选择运行程序的标记列表。 |
allow_failure | 允许job失败。失败的job不影响提交状态。 |
when | 何时运行job。还可用:when:manual and when:delayed。 |
environment | job部署到的环境的名称。还可用:environment:name, environment:url, environment:on_stop, and environment:action. |
cache | 在后续运行之间应缓存的文件列表。还可用:cache:paths, cache:key, cache:untracked, and cache:policy.。 |
artifacts | 成功时要附加到job的文件和目录列表。还可用:artifacts:paths, artifacts:name, artifacts:untracked, artifacts:when, artifacts:expire_in, artifacts:reports, and artifacts:reports:junit。在Gitlab企业版中,这些可用:artifacts:reports:codequality, artifacts:reports:sast, artifacts:reports:dependency_scanning, artifacts:reports:container_scanning, artifacts:reports:dast, artifacts:reports:license_management, artifacts:reports:performance and artifacts:reports:metrics。 |
dependencies | job所依赖的其他job,以便在它们之间传递artifacts。 |
coverage | 给定job的代码覆盖率设置。 |
retry | 如果出现故障,一个job可以自动重试的时间和次数。 |
parallel | 一个job应并行运行多少个实例。 |
trigger | 定义下游管道触发器。 |
include | 允许此job包含外部yaml文件。还提供:include:local、include:file、include:template和include:remote。 |
extends | 此job将从中继承的配置项。 |
pages | 上载job的结果以用于Gitlab页面。 |
variables | 在job级别定义job变量。 |
NOTE: Note:Parameters types and type are deprecated.(弃用)
6. 设置默认参数
某些参数可以全局设置为所有job的默认值,使用默认值:关键字。然后,默认参数可以被特定于job的参数覆盖配置。
可以在默认块内定义以下job参数:
image |
在下面的示例中,ruby:2.5图像被设置为所有图像的默认值。job,rspec 2.6job除外,它使用ruby:2.6映像:
default: |
7. 参数详细信息
以下是用于配置CI/CD管道的参数的详细说明。
7.1. script
script是job所需的唯一关键字。这是一个shellscript由运行程序执行。例如:
job: |
此参数还可以包含使用数组的多个命令:
job: |
有时,script命令需要用单引号或双引号括起来。例如,包含冒号(:)的命令需要用引号括起来,因此yaml解析器知道将整个事件解释为字符串而不是“key:value”对。使用特殊字符时要小心:
:, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, `.
7.2. image
用于指定要用于job的Docker映像。
用于:
简单定义示例,请参见从.gitlab-ci.yml定义图像和服务。
详细使用信息,请参阅Docker集成文档。
image:name
有关详细信息,请参阅图像的可用设置。
image:entrypoint
扩展Docker配置选项。
有关详细信息,请参阅图像的可用设置。
7.3. services
用于指定服务Docker映像,链接到映像中指定的基映像。
用于:
简单定义示例,请参见从.gitlab-ci.yml定义图像和服务。
详细使用信息,请参阅Docker集成文档。
services:name
扩展Docker配置选项。有关详细信息, 请参阅“服务的可用设置”。
services:alias
扩展Docker配置选项。有关详细信息,请参阅“服务的可用设置”。
services:entrypoint
扩展Docker配置选项。有关详细信息,请参阅“服务的可用设置”。
services:command
扩展Docker配置选项。有关详细信息,请参阅“服务的可用设置”。
7.4. before_script / after_script
before_script用于定义应在所有命令之前运行的命令job,包括部署job,但在恢复artifacts之后。这可以是一个数组或多行字符串。
after_script用于定义将要运行的命令job,包括失败的job。这必须是一个数组或多行字符串。
在before_script指定的script是:
与主script中指定的script连接。工作级别在script定义之前覆盖全局级别在script定义之前与script定义连接时。
与主scriptscript一起在单个shell中作为一个script执行上下文。
after_script指定的script:
将当前工作目录设置回默认值。
在与script和script之前分开的shell上下文中执行script。
由于上下文分隔,无法查看定义的script所做的更改在“script”或“before_script”,请执行以下操作之一:
在外壳中。例如,script中导出的命令别名和变量script。
在工作树之外(取决于运行者执行者)。例如,由before_script或scriptscript安装的软件。
可以覆盖在script之前和之后定义的全局,如果按job设置:
default: |
7.5. stages
stages用于全局定义job可以使用的阶段
stages的规格允许有灵活的多级管道。stages中元素的顺序定义了job执行的顺序:
同一阶段的job并行运行。
下一阶段的job在上一阶段的job之后运行成功完成。
让我们考虑下面的例子,它定义了3个阶段:
stages: |
首先,build的所有job都是并行执行的。
如果build的所有job都成功,则test job将并行执行。
如果test的所有job都成功,则deploy job将并行执行。
如果Deploy的所有job都成功,则提交标记为通过。
如果以前的任何job失败,提交将标记为失败,并且不
执行下一阶段的工作。
还有两个边缘案例值得一提:
如果在.gitlab-ci.yml中没有定义阶段,默认情况下,build, test and deploy用作job的阶段。
如果job未指定阶段,则该job将被分配到test阶段。
7.6. stage
stage是定义单个job,并依赖于全局的stages。它允许将job分组到不同的阶段,并且相同的job阶段是并行执行的(取决于某些条件)。例如:
stages: |
Using your own Runners
使用自己的运行程序时,默认情况下,Gitlab运行程序一次只运行一个job(请参见运行程序全局设置中的并发标志)。
只有在以下情况下,job才会并行运行:
在不同程序上运行
运行程序的并发设置已更改。
7.7. only/except (basic)
only和except两个参数将job策略设置为限制创建的job:
only定义要为其运行job的分支和标记的名称。
except定义排除的job
有一些规则适用于job策略的使用:
only和except是包容性的。如果只定义only和except在job规范中,引用only由和except。
only和except允许使用正则表达式(支持的regexp语法)。
only和except允许指定用于筛选job的存储库路径分支。
此外,only和except情况允许使用特殊关键字:
Value | 描述 |
branches | 当管道的Git引用是分支时。 |
tags | 当管道的Git引用是标记时。 |
api | 当管道被第二个管道API触发时(而不是触发API)。 |
external | 使用Gitlab以外的CI服务时。 |
pipelines | 对于多项目触发器,使用带有CI_JOB_TOKEN的API创建的。 |
pushes | 管道由用户的git push触发。 |
schedules | 用于计划的管道。 |
triggers | 用于使用触发器标记创建的管道。 |
web | 对于使用Gitlab UI中的“运行管道”按钮创建的管道(在项目的管道下)。 |
merge_requests | 创建或更新合并请求时(有关合并请求,请参阅管道)。 |
chats | 对于使用gitlab chatops命令创建的job。 |
在下面的示例中,job将仅对以问题-开头的引用运行,鉴于将跳过所有分支:
job: |
默认情况下,模式匹配区分大小写。使用i标志修饰符,如/pattern/i使模式不区分大小写:
job: |
在本例中,job将仅对标记的引用运行,或者如果通过API触发器或管道计划显式请求生成:
job: |
存储库路径只能用于执行父存储库的job,而不能用于分叉:
job: |
上面的示例将为gitlab-org/gitlab-ce上的所有分支运行job,master和以release/作为前缀的分支除外。
only默认值:’’branches’、’tags’]
except默认值为空。
例如,
job: |
转换为:
job: |
Regular expressions
因为@用于表示引用存储库路径的开头,匹配正则表达式中包含@字符的引用名称需要使用十六进制字符代码match \x40。
只有标记或分支名称才能与正则表达式匹配。如果给定存储库路径,则始终按字面匹配。
如果使用正则表达式来匹配标记或分支名称,模式的整个引用名称部分必须是正则表达式,必须用/包围。(在结束/后附加正则表达式标志)因此,问题-/.*/无法匹配所有标记名或分支名从问题开始。
使用锚^和$避免正则表达式只匹配标记名或分支名的子字符串。例如,/^issue-.$/等于/^issue-/,而just/issue/也将匹配一个称为严重问题的分支。
Supported only/except regexp syntax
警告:警告:这是Gitlab 11.9.4引入的突破性变化。
在Gitlab 11.9.4中,Gitlab开始内部转换使用的regexp仅限RE2和RE2的参数。
这意味着只有RubyRegexp提供的特性的子集支持。RE2限制了功能集由于计算的复杂性,这意味着一些特性在Gitlab 11.9.4中变得不可用。例如,负数lookaheads。
对于11.9.7到Gitlab 12.0的Gitlab版本,Gitlab提供了一个可以由管理员启用,允许用户使用不安全的regexp语法。这带来了兼容性使用以前允许的语法版本,并允许用户优雅地迁移到新语法。
Feature.enable(:allow_unsafe_ruby_regexp) |
7.8. only/except (advanced)高级
警告:警告:这是一个alpha功能,随时可能更改,恕不另行通知!
Gitlab支持简单和复杂的策略,因此可以使用数组和哈希配置方案。
有四把钥匙:
refs |
If you use multiple keys under only or except, they act as an AND. The logic is:
(any of refs) AND (any of variables) AND (any of changes) AND (if kubernetes is active)
only:refs/except:refs
refs策略可以采用与仅简化/例外配置相同的值。
在下面的示例中,只有在为主分支计划管道或运行管道时,才会创建部署job:
deploy: |
only:kubernetes/except:kubernetes
kubernetes策略只接受活动关键字。
在下面的示例中,只有当项目中的kubernetes服务处于活动状态时,才会创建部署job:
deploy: |
only:variables/except:variables
variables关键字用于定义变量表达式。换句话说,您可以使用预定义的变量/project/group或环境范围的变量来定义一个表达式gitlab将要评估,以决定是否应该创建一个job。
使用变量表达式的示例:
deploy: |
另一个用例是根据提交消息排除job:
end-to-end: |
Learn more about variables expressions.
only:changes/except:changes
使用changes关键字only或except可以定义是否应基于Git push事件修改的文件创建job。
For example:
docker build: |
在上面的场景中,将多个提交推送到Gitlab时,分支,Gitlab创建并触发Docker构建job,前提是提交包含对以下任一项的更改:
Dockerfile文件。
docker/scripts/directory中的任何文件。
dockerfiles目录中的任何文件和子目录。
more_scripts目录中任何具有rb、py、sh扩展名的文件。
您还可以使用glob模式来匹配repo根目录或repo中的任何目录中的多个文件。例如:
test: |
在上面的示例中,表达式被双引号括起来,因为它们是全局模式。Gitlab将无法解析带有未封装的glob模式的.gitlab-ci.yml文件。
如果在repo根目录下扩展名为.md的任何文件中检测到更改,则以下示例将跳过CIjob:
build: |
警告:警告:在将此功能与新的分支和标记一起使用时,需要注意一些事项。请参阅下面的部分。
使用带有新分支和标记的更改
在将新分支或新标记推送到Gitlab时,,策略的计算结果始终为true,Gitlab将创建job。此功能尚未与合并请求连接,并且,由于Gitlab正在创建管道,用户才能创建合并请求,因此此时目标分支的位置未知。
对合并请求使用更改
对于合并请求的管道,可以根据合并请求中修改的文件定义要创建的job。
For example:
docker build service one: |
在上面的场景中,如果创建或更新合并请求以更改service one目录或dockerfile中的文件,那么gitlab将创建并触发docker build service onejob。
7.9. tags
tags用于从允许运行此项目的所有运行者列表中选择特定的运行者。
在注册运行程序期间,可以指定运行程序的tags,例如ruby、postgres、development。
tags允许您使用分配了指定tags的运行者运行job:
job: |
上面的规范将确保job由同时定义了ruby和postgres标记的运行程序构建。
标签也是在不同平台上运行不同job的好方法,例如,给定一个带有标签OSX的OSX运行程序和带有标签的Windows运行程序Windows,以下job在各自的平台上运行:
windows job: |
7.10. allow_failure
允许失败允许job失败而不影响CI套件的其余部分。默认值为假,手动job除外。
当启用并且job失败时,该job将在用户界面中显示橙色警告。但是,管道的逻辑流会将job视为成功/通过,并且不会被阻塞。
假设所有其他job都成功,则job的阶段及其管道将显示相同的橙色警告。但是,关联的提交将被标记为“通过”,没有警告。
在下面的示例中,job1和job2将并行运行,但如果job1失败,则不会停止下一阶段的运行,因为它标记为allow_failure:true:
job1: |
7.11. when
用于实现在失败或失败时运行的job。
when可以设置为以下值之一:
on_success-仅当先前阶段的所有job成功时执行job(或由于标记为“允许失败”而被视为成功)。这是默认设置。
on_failure-仅当先前阶段中的至少一个job失败时才执行job。
always-执行job,而不管先前阶段的job状态如何。
manual-手动执行job(在Gitlab 8.10中添加)。阅读下面的手动操作 。
For example:
stages: |
上面的脚本将:
仅当build_job失败时才执行cleanup_build_job。
始终在最后执行cleanup_job而不管成功或失败。
允许您从Gitlab的用户界面手动执行Deploy_job。
when:manual
手动操作是一种特殊类型的job,不能自动执行,需要由用户显式启动。手动操作的一个示例用法是部署到生产环境。可以从管道、job、环境和部署视图启动手动操作。Read more at the
environments documentation.
手动操作可以是可选的,也可以是阻塞的。阻止手动操作将在定义此操作的阶段阻止管道的执行。它是当有人通过单击播放按钮执行阻止手动操作时,可以恢复管道的执行。
当管道被阻塞时,如果设置了“管道成功时合并”,则不会合并管道。阻塞的管道也有一个特殊的状态,称为手动。默认情况下,手动操作是非阻塞的。如果要进行手动操作阻止,则必须在.gitlab-ci.yml中的job定义中添加allow_failure:false。
可选的手动操作默认情况下allow_failure: true,其状态不会影响整个管道状态。因此,如果手动操作失败,管道最终会成功。
手动操作被认为是写操作,因此当用户希望触发操作时,将使用受保护分支的权限。换句话说,为了触发分配给正在运行管道的分支的手动操作,用户需要能够合并到此分支。
when:delayed
延迟job用于在一段时间后执行脚本。如果希望避免job立即进入挂起状态,则此操作非常有用。
您可以用start_in键设置周期。除非提供了一个单位,否则start_in key的值是以秒为单位的已用时间,并且时间必须小于或等于一小时。例如:
10 seconds |
当某个阶段中存在延迟job时,管道将不会进行,直到延迟job完成。这意味着这个关键字也可以用于在不同阶段之间插入延迟。
延迟job的计时器在上一阶段完成后立即启动。与其他类型的job类似,延迟job的计时器将不会启动,除非上一阶段已通过。
下面的示例创建一个名为Timed Rollow 10%的job,该job在上一阶段完成30分钟后执行:
timed rollout 10%: |
通过单击Unschedule按钮,可以停止延迟job的活动计时器。除非手动执行该job,否则将来永远不会执行该job。
您可以通过单击“播放”按钮立即启动延迟的job。Gitlab Runner将很快选择您的工作并开始工作。
7.12. environment
environment用于定义job部署到特定环境。如果指定了environment,并且该名称下不存在任何环境,则将自动创建一个新的环境。
在其最简单的形式中,environment关键字的定义如下:
deploy to production: |
在上面的示例中,部署到生产job将标记为对生产环境进行部署。
environment:name
The environment name can contain:
letters |
常见的名称有qa, staging, and production,但是您可以将任何名称用于您的工作流。
除了在environment关键字后定义环境名称,还可以将其定义为单独的值。为此,请在环境下使用name关键字:
deploy to production: |
environment:url
这是一个可选值,设置后,它会在Gitlab中的不同位置显示按钮,单击该按钮会将您带到定义的URL。
在下面的示例中,如果job成功完成,它将在合并请求和环境/部署页面中创建按钮,这些页面将指向https://prod.example.com。
deploy to production: |
environment:on_stop
关闭(停止)环境可以通过在environment下定义的on-stop关键字来实现。它声明了一个不同的job,该job运行的目的是关闭环境。
例如,请阅读environment:action部分。
environment:action
action关键字将与on_stop一起使用,并在调用以关闭环境的job中定义。
例如:
review_app: |
在上面的示例中,我们设置了review-appjob以部署到review环境中,并且在on-stop下定义了一个新的stop-review-appjob。一旦review_app完成,它将根据“when”下定义的内容触发stop_review_app。在本例中,我们将其设置为手动,以便它需要通过Gitlab的Web界面进行手动操作才能运行。
同样在这个例子中,GIT_STRATEGY被设置为“none”,这样当自动触发stop_review_app时,Gitlab Runner不会在删除分支后尝试check out代码。
stop_review_app需要定义以下关键字:
when - reference |
动态环境
For example:
deploy as review app: |
deploy as review app将标记为deployment,以动态创建review/$CI_COMMIT_REF_NAME环境,其中$CI_COMMIT_REF_NAME是运行程序设置的环境变量。$CI_ENVIRONMENT_SLUG变量基于环境名称,但适合包含在URL中。在这种情况下,如果在名为pow的分支中运行deploy as review app,则可以使用类似https://review pow.example.com/的URL访问此环境。
当然,这意味着承载应用程序的底层服务器配置正确。
常见的用例是为分支创建动态环境,并将它们用作审查应用程序。您可以在https://gitlab.com/gitlab-examples/review-apps-nginx/上看到一个使用review-apps的简单示例。
7.13. cache
TIP: Learn more:Read how caching works and find out some good practices in the caching dependencies documentation.cache用于指定应在job之间缓存的文件和目录的列表。只能使用项目工作区内的路径。
如果cache是在job范围之外定义的,则意味着它是全局设置的,所有job都将使用该定义。
cache:paths
使用paths指令选择将缓存哪些文件或目录。可以使用通配符跟踪glob模式和filepath.match。
缓存以.apk和.config文件结尾的二进制文件中的所有文件:
rspec: |
本地定义的缓存覆盖全局定义的选项。以下rspecjob将只缓存二进制文件/:
cache: |
请注意,由于缓存是在job之间共享的,如果您对不同的job使用不同的路径,则还应设置不同的cache:key,否则缓存内容会被覆盖。
cache:key
由于缓存是在job之间共享的,如果您对不同的job使用不同的路径,则还应设置不同的cache:key,否则缓存内容会被覆盖。
key指令允许您定义job之间缓存的关联性,允许为所有job都有一个缓存、每个job缓存、每个分支缓存。或者其他适合您工作流程的方式。通过这种方式,您可以微调缓存,允许您在不同的job之间甚至不同的分支之间缓存数据。
cache:key变量可以使用任何预定义的变量,如果没有设置默认键,则它只是文字默认值,这意味着默认情况下,从gitlab 9.0开始,每个管道和job之间共享所有内容。
cache:key变量不能包含/字符,或者编码为%2f的等效URI;也禁止使用仅由点(.,%2e)构成的值。
例如,要启用每个分支缓存:
cache: |
如果使用Windows批处理运行shell脚本,则需要将$替换为%:
cache: |
cache:untracked
set untracked:true缓存Git存储库中所有未跟踪的文件:
rspec: |
缓存binaries下的所有Git未跟踪文件和文件:
rspec: |
cache:policy
缓存job的默认行为是在执行开始时下载文件,并在结束时重新上传文件。这允许为将来的运行保留job所做的任何更改,称为pull-push缓存策略。
如果知道job不会更改缓存文件,可以通过设置policy:pull来跳过上传步骤。通常,这将与早期阶段的普通缓存job成对出现,以确保缓存不时更新:
stages: |
这有助于加快job执行速度并减少缓存服务器上的负载,特别是当您有大量的缓存使用并行执行的job时。
此外,如果有一个job无条件地重新创建缓存而不引用其先前的内容,则可以使用policy: push跳过下载步骤。
7.14. artifacts
artifacts用于指定在job成功、失败或总是失败时应附加到该job的文件和目录列表。
artifacts将在job完成后发送到Gitlab,并可在Gitlab UI中下载。
Read more about artifacts.
artifacts:paths
只能使用项目工作区内的路径。可以使用通配符跟踪glob模式和filepath.match。
要在不同job之间传递artifacts,see dependencies.。
发送binaries and .config:下所有文件:
artifacts: |
要禁用artifacts传递,请使用dependencies: []
job: |
您可能希望只为tags的版本创建artifacts,以避免用临时的artifacts填充构建服务器存储。
仅为tags创建artifacts(default-job不会创建artifacts):
default-job: |
artifacts:name
name指令允许您定义创建的artifacts存档的名称。这样,当您想从Gitlab下载归档文件时,每个归档文件都可以有一个唯一的名称。artifacts:name变量可以使用任何预定义的变量。默认名称为artifacts,下载时将变为artifacts.zip。
如果您的分支名称包含正斜杠(例如feature/my feature),建议使用$ci-commit-ref-slug而不是$ci-commit-ref-name来正确命名artifacts。
要使用当前job的名称创建存档,请执行以下操作:
job: |
要使用当前分支或标记的名称(仅包括binaries文件夹)创建存档,请执行以下操作:
job: |
要使用当前job的名称和当前分支或标记(仅包括binaries文件夹)创建存档,请执行以下操作:
job: |
要创建具有当前阶段名称和分支名称的存档,请执行以下操作:
job: |
如果使用Windows批处理运行shell脚本,则需要将$替换为%:
job: |
如果使用Windows PowerShell运行shell脚本,则需要将$替换为$env::
job: |
artifacts:untracked
artifacts:untracked用于将所有git未跟踪文件添加为artifacts(沿着artifacts:paths中定义的路径)。
artifacts:untracked忽略存储库的.gitignore文件中的配置。
发送所有git未跟踪文件:
artifacts: |
发送所有git未跟踪文件和二进制文件:
artifacts: |
artifacts:when
artifacts:when用于在job失败或尽管失败时上载artifacts的时间。
artifacts:when可以设置为以下值之一:
on_success-仅当job成功时上载artifacts。这是默认设置。
on_failure-仅当job失败时才上载artifacts。
always-上载artifacts,不管job状态如何。
仅当job失败时上载项目:
job: |
artifacts:expire_in
expire_-in允许您指定artifacts在过期之前应该存在多长时间,从而从它们上传和存储到Gitlab的时间开始删除。如果未定义到期时间,则默认为实例范围的设置。(默认为30天,永远在gitlab.com上)。
您可以使用“job”页上的“保留”按钮来覆盖过期时间并永久保留项目。
过期后,artifacts默认每小时删除一次(通过cronjob),并且不再可访问。
expire_in的值是以秒为单位的已用时间,除非提供了一个单位。可分析值示例:
'42' |
要在上载后1周使项目过期,请执行以下操作:
job: |
artifacts:reports
reports关键字用于从job收集测试报告并在Gitlab的UI(合并请求、管道视图)中公开它们。阅读如何将其与JUnit报告一起使用。
无论job结果如何(成功或失败),都会收集测试报告。您可以使用artifacts:expire\u来设置其artifacts的到期日期。
如果还希望能够浏览报告输出文件,请包含artifacts:paths关键字。
artifacts:reports:junit
JUnit报告将JUnit XML文件收集为artifacts。虽然JUnit最初是在爪哇开发的,但是有许多其他第三方端口,如yml、Python、Ruby等。
有关更多详细信息和示例,请参阅JUnit测试报告。下面是从Ruby的rspec测试工具收集JUnit XML文件的示例:
rspec: |
收集到的JUnit报告将作为artifacts上传到Gitlab,并将自动显示在合并请求中。
如果JUnit工具使用导出到多个XML文件,则可以在一个job中指定多个测试报告路径,这些路径将自动连接到一个文件中。使用文件名模式(junit:rspec-.xml)、文件名数组(junit:[rspec-1.xml、rspec-2.xml、rspec-3.xml])或其组合(junit:[rspec.xml,测试结果/test-.xml])。
artifacts:reports:codequality (STARTER)
代码质量报告将代码质量问题收集为artifacts。
收集的代码质量报告将作为artifacts上传到Gitlab,并将自动显示在合并请求中。
artifacts:reports:sast (ULTIMATE)终极
sast报告将sast漏洞收集为artifacts。
收集的SAST报告将作为artifacts上传到Gitlab,并将自动显示在合并请求、管道视图中,并为安全仪表盘提供数据。
artifacts:reports:dependency_scanning (ULTIMATE)终极
依赖项扫描报告将依赖项扫描漏洞收集为artifacts。
收集到的依赖项扫描报告将作为artifacts上载到Gitlab,并将自动显示在合并请求、管道视图中,并为安全仪表板提供数据。
artifacts:reports:container_scanning (ULTIMATE)
容器扫描报告将容器扫描漏洞收集为artifacts。
收集的容器扫描报告将作为一个artifacts上载到Gitlab,并将自动显示在合并请求、管道视图中,并为安全仪表板提供数据。
artifacts:reports:dast (ULTIMATE)
DAST报告将DAST漏洞收集为artifacts。
收集的DAST报告将作为artifacts上传到Gitlab,并将自动显示在合并请求、管道视图中,并为安全仪表盘提供数据。
artifacts:reports:license_management (ULTIMATE)
许可证管理报告将许可证作为artifacts收集。
收集的许可证管理报告将作为一个artifacts上载到Gitlab,并将自动显示在合并请求、管道视图中,并为安全仪表盘提供数据。
artifacts:reports:performance (PREMIUM)
性能报告将性能指标收集为artifacts。
收集到的性能报告将作为artifacts上传到Gitlab,并将自动显示在合并请求中。
artifacts:reports:metrics (PREMIUM)
性能报告将性能指标收集为artifacts。
收集到的性能报告将作为artifacts上传到Gitlab,并将自动显示在合并请求中。
artifacts:reports:metrics (PREMIUM)
度量报告将度量收集为artifacts。
收集的度量报告将作为artifacts上传到Gitlab,并将自动显示在合并请求中。
7.15. dependencies
此功能应该与artifacts一起使用,并允许您定义要在不同job之间传递的artifacts。
请注意,默认情况下,来自所有先前阶段的artifacts都会被传递。
若要使用此功能,请在job的上下文中定义依赖项,并传递一个列表,其中列出了应从中下载artifacts的所有先前job。只能从当前job之前执行的阶段定义job。如果从当前阶段或下一阶段定义job,将显示一个错误。
定义空数组将跳过下载该job的任何artifacts。使用依赖项时不考虑上一个job的状态,因此如果它失败或是未运行的手动job,则不会发生错误。
在下面的示例中,我们用artifacts定义了两个job,build:osx和build:linux。执行test:osx时,来自build:osx的artifacts
将在生成上下文中下载和提取。对于test:linux和build:linux中的artifacts也是如此。
由于阶段优先,job部署将从所有以前的job下载项目:
build:osx: |
When a dependent job will fail
如果设置为依赖项的job的artifacts已过期或清除,则依赖job将失败。
您可以要求管理员翻转此开关并恢复旧行为。
7.16. coverage
Coverage允许您配置如何从job输出中提取代码覆盖率。
正则表达式是此处唯一有效的值类型。因此,为了一致和显式地表示正则表达式字符串,必须使用环绕/。如果你想从字面上匹配特殊字符,你必须转义它们。
A simple example:
job1: |
7.17. retry
重试”允许您配置一个job在发生故障时将重试多少次。
当一个job失败并配置了重试时,它将被再次处理到retry关键字指定的次数。
如果retry设置为2,并且job在第二次运行(第一次重试)中成功,则不会重试。
再一次。重试值必须是一个正整数,等于或大于0,但小于或等于2(最多两次重试,总共三次)。
在所有故障情况下重试的简单示例:
test: |
默认情况下,将在所有失败情况下重试job。要更好地控制重试失败的次数,retry可以是具有以下键的哈希:
max:最大重试次数。
when:失败的案例要重试。
要最多重试两次运行程序系统故障,请执行以下操作:
test: |
如果存在除运行程序系统故障以外的其他故障,则不会重试job。
要在多个故障情况下重试,时间也可以是一个故障数组:
test: |
Possible values for when are:
always:在出现任何故障时重试(默认)。
unknown_failure:失败原因未知时重试。
script_failure:当脚本失败时重试。
api_failure:在api失败时重试。
stuck_or_timeout_failure:当job卡住或超时时重试。
runner_system_failure:如果运行程序系统故障(例如设置job失败),请重试。
missing_dependency_failure:如果缺少依赖项,请重试。
runner_unsupported:如果运行程序不受支持,请重试。
7.18. parallel
Parallel允许您配置要并行运行的job实例数。该值必须大于或等于两(2)且小于或等于50。
这将创建并行运行的同一job的n个实例。它们按顺序从job_name 1/n到job_name n/n命名。
对于每个job,都会设置CI_NODE_INDEX and CI_NODE_TOTAL environment variables。
一个简单的例子:
test: |
跨并行job并行化测试套件。不同的语言有不同的工具来促进这一点。
7.19. trigger (PREMIUM)
trigger允许您定义下游管道trigger。当从trigger定义创建的job由Gitlab启动时,将创建下游管道。
Learn more about multi-project pipelines.
简单触发器语法
配置下游触发器以使用具有下游项目完整路径的触发器关键字的最简单方法:
rspec: |
复杂触发器语法
可以配置Gitlab用于创建下游管道的分支名称:
rspec: |
7.20. include
使用include关键字,可以允许包含外部yaml文件。include要求外部yaml文件具有扩展名.yml或.yaml,否则将不包括外部文件。
include中定义的文件包括:
–与.gitlab-ci.yml中的合并。
–始终首先评估并与.gitlab-ci.yml的内容合并,而不管include关键字的位置如何。
使用合并可使用本地定义自定义和覆盖包含的CI/CD配置。
不支持跨include源的不同yaml文件使用yaml别名。您只能引用同一文件中的别名。您可以使用extends关键字,而不是使用yaml锚。
包含支持四个包含方法
local |
所有方法包含的.gitlab-ci.yml配置在管道创建时进行评估。配置是一个及时的快照,并持久存在于数据库中。在创建下一个管道之前,对引用的.gitlab-ci.yml配置所做的任何更改都不会反映在gitlab中。
include:local
include:local包含来自与.gitlab-ci.yml相同存储库的文件。它是使用相对于根目录的完整路径来引用的(/)。
您只能在配置文件所在的分支上使用Git当前跟踪的文件。换句话说,当使用include:local时,请确保.gitlab-ci.yml和本地文件都在同一个分支上。
所有嵌套的include都将在同一个项目的范围内执行,因此可以使用本地、项目、远程或模板include。
不支持通过git子模块路径包含本地文件。
例子:
include: |
include:file
要在同一Gitlab实例下包含来自另一个私有项目的文件,请使用include:file。使用相对于根目录的完整路径(/)引用此文件。例如:
include: |
还可以指定ref,默认值为项目的标题:
include: |
所有嵌套的include都将在目标项目的范围内执行,因此可以使用本地(相对于目标项目)、项目、远程或模板include。
include:template
include:template可用于包含随Gitlab一起提供的.gitlab-ci.yml模板。
For example:
# File sourced from GitLab's template collection |
所有嵌套的include只能在用户的权限下执行,因此可以使用project、remote或template include。
include:remote
nclude:remote可用于包含来自不同位置的文件,使用http/https,使用完整的URL引用。远程文件必须通过简单的GET请求公开访问,因为不支持远程URL中的身份验证架构。例如:
include: |
所有嵌套的include将作为公共用户在没有上下文的情况下执行,因此只允许使用其他远程、公共项目或模板。
嵌套包含
嵌套的include允许您组成一组include。总共允许50个。
重复包含被视为配置错误。
包括示例
下面还有一些例子。
单个字符串或多个值的数组,您可以将额外的yaml文件作为单个字符串或多个值的数组包含在内。下面的例子都是有效的。
包含include:local方法的单个字符串:
include: '/templates/.after-script-template.yml' |
包含include方法的数组:
include: |
显式指定包含方法的单个字符串:
include: |
带有include:remote的数组是单个项:
include: |
具有多个包含方法的数组已明确指定:
include: |
数组混合语法:
include: |
重新使用前脚本模板
在下面的示例中,.before-script-template.yml的内容将与.gitlab-ci.yml的内容一起自动获取和评估。
https://gitlab.com/awesome project/raw/master/.before-script-template.yml的内容:
before_script: |
Content of .gitlab-ci.yml:
include: 'https://gitlab.com/awesome-project/raw/master/.before-script-template.yml' |
覆盖外部模板值以下示例显示了特定的yaml定义的变量以及在.gitlab-ci.yml中自定义的include文件中生产job的详细信息。
https://company.com/autodevops-template.yml的内容:
variables: |
Content of .gitlab-ci.yml:
include: 'https://company.com/autodevops-template.yml' |
在这种情况下,变量postgres-user和postgres-password以及autodevops-template.yml中定义的生产job的环境url已被.gitlab-ci.yml中定义的新值覆盖。
合并允许扩展和重写字典映射,但不能向包含的数组添加或修改项。例如,要向生产job脚本添加其他项,必须重复现有的脚本项:
https://company.com/autodevops-template.yml的内容:
production: |
Content of .gitlab-ci.yml:
include: 'https://company.com/autodevops-template.yml' |
在这种情况下,如果在.gitlab-ci.yml中不重复install_dependencies和deploy,它们将不会成为组合CI配置中生产job脚本的一部分。
使用嵌套的include
下面的示例说明如何使用不同方法的组合从不同的源嵌套include。
在本例中,.gitlab-ci.yml包含本地文件/.gitlab-ci/another-config.yml:
include: |
.gitlab ci/another-config.yml包含一个模板和另一个项目的/templates/docker-workflow.yml文件:
include: |
group/my项目中的/templates/docker-workflow.yml包含group/my项目的两个本地文件:
include: |
group/my项目中的/templates/docker-build.yml添加了一个docker构建job:
docker-build: |
我们的第二个/templates/docker-test.yml出现在group/my项目中,它添加了一个docker测试job:
docker-test: |
7.21. extends
扩展定义了使用扩展的job将从中继承的项名称。
它是使用yaml锚的替代方法,并且更灵活和易读:
.tests: |
在上面的示例中,rspecjob继承自.tests模板job。Gitlab将根据这些键执行反向深进。Gitlab想要:
递归地将rspec内容放入.tests。
不去键的值。
这将导致以下job:
rspec: |
请注意,script:rake测试已被script:rake rspec覆盖。
如果您想包括rake测试,请参见之前的脚本和之后的脚本。
.本例中的测试是隐藏的密钥,但也可以从常规job继承。扩展支持多级别继承,但不建议使用三个以上的级别。支持的最大嵌套级别为10。
以下示例具有两个继承级别:
.tests: |
在Gitlab 12.0及更高版本中,也可以使用多个父级进行扩展。用于合并的算法是“最近的作用域获胜”,因此来自最后一个成员的键将始终隐藏在其他级别上定义的任何内容。例如:
.only-important: |
这将导致以下RSPECjob:
rspec: |
Using extends and include together
扩展配置文件和include的工作。
例如,如果您有本地included.yml文件:
.template: |
然后,在.gitlab-ci.yml中,您可以这样使用它:
include: included.yml |
这将运行一个名为usetemplate的job,该job运行echo hello!根据.templatejob中的定义,并使用本地job中定义的Alpine Docker图像。
7.22. pages
页面是一项特殊的工作,用于将静态内容上载到Gitlab,该工作可用于为您的网站提供服务。它有一个特殊的语法,所以这两个
必须满足以下要求:
任何静态内容都必须放在public/目录下。
必须定义具有公共/目录路径的项目。
下面的示例只是将所有文件从项目的根目录移动到public/directory。.public解决方案是这样的,cp不会无限循环地将public/复制到自身:
pages: |
Read more on GitLab Pages user documentation.
7.23. variables
> 整数(以及字符串)对于变量的名称和值都是合法的。浮动不合法,不能使用。Gitlab CI/CD允许您在.gitlab-ci.yml中定义变量,然后在job环境中传递这些变量。它们可以全局设置,也可以按job设置。
在job级别上使用variables关键字时,它将覆盖全局yaml变量和预定义变量。
它们存储在Git存储库中,用于存储非敏感项目配置,例如:
variables: |
这些变量稍后可以在所有执行的命令和脚本中使用。yaml定义的变量也被设置为所有创建的服务容器,从而允许对它们进行微调。
除了用户定义的变量之外,还有运行程序本身设置的变量。一个例子是ci-commit-ref-name,它具有为其构建项目的分支或标记名的值。除了可以在.gitlab-ci.yml中设置的变量外,还可以在gitlab的用户界面中设置所谓的变量。
Learn more about variables and their priority.
Git strategy
您可以在“变量”部分中设置用于获取最新应用程序代码的Git_策略(全局或每个job)。如果未指定,将使用项目设置中的默认值。
有三个可能的值:clone、fetch和none。
克隆是最慢的选项。它为每个job从头克隆存储库,确保项目工作空间始终是原始的。
variables: |
提取速度更快,因为它重新使用项目工作区(如果不存在则返回到克隆)。Git Clean用于撤消上一个job所做的任何更改,Git Fetch用于检索自上一个job运行以来所做的提交。
variables: |
也没有人会重新使用项目工作区,但会跳过所有Git操作(包括Gitlab Runner的预克隆脚本,如果存在的话)。它主要用于只在artifacts上操作的job(例如部署)。Git存储库数据可能存在,但它肯定是过时的,因此您应该只依赖从缓存或artifacts引入到项目工作区的文件。
variables: |
Kubernetes的执行者不支持Git_策略,但将来可能会支持。有关更新,请参阅支持带kubernetes执行器的git策略的特性建议。
Git submodule strategy
Git_子模块_策略变量用于控制在生成前获取代码时是否包含Git子模块/如何包含Git子模块。您可以在“变量”部分中全局或按job设置它们。
有三个可能的值:无、正常和递归:
无表示在获取项目代码时不包括子模块。这是默认值,与v1.10之前的行为匹配。
正常意味着只包括顶级子模块。相当于:
git submodule sync |
递归意味着将包括所有子模块(包括子模块的子模块)。此功能需要Git v1.8.1及更高版本。当使用不基于Docker的执行器的Gitlab运行程序时,请确保Git版本满足该要求。相当于:
git submodule sync --recursive |
请注意,要使此功能正常工作,子模块必须(在.gitmodules中)配置为:
公共可访问存储库的HTTP(S)URL,或指向同一Gitlab服务器上另一个存储库的相对路径。请参见Git子模块文档。
Git checkout
当git策略设置为clone或fetch以指定是否应运行git签出时,可以使用git签出变量。如果未指定,则默认为true。您可以在“变量”部分中全局或按job设置它们。如果设置为false,则运行程序将:
执行提取时-更新存储库并将工作副本保留在当前版本上,执行克隆时-克隆存储库并将工作副本保留在默认分支上。
将此设置设置为true意味着对于克隆和获取策略,运行程序将签出工作副本到与CI管道相关的修订:
variables: |
Git clean flags
git-clean-flags变量用于控制签出源后git-clean的默认行为。您可以全局设置它,也可以在变量部分中为每个job设置它。
git_clean_标志接受git clean命令的所有可能选项。
如果指定了git_checkout:false,则禁用git clean。如果git_clean_标志是:
未指定,git clean标志默认为-ffdx。
给定值none,不执行git clean。
例如:
variables: |
Job stages attempts
您可以设置正在运行的job将尝试执行以下每个阶段的尝试次数:
Variable | Description |
GET_SOURCES_ATTEMPTS | 尝试获取运行job的源的次数 |
ARTIFACT_DOWNLOAD_ATTEMPTS | 尝试下载运行job的项目的次数 |
RESTORE_CACHE_ATTEMPTS | 尝试还原运行job的缓存的次数 |
默认为一次尝试。
Example:
variables: |
Shallow cloning
可以使用git_depth指定提取和克隆的深度。这允许对存储库进行浅层克隆,这可以显著加快对具有大量提交或旧的大型二进制文件的存储库的克隆。价值是
传递给了git fetch和git clone。
如果使用深度1并有job队列或重试job,则job可能会失败。
因为Git获取和克隆是基于引用的,例如分支名称,所以运行者不能克隆特定的commit SHA。如果队列中有多个job,或者您正在重试一个旧job,那么要测试的提交需要在克隆的Git历史记录中。为GIT_DEPTH设置的值太小可能导致无法运行这些旧提交。您将在中看到未解决的引用
job日志。然后,您应该重新考虑将GIT_DEPTH更改为更高的值。
当设置GIT_DEPTH时,依赖于Git描述的job可能无法正常工作,因为Git历史只有一部分存在。
要仅获取或克隆最后3个提交:
variables: |
您可以全局设置它,也可以在变量部分中为每个job设置它。
8. 不推荐使用的参数(见原文)
以下参数已弃用。……