Azure DevOps YAML:模板中变量的 If-else 条件不起作用

问题描述 投票:0回答:1

编辑 1: 在原帖中我有一个拼写错误:在第 4 步中我使用了编译时表达式,这当然是不正确的,而在我原来的管道中我使用的是模板表达式。抱歉造成混淆 - 现在这篇文章中的 YAML 片段与我的管道相同。是的,它仍然无法正常工作。 Screenshot of execution

由于某种原因,我在对从模板导入的变量使用模板表达式语法(尤其是 If-else 语句)时遇到了一些麻烦。这打破了我管道的所有逻辑。 所以,我有一个非常简单的 ADO Yaml 管道: 天蓝色管道.yml

parameters:
  - name: applicationType
    type: string
    values:
    - Backend
    - Frontend
    - Others
    default: Backend

trigger: none
resources:
    repositories:
    - repository: Templates
      type: git
      name: Templates

variables:
 - name: applicationType
  value: ${{ parameters.applicationType }}
 - template: vars/vars.yml@Templates
   parameters:
     varAppType:$(applicationType)

stages:
  - stage: Test
    jobs:
      - job: Test
        pool:
          vmImage: ubuntu-latest
        steps:
        - bash: echo $(applicationType) #1
        - ${{ if eq(variables.applicationType, 'Backend') }}: #2
          - bash: echo "It is Backend" 
        - ${{ else }}:
          - bash: echo "It is something different"
        - bash: echo $(varAppType) #3
        - ${{ if eq(variables.varAppType, 'Backend') }}: #4
          - bash: echo "It is Backend" 
        - ${{ else }}:
          - bash: echo "It is something different" 

这里是位于 Templates repo 中的 vars/vars.yml 的片段:

parameters:
    - name: varAppType
      default: ''

variables:
- name: varAppType
  value: ${{ parameters.varAppType }}

一切看起来都很好而且很简单,但如果我将 applicationType 设置为“后端”,这是我在运行期间在日志中看到的内容:

#1 output: Backend
#2 output: It is Backend
#3 output: Backend
#4 output: It is something different

因为条件语句只有在与模板语法一起使用时才有效,我什至不知道我还能尝试做什么。 奇怪的是,为什么 ADO 在典型的 var 和从模板导入的 var 之间产生如此大的差异,因为我认为它应该运行良好,因为模板语法在运行时开始之前的编译时得到处理。 也许有人知道如何解决这个问题,以及我在这项微不足道的任务中遗漏了什么。 任何帮助将不胜感激,所以提前致谢。

azure-devops yaml azure-pipelines ado azure-pipelines-yaml
1个回答
1
投票

对于 #4,您使用的是运行时表达式 (

$[]
),而对于 #2 - 编译时表达式 (
${{}}
)。条件插入只能用于编译时表达式,这就是 #4 不起作用的原因。有关表达式的更多信息:https://learn.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops

要解决您的问题,您可以尝试以使用编译时表达式或使用任何步骤中存在的

condition
字段的方式更改管道。在第二个选项中,可以使用运行时表达式

© www.soinside.com 2019 - 2024. All rights reserved.