在Azure DevOps管道中的各个阶段共享变量

时间:2019-08-13 21:37:28

标签: azure azure-devops azure-pipelines

我试图弄清楚如何在脚本中跨ADO管道共享自定义变量。下面是我的脚本,分为两个阶段。

我将curProjVersion设置为输出变量,并尝试从其他阶段访问它。我做对了吗?

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: VersionCheck
    pool:
      vmImage: 'ubuntu-latest'
    displayName: Version Check
    continueOnError: false
    steps:

      - script: |
          echo "##vso[task.setvariable variable=curProjVersion;isOutput=true]1.4.5"
        name: setCurProjVersion
        displayName: "Collect Application Version ID"

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  variables:
    curProjVersion1: $[ dependencies.Build.VersionCheck.outputs['setCurProjVersion.curProjVersion'] ]
  jobs:
  - job: 
    steps: 
      - script: |
          echo $(curProjVersion1)

8 个答案:

答案 0 :(得分:12)

作业现在可以访问先前阶段的变量

输出变量仍由作业内部的步骤产生。阶段不是引用dependencies.jobName.outputs['stepName.variableName'],而是引用stageDependencies.stageName.jobName.outputs['stepName.variableName']

https://docs.microsoft.com/en-us/azure/devops/release-notes/2020/sprint-168-update#azure-pipelines-1

答案 1 :(得分:10)

stageDependencies在阶段级别没有重要的提示condition。它可以在工作中使用,但不能直接在舞台上使用(至少目前是这样)。

stages:
- stage: A
  jobs:
  - job: JA
    steps:
    - script: |
        echo "This is job Foo."
        echo "##vso[task.setvariable variable=doThing;isOutput=true]Yes" #The variable doThing is set to true
      name: DetermineResult
    - script: echo $(DetermineResult.doThing)
      name: echovar
  - job: JA_2
    dependsOn: JA
    condition: eq(dependencies.JA.outputs['DetermineResult.doThing'], 'Yes')
    steps:
    - script: |
        echo "This is job Bar."

#stage B runs if DetermineResult task set doThing variable n stage A
- stage: B
  dependsOn: A
  jobs:
  - job: JB
    condition: eq(stageDependencies.A.JA.outputs['DetermineResult.doThing'], 'Yes') #map doThing and check if true
    variables:
      varFromStageA: $[ stageDependencies.A.JA.outputs['DetermineResult.doThing'] ]
    steps:
    - bash: echo "Hello world stage B first job"
    - script: echo $(varFromStageA)

答案 2 :(得分:7)

自2020年5月4日起可用

Jobs can access output variables from previous stages:

现在可以在基于YAML的管道的各个阶段中使用输出变量。这可以帮助您从一个阶段到下一个阶段传递有用的信息,例如执行/不执行决策或生成的输出的ID。上一阶段的结果(状态)及其工作也可用。

输出变量仍由作业内部的步骤产生。阶段不是引用dependencies.jobName.outputs['stepName.variableName'],而是引用stageDependencies.stageName.jobName.outputs['stepName.variableName']

注意

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

答案 3 :(得分:3)

  

在Azure DevOps管道中的各个阶段共享变量

恐怕要说的是,它不支持共享在一个阶段中定义的变量并将其传递到另一阶段。

这是我们计划添加的功能,但到目前为止,尚不支持。您可以遵循此Github issue,许多人对您有相同的需求。您可以跟踪它。

到目前为止,我们仅支持设置multi-job output variable,但这仅支持YAML。对于Classic Editor,没有计划在发行版中添加此功能。

要解决此问题,可以在阶段之前预定义变量。但是重要的是,如果您要一步改变它的价值。新值无法传递到下一阶段。具有新值的变量的生存期仅存在于阶段中。

答案 4 :(得分:2)

您可以定义一个全局变量,并使用Powershell将stage变量的值分配给该全局变量。

Write-Output ("##vso[task.setvariable variable=globalVar;]$stageVar")

全局变量可以在Yaml本身中定义,也可以在变量组中定义。 用空值初始化var。

例如yaml

  variables:
    globalVar: ''

答案 5 :(得分:1)

作为对任何发现此问题的人的更新,似乎在阶段has been implemented and should be released in the next couple of weeks之间传递变量。

答案 6 :(得分:1)

对于阶段条件,Azure DevOps 版本 Dev17.M153.5 和代理版本 2.153.1 有以下作用:

stages:
- stage: A
  jobs:
  - job: JA
    steps:
    - script: |
        echo "This is job Foo."
        echo "##vso[task.setvariable variable=doThing;isOutput=true]Yes" #The variable doThing is set to 'Yes'
      name: DetermineResult

#stage B runs if DetermineResult task set doThing variable on stage A
- stage: B
  dependsOn: A
  condition: eq(dependencies.A.outputs['JA.DetermineResult.doThing'], 'Yes')
  jobs:
  - job: JB
    steps:
    - bash: echo "Hello world stage B first job"

注意:与工作相比,舞台上的属性布局不同:

dependencies.{stage name}.outputs['{job name}.{script name}.{variable name}']

注意:带有“stageDependencies”的表达式失败并显示以下错误消息:

<块引用>

加载 YAML 构建管道时出错。无法识别的值:“stageDependencies”。位于表达式中的位置 XX: and(always(), eq(stageDependencies.A.outputs['JA.DetermineResult.doThing'], 'Yes'))。如需更多帮助,请参阅 https://go.microsoft.com/fwlink/?linkid=842996

奖励

有关如何访问依赖阶段的状态,请参阅以下文档:link

答案 7 :(得分:-2)

您可以在定义触发器之后和定义阶段之前定义变量

trigger:
- master
  variables:
    VarA: aaaaa
    VarB: bbbbb
stages:
- stage: Build  
  jobs:
  - job: Build
    pool:
      vmImage: 'vs2017-win2016'