如何在Gitlab CI中重用共享yml文件中的before_脚本?

如何在Gitlab CI中重用共享yml文件中的before_脚本?,gitlab,gitlab-ci,Gitlab,Gitlab Ci,我知道您可以使用yaml锚点重用before脚本中的代码块: .something_before: &something_before - echo 'something before' before_script: - *something_before - echo "Another script step" 但是,如果通过include:file在共享的.yml文件中声明.something\u,则这似乎不起作用。似乎extends也不适用于before\u s

我知道您可以使用yaml锚点重用before脚本中的代码块:

.something_before: &something_before
- echo 'something before'   


before_script:
  - *something_before
  - echo "Another script step"
但是,如果通过
include:file
在共享的
.yml
文件中声明.something\u,则这似乎不起作用。似乎
extends
也不适用于
before\u script
。有人知道如何从共享的
.yml
文件中重用
之前脚本中的某些步骤吗


编辑:我的用例是我有两个gitlab项目,它们的before_脚本步骤几乎相同。我不想在发生更改时同时更改这两个项目,所以我有第三个独立的Gitlab项目,它有一个.yml模板,我通过include:file将其包含在两个项目中。我想把所有的公共代码放在共享模板中,在git项目的脚本前面有两行代码,它有两个额外的步骤。

您可以毫无问题地使用extends,但是您需要在脚本之前覆盖整个

如果只想更改before_脚本的一部分,请使用shell脚本

在模板内部设置if条件

before_script
  - | 
    if [ condition ]
    then
      commands here
    fi
编辑后:您可以使用变量来实现它

项目1:
VAR=命令1

项目2:
VAR=command 2


您可以在gitlab-ci.yml文件或每个项目的ci/CD设置上设置env var的内容

Yaml锚不适用于包含的文件。您需要使用
extends
关键字。但是,如果在脚本之前有一个
,那么模板中的代码将在使用模板的作业中被覆盖,因此您想要实现的目标将无法在脚本之前使用

在你的具体工作中,你真的需要一个赛前脚本吗?或者你能用一个普通的
脚本实现同样的效果吗?如果是,您可以这样做:

模板文件:

.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
部分之前执行。

看看(2020年11月)是否会让它变得更简单:

包括多个CI/CD配置文件作为列表 以前,使用
include:file
语法将多个文件添加到CI/CD配置时,必须为每个文件指定项目和引用。在这个版本中,您现在可以同时指定项目、ref和提供文件列表。这可以防止您重复自己的操作,并减少管道配置的冗长

见)和


我已经编辑了我的帖子以包含更多相关信息。在我的例子中,我会将您的代码放在共享模板中,而“条件”是包含额外步骤的项目的名称吗?是的!现在我提出了另一种方法。。。带变量