我试图弄清楚如何在脚本中跨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)
答案 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'