Continuous integration Gitlab CI/CD:从上游管道有条件地运行下游多级管道

Continuous integration Gitlab CI/CD:从上游管道有条件地运行下游多级管道,continuous-integration,devops,gitlab-ci,continuous-deployment,multistage-pipeline,Continuous Integration,Devops,Gitlab Ci,Continuous Deployment,Multistage Pipeline,只有当上游管道中的工件不可用时,我才尝试触发下游管道。我正在使用Gitlab CE v13.5.1 这个想法是: 预构建阶段:从nexus卷曲并检查工件是否正确 可用。如果是,请不要运行下游触发器,否则请运行 它 为了实现这一点,当curl失败时,我将创建一个伪exists.txt文件,该文件随后将在后续阶段的exists条件中使用 仅当存在exists.txt时运行触发器。但是,问题是无论exists.txt是否存在,触发器都会一直运行。也就是说,触发阶段的存在条件不起作用 以下是gi

只有当上游管道中的工件不可用时,我才尝试触发下游管道。我正在使用Gitlab CE v13.5.1

这个想法是:

  • 预构建阶段:从nexus卷曲并检查工件是否正确 可用。如果是,请不要运行下游触发器,否则请运行 它

    • 为了实现这一点,当curl失败时,我将创建一个伪exists.txt文件,该文件随后将在后续阶段的exists条件中使用
  • 仅当存在exists.txt时运行触发器。但是,问题是无论exists.txt是否存在,触发器都会一直运行。也就是说,触发阶段的存在条件不起作用

  • 以下是gitlab ci文件:

    image: ${NEXUS_REPO_DOCKER_URL}/<<image>>
    
      variables:
        CUSTOMER_NAME: "ABC"
        CONFIG_VERSION: "1.2.7"
        PICKER_TEMPLATE_TAG: "6.9.15"
    
      stages:
        - prebuild
        - trigger
        - build
        - release
    
      checkArtifactAvailability:
         stage: prebuild
         only:
          - master
         tags:
          - docker
          -  lxc
        script:
          - set +e
          - curl -s -S -f $NEXUS_RAW_PICKER_REPOSITORY/${PRODUCT_FLAVOR}/${PRODUCT_FLAVOR}-${BUILD_TYPE}v${PICKER_TEMPLATE_TAG}.apk --output ${PRODUCT_FLAVOR}-${BUILD_TYPE}v${PICKER_TEMPLATE_TAG}.apk
          - "if [ '$?' -gt '0' ]; then touch exists.txt; fi"
          -set -e
        artifacts:
          expire_in: 1 hour
          paths:
           - ${PRODUCT_FLAVOR}-${BUILD_TYPE}v${PICKER_TEMPLATE_TAG}.apk
           - exists.txt
    
      createApk:
        stage: trigger
        rules:
          - exists:
              - exists.txt
        trigger:
          project: dev/<<project_name>>
          strategy: depend
        when: on_failure
      
      buildZip:
        stage: build
        tags:
          - docker
          - lxc
        rules:
          - exists:
              - exists.txt
        script:
            - curl -s -S -f $NEXUS_RAW_PICKER_REPOSITORY/${PRODUCT_FLAVOR}/${PRODUCT_FLAVOR}-${BUILD_TYPE}v${PICKER_TEMPLATE_TAG}.apk --output ${PRODUCT_FLAVOR}-${BUILD_TYPE}v${PICKER_TEMPLATE_TAG}.apk
            - zip -r v${CONFIG_VERSION}.zip <<files>> ${PRODUCT_FLAVOR}-${BUILD_TYPE}v${PICKER_TEMPLATE_TAG}.apk
        artifacts:
          expire_in: 1 hour
          paths:
              - v${CONFIG_VERSION}.zip
    
      releaseToNexus:
        stage: release
        tags:
            - docker
            - lxc
        rules:
          - exists:
              - exists.txt
        needs:
         - job: buildZip
           artifacts: true
        script:
            - curl -u $NEXUS_USER:$NEXUS_PASSWORD --upload-file ./v${CONFIG_VERSION}.zip $NEXUS_RAW_QA_REPOSITORY/Picker/${CUSTOMER_NAME}/
    
    image:${NEXUS\u REPO\u DOCKER\u URL}/
    变量:
    客户名称:“ABC”
    配置_版本:“1.2.7”
    选择器模板标签:“6.9.15”
    阶段:
    -预构建
    -触发
    -建造
    -释放
    检查可用性:
    阶段:预构建
    仅:
    -主人
    标签:
    -码头工人
    -lxc
    脚本:
    -set+e
    -curl-s-s-f$NEXUS_RAW_PICKER_REPOSITORY/${PRODUCT_FLAVOR}/${PRODUCT_FLAVOR}-${BUILD_TYPE}v${PICKER_TEMPLATE_TAG}.apk--output${PRODUCT_FLAVOR}-${BUILD TYPE}v${PICKER_TEMPLATE_TAG}.apk
    -“如果['$?'-gt'0'];则touch exists.txt;fi”
    -set-e
    人工产品:
    1小时后到期
    路径:
    -${PRODUCT\u FLAVOR}-${BUILD\u TYPE}v${PICKER\u TEMPLATE\u TAG}.apk
    -exists.txt
    createApk:
    阶段:触发
    规则:
    -存在:
    -exists.txt
    触发:
    项目:开发/
    策略:依赖
    什么时候:发生故障
    buildZip:
    阶段:建造
    标签:
    -码头工人
    -lxc
    规则:
    -存在:
    -exists.txt
    脚本:
    -curl-s-s-f$NEXUS_RAW_PICKER_REPOSITORY/${PRODUCT_FLAVOR}/${PRODUCT_FLAVOR}-${BUILD_TYPE}v${PICKER_TEMPLATE_TAG}.apk--output${PRODUCT_FLAVOR}-${BUILD TYPE}v${PICKER_TEMPLATE_TAG}.apk
    -zip-rv${CONFIG\u VERSION}.zip${PRODUCT\u FLAVOR}-${BUILD\u TYPE}v${PICKER\u TEMPLATE\u TAG}.apk
    人工产品:
    1小时后到期
    路径:
    -v${CONFIG_VERSION}.zip
    releaseToNexus:
    阶段:发布
    标签:
    -码头工人
    -lxc
    规则:
    -存在:
    -exists.txt
    需要:
    -工作:buildZip
    文物:真的
    脚本:
    -curl-u$NEXUS_USER:$NEXUS_密码——上传文件。/v${CONFIG_VERSION}.zip$NEXUS_RAW_QA_存储库/Picker/${CUSTOMER_NAME}/
    
    请出示
    exists.txt的消毒代码好吗。好吧,我在一个单独的脚本文件中运行了这个,它运行正常。你认为这可能是错误的吗?我也有同样的预感。是的,可能是。你可以调查是什么导致了问题,或者分享错误(如果有的话)。我认为它不会像这样工作,因为阶段最初是用变量或存在值的规则来选择的。在缺席的情况下,如果被视为总是正确的。也就是说,当buildAndCreateApk被选择为暂存或不暂存时,exists.txt将不存在。所以,无论文件是否存在,它都会被选择。在运行作业之前选择阶段。