运行 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
但是没有结果。下游管道根本没有任何工作!
有什么想法吗?
我不确定这现在是否有帮助,但从外部看这似乎是一种过于复杂的方法。我不得不说我的知识有限,我的回答是基于假设:
QA/tests
存储库包含所有存储库的某些测试用例
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
我有一个存储库 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
但是没有结果。下游管道根本没有任何工作!
有什么想法吗?
我不确定这现在是否有帮助,但从外部看这似乎是一种过于复杂的方法。我不得不说我的知识有限,我的回答是基于假设:
QA/tests
存储库包含所有存储库的某些测试用例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
.
免责声明
正如我所说,我只有有限的几个,因为描述了目标而不是动机。使用这种方法,您可以删除一些指令调用——主要是从子项目触发到 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