YAML 管道变量范围
YAML pipeline variable scopes
我对变量及其范围有疑问。我想设置一个包含多个作业的管道,每个作业都包含相同的任务,我想为它们使用一个模板。
我也有工作变量,我想在工作 运行 期间操纵它们。由于 Job 是在模板中定义的,因此所有变量名称都是相同的。通常我使用以下命令为变量设置新值。
Write-Output ("##vso[task.setvariable variable=job_variable1;]$newValue")
我真的不知道这是否会导致所有作业的所有变量都设置为 $newVariable 的内容,或者此日志记录命令是否仅设置当前作业的变量。
所有作业 运行 并行,如果这也会设置来自其他作业的变量,则可能会对其他作业产生副作用。
我用以下 yaml 管道测试了这个问题,据我所知,它看起来不错,在 BuildJob1 中设置的新值在 BuildJob2 中没有回显,但我真的不知道它是否有效测试。
trigger: none
jobs:
- job: BuildJob1
variables:
job_variable1: VariableFromJob1 # this is only available in BuildJob
steps:
- task: PowerShell@2
displayName: "Echo and set job variable"
inputs:
targetType: inline
script: '
echo "initial job variable";
echo "$(job_variable1)";
$newValue = "new Variable for VariableFromJob1";
Write-Output ("##vso[task.setvariable variable=job_variable1;]$newValue");
'
- task: PowerShell@2
displayName: "Echo new job variable"
inputs:
targetType: inline
script: '
echo "new job variable";
echo "$(job_variable1)";
'
- job: BuildJob2
variables:
job_variable1: VariableFromJob2 # this is only available in BuildJob
steps:
- task: PowerShell@2
displayName: "Echo and set job variable"
inputs:
targetType: inline
script: '
echo "initial job variable";
Start-Sleep -s 45;
echo "$(job_variable1)";
$newValue = "newJobValue from job 2";
Write-Output ("##vso[task.setvariable variable=job_variable1;]$newValue");
'
- task: PowerShell@2
displayName: "Echo new job variable"
inputs:
targetType: inline
script: '
echo "new job variable";
echo "$(job_variable1)";
'
在 Job2 中,我等了 45 秒以确保在打印其内容之前在 Job1 中设置了作业变量。
好的,我在文档中找到了答案。
因此该命令在作业中设置变量,应该不会出现并发问题。
进一步说明你是对的。 运行 来自模板的作业是这些模板的副本,甚至大部分时间都可以 运行 在不同的代理上并行,因此他们不会知道局部变量对作业的更改.
我对变量及其范围有疑问。我想设置一个包含多个作业的管道,每个作业都包含相同的任务,我想为它们使用一个模板。 我也有工作变量,我想在工作 运行 期间操纵它们。由于 Job 是在模板中定义的,因此所有变量名称都是相同的。通常我使用以下命令为变量设置新值。
Write-Output ("##vso[task.setvariable variable=job_variable1;]$newValue")
我真的不知道这是否会导致所有作业的所有变量都设置为 $newVariable 的内容,或者此日志记录命令是否仅设置当前作业的变量。
所有作业 运行 并行,如果这也会设置来自其他作业的变量,则可能会对其他作业产生副作用。
我用以下 yaml 管道测试了这个问题,据我所知,它看起来不错,在 BuildJob1 中设置的新值在 BuildJob2 中没有回显,但我真的不知道它是否有效测试。
trigger: none
jobs:
- job: BuildJob1
variables:
job_variable1: VariableFromJob1 # this is only available in BuildJob
steps:
- task: PowerShell@2
displayName: "Echo and set job variable"
inputs:
targetType: inline
script: '
echo "initial job variable";
echo "$(job_variable1)";
$newValue = "new Variable for VariableFromJob1";
Write-Output ("##vso[task.setvariable variable=job_variable1;]$newValue");
'
- task: PowerShell@2
displayName: "Echo new job variable"
inputs:
targetType: inline
script: '
echo "new job variable";
echo "$(job_variable1)";
'
- job: BuildJob2
variables:
job_variable1: VariableFromJob2 # this is only available in BuildJob
steps:
- task: PowerShell@2
displayName: "Echo and set job variable"
inputs:
targetType: inline
script: '
echo "initial job variable";
Start-Sleep -s 45;
echo "$(job_variable1)";
$newValue = "newJobValue from job 2";
Write-Output ("##vso[task.setvariable variable=job_variable1;]$newValue");
'
- task: PowerShell@2
displayName: "Echo new job variable"
inputs:
targetType: inline
script: '
echo "new job variable";
echo "$(job_variable1)";
'
在 Job2 中,我等了 45 秒以确保在打印其内容之前在 Job1 中设置了作业变量。
好的,我在文档中找到了答案。
因此该命令在作业中设置变量,应该不会出现并发问题。
进一步说明你是对的。 运行 来自模板的作业是这些模板的副本,甚至大部分时间都可以 运行 在不同的代理上并行,因此他们不会知道局部变量对作业的更改.