Continuous integration Gitlab CI:仅当工件存在时运行作业

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

我有monorepo,我想运行子管道,这取决于目录内容的变化。在作业
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,可以使用脚本部分中的变量创建作业。这将帮助你解决你的问题。