Devops 将输出从一个作业模板步骤传递到另一个作业模板步骤

问题描述 投票:0回答:1

我有一个用于运行 terraform 计划的模板,或根据传递到模板中的命令参数进行应用。

舞台和模板文件如下所示(针对上下文进行了精简)。

  - stage: terraform_${{ parameters.environment }}
    displayName: "Stage1"
    jobs:
      - job: "TFPlan"
        steps:
          - template: ../steps/terraform-steps.yml
            parameters:
              command: plan
              subscription: ${{ variables['Terraform.Subscription'] }}

      - job: "TFApply"
        variables:
          changesPresent: $[ dependencies.TFPlan.outputs['Terraformplan.changesPresent'] ]
        steps:
          - template: ../steps/terraform-steps.yml
            parameters:
              command: apply
              subscription: ${{ variables['Terraform.Subscription'] }}
              changesPresent: $(changesPresent)
parameters:
  - name: command
    displayName: Terraform Command
    type: string
    default: plan
    values:
      - plan
      - apply

  - name: subscription
    displayName: Azure Subscription
    type: string

  - name: changesPresent
    displayName: Changes changesPresent
    type: string
    default: "false"

steps:
  - ${{ if eq(parameters.command, 'apply') }}:
    - powershell: |
        Write-Host "command = ${{parameters.command}}"
        Write-Host "changesPresent = ${{parameters.changesPresent}}"
        Write-Host "equals commandIsApply = ${{ eq(parameters.command, 'apply') }}"
        Write-Host "equals changesPresentisFalse = ${{ eq(parameters.changesPresent, 'false') }}"
        Write-Host "equals changesPresentisFalse = ${{ eq(parameters.changesPresent, false) }}"
        Write-Host "equals changesPresentisFalse = ${{ eq(parameters.changesPresent, False) }}"
        Write-Host "equals changesPresentisTrue = ${{ eq(parameters.changesPresent, 'true') }}"
        Write-Host "equals changesPresentisTrue = ${{ eq(parameters.changesPresent, true) }}"
        Write-Host "equals changesPresentisTrue = ${{ eq(parameters.changesPresent, True) }}"

  - ${{ if not(and(eq(parameters.command, 'apply'), eq(parameters.changesPresent, 'false'))) }}:
    - task: TerraformTaskV4@4
      name: Terraform${{ parameters.command }}
      displayName: Terraform ${{ parameters.command }}
      inputs:
        provider: azurerm
        command: ${{ parameters.command }}
        environmentServiceNameAzureRM: ${{ parameters.subscription }}

TerraformTaskV4@4 步骤有 ChangePresent 的输出 (doc)。我正在尝试从运行 terraform plan 的第一个作业访问此输出变量,并将其传递到第二个作业中,以确定是否需要运行 terraform apply ,具体取决于是否存在任何更改。

正如您从模板中的所有调试输出中看到的,我正在尝试验证当changesPresent作为参数传递到模板中时,它是否设置为我期望的值。

奇怪的是,以下行显示的值为 false:

Write-Host "changesPresent = ${{parameters.changesPresent}}"

然而接下来的每一行尝试用 eq() 确认该值都会返回 False 值。 这是我得到的输出:

command = apply
changesPresent = false
equals commandIsApply = True
equals changesPresentisFalse = False
equals changesPresentisFalse = False
equals changesPresentisFalse = False
equals changesPresentisTrue = False
equals changesPresentisTrue = False
equals changesPresentisTrue = False

它正确地将命令参数等同于“apply”,但不将changesPresent参数等同于“false”。我确信它与编译/运行时/宏语法的疯狂有关,但我不知道如何让它工作。 非常感谢任何帮助。

azure-devops azure-pipelines azure-pipelines-yaml
1个回答
0
投票

看起来您正在尝试在调用模板时传入运行时变量作为参数值:

changesPresent: $(changesPresent)

如果这是一个运行时变量,那么这将不起作用。在管道开始运行之前,参数值必须在编译时已知。

© www.soinside.com 2019 - 2024. All rights reserved.