我正在尝试找出一种方法来执行以下操作
variables:
${{ if eq(variables['var-a'], exists_and_is_set) }}:
namespaceName: $(var-a)
${{ if ne(variables['var-a'], exists_and_is_set) }}:
namespaceName: $(var-b)
Run Code Online (Sandbox Code Playgroud)
基本上,如果变量 A 存在并且有一个值 != null != '' 则使用它,否则使用另一个变量。这里的脚本非常简单,我找不到方法来做到这一点。原因是我正在进行更改,在使用此模板的数百个 CICD 管道中,只有 10 个左右会使用var-a,因此我试图找到一种方法来实现逻辑,而不必去更新数百个管道包含他们不会使用的东西。
Kev*_*SFT 17
您可以尝试使用''来表示不存在或没有值。
例如:eq(variables['var-a'], '')
如果您使用If 表达式,它可能无法实现您想要的功能。
根据我的测试,当我使用If Expression时,变量的值var-a将始终保持不存在或为空,即使它已被创建。
所以我找到了另一种方法来设置变量,它可以按预期工作:
这是我的例子:
模板:build.yml
steps:
- script: echo "##vso[task.setvariable variable=namespaceName;]$(var-a)"
condition: ne(variables['var-a'], '')
- script: echo "##vso[task.setvariable variable=namespaceName;]$(var-b)"
condition: eq(variables['var-a'], '')
Run Code Online (Sandbox Code Playgroud)
Azure pipelines.yml
....
steps:
- template: build.yml
- script: |
echo $(namespaceName)
displayName: 'Run a multi-line script'
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它将根据变量的值选择要运行的任务。在任务中,它将使用logging命令来设置变量。
var-a: null/不存在 -> 运行任务 2 -> 命名空间名称: var-b
var-a: 存在 -> 运行任务 1 -> 命名空间名称: var-a
Kevin Lu 是正确的,但这里有一些额外的背景来解释它为什么会这样工作。
${{ <expression> }}仅在模板编译时评估语法。这意味着任何用户变量尚未初始化。如果您尝试检查它们的值,它将始终返回空值。虽然${{ <expression> }}语法很方便有条件地输出模板行以进行处理,但用户变量值不会被设置限制您可以使用if.
语法$[ <expression> ]在运行时评估。变量将被初始化,但是您不能直接使用if语法有条件地直接输出不同的变量值。不过,您可以使用切肉刀黑客,如西蒙·阿林(Simon Alling)在这篇文章中的回答所述。
参考:https://learn.microsoft.com/en-us/azure/devops/pipelines/process/expressions
这个非常简单的 YAML Pipeline 说明了这个概念:
stages:
- stage: TestVarsCompile
variables:
- name: state_prefix
# $subdirectory is not defined
${{ if eq(variables['subdirectory'], '') }}:
value: 'subdirectory-not-set'
# $subdirectory is defined
${{ if ne(variables['subdirectory'], '') }}:
value: 'subdirectory-set'
jobs:
- job:
steps:
- checkout: none
- script: |
echo $(subdirectory)
echo $(state_prefix)
- stage: TestVarsRuntime
variables:
state_prefix: $[
replace(
replace(
eq(variables['subdirectory'], ''),
True,
'sub-directory-not-set'
),
False,
'sub-directory-set'
)
]
jobs:
- job:
steps:
- checkout: none
- script: |
echo $(subdirectory)
echo $(state_prefix)
Run Code Online (Sandbox Code Playgroud)
无论变量是否设置,阶段TestVarsCompile输出始终返回以下输出:subdirectory
some value
subdirectory-not-set
如果设置了变量,阶段TestVarsRuntime输出将返回以下内容:subdirectory
some value
subdirectory-set
| 归档时间: |
|
| 查看次数: |
25044 次 |
| 最近记录: |