Azure DevOps管道中的条件阶段执行

迈克尔·里斯

我希望根据上一个阶段中设置的变量的内容执行Azure DevOps管道中的一个阶段。

这是我的管道:

stages:
  - stage: plan_dev
    jobs:
    - job: terraform_plan_dev
      steps:
      - bash: echo '##vso[task.setvariable variable=terraform_plan_exitcode;isOutput=true]2'
        name: terraform_plan

  - stage: apply_dev
    dependsOn: plan_dev
    condition: eq(stageDependencies.plan_dev.terraform_plan_dev.outputs['terraform_plan.terraform_plan_exitcode'], '2')
    jobs:
    - deployment: "apply_dev"
      ...

apply_dev如果plan_dev阶段未显示任何更改,则想法是跳过阶段背景是在plan_dev没有要批准的更改的情况下,我们要阶段中手动批准部署

不幸的是,这似乎不起作用。无论变量terraform_plan_exitcode是否设置为期望值(2),都将apply_dev跳过阶段。

对于语法,我遵循此处文档

stageDependencies.StageName.JobName.outputs['StepName.VariableName']
马里乌斯·索尔巴肯(Marius Solbakken Mellum)

我见过同样的问题。您需要使用依赖项变量而不是stageDependencies:

stages:
- stage: plan_dev
jobs:
- job: terraform_plan_dev
  steps:
  - bash: echo '##vso[task.setvariable variable=terraform_plan_exitcode;isOutput=true]2'
    name: terraform_plan

- stage: apply_dev
dependsOn: plan_dev
condition: eq(dependencies.plan_dev.outputs['terraform_plan_dev.terraform_plan.terraform_plan_exitcode'], '2')
jobs:
- deployment: "apply_dev"

以下是我使用Terraform Plan +有条件Apply的一些更完整的示例:


