具有手动运行和用户设置变量的 Azure Devops Pipeline:如何检查条件中的变量?

ere*_*wok 1 azure-devops azure-devops-pipelines

希望有人能帮我解决这个问题,回顾一下我的 git 日志,我现在已经尝试了 14 种不同的方法来尝试让它发挥作用。这是场景:

  • 我在 UI 中创建了一个名为deploy_custom_env“用户可以在运行时设置变量”的变量。我将其初始化为“默认”,但我希望用户在开始手动运行时覆盖它。

  • 我试图在condition我的一些管道阶段中使用这个变量。

  • 我尝试过很多很多不同的事情。这里有些例子:

第一的:

condition: ne(variables.deploy_custom_env, 'default')
Run Code Online (Sandbox Code Playgroud)

condition: ne('${{ variables.deploy_custom_env }}', 'default')
Run Code Online (Sandbox Code Playgroud)

variables:
- name: isCustomEnv
  value: ne[($(deploy_custom_env), 'default')]
Run Code Online (Sandbox Code Playgroud)

乃至

variables:
  - name: isCustomEnv
    value: ne[(variables.deploy_custom_env, 'default')]
Run Code Online (Sandbox Code Playgroud)

有趣的是,当尝试使用上述内容时,以下两种情况都会导致跳过阶段:

condition: eq(variables.isCustomEnv, true)
condition: eq(variables.isCustomEnv, false)
Run Code Online (Sandbox Code Playgroud)

这是否意味着它既是 又是truefalse?(当然,我在开玩笑:我不知道这实际上会评估什么。)我也尝试过启用System.debug和检查“启用系统诊断”,但是当我的阶段被跳过时,我真的看不出这些是什么变量正在评估。

我将不胜感激任何可以帮助我解决这个问题的建议或文档。这肯定是人们做的事情吗?另外,建议任何来自 Azure 的人阅读:我很乐意在文档中的某个地方看到这个示例。

我查看了以下内容来尝试回答这个问题:

在后者中,我看到了编译时和运行时之间的区别,并附有以下注释:

运行时和编译时表达式语法之间的区别主要在于可用的上下文。在编译时表达式 (${{ }}) 中,您可以访问参数和静态定义的变量。在运行时表达式 ($[ ]) 中,您可以访问更多变量,但不能访问参数。

这似乎是相关的,但我如何将其转化为在我的condition系统中有效的东西?

Wai*_*ole 5

我会给你一个更多的可变语法来尝试,然后是另一种方法

此语法适用于您之前指出的变量:

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')
Run Code Online (Sandbox Code Playgroud)

另一种方法是不使用 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')
Run Code Online (Sandbox Code Playgroud)

这样做的优点是,在对构建进行排队时,将默认值的提示放在您的面前 - 您不必深入研究变量。

注意:此方法适用于管道,它不适用于模板或嵌套模板中的条件,因为当参数可用时可能会......棘手。