带有手动 运行 和用户设置变量的 Azure Devops 管道:如何检查条件中的变量?
Azure Devops Pipeline with Manual Run and User-Set Variables: How to check variables in conditions?
希望有人可以帮助我回顾我的 git 日志我现在已经尝试了 14 种不同的方法来尝试让它工作。场景如下:
我在 UI 中创建了一个名为 deploy_custom_env
的变量,并选中了“用户可以在运行时设置变量”。我将其初始化为“默认”,但我希望用户在开始手动运行时覆盖它。
我正在尝试在 condition
中的某些管道阶段使用此变量。
我尝试过很多很多不同的东西。以下是一些示例:
第一个:
condition: ne(variables.deploy_custom_env, 'default')
和
condition: ne('${{ variables.deploy_custom_env }}', 'default')
和
variables:
- name: isCustomEnv
value: ne[($(deploy_custom_env), 'default')]
甚至
variables:
- name: isCustomEnv
value: ne[(variables.deploy_custom_env, 'default')]
好笑的是,在尝试使用上述内容时,以下两种情况 都会导致跳过阶段:
condition: eq(variables.isCustomEnv, true)
condition: eq(variables.isCustomEnv, false)
这是否意味着它既是 true
又是 false
? (当然,我在开玩笑:我不知道这实际评估的是什么。)我也尝试启用 System.debug
并检查“启用系统诊断”`,但是当我的阶段被跳过时,我可以'真的看不到这些变量的评估结果。
如果有任何建议或文档可以帮助我解决此问题,我将不胜感激。这肯定是人们做的事情?另外,推荐给 Azure 阅读的任何人:我很乐意在文档中的某个地方看到这个例子。
我查看了以下内容以尝试回答这个问题:
- https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#understand-variable-syntax
- https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml#build-variables-devops-services
- https://docs.microsoft.com/en-us/azure/devops/pipelines/process/conditions?view=azure-devops&tabs=yaml
- https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops#conditionally-assign-a-variable
在后者中,我看到了编译时和运行时的区别,有如下注释:
The difference between runtime and compile time expression syntaxes is
primarily what context is available. In a compile-time expression (${{
}}), you have access to parameters and statically defined
variables. In a runtime expression ($[ ]), you have
access to more variables but no parameters.
这似乎是相关的,但我如何将其转化为适合我 condition
的内容?
如果您在 yml 文件中执行此操作,则 $(deploy_custom_env) 应该可以工作。
我会再给你一个可变的语法来尝试,然后用另一种方法来做
此语法适用于您之前指出的描述的变量:
stages:
- stage: FirstStage
jobs:
- job: FirstJob
pool:
vmImage: 'windows-latest'
steps:
- pwsh: Write-Host "deploy custom environment is default"
displayName: Run if default
condition: eq(variables['deploy_custom_env'], 'default')
- pwsh: Write-Host "deploy custom environment is notdefault"
displayName: Run if not default
condition: ne(variables['deploy_custom_env'], 'default')
另一种方法是不使用在 UI 中声明的变量,而是使用构建的参数 - 这将设置默认值,并允许您在排队时更改它构建:
parameters:
- name: deploy_custom_env
type: string
default: 'default'
stages:
- stage: FirstStage
jobs:
- job: FirstJob
pool:
vmImage: 'windows-latest'
steps:
- pwsh: Write-Host "deploy custom environment is default"
displayName: Run if default
condition: eq('${{ parameters.deploy_custom_env }}', 'default')
- pwsh: Write-Host "deploy custom environment is notdefault"
displayName: Run if not default
condition: ne('${{ parameters.deploy_custom_env }}', 'default')
这样做的好处是,在排队构建时,将默认值的提示放在您面前 - 您不必深入研究变量。
注意: 这种方法适用于管道,不适用于模板或嵌套模板中的条件,如可用参数可能...棘手。
希望有人可以帮助我回顾我的 git 日志我现在已经尝试了 14 种不同的方法来尝试让它工作。场景如下:
我在 UI 中创建了一个名为
deploy_custom_env
的变量,并选中了“用户可以在运行时设置变量”。我将其初始化为“默认”,但我希望用户在开始手动运行时覆盖它。我正在尝试在
condition
中的某些管道阶段使用此变量。我尝试过很多很多不同的东西。以下是一些示例:
第一个:
condition: ne(variables.deploy_custom_env, 'default')
和
condition: ne('${{ variables.deploy_custom_env }}', 'default')
和
variables:
- name: isCustomEnv
value: ne[($(deploy_custom_env), 'default')]
甚至
variables:
- name: isCustomEnv
value: ne[(variables.deploy_custom_env, 'default')]
好笑的是,在尝试使用上述内容时,以下两种情况 都会导致跳过阶段:
condition: eq(variables.isCustomEnv, true)
condition: eq(variables.isCustomEnv, false)
这是否意味着它既是 true
又是 false
? (当然,我在开玩笑:我不知道这实际评估的是什么。)我也尝试启用 System.debug
并检查“启用系统诊断”`,但是当我的阶段被跳过时,我可以'真的看不到这些变量的评估结果。
如果有任何建议或文档可以帮助我解决此问题,我将不胜感激。这肯定是人们做的事情?另外,推荐给 Azure 阅读的任何人:我很乐意在文档中的某个地方看到这个例子。
我查看了以下内容以尝试回答这个问题:
- https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#understand-variable-syntax
- https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml#build-variables-devops-services
- https://docs.microsoft.com/en-us/azure/devops/pipelines/process/conditions?view=azure-devops&tabs=yaml
- https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops#conditionally-assign-a-variable
在后者中,我看到了编译时和运行时的区别,有如下注释:
The difference between runtime and compile time expression syntaxes is primarily what context is available. In a compile-time expression (${{ }}), you have access to parameters and statically defined variables. In a runtime expression ($[ ]), you have access to more variables but no parameters.
这似乎是相关的,但我如何将其转化为适合我 condition
的内容?
如果您在 yml 文件中执行此操作,则 $(deploy_custom_env) 应该可以工作。
我会再给你一个可变的语法来尝试,然后用另一种方法来做
此语法适用于您之前指出的描述的变量:
stages:
- stage: FirstStage
jobs:
- job: FirstJob
pool:
vmImage: 'windows-latest'
steps:
- pwsh: Write-Host "deploy custom environment is default"
displayName: Run if default
condition: eq(variables['deploy_custom_env'], 'default')
- pwsh: Write-Host "deploy custom environment is notdefault"
displayName: Run if not default
condition: ne(variables['deploy_custom_env'], 'default')
另一种方法是不使用在 UI 中声明的变量,而是使用构建的参数 - 这将设置默认值,并允许您在排队时更改它构建:
parameters:
- name: deploy_custom_env
type: string
default: 'default'
stages:
- stage: FirstStage
jobs:
- job: FirstJob
pool:
vmImage: 'windows-latest'
steps:
- pwsh: Write-Host "deploy custom environment is default"
displayName: Run if default
condition: eq('${{ parameters.deploy_custom_env }}', 'default')
- pwsh: Write-Host "deploy custom environment is notdefault"
displayName: Run if not default
condition: ne('${{ parameters.deploy_custom_env }}', 'default')
这样做的好处是,在排队构建时,将默认值的提示放在您面前 - 您不必深入研究变量。
注意: 这种方法适用于管道,不适用于模板或嵌套模板中的条件,如可用参数可能...棘手。