首页 > 解决方案 > 根据条件在 Gitlab CI 中运行特定作业

问题描述

我有一个 repo QA/tests,当有推送到这个 repo 时,我想运行所有的工作。

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

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

在下一步,我有另一个 repo products/first,我想QA/tests在每次推送时运行一个特定的工作,products/first所以我尝试了:

stages:
  - test

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

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

生成作业.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

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

任何想法?

标签: gitlabcontinuous-integrationgitlab-cigitlab-ci-runner

解决方案


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

  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 代码段发生更改,您就不需要在存储库中进行更新。

最后,要在每次推送时触发执行,您只需要从QA/tests.

免责声明

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


推荐阅读