Powershell 脚本任务输出的 AzureDevOps 管道变量分配

时间:2021-03-08 17:17:07

标签: powershell azure-devops azure-powershell

我有一个 YAML 管道,它定义了一个名为 vmPrivateIp 的变量:

pr: none
  trigger: none

variables:
  vmName: 'MyVmName'
  vmPrivateIp: '10.0.0.1'

我想用获取MyVmName私有IP的脚本任务的结果来分配这个变量:

- task: PowerShell@2
  inputs:
  targetType: 'inline'
  script: |
    $IP = (Get-AzNetworkInterface -Name $(vmName)-nic -ResourceGroupName MyResourceGroup).IpConfigurations.PrivateIpAddress
    Write-Host "##vso[task.setvariable variable=vmPrivateIp,isOutput=true]$IP"
    Write-Host $(vmPrivateIp)

任务运行正常但变量仍然包含初始值

enter image description here

我需要做什么才能将脚本任务的结果成功分配给vmPrivateIp

2 个答案:

答案 0 :(得分:3)

在作业中,如果您在步骤中使用“SetVariable”命令来设置具有新值的输出变量,则在功能上等同于创建具有相同值的新输出变量名称但与管道变量不同的值。管道变量及其初始值仍然可用。

此输出变量仅可用于同一作业中的后续步骤以及依赖当前作业的后续作业。对于运行“SetVariable”命令来设置此输出变量的步骤,此输出变量不可用。

  • 对于同一作业中的后续步骤,您应该使用表达式“$(stepId.varName)”来访问输出变量的值。表达式“$(varName)”将返回管道变量的初始值。

  • 对于依赖当前作业的每个后续作业,您应该使用表达式“$[dependencies.jobId.outputs['stepId.varName']]”来分配将输出变量转换为作业变量,然后在作业的步骤中您可以通过该作业变量访问该值。

要查看更多详细信息,您可以查看“SetVariable: Initialize or modify the value of a variable”和“Set a multi-job output variable”。

参考示例:

  • azure-pipelines.yml
variables:
  vmPrivateIp: '10.0.0.1'

jobs:
- job: 'JobA'
  displayName: 'Job A'
  steps:
  - task: PowerShell@2
    inputs:
      targetType: 'inline'
      script: Write-Host "vmPrivateIp = $(vmPrivateIp)"
    displayName: 'View IP before update'

  - task: PowerShell@2
    name: 'UpdateIp'
    inputs:
      targetType: 'inline'
      script: Write-Host "##vso[task.setvariable variable=vmPrivateIp;isoutput=true]10.0.0.2"
    displayName: 'Update IP and set output'

  - task: PowerShell@2
    inputs:
      targetType: 'inline'
      script: |
        Write-Host "vmPrivateIp = $(vmPrivateIp)"
        Write-Host "UpdateIp.vmPrivateIp = $(UpdateIp.vmPrivateIp)"
    displayName: 'View IP after update'

- job: 'JobB'
  displayName: 'Job B'
  dependsOn: 'JobA'
  variables:
    IP_from_JobA: $[dependencies.JobA.outputs['UpdateIp.vmPrivateIp']]
  steps:
  - task: PowerShell@2
    inputs:
      targetType: 'inline'
      script: Write-Host "IP_from_JobA = $(IP_from_JobA)"
    displayName: 'View IP from JobA'
  • 结果 enter image description here

    enter image description here

    enter image description here

答案 1 :(得分:2)

task.setVariable 的目的是将变量值传达给管道的其他任务、作业和阶段。您不能期望它将值反映到任务中的变量中,因为它在任务完成后有效运行 - 管道运行 Powershell,然后扫描 task.setVariable 的输出,并相应地设置变量。因此,在任务中,您可以使用 Powershell 变量本身。

- task: PowerShell@2
  name: GetPrivateIp
  inputs:
  targetType: 'inline'
  script: |
    # Lives local to this script
    $IP = (Get-AzNetworkInterface -Name $(vmName)-nic -ResourceGroupName MyResourceGroup).IpConfigurations.PrivateIpAddress
    # Sets release variable after execution
    Write-Host "##vso[task.setvariable variable=privateIp;isOutput=true]$IP"
    # Writes your initial value as declared
    Write-Host $(vmPrivateIp)
- task: PowerShell@2
  name: UsePrivateIp
  inputs:
  targetType: 'inline'
  script: |
    Write-Host "$(GetPrivateIp.privateIp)"

请注意,此语法用于在作业内进行通信 - 需要使用不同的语法将变量传送到管道的另一个作业或阶段。