使用 gitlab ci,我有一个存储库,其中创建了我所有的模板。 例如,我有一个名为
.sonar-scanner.yml
: 的声纳扫描仪作业模板
sonar-analysis:
stage: quality
image:
name: sonar-scanner-ci:latest
entrypoint: [""]
script:
- sonar-scanner
-D"sonar.projectKey=${SONAR_PROJECT_NAME}"
-D"sonar.login=${SONAR_LOGIN}"
-D"sonar.host.url=${SONAR_SERVER}"
-D"sonar.projectVersion=${CI_COMMIT_SHORT_SHA}"
-D"sonar.projectBaseDir=${CI_PROJECT_DIR}"
我已经将这个模板作为一个像这样的项目包含在主 gitlab ci 文件中:
include:
- project: 'organization/group/ci-template'
ref: master
file: '.sonar-scanner.yml'
正如你所理解的,我有一个名为 ci-templates 的 repo,我所有的模板都是在其中创建的。在另一个回购协议中,我使用 include 这些模板进行了扩展。
最后,在回购协议中,当创建新的合并请求时,我的声纳工作正在我项目中的另一个文件下运行
test/quality.yml
:
sonar:
stage: quality
extends:
- sonar-analysis
allow_failure: true
only:
refs:
- merge_requests
除了替换或覆盖我的环境变量外,一切都运行良好。确实是我的模板。我有很多声纳服务器或项目名称。我想知道当我从模板扩展作业时如何覆盖这些变量
SONAR_SERVER
和SONAR_PROJECT_NAME
。
在我的主
.gitlab-ci.yml
文件中,我有一个变量部分声明,当我覆盖这些变量时,它起作用了。
但这并不是我真正想要的。使用多个阶段和多个微服务,可以以不同的方式重用相同的扩展作业。我真正想做的是直接在文件中覆盖这些变量test/quality.yml
.
例如,这不起作用:
sonar:
stage: quality
extends:
- sonar-analysis
variables:
SONAR_PROJECT_NAME: foo
SONAR_SERVER: bar
allow_failure: true
only:
refs:
- merge_requests
这也行不通:
variables:
SONAR_PROJECT_NAME: foo
SONAR_SERVER: bar
sonar:
stage: quality
extends:
- sonar-analysis
allow_failure: true
only:
refs:
- merge_requests
完成这项工作的最佳方法是什么?
在 2020 年 2 月提出这个问题后,新的 MR Use non-predefined variables inside CI include blocks 已合并到 Gitlab 14.2 中,解决了被覆盖的作业的问题。
做include的项目可以在扩展job的时候重新定义变量:
include:
- project: 'organization/group/ci-template'
ref: master
file: '.sonar-scanner.yml'
sonar:
stage: quality
extends:
- sonar-analysis
variables:
SONAR_PROJECT_NAME: foo
SONAR_SERVER: bar
allow_failure: true
但在这种情况下,您可能希望模板中的工作以点
.sonar-analysis
而不是 sonar-analysis
开始,以免在模板中创建真正的 sonar-analysis
工作(参见 hidden jobs)。
或者您也可以直接设置项目中现有作业的变量值(重新定义它们),该作业包含:
include:
- project: 'organization/group/ci-template'
ref: master
file: '.sonar-scanner.yml'
sonar-analysis:
variables:
SONAR_PROJECT_NAME: foo
SONAR_SERVER: bar
我用一个测试项目验证了这一点,它包括一个来自同行测试项目的模板,当它运行时,会产生两个作业。这是覆盖作业的作业输出:
$ echo sonar.projectKey=${SONAR_PROJECT_NAME}
sonar.projectKey=foo
$ echo sonar.login=${SONAR_LOGIN}
sonar.login=bob
$ echo sonar.host.url=${SONAR_SERVER}
sonar.host.url=bar