如何在Azure DevOps Pipeline中编写if else条件

8
我有一个 Azure 管道,并运行参数,其中有多个选项如下:
选择测试执行
- 产品 - 带成本的产品 - 带附件的产品
如果我选择“产品”,则执行“product.js”文件,如果我选择“带成本的产品”,则执行“productCost.js”等等。我已经编写了一个 Azure 管道脚本来完成此操作。我有另一个条件“生成测试数据”复选框,它返回布尔值“true”或“false”。如果值是“true”,则我必须选择文件“productWithTestData.js”(如果选择了“产品”)。我不知道如何在 Azure 管道代码中编写 if else 条件语句。请看我的伪代码。
能否有人帮我编写 if else 条件语句以解决我的问题 - 非常感谢您的帮助!谢谢!
variables:
  - name: fileName
    ${{ if eq(parameters.selectTestRun, 'Product') }}:
      value: 'product.js'
    else ${{ if eq(parameters.selectTestRun, 'Product') } && { if eq(parameters.testData, True) }}:   
      value: 'productWithTestData.js'

我的Pipeline代码:

trigger:
  none

parameters:

- name: selectTestRun
  displayName: Select test execution
  type: string
  default: Product
  values:
  - Product
  - Product with Cost
  - Product with Attachments

- name: testData
  displayName: Generate Test Data
  type: boolean
  default: false

variables:
  - name: fileName
    ${{ if eq(parameters.selectTestRun, 'Product') }}:
      value: 'product.js'
    ${{ if eq(parameters.selectTestRun, 'Product with Cost') }}:
      value: 'productCost.js'
    ${{ if eq(parameters.selectTestRun, 'Product with Attachments') }}:
      value: 'productAttachment.js'      
  
jobs:
  - job: testJob
    pool:
      vmImage: ubuntu-latest
    displayName: Run sample tests
    steps:
      - task: Bash@3
        displayName: Test variable
        inputs:
          targetType: inline
          script: |
            echo "Hello world"
            echo ${{variables.fileName}}
                
2个回答

19

更新:09/09/2021

现在我们也有if else条件可用:

variables:
  ${{ if eq(parameters.os, 'win') }}:
    testsFolder: windows
  ${{ elseif eq(parameters.os, 'linux' }}:
    testsFolder: linux
  ${{ else }}:
    testsFolder: mac

所以我们可以写成

variables:
  - name: fileName
    ${{ if eq(parameters.selectTestRun, 'Product') }}:
      value: 'product.js'
    ${{ elseif eq(parameters.selectTestRun, 'Product with Cost') }}:
      value: 'productCost.js'
    ${{ elseif eq(parameters.selectTestRun, 'Product with Attachments') }}:
      value: 'productAttachment.js'   
    ${{ else }}:
      value: 'something-else.js' 

原回复

在这种情况下,您应该使用notIn表达式:

variables:
  - name: fileName
    ${{ if eq(parameters.selectTestRun, 'Product') }}:
      value: 'product.js'
    ${{ if eq(parameters.selectTestRun, 'Product with Cost') }}:
      value: 'productCost.js'
    ${{ if eq(parameters.selectTestRun, 'Product with Attachments') }}:
      value: 'productAttachment.js'   
    ${{ if notIn(parameters.selectTestRun, 'Product', 'Product with Cost', 'Product with Attachments') }}:
      value: 'something-else.js' 

在这种情况下,您需要每次按以下方式重复执行:

 ${{ if and(eq(parameters.selectTestRun, 'Product'), ne(parameters.testData, True)) }}:
      value: 'product.js'
 ${{ if and(eq(parameters.selectTestRun, 'Product'),eq(parameters.testData, True)) }}:
      value: 'productWithTestData.js'

对于其他的if语句同理。


谢谢!在按照您的更改进行管道操作后,我遇到了以下错误:( 在解析管道YAML时遇到错误: /azure-pipeline.yml (第24行,第5列):指令“if”后面应该有1个参数。实际参数计数为4。 - Datadog Learning
1
是的,抱歉我使用了错误的语法。现在应该没问题了。 - Krzysztof Madej
1
@KrzysztofMadej 我正在尝试实现完全相同的功能,但是当我在原始回复下面使用上述语法时,值:会被波浪线下划线,并且弹出窗口显示“重复键”。对此有什么建议吗?我只是复制了上面的代码并粘贴以确保我有正确的语法,所以我不确定为什么它不起作用。 - Mike
您可以忽略该消息。用于验证的工具无法识别这些表达式,但它们是有效的。 - Krzysztof Madej
我只希望上述内容适用于参数...但今天它只适用于变量,然而Azure模板不能定义变量,只能定义参数。 - Scott Stensland
显示剩余4条评论

0

没有else。如果你正在测试某个东西是否相等,那么“else”的作用就是测试不相等:

${{ if eq(parameters.selectTestRun, 'Product') }}:
  value: 'product.js'
${{ if ne(parameters.selectTestRun, 'Product') }}:
  value: 'something else'

但是这种方法在我的情况下不太适用,因为我必须选择产品并根据不同的参数条件选择文件名。如果生成测试数据为True,则需要检查产品和True,然后有值productWithTestData.js,否则为product.js。 - Datadog Learning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接