如何在 YAML 管道中设置和检索条件的变量值?

How to set and retrieve variable value for condition in YAML Pipelines?

“Deploy_Infrastructure”的条件正在使用变量 isInfraCreated。 isInfraCreated 的值不断返回 'unknown',即使 PowerShell 脚本设置了这些值。我在这里做错了什么?

trigger:
- main

stages:
- stage: development
  variables:
    isInfraCreated: "unknown"
    aksClusterName: "bla-aks"
    aksResourceGroup: "bla-aks-resources-01"
  jobs:
  - job: Prepare
    steps:
    - task: AzureCLI@2
      displayName: 'Azure PowerShell: Determine isInfraCreated'
      inputs:
        azureSubscription: 'myAzureSubscription'
        scriptType: 'pscore'
        scriptLocation: 'inlineScript'
        inlineScript: |
          $aksResource = az aks show --name $(aksClusterName) --resource-group $(aksResourceGroup)
          $aksResource
          if ($aksResource -eq $null)
          {
            Write-Host "##vso[task.setvariable variable=isInfraCreated]$false"
            $isInfraCreated = $false
            $env:isInfraCreated = $false
          }
          else 
          {
            Write-Host "##vso[task.setvariable variable=isInfraCreated]$true"
            $isInfraCreated = $true
            $env:isInfraCreated = $true
          }
  - job: Deploy_AKS_Infrastructure 
    condition: and(succeeded(), eq(variables.isInfraCreated, 'False'))

How to set and retrieve variable value for condition in YAML Pipelines?

要解决此问题,我们需要 share variables across jobs 使用任务的输出变量:

  • To reference a variable from a different task within the same job, use TASK.VARIABLE.
  • To reference a variable from a task from a different job, use dependencies.JOB.outputs['TASK.VARIABLE'].

因此,我们需要将脚本更新为:

trigger:
- main

stages:
- stage: development
  variables:
    isInfraCreated: "unknown"
    aksClusterName: "bla-aks"
    aksResourceGroup: "bla-aks-resources-01"
  jobs:
  - job: Prepare
    steps:
    - task: AzureCLI@2
      displayName: 'Azure PowerShell: Determine isInfraCreated'
      inputs:
        azureSubscription: 'myAzureSubscription'
        scriptType: 'pscore'
        scriptLocation: 'inlineScript'
        inlineScript: |
          $aksResource = az aks show --name $(aksClusterName) --resource-group $(aksResourceGroup)
          $aksResource
          if ($aksResource -eq $null)
          {
            Write-Host "##vso[task.setvariable variable=isInfraCreated;isOutput=true]$false"
            $isInfraCreated = $false
            $env:isInfraCreated = $false
          }
          else 
          {
            Write-Host "##vso[task.setvariable variable=isInfraCreated;isOutput=true]$true"
            $isInfraCreated = $true
            $env:isInfraCreated = $true
          }
      name: SetIsInfraCreated

  - job: Deploy_AKS_Infrastructure 
    variables:
      TestisInfraCreated: $[ dependencies.Prepare.outputs['SetIsInfraCreated.isInfraCreated'] ]
    condition: and(succeeded(), eq(variables.TestisInfraCreated, 'False')) 

您可以查看文档 How to pass variables in Azure Pipelines YAML tasks 了解更多详情。