Cia*_*ill 6 azure-devops azure-pipelines
我有一个 Azure Devops 发布管道(使用经典编辑器而不是 yaml),并且在内联 powershell 脚本中设置变量时遇到问题。脚本的相关部分是这样的:
Write-Host "Web is $web"
Write-Host "App is $app"
Write-Host "##vso[task.setvariable variable=MyWebEnv;]$web"
Write-Host "Set Web to $($MyWebEnv)"
Write-Host "##vso[task.setvariable variable=MyAppEnv;]$app"
Write-Host "Set App to $(MyAppEnv)"
Run Code Online (Sandbox Code Playgroud)
日志文件表明 my$web和$app变量保存正确的值,但是该设置不起作用。
$($env:MyWebEnv)我尝试以和格式写出值$(MyWebEnv),这两种格式都表明 ADO 变量尚未正确设置。
我的变量是在管道的变量选项卡中定义的。它在排队时设置为可设置。我尝试过在定义中未设置任何值并设置初始值,我可以看到初始值不会被覆盖。
我尝试在自托管代理和 Azure Pipelines 托管代理上运行此命令 - 结果相同。我有另一个发布管道,它可以执行类似的操作,但没有出现问题。
我正在尝试在后续阶段中使用该变量。
我不想将变量写入文件或任何内容,因为我想使用变量来控制阶段是否运行。
编辑:根据李维的评论,我尝试isOutput=true在同一阶段的后续步骤中添加和检查变量 - 即使在后续步骤中它也不可见:
=================================================== ======================= 编辑2:我一定在某个地方有一个不可见的角色。我正在外部编辑器中编写 powershell(这样我就有更多空间)并粘贴到 ADO 中的内联文本框中 - 当我在编辑器中输入完全相同的内容时,它开始工作 - 有点。
我现在可以设置该变量,它会出现在下面的任务中,但我真正想要的是在下一阶段使用它 - 在 IIS 部署组中控制 IIS 服务器 A 运行,但 IIS 服务器 B 不运行。我试图在附加选项运行表达式中执行此操作。
我试过了
and(succeeded(), eq(variables['MyWebEnv'], 'myvalue')
或(其中 MyOutput. 是设置变量时为我的输出引用指定的名称)
and(succeeded(), eq(variables['MyOutpub.MyWebEnv'], 'myvalue')
或
and(succeeded(), eq(variables['MyOutpub_MyWebEnv'], 'myvalue')
为了澄清,我是在 IIS 部署组本身上执行此操作,而不是在该组内的任何任务上执行此操作。
我不断看到部署被跳过,原因如下:
Evaluating: eq(variables['MyOutput,MyWebEnv'], 'myvalue') Expanded: eq(Null, 'myvalue') Result: False
您尝试在 powershell 任务中设置的变量只会在以下任务中生效,这意味着如果您在其自己的 powershell 任务中回显该变量,它将不会输出覆盖的值。看这里。
要从脚本设置变量,请使用 task.setvariable 日志记录命令。这不会更新环境变量,但它确实使新变量可用于同一作业中的下游步骤。
所以只能通过环绕的方式在下游任务中引用它$()。见下文:
steps:
- powershell: |
Write-Host "##vso[task.setvariable variable=MyWebEnv]$web"
- powershell: |
Write-Host "Set Web to $(MyWebEnv)"
Run Code Online (Sandbox Code Playgroud)
如果你想在后续阶段使用它。您必须使用 使该变量成为输出变量isOutput=true。看这里
- powershell: |
Write-Host "##vso[task.setvariable variable=MyWebEnv;isOutput=true]$web"
name: MyVariable
- powershell: echo "$(MyVariable.MyWebEnv)"
Run Code Online (Sandbox Code Playgroud)
您还应该为此 powershell 任务命名,以便在后续阶段引用它。请参阅此处了解如何引用多级输出变量。
variables:
web: $[stageDependencies.stageName.jobName.outputs['stepName.variableName']]
Run Code Online (Sandbox Code Playgroud)
您还需要为后续阶段添加对此阶段的依赖关系。
请参阅下面的示例:
stages:
- stage: VariableStage
jobs:
- job: VariableJob
steps:
- powershell: |
$web = "---"
Write-Host "##vso[task.setvariable variable=MyWebEnv;isOutput=true]$web"
name: MyVariable
- stage:
dependsOn: VariableStage
variables:
web: $[stageDependencies.VariableStage.VariableJob.outputs['MyVariable.MyWebEnv']]
jobs:
- job:
steps:
- powershell: echo "$(web)"
Run Code Online (Sandbox Code Playgroud)
正如 Levi Lu 提到的,您可以在下一步中访问管道变量。因此,如果您在这里设置这样的变量:
$web ="some-web"
$app ="some-app"
Write-Host "##vso[task.setvariable variable=MyWebEnv;]$web"
Write-Host "##vso[task.setvariable variable=MyAppEnv;]$app"
Run Code Online (Sandbox Code Playgroud)
那么你可以这样阅读它们:
Write-Host "Set Web to $(MyWebEnv)"
Write-Host "Set App to $(MyAppEnv)"
Run Code Online (Sandbox Code Playgroud)
如果您想通过环境变量访问它们,您应该使用以下语法:
Write-Host "Set Web to $($env:MYWEBENV)"
Write-Host "Set App to $($env:MYAPPENV)"
Run Code Online (Sandbox Code Playgroud)
编辑2的答案:
您实际需要的是 YAML 中支持但经典管道中不支持的输出跨阶段变量。请检查此主题。您可以克服这个问题,但需要付出额外的努力,如此处所示。但是,请记住,您无法从发布管道发布工件。
这里有跨阶段变量的文档,但如上所述,它适用于 YAML。
| 归档时间: |
|
| 查看次数: |
11112 次 |
| 最近记录: |