我有一个带有作业模板的天蓝色 DevOps 管道。
我需要将前一个作业中的变量传递到作业模板中。
在作业中,您可以导出变量:
echo "##vso[task.setvariable variable=runtimevar1]test"
在各个作业中,您可以设置一个标志,并将其导入到下一个作业的变量中:
variables:
var1: $[ dependencies.job1.outputs['setvars.runtimevar2'] ]
echo "##vso[task.setvariable variable=runtimevar2;isOutput=true]test2"
但是,当使用模板时,这不起作用,因为您无法将变量块传递给模板
当 job2 是模板时,是否有一种简单的方法将输出变量(仅在运行时已知)从 job1 传递到 job2?
完整示例:
# ################################################################
# Update the network packages
# Push new network JSON to Topdesk
# Triggers whenever connectivityJSON is updated in main branch
# ################################################################
name: testing-passing-vars
trigger: none
stages:
- stage: stage1
jobs:
- job: job1
steps:
- checkout: self
# set a variable
- script: |
echo "##vso[task.setvariable variable=runtimevar1]test"
echo "##vso[task.setvariable variable=runtimevar2;isoutput=true]test2"
name: setvars
displayName: 'set vars'
- script: |
echo "within a job local var is available"
echo runtimevar1: $(runtimevar1) # this works
echo runtimevar2: $(runtimevar2) # this does not work
displayName: echovars
- job: job2
dependsOn: job1
variables:
var2: "$[ dependencies.job1.outputs['setvars.runtimevar2'] ]"
steps:
- checkout: self
- script: |
echo "between jobs only the explicitely exported var is available and using the dependencies keyword in variable block op job"
# echo runtimevar1: $(runtimevar1) # this will not work
echo "var2: $(var2)" # this works
displayName: echovars
# this does not work
- template: ./templates/jobs/test-job.yaml
parameters:
var1: "$[ dependencies.job1.outputs['setvars.runtimevar2'] ]"
var2: "empty"
dependson: job1
# # this is not allowed
# - template: ./templates/jobs/test-job-variables-template.yaml
# variables:
# var2: $[ dependencies.job1.outputs['setvars.runtimevar2'] ]
# parameters:
# var1: $(var2)
# var2: "empty"
parameters:
- name: var1
type: string
- name: var2
type: string
- name: dependson
type: string
jobs:
- job: testjob
displayName: testjob-template1
dependsOn: ${{ parameters.dependson }}
variables:
- name: localvar1
value: "localvar"
- name: remotevar
value: "$[ dependencies.job1.outputs['setvars.runtimevar2'] ]"
steps:
- checkout: self
# Get the Azure credentials for this environment
- script: |
echo param1 var1 ${{ parameters.var1 }}
echo param2 var2 ${{ parameters.var2 }}
echo local var ${{ variables.localvar1 }}
echo remote var ${{ variables.remotevar }}
displayName: 'echo vars'
不能通过参数传递输出变量。参数需要提前给定,不能是运行时产生的。
但是您可以使用
$[ dependencies.job1.outputs['setvars.runtimevar2'] ]
在模板作业中定义变量,如示例代码中所示,然后使用它 echo remote var $(remotevar)
而不是 ${{ variables.remotevar }}
我认为您遵循了正确的方法,但是使用变量时出现了一些错误
这是您的示例代码,进行了一些细微的修改。
main.yml
stages:
- stage: stage1
jobs:
- job: job1
steps:
# set a variable
- script: |
echo "##vso[task.setvariable variable=runtimevar1]test"
echo "##vso[task.setvariable variable=runtimevar2;isoutput=true]test2"
name: setvars
displayName: 'set vars'
- script: |
echo runtimevar1: $(runtimevar1)
echo runtimevar2: $(setvars.runtimevar2)
displayName: echovars
- job: job2
dependsOn: job1
variables:
var2: $[ dependencies.job1.outputs['setvars.runtimevar2'] ]
steps:
- script: |
echo "var2: $(var2)"
displayName: echovars
# this does not work
- template: ./test-job.yaml
parameters:
var1: "hello world"
test-job.yml
parameters:
- name: var1
type: string
jobs:
- job: testjob
displayName: testjob-template1
dependsOn: job1
variables:
- name: remotevar
value: $[ dependencies.job1.outputs['setvars.runtimevar2'] ]
steps:
# Get the Azure credentials for this environment
- script: |
echo param1 var1 ${{ parameters.var1 }}
echo remote var $(remotevar)
displayName: 'echo vars'
请注意我的文件的相对路径