2

我正在尝试使我的环境变量依赖于代理操作系统

我写了以下内容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 缩进有问题吗?

4

3 回答 3

2

根据 Cece Dong 的回答,在这种语法中不能使用代理变量。达到相同效果的最简洁的方法就是使用 shell 来管理环境变量。

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"

于 2020-07-29T18:16:00.893 回答
1

您的 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,因此您可以将此条件逻辑直接放在目标步骤中。我只是假设您想在TestVar其他地方提供。

于 2020-07-14T23:46:27.810 回答
1

更改后您的语法是正确的OS: $(Agent.OS)。但是代理变量不支持在模板表达式中使用。您可以参考以下链接,带有Yesin的变量Available in templates?应该能够在模板表达式中使用。

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

于 2020-07-24T10:36:11.823 回答