Continuous integration Gitlab CI:仅当工件存在时运行作业
我有monorepo,我想运行子管道,这取决于目录内容的变化。在作业Continuous integration Gitlab CI:仅当工件存在时运行作业,continuous-integration,gitlab,gitlab-ci,pipeline,continuous-delivery,Continuous Integration,Gitlab,Gitlab Ci,Pipeline,Continuous Delivery,我有monorepo,我想运行子管道,这取决于目录内容的变化。在作业prepare\u config中,我检查最新更改的位置,创建子配置yml,并在下一阶段的作业run\u child中运行子管道 问题是,如果model gitlab ci.yml不存在,那么作业run\u child将失败,而不是由于缺少工件而跳过。我搜索了仅当工件存在而不是失败时才有条件地运行作业的解决方案,但没有找到任何解决方案。也许这里有人有什么想法 .gitlab ci.yml: stages: - .pre
prepare\u config
中,我检查最新更改的位置,创建子配置yml,并在下一阶段的作业run\u child
中运行子管道
问题是,如果model gitlab ci.yml
不存在,那么作业run\u child
将失败,而不是由于缺少工件而跳过。我搜索了仅当工件存在而不是失败时才有条件地运行作业的解决方案,但没有找到任何解决方案。也许这里有人有什么想法
.gitlab ci.yml
:
stages:
- .pre
- build
prepare_config:
stage: .pre
tags:
- sometag
rules:
- if: $CI_COMMIT_TAG == null
when: always
changes:
- '.gitlab-ci.yml'
- 'DIR_A/**/*'
- 'DIR_B/**/*'
- 'DIR_C/**/*'
script:
- |-
files=$(git diff-tree --name-only --no-commit-id ${CI_MERGE_REQUEST_TARGET_BRANCH_SHA:-$CI_COMMIT_SHA})
echo "Files changed: $files"
for f in $files; do
if [ -d $f ]; then
sed "s/{{ MODEL_NAME }}/$f/g" .gitlab-ci-template.yml >> model-gitlab-ci.yml
fi
done
artifacts:
paths:
- "model-gitlab-ci.yml"
run_child:
stage: build
rules:
- if: $CI_COMMIT_TAG == null
when: always
needs:
- job: prepare_config
artifacts: true
trigger:
include:
- artifact: model-gitlab-ci.yml
job: prepare_config
strategy: depend
您不能在
prepare\u config
中将变量设置为IS\u MODEL\u CI\u EXISTS
值为0(即否)或1(即是)。此外,在run\u child
中,检查的值是否存在模型CI\u,并根据该值继续执行或跳过执行run\u child
?@amitd您希望如何在阶段之间传递该变量?如果您的意思是规则:如果则为否,则它将不起作用,因为它将在创建管道后进行评估。动态创建的作业可能是一种解决方案()。为了创建动态子管道,您可以使用jsonnet()。@JkbLskw您看过我的yml吗?“这是动态管道。”塔兹:当然。使用这种动态管道,您无法对在其他作业的脚本部分中创建的工件/变量做出反应。使用jsonnet,可以使用脚本部分中的变量创建作业。这将帮助你解决你的问题。