gitlab - 根据条件在 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
但没有结果。下游管道根本没有任何工作!
任何想法?
解决方案
我不确定这现在是否有帮助,但从外部来看,这似乎是一种过于复杂的方法。我不得不说我的知识有限,我的回答是基于假设:
- 存储库包含所有存储库的
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 代码段发生更改,您就不需要在存储库中进行更新。
最后,要在每次推送时触发执行,您只需要从QA/tests
.
免责声明
正如我所说,我只有有限的几个,因为描述的是目标而不是动机。使用这种方法,您可以删除一些指令调用 - 主要是从子项目触发到 QA/测试的那些。它会生成清晰的结构,但可能不适合您的需求。
推荐阅读
- html - 如何在图像 HTML CSS 中使文本居中
- html - CSS下划线与上述元素相同
- ruby-on-rails - 在关联错误消息中隐藏/删除模型名称
- python - 无法分配“
":" 必须是一个 "" 实例 - javascript - Laravel Passport API 向未使用付费号码的用户发送 OTP
- html - 无法使用 :link 选择器更改链接的颜色
- javascript - 使用 React 的地图加载不正确传单
- reactjs - 返回内部功能组件中的显示值
- javascript - 如何在 Chrome 的全局媒体控件中使用 blob URL 作为图像源?
- php - 如何缓存和重用 GuzzleHttp\Psr7\Response 的副本以进行调试?