【问题标题】:Getting ADO pipelines to skip steps on Terraform plan no changes让 ADO 管道跳过 Terraform 计划的步骤没有变化
【发布时间】:2020-09-16 01:54:10
【问题描述】:

我在想出一个解决方案时遇到了麻烦附加到计划命令:没有更改是退出代码 0,更改是退出代码 2。

我面临的问题是,如果没有 terraform 计划的更改,我希望管道跳过其余阶段并报告成功,并在检测到更改时继续管道。

      - script: |
        terraform plan -input=false -no-color -out=plan.tfplan -detailed-exitcode
        # on changes detected, succeed; otherwise fail
        if [ $? -eq 2 ]; then 
          exit 0
        else
          exit 1
        fi
      displayName: "Planning Terraform Changes"
      name: TerraformPlan
      condition: succeeded()
      continueOnError: true
      workingDirectory: "$(Build.SourcesDirectory)/terraform/$(ENVIRONMENT_NAME)"
      env:
        TF_IN_AUTOMATION: true
        ARM_CLIENT_ID: $(NONPROD_ARM_CLIENT_ID)
        ARM_CLIENT_SECRET: $(NONPROD_ARM_CLIENT_SECRET)
        ARM_SUBSCRIPTION_ID: $(NONPROD_ARM_SUBSCRIPTION_ID)
        ARM_TENANT_ID: $(NONPROD_ARM_TENANT_ID)
    - script: |
        echo "Nothing to do"
      displayName: "No changes detected"
      name: NoChanges
      condition: failed()
    - script: |
        echo "Changes detected"
      displayName: "Changes Detected"
      name: Changes
      condition: succeeded()
- stage: ...

使用上述管道 yaml,“检测到的更改”脚本始终运行。我不确定我是否以正确的方式进行此操作,因此感谢您提供任何意见。

您是否认为采用删除文件并使用管道变量的方法会更好,例如:Skip stage with manual approval in Azure DevOps Pipelines (YAML)

更新: 如果我删除continueOnError: true,那么整个管道在舞台之后停止并且“未检测到更改”被拾取。我正在尝试让管道进入另一个阶段。

【问题讨论】:

    标签: azure-devops terraform azure-pipelines


    【解决方案1】:

    你需要的其实是一个set变量,然后在条件下使用:

         - script: |
            terraform plan -input=false -no-color -out=plan.tfplan -detailed-exitcode
            # on changes detected, succeed; otherwise fail
            if [ $? -eq 2 ]; then 
              echo '##vso[task.setvariable variable=changedDetected]true'
            fi
          displayName: "Planning Terraform Changes"
          name: TerraformPlan
          condition: succeeded()
          continueOnError: true
          workingDirectory: "$(Build.SourcesDirectory)/terraform/$(ENVIRONMENT_NAME)"
          env:
            TF_IN_AUTOMATION: true
            ARM_CLIENT_ID: $(NONPROD_ARM_CLIENT_ID)
            ARM_CLIENT_SECRET: $(NONPROD_ARM_CLIENT_SECRET)
            ARM_SUBSCRIPTION_ID: $(NONPROD_ARM_SUBSCRIPTION_ID)
            ARM_TENANT_ID: $(NONPROD_ARM_TENANT_ID)
        - script: |
            echo "Nothing to do"
          displayName: "No changes detected"
          name: NoChanges
          condition: and(succeeded(), ne(variables['changedDetected'], 'true'))
        - script: |
            echo "Changes detected"
          displayName: "Changes Detected"
          name: Changes
          condition: and(succeeded(), eq(variables['changedDetected'], 'true'))
    

    【讨论】:

      【解决方案2】:

      如果您可以将任务的输出捕获到变量中,则可以在下一阶段使用custom conditional 来仅选择性地执行。

      steps:
      - script: echo I did a thing
        condition: and(succeeded(), eq('${{ SkipSteps }}', false))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-07
        • 2022-11-03
        • 2021-09-22
        • 1970-01-01
        • 2023-01-21
        • 2020-01-24
        • 1970-01-01
        • 2019-03-13
        相关资源
        最近更新 更多