我有一个
parent.yml
和 sub.yml
,如下所示:
parent.yml
:
variables:
- name: JavaVersion
value: 21
jobs:
- template: templates/sub.yml
parameters:
JavaVersion: $(JavaVersion)
sub.yml
:
parameters:
JavaVersion: ''
jobs:
- job: UseJavaVersion
steps:
- ${{ if ge(parameters.JavaVersion, 21) }}:
- task: PowerShell@2
displayName: Set default java version to ${{ parameters.JavaVersion }}
- ${{ else }}:
- task: PowerShell@2
displayName: Install java version ${{ parameters.JavaVersion }}
当我运行作业时,它总是转到其他部分。为什么 'if-condition' 的计算结果不为 true ?我在这里做错或错过了什么?
我尝试将
parent.yml
中的变量值更改为“21”,并将 sub.yml
if 条件中的变量值更改为“21”,但不起作用。
我还在这个github页面中找到了一些相关讨论https://github.com/microsoft/azure-pipelines-agent/issues/1749但它并没有真正澄清我的问题。
我希望由于变量 JavaVersion 的值为 21,那么应该执行
sub.yml
中的 if 条件,并且我们应该看到名为“将默认 java 版本设置为 ${{parameters.JavaVersion }}”的步骤。
注意:由于它总是转到其他部分,因此步骤显示名称显示正确的 JavaVersion 由 ${{parameters.JavaVersion }} 解析。
您正在尝试使用仅在运行时可用的值来执行条件插入表达式。
永远记住:变量在运行时评估;参数仅存在于编译时。
如果你想在编译时进行条件插入,则需要使用参数的编译时值:
# pipeline.yml
jobs:
- template: templates/sub.yml
parameters:
JavaVersion: 21
如果您想使用变量,则必须在任务上使用条件:
# pipeline.yml
jobs:
- template: templates/sub.yml
parameters:
JavaVersion: $(currentJavaVersion)
# templates/sub.yml
parameters:
- name: JavaVersion
type: string
jobs:
- job: UseJavaVersion
variables:
javaVersion: ${{ parameters.JavaVersion }}
steps:
- task: PowerShell@2
displayName: Using Java 21 or greater
condition: and( succeeded(), ge( variables['javaVersion'], 21) )
inputs:
targetType: inline
script: Write-Host "Using ${{ parameters.JavaVersion }}"
- task: PowerShell@2
displayName: Install java
condition: and( succeeded(), lt( variables['javaVersion'], 21) )
inputs:
targetType: inline
script: Write-Host "Installing!"