变量替换(或覆盖)从 gitlab 模板扩展作业时不包括在内

问题描述 投票:0回答:1

使用 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

完成这项工作的最佳方法是什么?

continuous-integration sonarqube gitlab gitlab-ci continuous-deployment
1个回答
3
投票

在 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
© www.soinside.com 2019 - 2024. All rights reserved.