当从 gitlab 模板 unsing include 扩展作业时,变量替换(或覆盖)

fre*_*dev 6 continuous-integration continuous-deployment gitlab sonarqube gitlab-ci

使用 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}"
Run Code Online (Sandbox Code Playgroud)

我已将此模板作为一个项目包含在主 gitlab ci 文件中:

include: 
  - project: 'organization/group/ci-template'
    ref: master
    file: '.sonar-scanner.yml'
Run Code Online (Sandbox Code Playgroud)

正如您所理解的,我有一个名为 ci-templates 的存储库,其中创建了我的所有模板。在另一个存储库中,我使用包含这些模板进行扩展。

最后,在存储库中,当创建新的合并请求时,我的声纳作业正在项目中的另一个文件下运行test/quality.yml

sonar:
  stage: quality
  extends: 
    - sonar-analysis 
  allow_failure: true
  only:
    refs:
      - merge_requests
Run Code Online (Sandbox Code Playgroud)

除了替换或覆盖我的环境变量之外,一切都运行良好。确实是我的模板。我有很多声纳服务器或项目名称。我想知道如何覆盖这些变量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
Run Code Online (Sandbox Code Playgroud)

这也不起作用:

variables:
  SONAR_PROJECT_NAME: foo
  SONAR_SERVER: bar

sonar:
  stage: quality
  extends: 
    - sonar-analysis 
  allow_failure: true
  only:
    refs:
      - merge_requests
Run Code Online (Sandbox Code Playgroud)

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

mik*_*ike 3

在 2020 年 2 月提出这个问题后,新的 MR使用 CI 包含块中的非预定义变量已合并到 Gitlab 14.2 中,这解决了覆盖作业的问题。

执行包含操作的项目可以在扩展作业时重新定义变量:

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
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,您可能希望模板中的作业以点开头,.sonar-analysis而不是sonar-analysis不在sonar-analysis模板中创建真正的作业(请参阅隐藏作业)。

或者,您也可以直接设置项目中现有作业的变量值(以重新定义它们),该作业执行以下操作:

include: 
  - project: 'organization/group/ci-template'
    ref: master
    file: '.sonar-scanner.yml'

sonar-analysis:
  variables:
    SONAR_PROJECT_NAME: foo
    SONAR_SERVER: bar
Run Code Online (Sandbox Code Playgroud)

我用一个测试项目验证了这一点,其中包括来自同行测试项目的模板,当它运行时,会产生两个作业。这是首要作业的作业输出

$ 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
Run Code Online (Sandbox Code Playgroud)