代码之家  ›  专栏  ›  技术社区  ›  michasaucer

在下一阶段的条件下,阶段的输出不可见

  •  0
  • michasaucer  · 技术社区  · 2 年前

    我正在开发Terraform管道,我想在一个阶段中设置一个变量,然后输出它,这样我就可以在另一个阶段使用它。

    这是我的代码,它有效:

    stages:
    - stage: Terraform_Plan
      displayName: Plan
      jobs:
      - job: Terraform_Plan
        displayName: Plan 
    
        steps:
        
        - powershell: |
            # made it shorter to get a point, that variable set here is not 
            # respected in next stage
            Write-Host "##vso[task.setvariable variable=anyTfChanges;isOutput=true]false"
    
          displayName: Detect any Terraform changes
    

    在另一个阶段,我想从条件中使用它:

     stage: Terraform_Apply
      displayName: Apply
      jobs:
      - deployment: Apply
        environment: dev
        displayName: Apply Terraform
        condition: and(succeeded(), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq('true', 'true'), eq(dependencies.Terraform_Plan.outputs['Terraform_Plan.anyTfChanges'], 'true')))
    
        strategy:
          runOnce:
            deploy:
              steps:
    

    但看起来这个变量根本没有得到尊重,因为 Apply 舞台一直在运行,即使在我设置的时候 anyTfChanges 变量为false

    有什么想法吗?我使用windows代理

    1 回复  |  直到 2 年前
        1
  •  1
  •   Kevin Lu-MSFT    2 年前

    从您的YAML样本中,您需要在阶段之间传递变量。请参阅本文档: Use outputs in a different stage

    您可以尝试使用以下示例:

    stages:
    - stage: Terraform_Plan
      displayName: Plan
      jobs:
      - job: Terraform_Plan
        displayName: Plan 
    
        steps:
        
        - powershell: |
            # made it shorter to get a point, that variable set here is not 
            # respected in next stage
            Write-Host "##vso[task.setvariable variable=anyTfChanges;isOutput=true]false"
    
          displayName: Detect any Terraform changes
          name: test
    - stage: Terraform_Apply
      displayName: Apply
      dependsOn: Terraform_Plan
      variables:
         varFromA: $[ stageDependencies.Terraform_Plan.Terraform_Plan.outputs['test.anyTfChanges'] ]
      jobs:
      - deployment: Apply
        environment: dev
        displayName: Apply Terraform
        condition: and(succeeded(), and(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq('true', 'true'), eq(variables['varFromA'], 'true')))
        strategy:
          runOnce:
            deploy:
              steps:
              - script: echo "1"
    

    您还需要更改 或者 运算符到 在条件下。

    OR运算符表示通过的一个判断将运行该阶段。这个 eq('true', 'true') 总会过去的。

    在这种情况下,只有当所有三个判断都得到满足时,才会运行该阶段。

    后果

    enter image description here