Azure Pipelines YAML如何在具有策略的作业之间使用变量

时间:2019-07-09 17:09:27

标签: azure-devops azure-pipelines

假设我从这种有效的配置开始:

jobs:
  - job: ARelease

    pool:
      vmImage: 'Ubuntu-16.04'

    steps:
    - script: |
        echo "##vso[task.setvariable variable=ReleaseVar;isOutput=true]1"
      name: JobResult


  - job: C

    pool:
      vmImage: 'Ubuntu-16.04'

    dependsOn: ARelease

    variables:
      AVar: $[ dependencies.A.outputs['JobResult.ReleaseVar'] ]

    steps:
    - script: |
        echo $(AVar)

按预期的作业C输出1。

现在让我们说我必须添加一个新的作业ADebug,它与ARelease几乎相同,因此我使用一种策略:

jobs:
  - job: A

    strategy:
      matrix:
        Release:
          BUILD_TYPE: Release
        Debug:
          BUILD_TYPE: Debug

    pool:
      vmImage: 'Ubuntu-16.04'

    steps:
    - script: |
        echo "##vso[task.setvariable variable=$(BUILD_TYPE)Var;isOutput=true]1"
      name: JobResult


  - job: C

    pool:
      vmImage: 'Ubuntu-16.04'

    dependsOn: A

    variables:
      AReleaseVar: $[ dependencies.A.outputs['JobResult.ReleaseVar'] ]
      ADebugVar: $[ dependencies.A.outputs['JobResult.DebugVar'] ]

    steps:
    - script: |
        echo $(AReleaseVar)
        echo $(ADebugVar)

我希望一切正常,并且可以看到输出。.但是输出为空。

使用诊断对作业进行排队,看来$[ dependencies.A.outputs['JobResult.ReleaseVar'] ]$[ dependencies.A.outputs['JobResult.DebugVar'] ]的值为Null。 我尝试了不同的变体来访问这些变量,但是它总是计算为Null。

您知道什么是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#set-a-multi-job-output-variable

  

如果您要从matrixslice设置变量,请参考   变量,您必须包括作业名称以及   当您从下游作业访问它时会执行此步骤。

格式如下:dependencies.{job}.outputs['{matrix/slice key}.{step name}.{variable name}']


在您的方案中,您使用矩阵策略( Release Debug )运行了 Job A ,并分别设置了变量名称分别是 ReleaseVar DebugVar 。准确访问这些变量的方法是:

  • dependencies.A.outputs['Release.JobResult.ReleaseVar']
  • dependencies.A.outputs['Debug.JobResult.DebugVar']

另一方面,也许您可​​以使用相同的变量名,因为您已经能够根据矩阵名区分值。