0

我正在阅读这篇文章:https ://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=classic%2Cbatch#set-in-script

此处显示的 Powershell 脚本示例:https ://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=classic%2Cpowershell#set-a-job-scoped-variable -from-a-script-1

我假设“设置酱汁和秘密。酱汁变量”是一项任务,“读取变量”是另一项任务。并且这些参数作为任务参数传递。

如果是这样(即 - 在一个 powershell 任务中设置的值可以在另一个 powershell 任务中使用),那么,为什么下面的部分(请参阅https://docs.microsoft.com/en-us/azure/devops/pipelines /process/variables?view=azure-devops&tabs=classic%2Cpowershell#using-variables-as-task-inputs)建议:

为了将变量用作任务输入,该变量必须是输出变量,并且您必须为生成任务指定一个引用名称。

本节(https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#set-a-multi-job-output-variable)说:

如果要使变量可用于将来的作业,则必须使用 isOutput=true 将其标记为输出变量。

4

1 回答 1

2

首先,你假设了什么

“设置酱汁和秘密。酱汁变量”是一项任务,“读取变量”是另一项任务

是正确的。如果您在同一任务中阅读它,您会收到"{output variable name}"可以识别的错误。

如果在同一个作业中使用变量$()直接使用与$(<ReferenceName>.<VariableName>)在大多数情况下使用相同,包括在一个代理作业中获取变量,而不是在另一个任务中设置同名变量。但是,显然,$()这是一种最简单的方法。


  • 1. 如果在另一个任务中设置了同名变量。

    有时,您可能需要以不同的条件执行相同的脚本,因此其结果可能名称相同但值不同。一言以蔽之,您需要使用相同的变量名在不同的任务中设置不同的值。然后您需要根据在不同状态下生成的值执行下一个任务。

    这时候使用$(<ReferenceName>.<output VariableName>)是比较好的方案,获取设置在哪个状态的具体变量值。因为读取动作只能得到最新的赋值。

  • 2.如果你想在不同的代理工作中使用这个变量

    在一些大型项目中,下一个代理作业需要使用上一个代理作业中设置的变量(注意:这两个作业必须在同一管道中)。重新运行脚本设置变量会增加构建的时间,也会增加代码验证的成本。

    在这种情况下,$(<ReferenceName>.<output VariableName>)是唯一可以实现这种情况的方法。

    但是,直到现在,这种方法只支持 YAML 模式。如果使用经典编辑器来实现这种场景,只能重新编写设置变量脚本。

于 2019-11-11T05:05:06.750 回答