在脚本中设置变量

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

在管道中使用 PowerShell 和 Bash 脚本时,可以设置可在将来的任务中使用的变量通常很有用。 当想要执行任务不支持的内容(如调用自定义 REST API 并分析响应)时,脚本非常适用于。

你将使用 task.setvariable 日志记录命令在 PowerShellBash 脚本中设置变量。

注意

部署作业对输出变量使用不同的语法。 若要详细了解对部署作业中的输出变量的支持,请参阅 部署作业

关于 task.setvariable

使用 添加变量 task.setvariable时,以下任务可以使用宏语法 $(myVar)的变量。 默认情况下,该变量仅适用于同一作业中的任务。 如果添加参数 isoutput,则调用变量更改的语法。 请参阅 设置输出变量以用于同一作业

使用值foo设置变量myVar

- bash: |
    echo "##vso[task.setvariable variable=myVar;]foo"

读取变量 myVar

- bash: |
    echo "You can use macro syntax for variables: $(myVar)"

设置变量属性

此命令 task.setvariable 包含用于将变量设置为机密、作为输出变量和只读的属性。 可用属性包括:

  • variable = 变量名称 (必需)
  • issecret = 布尔 (可选,默认值为 false)
  • isoutput = 布尔 (可选,默认值为 false)
  • isreadonly = 布尔 (可选,默认值为 false)

若要在下一阶段使用变量,请将 isoutput 属性设置为 true. 若要引用设置为 isoutput true 的变量,请包含任务名称。 例如,$(TaskName.myVar)

将变量设置为只读时,下游任务无法覆盖该变量。 将 isreadonly 设置为 true。 将变量设置为只读可增强保护,方法是使该变量不可变。

将变量设置为机密

如果 issecret 设置为 true,变量的值将保存为机密,并从日志中屏蔽。

设置机密变量 mySecretVal

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"

获取机密变量 mySecretVal

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
    echo $(mySecretVal)

bash 中的机密变量输出。

bash 变量输出的屏幕截图。

输出变量级别

有四种不同类型的输出变量具有不同的语法:

设置用于同一作业的输出变量

在同一作业中使用输出变量时,无需使用该 isoutput 属性。 默认情况下,该变量将可用于同一作业中的下游步骤。 但是,如果确实添加属性 isoutput ,则需要使用任务名称引用变量。

下面的脚本设置同一作业输出变量 myJobVar ,而无需指定 isoutput 和设置 myOutputJobVarisoutput=true

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myJobVar]this is the same job"
  - bash: |
     echo "##vso[task.setvariable variable=myOutputJobVar;isoutput=true]this is the same job too"
    name: setOutput

此脚本获取同一作业变量 myJobVarmyOutputJobVar。 请注意,添加一次 isoutput=true 引用输出变量的语法更改。

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myJobVar]this is the same job"
  - bash: |
     echo "##vso[task.setvariable variable=myOutputJobVar;isoutput=true]this is the same job too"
    name: setOutput
  - bash: |
     echo $(myJobVar) 
  - bash: |
     echo $(setOutput.myOutputJobVar)

设置输出变量以供将来的作业使用

跨作业使用输出变量时,你将使用 dependencies它们。 在将来的作业或阶段中访问输出变量的语法因变量的 setter 与使用者之间的关系而异。 了解 依赖项中的每个案例。

首先,设置输出变量 myOutputVar

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
    name: passOutput

接下来,在将来的作业中访问 myOutputVar 并将变量输出为 myVarFromJobA。 若要使用 dependencies,需要使用设置输出变量的过去作业的名称,在将来的作业上设置 dependsOn 属性。

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
    name: passOutput
- job: B
  dependsOn: A
  variables:
    myVarFromJobA: $[ dependencies.A.outputs['passOutput.myOutputVar'] ]  
  steps:
  - bash: |
     echo $(myVarFromJobA)

设置输出变量以供将来阶段使用

可以在管道中的各个阶段使用输出变量。 这有助于将有用的信息(例如生成的输出的 ID)从一个阶段传递到下一个阶段。

使用 isoutput 属性设置变量时,可以使用任务名称和 stageDependencies 语法在后续阶段引用该变量。 详细了解 依赖项

首先,设置输出变量 myStageVal

steps:
    - bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
      name: MyOutputVar

然后,在将来的阶段,将输出变量 myStageVal 映射到阶段、作业或任务范围的变量,例如 myStageAVar。 请注意,映射语法使用运行时表达式$[],并使用阶段名称 () 和作业名称A1 (A) 跟踪输出变量的路径stageDependencies,以完全限定变量。

stages:
- stage: A
  jobs:
  - job: A1
    steps:
     - bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
       name: MyOutputVar
- stage: B
  dependsOn: A
  jobs:
  - job: B1
    variables:
      myStageAVar: $[stageDependencies.A.A1.outputs['MyOutputVar.myStageVal']]
    steps:
      - bash: echo $(myStageAVar)