簡體   English   中英

Powershell腳本任務output的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

在作業中,如果您在步驟中使用“ SetVariable ”命令設置具有新值的 output 變量,則在功能上等同於創建與管道變量具有相同名稱但值不同的新 output 變量。 管道變量及其初始值仍然可用。

此 output 變量僅可用於同一作業中的后續步驟以及依賴於當前作業的后續作業。 對於運行“ SetVariable ”命令設置此 output 變量的步驟,此 output 變量不可用。

  • 對於同一作業中的后續步驟,您應該使用表達式“ $(stepId.varName) ”來訪問 output 變量的值。 表達式“ $(varName) ”將返回管道變量的值,即初始值。

  • 對於依賴於當前作業的每個后續作業,您應該使用表達式“ $[dependencies.jobId.outputs['stepId.varName']] ”將 output 變量的值分配給作業變量,然后在步驟您可以通過此作業變量訪問該值的作業。

要查看更多詳細信息,您可以查看“ SetVariable:初始化或修改變量的值”和“ 設置多作業 output 變量”。

一個例子作為參考:

  • 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'
  • 結果在此處輸入圖像描述

    在此處輸入圖像描述

    在此處輸入圖像描述

task.setVariable的目的是將變量值傳達給管道的其他任務、作業和階段。 您不能期望它將值反映到任務中的變量中,因為它在任務完成后有效運行 - 管道運行 Powershell,然后掃描 output 中的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)"

請注意,此語法用於作業內的通信 - 需要使用不同的語法將變量與管道的另一個作業或階段進行通信。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM