我知道您可以使用yaml锚重用before脚本中的代码块:
.something_before: &something_before
- echo 'something before'
before_script:
- *something_before
- echo "Another script step"
,但是当通过.yml
在共享include:file
文件中声明了.something_before时,这似乎不起作用。似乎extends
也不能用于before_script
。有谁知道重用共享before_script
文件中.yml
中某些步骤的方法吗?
编辑:我的用例是我有2个gitlab项目,它们具有几乎相同的before_script步骤。我不想每次都更改时都不必更改两个项目,因此我有第三个单独的Gitlab项目,该项目具有.yml模板,我通过两个项目中的include:file包含了该模板。我想将所有通用代码放在该共享模板中,对于git项目来说,就像两行before_script一样,它具有两个额外的步骤。
答案 0 :(得分:2)
Yaml锚点不适用于包含的文件。您需要使用extends
关键字。但是您要实现的目标将无法与before_script
一起使用,因为如果模板中的代码也存在before_script
,则模板中的代码将在使用该模板的作业中被覆盖。
您是否确实需要在特定工作中使用before_script,还是可以通过普通的script
来实现?如果是,您可以执行以下操作:
模板文件:
.something_before:
before_script:
- echo 'something before'
- echo 'something more before'
项目管道:
include:
- project: 'my-group/my-project'
file: '/something_before.yml'
stages:
- something
something:
stage: something
extends: .something_before
script:
- echo 'additional stuff to do'
您的before_script
部分将被合并到something作业中,并在script
部分之前执行。
答案 1 :(得分:1)
看看GitLab 13.6(2020年11月)是否确实使其变得更容易:
以列表形式包含多个CI / CD配置文件
以前,当使用
include:file
语法将多个文件添加到CI / CD配置时,必须为每个文件指定项目和引用。在此版本中,您现在可以一次指定项目,引用并提供所有文件列表。这样可以避免重复您的操作,并使您的管道配置不那么冗长。请参见Documentation)和Issue。
答案 2 :(得分:0)
您可以毫无疑问地使用扩展,但是您将需要覆盖整个before_script
块。
如果您只想更改before_script的一部分,请使用Shell脚本进行更改
在模板内部设置if条件
before_script
- |
if [ condition ]
then
commands here
fi
修改后:您可以使用变量来实现
项目1:VAR = command 1
项目2:VAR = command 2
您可以在gitlab-ci.yml文件或每个项目的CI / CD设置中设置env var的内容!