【问题标题】:Azure Pipeline: Passing variable to multiple stagesAzure Pipeline:将变量传递给多个阶段
【发布时间】:2021-05-22 11:27:25
【问题描述】:

是否可以声明一个变量然后将其传递给下游? 我在 StageA -> StageB -> StageC 下面有一张图片 我在 StageA 上获取我的存储帐户的 url,我想将它用于 Stage B 和 StageC

但如果我使用[stagedependencies.StageA.JobA.outputs['var'],它只适用于StageB,不适用于StageC

- stage: 'StageC'
  dependsOn: 'StageB'
  pool:
    vmImage: 'windows-latest'
  variables:
    blobUri: $[stageDependencies.StageA.JobA.outputs['createOutput.blobUri']]
  jobs:
  - job: 'JobC'
    steps:
    - checkout: none
    - download: none
    - powershell: |
        echo JobBUri: $(blobUri)    

也许我在某个地方错过了它,但这是否意味着您只能从您依赖的直接阶段获取变量?

例子:

trigger:
- master

pool:
  vmImage: ubuntu-latest

stages:
- stage: 'StageA'
  jobs:
  - job: 'JobA'
    steps:
    - task: Powershell@2
      name: 'createOutput'
      inputs:
        targetType: 'inline'
        script: |
          Write-Output "##vso[task.setvariable variable=blobUri;isOutput=true]www.google.com"
- stage: 'StageB'
  dependsOn: 'StageA'
  pool:
    vmImage: 'windows-latest'
  variables:
    blobUri: $[stageDependencies.StageA.JobA.outputs['createOutput.blobUri']]
  jobs:
  - job: 'JobB'
    steps:
    - powershell: |
        echo JobBUri: $(blobUri)    

- stage: 'StageC'
  dependsOn: 'StageB'
  pool:
    vmImage: 'windows-latest'
  variables:
    blobUri: $[stageDependencies.StageA.JobA.outputs['createOutput.blobUri']]
  jobs:
  - job: 'JobC'
    steps:
    - powershell: |
        echo JobBUri: $(blobUri)    

【问题讨论】:

    标签: azure azure-devops yaml azure-pipelines azure-pipelines-yaml


    【解决方案1】:

    试试这个,在阶段 A 中设置的变量可能会在阶段 C 由 stageDependencies.StageA 提供

    - stage: 'StageC'
      dependsOn:
      - StageA
      - StageB
    

    其他解决方法是再次将此变量设置为阶段 B 中的输出变量,并通过 stageDependencies.StageB(...) 从 C 访问它

    来自发行说明

    https://docs.microsoft.com/en-us/azure/devops/release-notes/2020/sprint-168-update#jobs-can-access-output-variables-from-previous-stages

    默认情况下,管道中的每个阶段都依赖于 YAML 文件中它之前的阶段。因此,每个阶段都可以使用前一阶段的输出变量。您可以更改依赖关系图,这也将更改可用的输出变量。例如,如果第 3 阶段需要第 1 阶段的变量,则需要声明对第 1 阶段的显式依赖。

    【讨论】:

    • 已验证。将我的管道的源添加为单独的答案,但这是正确的。
    【解决方案2】:

    以下说明 Kontekst 的答案是正确的(我打算编辑帖子以添加此内容,但不知道这是否合适?):

    以下证实并说明这是正确答案:

    stages:
    - stage: A
      jobs:
      - job: A1
        steps:
         - pwsh: Write-Host "##vso[task.setvariable variable=varFromA;isOutput=true]A"
           name: writevar
    
    - stage: B
      dependsOn: A
      jobs:
      - job: B1
        variables: 
          varA: $[ stageDependencies.A.A1.outputs['writevar.varFromA'] ]
        steps:
         - pwsh: |
              Write-Host "##vso[task.setvariable variable=varFromB;isOutput=true]B"
              Write-Host "accesses $(VarA) from A"
           name: writevar
    
    - stage: C
      dependsOn: 
      - A
      - B
      jobs:
      - job: C1
        variables: 
          varA: $[ stageDependencies.A.A1.outputs['writevar.varFromA'] ]
          varB: $[ stageDependencies.B.B1.outputs['writevar.varFromB'] ]
        steps:
         - pwsh: |
              Write-Host "##vso[task.setvariable variable=varFromC;isOutput=true]C"
              Write-Host "accesses $(varB) from B"
              Write-Host "accesses $(varA) from A"
           name: writevar
    

    【讨论】:

      猜你喜欢
      • 2021-07-18
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2020-10-03
      • 2012-07-24
      • 1970-01-01
      相关资源
      最近更新 更多