Azure DevOps YAML管道中如何向非依赖Job传递输出变量
问题根因
Azure DevOps YAML 流水线中,dependencies 运行时对象仅包含当前Job直接声明依赖的Job的输出变量。你当前的JobC仅声明了dependsOn: JobB,所以dependencies集合里只有JobB的上下文,没有JobA的输出变量,因此取值失败。
可行解决方案
方案1:给需要取JobA变量的Job追加JobA依赖(最简便,不改变原有执行顺序)
你可以把dependsOn改为数组,同时声明依赖JobA和JobB,执行顺序依然是JobA→JobB→JobC,不会打乱原有流程,同时JobC就能获取到JobA的输出变量,就算中间存在无代理手动校验作业也不受影响:
jobs: - job: JobA steps: - task: Bash@3 name: var_test inputs: targetType: 'inline' script: | myVar=demo-value echo "##vso[task.setvariable variable=myVarNew;isOutput=true]$myVar" - job: JobB dependsOn: JobA variables: - name: newVar2 value: $[ dependencies.JobA.outputs['var_test.myVarNew'] ] steps: - task: Bash@3 inputs: targetType: 'inline' script: | echo "$(newVar2)" - job: JobC # 同时依赖JobB和JobA,执行顺序还是等JobB跑完才会启动JobC,不影响原有流程 dependsOn: - JobA - JobB variables: - name: newVar2 value: $[ dependencies.JobA.outputs['var_test.myVarNew'] ] steps: - task: Bash@3 inputs: targetType: 'inline' script: | echo "$(newVar2)"
方案2:中间Job透传输出变量
如果不想修改原有依赖关系,可以在JobB中把拿到的变量再次标记为输出,后续Job直接从JobB取变量即可:
jobs: - job: JobA steps: - task: Bash@3 name: var_test inputs: targetType: 'inline' script: | myVar=demo-value echo "##vso[task.setvariable variable=myVarNew;isOutput=true]$myVar" - job: JobB dependsOn: JobA variables: - name: newVar2 value: $[ dependencies.JobA.outputs['var_test.myVarNew'] ] steps: - task: Bash@3 name: pass_var inputs: targetType: 'inline' script: | echo "$(newVar2)" # 把变量再次标记为输出,供下游Job使用 echo "##vso[task.setvariable variable=myVarNew;isOutput=true]$(newVar2)" - job: JobC dependsOn: JobB variables: - name: newVar2 value: $[ dependencies.JobB.outputs['pass_var.myVarNew'] ] steps: - task: Bash@3 inputs: targetType: 'inline' script: | echo "$(newVar2)"
方案3:可变变量组存储(适合大量Job复用的场景)
如果需要跨多个Job甚至跨阶段复用变量,也可以提前创建支持修改的变量组,在JobA中把生成的变量写入变量组,后续所有Job直接从变量组读取即可,无需每个Job都声明上游依赖的输出变量。
内容的提问来源于stack exchange,提问作者Ela
相关产品推荐
相关产品推荐

