我正在尝试找出一种方法来进行以下操作
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)
基本上,如果变量A存在并且具有值!= null!=”,则使用它,否则使用另一个变量。这里的脚本非常简单,我找不到实现此目的的方法。这样做的原因是,我正在进行更改,从使用该模板的数百条cicd管道中,只有10条左右将使用var-a
,所以我试图找到一种在没有逻辑的情况下实现逻辑的方法去更新数百个管道,以包括它们不会使用的内容。
答案 0 :(得分:1)
Kevin Lu 是对的,但这里有一些额外的背景说明为什么它会这样工作。
${{ <expression> }}
语法仅在模板编译时评估。这意味着尚未初始化任何用户变量。如果您尝试检查它们的值,它将始终返回一个空值。虽然 ${{ <expression> }}
语法便于有条件地输出模板行进行处理,但不会设置用户变量值来限制您可以使用 if
执行的操作。
$[ <expression> ]
语法在运行时进行评估。变量将被初始化,但是您不能直接使用 if
语法直接有条件地输出不同的变量值。但是,您可以使用 cleaver hack,如 this 帖子中 Simon Alling 的回答所述。
参考:https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions
这个非常简单的 YAML 管道说明了这个概念:
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)
无论是否设置了 TestVarsCompile
变量,subdirectory
阶段输出总是返回以下输出:
some value
subdirectory-not-set
如果设置了 TestVarsRuntime
变量,subdirectory
阶段输出将返回以下内容:
some value
subdirectory-set
答案 1 :(得分:0)
您可以尝试使用''
表示不存在或没有值。
例如:eq(variables['var-a'], '')
如果使用如果表达式,则可能无法实现所需的功能。
根据我的测试,当我使用 If表达式时,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'], '')
Azure pipelines.yml
....
steps:
- template: build.yml
- script: |
echo $(namespaceName)
displayName: 'Run a multi-line script'
此示例使用Condition Expression和Logging command。
在这种情况下,它将根据变量的值选择要运行的任务。在该任务中,它将使用logging命令来设置变量。
var-a:null /不存在->运行任务2->名称空间名称:var-b
var-a:存在->运行任务1-> namespaceName:var-a