Azure pipeline: условная переменная env на основе ОС - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь сделать переменные моей среды зависимыми от операционной системы агента .

Я написал следующее test.yml, но это не работает:

jobs:
  - job: Test
    pool:
      vmImage: 'ubuntu-latest'
    steps:
      - pwsh: |
          echo $env:TestVar
          echo $env:OS
        env:
          OS: $[variables['Agent.OS']]
          ${{ if eq(variables['Agent.OS'], 'Windows_NT') }}:
            TestVar: "I am Windows"
          ${{ if eq(variables['Agent.OS'], 'Linux') }}:
            TestVar: "I am Linux"

Есть ли проблема с моим отступом YAML?

Ответы [ 3 ]

1 голос
/ 24 июля 2020

Ваш синтаксис верен после изменения OS: $(Agent.OS). Но переменные агента не поддерживают использование в выражении шаблона. Вы можете обратиться к следующей ссылке, переменные с Yes в Available in templates? должны использоваться в выражении шаблона.

https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml

1 голос
/ 15 июля 2020

Ваш YAML кажется правильным, но в Azure DevOps что-то неясно. Однако вы можете использовать это как обходной путь:

trigger:
- master

jobs:
- job: Test
  pool:
    vmImage: 'ubuntu-latest'
  variables:
    varOS: $(Agent.OS)
  steps:
    - pwsh: |
        $testVar = ''
        $os = '$(Agent.OS)'
        if ($os -eq 'Windows_NT') {
          $testVar = "I am Windows";
        } elseif ($os -eq 'Linux') {
          $testVar = "I am Linux";
        }
        Write-Host $testVar
        Write-Host "##vso[task.setvariable variable=HelloOS;isOutput=true]$testVar"
      name: Initialize
    - pwsh: |
        echo $env:TestVar
        echo $env:OS
        echo $env:AGENT_OS
        echo $env:IsMaster
        printenv
      env:
        OS: $(varOS)
        TestVar: $(Initialize.HelloOS)
        ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/master')}}:
          IsMaster: "true"

для этой сборки я получил:

I am Linux
Linux
Linux
true

Я пробовал несколько подходов, также помещая условную настройку в раздел переменных. Но только это дало ожидаемый результат. Конечно, поскольку у вас есть доступ к $env:AGENT_OS, вы можете поместить этот условный logi c прямо на целевой шаг. Я просто предположил, что вы хотите иметь TestVar где-то еще.

0 голосов
/ 29 июля 2020

На основании ответа Сесе Донг, переменные агента не могут использоваться в этом синтаксисе. Самый чистый способ добиться того же эффекта - просто использовать оболочку для управления переменными среды.

jobs:
  - job: Test
    pool:
      vmImage: 'ubuntu-latest'
    steps:
      - pwsh: |
           if ($env:AGENT_OS -eq "Windows_NT") {
             $env:TestVar="I am Windows"
           }
           if ($env:AGENT_OS -eq "Linux") {
             $env:TestVar="I am Linux"
           }

и если TestVar предполагается использовать на другом шаге, используйте это позже:

           echo "##vso[task.setvariable variable=env:TestVar]$env:TestVar"

...