在脚本中设置变量
Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018
在管道中使用 PowerShell 和 Bash 脚本时,可以设置可在将来的任务中使用的变量通常很有用。 当想要执行任务不支持的内容(如调用自定义 REST API 并分析响应)时,脚本非常适用于。
你将使用 task.setvariable 日志记录命令在 PowerShell 和 Bash 脚本中设置变量。
注意
部署作业对输出变量使用不同的语法。 若要详细了解对部署作业中的输出变量的支持,请参阅 部署作业。
关于 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 中的机密变量输出。
输出变量级别
有四种不同类型的输出变量具有不同的语法:
- 未使用参数的同一作业中设置的
isoutput输出变量。 若要引用这些变量,请使用宏语法。 示例:$(myVar)。 - 使用参数在同一作业中设置的
isoutput输出变量。 若要引用这些变量,需要包含任务名称。 示例:$(myTask.myVar)。 - 在将来的作业中设置的输出变量。 若要引用这些变量,你将使用
dependency语法引用节中的variables变量。 - 未来阶段设置的输出变量。 若要引用这些变量,你将使用
stageDependencies语法引用节中的variables变量。
设置用于同一作业的输出变量
在同一作业中使用输出变量时,无需使用该 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
此脚本获取同一作业变量 myJobVar 和 myOutputJobVar。 请注意,添加一次 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)
