如何在Gitlab CI中从共享的yml文件中重用before_script?

时间:2020-05-18 17:45:53

标签: gitlab gitlab-ci

我知道您可以使用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一样,它具有两个额外的步骤。

3 个答案:

答案 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配置时,必须为每个文件指定项目和引用。在此版本中,您现在可以一次指定项目,引用并提供所有文件列表。这样可以避免重复您的操作,并使您的管道配置不那么冗长。

https://about.gitlab.com/images/13_6/list.png -- Include multiple CI/CD configuration files as a list

请参见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的内容!