我正在尝试让一项作业检查配置文件中是否存在单词,并确定后续触发作业是否发生...
像这样...
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
端点来执行