Azure 管道:基于 OS 的条件环境变量
Azure pipeline: conditional env variable based on OS
我正在尝试使我的环境变量依赖于 Agent 操作系统。
我写了下面的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 缩进有问题吗?
您的 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
。
您的语法在更改 OS: $(Agent.OS)
后是正确的。但代理变量不支持在模板表达式中使用。可以参考下面的link,Available in templates?
中带Yes
的变量应该可以在模板表达式中使用。
https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml
根据董策策的回答,代理变量不能用在这个语法中。达到相同效果的最干净的方法就是使用 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"
我正在尝试使我的环境变量依赖于 Agent 操作系统。
我写了下面的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 缩进有问题吗?
您的 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
。
您的语法在更改 OS: $(Agent.OS)
后是正确的。但代理变量不支持在模板表达式中使用。可以参考下面的link,Available in templates?
中带Yes
的变量应该可以在模板表达式中使用。
https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml
根据董策策的回答,代理变量不能用在这个语法中。达到相同效果的最干净的方法就是使用 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"