Powershell脚本任务输出的AzureDevOps Pipeline变量赋值

AzureDevOps Pipeline variable assignment of Powershell script task output

我有一个 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)

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

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

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)"

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

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

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

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

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

查看更多详情,您可以查看“SetVariable: Initialize or modify the value of a variable" and "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'
  • 结果