编辑 1: 在原帖中我有一个拼写错误:在第 4 步中我使用了编译时表达式,这当然是不正确的,而在我原来的管道中我使用的是模板表达式。抱歉造成混淆 - 现在这篇文章中的 YAML 片段与我的管道相同。是的,它仍然无法正常工作。
由于某种原因,我在对从模板导入的变量使用模板表达式语法(尤其是 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 之间产生如此大的差异,因为我认为它应该运行良好,因为模板语法在运行时开始之前的编译时得到处理。 也许有人知道如何解决这个问题,以及我在这项微不足道的任务中遗漏了什么。 任何帮助将不胜感激,所以提前致谢。
对于 #4,您使用的是运行时表达式 (
$[]
),而对于 #2 - 编译时表达式 (${{}}
)。条件插入只能用于编译时表达式,这就是 #4 不起作用的原因。有关表达式的更多信息:https://learn.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops
要解决您的问题,您可以尝试以使用编译时表达式或使用任何步骤中存在的
condition
字段的方式更改管道。在第二个选项中,可以使用运行时表达式