有没有一种方法可以动态选择作业是否在Gitlab CI管道中运行



我正在尝试让一个作业检查配置文件中是否存在一个单词,并让它确定是否发生后续触发作业。。。

就像这样…

stages:
- check
- trigger_pipeline
variables:
- TRIGGER_JOB : "0"
- CONFIG_FILE : "default.json"
check:
stage: check
script:
- |
if grep -q keyword "$CONFIG_FILE"; then
TRIGGER_JOB="1"
fi
- echo "TRIGGER_JOB=${TRIGGER_JOB}" >> variables.env
artifacts:
reports:
dotenv: "variables.env"
trigger_pipeline:
stage: trigger_pipeline
rules:
- if: '$TRIGGER_JOB == "1"'
trigger:
project: downstream/project
branch: staging
strategy: depend
needs: ["check"]

GitLab似乎已经达到了一个限制,因为trigger_pipeline作业甚至没有创建,因为管道是用TRIGGER_JOB: "0"初始化的,所以如果找到关键字,我稍后进行此检查以触发管道并不重要。

是否有任何方法可以动态决定是否创建此trigger_pipeline作业?

我只想把这一切放在一个工作中,并通过API触发下游管道,但当然,我不能依赖于下游状态,这也是我想要的(当通过API从我在文档中找到的所有内容触发时,这是不可能做到的(。

如有任何建议,我们将不胜感激。谢谢

与您所描述的内容最接近的是动态子管道。这将允许您在一个作业中动态创建管道配置,然后运行它

generate-config:
stage: build
script: generate-ci-config > generated-config.yml
artifacts:
paths:
- generated-config.yml

child-pipeline:
stage: test
trigger:
include:
- artifact: generated-config.yml
job: generate-config

有一种方法可以动态选择是否执行gitlab作业

在您的情况下,应用以下配置

stages:
- trigger_pipeline
- check
variables:
- CONFIG_FILE : "default.json"
check:
stage: check
script:
- |
if grep -q keyword "$CONFIG_FILE"; then
curl -s --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs" | jq '.[]'
JOB_ID=$(curl -s --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs" | jq '.[] | select(.name=="child-pipeline") | .id')
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/jobs/$JOB_ID/play"
fi
trigger_pipeline:
stage: trigger_pipeline
trigger:
project: downstream/project
branch: staging
strategy: depend
when: manual

背后的逻辑是,您将目标作业配置为trigger_pipeline作为manual

更改阶段顺序,以便首先设置目标作业

然后,如果您的逻辑在中评估为true

grep -q keyword "$CONFIG_FILE"

然后检查作业基本上执行目标作业。首先识别目标job id,最后调用Gitlab API 的play端点执行

相关内容

最新更新