Отправка переменных среды в хостах Ubuntu с помощью powershell (Azure DevOps) - PullRequest
0 голосов
/ 28 мая 2020

У меня возникают проблемы, когда я пытаюсь отправить переменную среды между задачами с использованием хостов Powershell и Ubuntu в Azure конвейерах сборки DevOps.

Чтобы протестировать и показать эту проблему, я создал конвейер с следующее:

-Созданы две задачи, первая записывает переменную среды:

$EnvVariable= "Value"

Write-Host "##vso[task.setvariable variable=EnvVariable;]$EnvVariable"

Write-Output "##vso[task.setvariable variable=EnvVariable;]$EnvVariable"

-Вторая задача выводит это значение на вывод:

Write-Host "env:EnvVariable : $($env:EnvVariable)"

Write-Host "ENV:EnvVariable : $($ENV:EnvVariable)"

Write-Output "env:EnvVariable : $($env:EnvVariable)"

Write-Output "ENV:EnvVariable : $($ENV:EnvVariable)"

- Выходные данные этого конвейера выглядят хорошо на Windows хостах, например, при использовании хоста «vs2017-win2016» я получаю следующий результат:

env:EnvVariable : Value
ENV:EnvVariable : Value
env:EnvVariable : Value
ENV:EnvVariable : Value

-Но когда я выполняю этот же конвейер на хостах ubuntu я не получаю ожидаемого результата, здесь у вас есть результат второй задачи, выполненной на хосте сборки «ubuntu-18.04»:

env:EnvVariable : 
ENV:EnvVariable : 
env:EnvVariable : 
ENV:EnvVariable : 

Как видите, нет значений из переменной среды используя те же задачи, но на хостах ubuntu.

Просто чтобы перепроверить, я использовал Write-Output и Write-Host, чтобы проверить, не вызвана ли проблема требованием использования одного из d использовал env: и ENV: просто чтобы проверить, является ли имя переменной с учетом регистра.

Большое спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Я сталкиваюсь с проблемами, когда пытаюсь отправить переменную среды между задачами с использованием хостов Powershell и Ubuntu в Azure конвейерах сборки DevOps.

Согласно переменным среды :

В системах UNIX (macOS и Linux) переменные среды имеют формат $ NAME. На Windows формат:% NAME% для пакета и $ env: NAME в PowerShell.

Итак, вы встретили ожидаемое поведение в соответствии с документом. А чтобы работать с и Windows, и Linux, я предлагаю использовать формат $(EnvVariable).

Подробности:

Разница, когда вы устанавливаете переменную EnvVariable:

  1. В Linux с использованием задачи Powershell вы должны использовать $env:ENVVARIABLE. Также он работает для задачи Powershell в Windows, но не работает в задаче CMD/bash.

  2. В Linux с использованием bash задачи вы должны использовать $ENVVARIABLE, но он не может работать в задаче PS.

  3. В обоих Linux и Windows, независимо от задачи bash, задачи cmd или powershell задача, вы можете использовать $(EnvVariable).

0 голосов
/ 28 мая 2020

Если вы не хотите использовать раздел env, вам необходимо использовать верхний регистр для агентов на основе Linux:

- task: PowerShell@2
  displayName: Set Variables
  name: setVariables
  inputs:
    targetType: 'inline'
    pwsh: true
    script: |
      $EnvVariable= "Value"

      Write-Host "##vso[task.setvariable variable=EnvVariable;]$EnvVariable"

      Write-Output "##vso[task.setvariable variable=EnvVariable;]$EnvVariable"

- task: PowerShell@2
  displayName: Read variables 0
  inputs:
    targetType: 'inline'
    pwsh: true
    script: |
      Write-Host "env:EnvVariable : $($env:ENVVARIABLE)"

      Write-Host "ENV:EnvVariable : $($ENV:ENVVARIABLE)"

      Write-Output "env:EnvVariable : $($env:ENVVARIABLE)"

      Write-Output "ENV:EnvVariable : $($ENV:ENVVARIABLE)"

- task: PowerShell@2
  displayName: Read variables 2
  env:
    EnvVariable: $(EnvVariable)
  inputs:
    targetType: 'inline'
    pwsh: true
    script: |
      Write-Host "env:EnvVariable : $($env:EnvVariable)"

      Write-Host "ENV:EnvVariable : $($ENV:EnvVariable)"

      Write-Output "env:EnvVariable : $($env:EnvVariable)"

      Write-Output "ENV:EnvVariable : $($ENV:EnvVariable)"
...