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 中设置了作业变量。

好的,我在文档中找到了答案。

https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#set-a-job-scoped-variable-from-a-script

因此该命令在作业中设置变量,应该不会出现并发问题。

进一步说明你是对的。 运行 来自模板的作业是这些模板的副本,甚至大部分时间都可以 运行 在不同的代理上并行,因此他们不会知道局部变量对作业的更改.