当前位置: 首页 > 知识库问答 >
问题:

如何在azure DevOps yaml管道的变量和变量组中使用IF-ELSE?

姬欣怡
2023-03-14

我试图将两个值中的一个分配给变量组之外的变量,但找不到如何使用IF-ELSE的引用。

基本上,我需要将这个jerkins逻辑转换为azure DevOps。

詹金斯

if (branch = 'master') { 
   env = 'a'
} else if (branch = 'dev'){
    env ='b'
}

我从下面的一个引用中找到了一个引用,但是如果变量部分没有变量组,那么这个引用似乎有效。

https://stackoverflow.com/a/57532526/5862540

但在我的管道中,我已经有了一个用于机密的变量组,因此我必须使用名称/值约定,并且该示例无法处理诸如预期映射未预期映射意外值“env”

variables:
- group: my-global
- name: env
  value:
    ${{ if eq(variables['Build.SourceBranchName'], 'master') }}: 
      env: a
    ${{ if eq(variables['Build.SourceBranchName'], 'dev') }}: 
      env: b

variables:
- group: my-global
- name: env
  value:
    ${{ if eq(variables['Build.SourceBranchName'], 'master') }}: a
    ${{ if eq(variables['Build.SourceBranchName'], 'dev') }}: b

共有3个答案

仲霍英
2023-03-14

几周前,微软发布了一个YAML pipeliens的新功能,它只允许你这么做:IF-ELSEnotation。

https://docs.microsoft.com/en-us/azure/devops/release-notes/2021/sprint-192-update#new-yaml-conditional-expressions

通过使用${else}和${elseif}表达式,在YAML文件中编写条件表达式变得更加容易。下面是如何在YAML管道文件中使用这些表达式的示例。

steps:
- script: tool
  env:
    ${{ if parameters.debug }}:
      TOOL_DEBUG: true
      TOOL_DEBUG_DIR: _dbg
    ${{ else }}:
      TOOL_DEBUG: false
      TOOL_DEBUG_DIR: _dbg
variables:
  ${{ if eq(parameters.os, 'win') }}:
    testsFolder: windows
  ${{ elseif eq(parameters.os, 'linux' }}:
    testsFolder: linux
  ${{ else }}:
    testsFolder: mac
罗伟兆
2023-03-14

更新09/09/2021

我们现在有了原生的if-else表达式,我们可以像

variables:
- group: PROD
- name: env
  ${{ if eq(variables['Build.SourceBranchName'], 'master') }}:
    value: a
  ${{ else }}:
    value: b

steps:
- script: | 
    echo '$(name)'
    echo '$(env)'

原来的答复

带有模板表达式的语法${{if……} 不仅限于作业/阶段级别。以下两个管道的作用相同,并产生相同的输出:

stages:
- stage: One
  displayName: Build and restore
  variables:
  - group: PROD
  - name: env
    ${{ if eq(variables['Build.SourceBranchName'], 'master') }}:
      value: a
    ${{ if eq(variables['Build.SourceBranchName'], 'dev') }}:
      value: b
  jobs:
  - job: A
    steps:
    - script: | 
        echo '$(name)'
        echo '$(env)'
variables:
- group: PROD
- name: env
  ${{ if eq(variables['Build.SourceBranchName'], 'master') }}:
    value: a
  ${{ if eq(variables['Build.SourceBranchName'], 'dev') }}:
    value: b

steps:
- script: | 
    echo '$(name)'
    echo '$(env)'

法烨华
2023-03-14


我对参数做了类似的处理。

variables:
  - name: var1
    ${{ if eq(parameters.var1, 'custom') }}:
      value: $(var1.manual.custom)
    ${{ if ne(parameters.var1, 'custom') }}:
      value: ${{ parameters.var1 }}
 类似资料:
  • 问题内容: 我有几个字段,每个字段都是这样的: 通过使用带有计数器的循环,我希望能够说出fieldx。其中x是该循环中计数器的值。这意味着如果我的数组中有6个条目,则将为fields1-field6提供值。 是否可以使用fieldx? 问题答案: 您可以使用反射来完成此操作,但是通常最好在数组中声明字段。代替: 你可以这样做: 然后,您可以遍历数组来设置值:

  • 我在Azure DevOps中创建了三个变量组,其中包括三个变量: 网络应用开发 每个变量组都有一个名为环境的变量,其值被适当命名以与环境相对应。 我现在想做的是引用Azure Pipeline yaml文件中的每个环境变量。下面的屏幕截图描述了我当前如何在管道开发阶段引用变量组WebApp-DEV。 但是,我如何调用或引用每个变量组的环境值,正如上面对WebApp DEV的描述?换句话说,从变量

  • 问题内容: 我想根据用户选择的值导入一些软件包。 默认值为: 如果用户选择,则应为: 在PHP中,我可以使用变量variable来做到这一点: 如何在Python中执行此操作? 问题答案: Python没有与PHP的“变量变量”直接等效的功能。要获取“变量变量”的值(或任何其他表达式的值),可以使用该函数。 但是,这不能在语句中使用。 可以使用该函数通过变量导入。 相当于

  • 我们正在努力将经典Azure管道转换为YAML管道。有一件事不清楚,那就是如何确保两个不同的变量组,它们的变量名称相同,但含义不同,不会互相踩踏。 例如,如果我有变量组和,每个变量名为,如何确保在YAML管道中使用正确的? 一个更令人担忧的例子是,如果我们最初有两个变量组而没有重叠的变量名,那么如何确保向组中添加一个新的重叠变量名不会取代最初预期的变量使用?

  • 我只是在学习编码,所以我遇到了“k不能解决”的问题。 我以前尝试过引入变量,如果运算符by: 我预期输出为2 相反,无法解析got k

  • 问题内容: 是否有任何环境变量可用于获取Jenkins管道标题? 我知道我们可以使用它来获得自由职业的头衔,但是有什么可以用来获取管道名称的东西吗? 问题答案: 您可以使用相同的名称(例如或)从groovy访问相同的环境变量。 从文档中: 可以从Groovy代码中以env.VARNAME或仅以VARNAME的形式访问环境变量。您也可以写入这些属性(仅使用env。前缀): 这些定义也将在构建期间或构