stages: 
  - stage: Build_zip_plan
    displayName: Build portal, zip files and terraform plan
    jobs:
    - job: Build_portal_zip_files_terraform_plan
      pool:
        vmImage: 'ubuntu-latest'
      steps:
        - task: Cache@2
          displayName: 'Register TF cache'
          inputs:
            key: terraform | $(Agent.OS) | $(Build.BuildNumber) | $(Build.BuildId) | $(Build.SourceVersion) | $(prefix)
            path: ${{ parameters.tfExecutionDir }}

        - task: TerraformInstaller@0
          displayName: 'Install Terraform'
          inputs:
            terraformVersion: ${{ parameters.tfVersion }}

        - task: TerraformTaskV1@0
          displayName: 'Terraform Init'
          inputs:
            provider: 'azurerm'
            command: 'init'
            workingDirectory: ${{ parameters.tfExecutionDir }}
            backendServiceArm: ${{ parameters.tfStateServiceConnection }}
            backendAzureRmResourceGroupName: ${{ parameters.tfStateResourceGroup }}
            backendAzureRmStorageAccountName: ${{ parameters.tfStateStorageAccount }}
            backendAzureRmContainerName: ${{ parameters.tfStateStorageContainer }}
            backendAzureRmKey: '$(prefix)-$(environment).tfstate'

        - task: TerraformTaskV1@0
          displayName: 'Terraform Plan'
          inputs:
            provider: 'azurerm'
            command: 'plan'
            commandOptions: '-input=false -out=deployment.tfplan -var="environment=$(environment)" -var="prefix=$(prefix)" -var="tenant=$(tenant)" -var="servicenow={username=\"$(servicenowusername)\",instance=\"$(servicenowinstance)\",password=\"$(servicenowpassword)\",assignmentgroup=\"$(servicenowassignmentgroup)\",company=\"$(servicenowcompany)\"}" -var="clientid=$(clientid)" -var="username=$(username)" -var="password=$(password)" -var="clientsecret=$(clientsecret)" -var="mcasapitoken=$(mcasapitoken)" -var="portaltenantid=$(portaltenantid)" -var="portalclientid=$(portalclientid)" -var="customerdisplayname=$(customerdisplayname)" -var="reportonlymode=$(reportonlymode)"'
            workingDirectory: ${{ parameters.tfExecutionDir }}
            environmentServiceNameAzureRM: ${{ parameters.tfServiceConnection }}

        - task: PowerShell@2
          displayName: 'Check Terraform plan'
          name: "Check_Terraform_Plan"
          inputs:
            filePath: '$(Build.SourcesDirectory)/Pipelines/Invoke-CheckTerraformPlan.ps1'
            arguments: '-TfPlan ''${{ parameters.tfExecutionDir }}/deployment.tfplan'''
            pwsh: true
  

  - stage:
    dependsOn: Build_zip_plan
    displayName: Terraform apply
    condition: eq(dependencies.Build_zip_plan.outputs['Build_portal_zip_files_terraform_plan.Check_Terraform_Plan.TFChangesPending'], 'yes')
    jobs:
    - deployment: DeployHub
      displayName: Apply
      pool:
        vmImage: 'ubuntu-latest'
      environment: '$(prefix)'
      strategy:
        runOnce:
          deploy:
            steps:
            - checkout: self

            - task: Cache@2
              displayName: 'Get Cache for TF Artifact'
              inputs:
                key: terraform | $(Agent.OS) | $(Build.BuildNumber) | $(Build.BuildId) | $(Build.SourceVersion) | $(prefix)
                path: ${{ parameters.tfExecutionDir }}
                
            - task: TerraformInstaller@0
              displayName: 'Install Terraform'
              inputs:
                terraformVersion: ${{ parameters.tfVersion }}

            - task: TerraformTaskV1@0
              displayName: 'Terraform Apply'
              inputs:
                provider: 'azurerm'
                command: 'apply'
                commandOptions: 'deployment.tfplan'
                workingDirectory: ${{ parameters.tfExecutionDir }}
                environmentServiceNameAzureRM: ${{ parameters.tfServiceConnection }}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Azure DevOps管道中的各个阶段共享变量

在Azure DevOps版本管道中从PowerShell执行SQLCMD.exe

Azure devops管道条件名称

Azure devops中的跳过管道阶段

在我的Azure DevOps YAML管道中,如何将一堆阶段转换成作业矩阵?

Azure Devops多阶段管道或发布,何时使用什么?

复制Azure Devops中发布管道的所有阶段中的更改

Azure Devops构建管道-意外的价值阶段

Azure Devops Server 2019中的多阶段YAML发布管道

Azure Devops YAML管道中的条件依赖作业

Azure DevOps中的Flutter管道

Azure Devops管道中的循环和数组

Azure DevOps管道阶段

防止在Azure DevOps中并行执行同一发布管道

在Azure DevOps管道中管理EF迁移

如何从 Azure DevOps 中的 YAML 管道获取阶段结果

Azure Devops - 如果测试 DLL 被其他测试 DLL 引用,则防止在管道中执行双重测试

Azure Devops Server:在经典发布管道的阶段之间共享文件

手动批准 Azure Devops 管道 (YAML) 中的阶段

在具有多阶段管道的 Azure DevOps 中,如何手动部署到环境?

PR 上的条件阶段执行甚至提高了 Azure DevOps

如何解决 Azure devops 管道 yml 中的“意外值‘阶段’天蓝色管道”

Azure 管道 - 在容器中执行阶段之一

多配置 Azure Devops 2019 构建管道中的条件管道(Visual Studio 测试)任务

在 Azure DevOps 管道中,在执行 az login 时使用 powershell 任务中的变量会导致 ArgumentParseError

Azure Devops 中的多分支管道

Azure DevOps:合并后执行 CI 管道

Azure Devops 管道 yml 循环阶段

Azure Devops 从其他管道的多个阶段触发管道