运行 Gitlab 中的特定作业 CI 基于条件

Run specific job in Gitlab CI base on a condition

我有一个存储库 QA/tests,我想在推送到此存储库时 运行 所有作业。

我使用脚本动态生成作业:

job-generator:
  stage: generate
  tags:
    - kuber
  script:
    - scripts/generate-job.sh > generated-job.yml
  artifacts:
    paths:
      - generated-job.yml

main:
  trigger:
    include:
      - artifact: generated-job.yml
        job: job-generator
    strategy: depend

下一步,我有另一个回购协议 products/first,我想在 products/first 中的每次推送时 运行 中的特定工作,所以我尝试了:

stages:
  - test

tests:
  stage: test
  variables:
    TARGET: first
  trigger:
    project: QA/tests
    branch: master
    strategy: depend

然后我尝试在我的主 gitlab-ci.yml 中定义一个全局 TARGET: all 变量,并在上面的 YAML 中用 TARGET: first 覆盖它。

生成-job.sh:

#!/bin/bash

PRODUCTS=("first" "second" "third")

for P in "${PRODUCTS[@]}"; do
cat << EOF
$P:
  stage: test
  tags:
    - kuber
  script:
    - echo -e "Hello from $P"
  rules:
    - if: '"$TARGET" == "all"'
      when: always
    - if: '"$TARGET" == $P'
      when: always

EOF
done

但是没有结果。下游管道根本没有任何工作!

有什么想法吗?

我不确定这现在是否有帮助,但从外部看这似乎是一种过于复杂的方法。我不得不说我的知识有限,我的回答是基于假设:

  1. QA/tests 存储库包含所有存储库的某些测试用例
  2. QA/tests 的唯一目的是包含测试,而不是对项目等的概述。

我的建议

由于 QA/tests 只包含应该针对每个项目执行的测试,我会从中创建一个 docker 图像,其中包含所有测试并且可以实际执行它们。 (让我们称之为 qa-tests:latest

在我的项目中,我将添加一个使用此图像的步骤,以及我的项目源代码并执行测试:

qa-test:
  image: qa-tests:latest
  script:
    - echo "command to execute scripts"
  # add rules here accordingly

这将解决每次推送到存储库时的问题。为了更容易使用,我可以创建一个 QA-Tests.gitlab-ci.yml 文件,该文件可以包含在

的子项目中
include:
  - project: QA/tests
    file: QA-Tests.gitlab-ci.yml

这样,如果 ci 片段发生变化,您就不需要在存储库中进行更新。

最后每次push触发执行,只需要触发QA/tests.

子项目的pipeline即可

免责声明

正如我所说,我只有有限的几个,因为描述了目标而不是动机。使用这种方法,您可以删除一些指令调用——主要是从子项目触发到 QA/tests 的指令调用。它生成了一个清晰的结构,但它可能不符合您的需求。

我解决了它:

gitlab-ci.yml:

variables:
  TARGET: all

job-generator:
  stage: generate
  tags:
    - kuber
  script:
    - scripts/generate-job.sh > generated-job.yml
  artifacts:
    paths:
      - generated-job.yml

main:
  variables:
    CHILD_TARGET: $TARGET
  trigger:
    include:
      - artifact: generated-job.yml
        job: job-generator
    strategy: depend

并在我的 generate-job.sh:

中使用 CHILD_TARGET
#!/bin/bash

PRODUCTS=("first" "second" "third")

for P in "${PRODUCTS[@]}"; do
cat << EOF
$P:
  stage: test
  tags:
    - kuber
  script:
    - echo -e "Hello from $P"
  rules:
    - if: '$CHILD_TARGET == "all"'
      when: always
    - if: '$CHILD_TARGET == "$P"'
      when: always

EOF
done

所以我可以像这样从其他项目中调用它:

stages:
  - test

e2e-tests:
  stage: test
  variables:
    TARGET: first
  trigger:
    project: QA/tests
    branch: master
    strategy: depend