在 Azure DevOps Pipelines 中跨阶段共享变量

zoo*_*oes 35 azure azure-devops azure-pipelines

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

我将 设置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)
Run Code Online (Sandbox Code Playgroud)

Mer*_*SFT 25

更新:

跨阶段共享变量功能现已在Sprint 168 中发布。

请使用以下格式访问前一阶段的输出变量:

stageDependencies.{stageName}.{jobName}.outputs['{stepName}.{variableName}'] 
Run Code Online (Sandbox Code Playgroud)

原来的:

在 Azure DevOps Pipelines 中跨阶段共享变量

我不敢说它不支持共享在一个阶段定义的变量并将其传递到另一个阶段。

这是我们计划添加的功能,但直到现在,它还不受支持。你可以关注这个Github issue,很多人和你有同样的需求。你可以跟踪那个。

到目前为止,我们只支持设置多作业输出变量,但这仅支持 YAML。对于经典编辑器,没有任何计划在发布中添加此功能。

对于变通方法,您可以在阶段之前预定义变量。但一件重要的事情是,如果你在一个阶段改变它的价值。新值无法传递到下一阶段。具有新值的变量的生命周期仅存在于阶段。

  • 它适用于工作,但不适用于部署工作 - 有机会看看它吗? (3认同)
  • @scorpio 对于部署作业,您的语法略有不同!您需要再次添加作业名称。详细信息:https://learn.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops#job-to-job-dependency-across-stages (3认同)
  • 最初记录的语法不适用于阶段条件。正确的语法(对于阶段条件)是 `stageDependency.{stageName}.outputs['{jobName}.{stepName}.{variableName}']`。有关详细信息,请参阅[关于跨阶段变量的 github 问题](https://github.com/microsoft/azure-pipelines-tasks/issues/4743#issuecomment-643469964)。 (2认同)

Krz*_*tof 15

重要的stageDependenciescondition在阶段级别不可用。它在工作中是可行的,但不能直接在阶段(至少目前)。

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)
Run Code Online (Sandbox Code Playgroud)


Blu*_*uds 13

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

输出变量仍然由作业内部的步骤产生。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


Dej*_*489 11

自 2020 年 5 月 4 日起可用

作业可以访问前一阶段的输出变量:

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

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

笔记

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

  • 您从文档中复制的注释对我有帮助。我的依赖不起作用,但我没有在前一阶段添加显式依赖 (3认同)

Sch*_*hLx 8

对于具有代理版本 2.153.1 的 Azure DevOps 版本 Dev17.M153.5 上的阶段条件,以下工作有效:

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"

Run Code Online (Sandbox Code Playgroud)

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

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

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

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

奖金

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

相应文件

要使用不同阶段的输出,您必须根据您处于阶段级别还是作业级别来使用语法:

  • 在阶段级别,引用不同阶段的变量的格式是dependencies.STAGE.outputs['JOB.TASK.VARIABLE']. 您可以在条件中使用这些变量。
  • 在作业级别,引用不同阶段的变量的格式是stageDependencies.STAGE.JOB.outputs['TASK.VARIABLE']

注意:默认情况下,管道中的每个阶段都依赖于 YAML 文件中前一个阶段。如果您需要引用不紧邻当前阶段之前的阶段,则可以通过dependsOn向该阶段添加一个部分来覆盖此自动默认值。