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



编辑1:在原来的帖子中,我有一个错字:在步骤#4中,我使用了编译时表达式,这当然是不正确的,在我原来的管道中,我使用模板表达式。很抱歉造成混乱-现在这篇文章中的YAML片段与我的管道相同。是的,它仍然不起作用。执行截图

由于某种原因,我在使用模板表达式语法(特别是If-else语句)时遇到了一些麻烦,这些变量是从模板导入的。这打乱了我所有的逻辑。所以,我有一个相当简单的ADO Yaml管道:azure-pipelines.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" 

下面是vars/vars的代码片段。

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

一切看起来都很好,但这是我在运行期间看到的日志,如果我将applicationType设置为'Backend':

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

因为条件只在与模板语法一起使用时起作用,所以我甚至不知道我还可以尝试做什么。奇怪的是,为什么ADO在典型的变量和从模板导入的变量之间做出如此大的区别,因为我认为它应该工作得很好,因为模板语法在编译时处理,在运行时开始之前。也许有人知道如何解决这个问题,什么点我错过了这样一个微不足道的任务。任何帮助都将是感激的,所以提前感谢。

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

要解决你的问题,你可以尝试改变你的管道的方式,你会使用编译时表达式或使用condition字段存在于任何步骤。在第二个选项中,可以使用运行时表达式

你在混合不同类型的变量。

- template: vars/vars.yml@Templates
parameters:
varAppType:$(applicationType)

$(applicationType)是宏语法,在运行时计算。但是,模板参数在编译时解析。因此,varAppType:$(applicationType)实际上应该是varAppType: ${{ variables.applicationType }}(或者更理想的是${{ parameters.applicationType }}),这样它可以在编译时解决。

但是,您所做的将参数映射到变量的操作在很大程度上是不必要的。您可以将参数直接引用为${{ parameters.applicationType }}。因此,整个vars.yml模板是不必要的。

另一个最佳实践注释:

你在这里做什么:

- bash: echo $(applicationType)具有潜在危险。就像SQL注入一样,您可以将任意字符串直接注入到脚本中。这被称为脚本注入漏洞。处理这个问题的更好的方法是将参数映射到一个环境变量,并在脚本中将其作为环境变量引用,如下所示:

- bash: echo $APP_TYPE
env:
APP_TYPE: ${{ parameters.applicationType }}

相关内容

  • 没有找到相关文章

最新更新