Azure DevOps的YAML管道表达式无法评估

3
我正在尝试在 azure-pipelines.yml 文件中为 PublishTestResults@2 任务分配 failTaskOnFailedTests 参数,使其成为表达式的结果。第一次运行测试时,如果有任何失败的测试,我希望失败该作业。在 重试失败的作业 时,我不想失败该作业。我已经按以下方式设置了该任务(倒数第二行是我设置 failTaskOnFailedTests 参数的地方):
    - task: PublishTestResults@2
      displayName: 'Publish Test Results'
      inputs:
        testResultsFormat: 'JUnit'
        testResultsFiles: '*.xml'
        searchFolder: '$(testsOutputPath)'
        mergeTestResults: true
        failTaskOnFailedTests: eq($(System.JobAttempt), 1)
        testRunTitle: 'Test Results $(System.JobAttempt)'

当我启用系统诊断运行管道时,可以在日志中看到以下内容:
##[debug]testRunTitle=Test Results 1
##[debug]publishRunAttachments=true
##[debug]failTaskOnFailedTests=eq(1, 1)
##[debug]searchFolder=/home/vsts/work/1/s/TestProject/cypress/reports/junit
##[debug]testRunner: JUnit
##[debug]testResultsFiles: *.xml
##[debug]mergeResults: true

第三行显示将failTaskOnFailedTests设置为表达式语句,而不是表达式的评估值。我不知道哪里出了问题。这个表达式似乎符合表达式文档中的其他表达式。
我错了什么?
1个回答

5
在 Azure DevOps 中,您可以使用 编译时 (${{ <expressions> }}) 和 运行时 ($[ <expression> ]) 表达式
编译时表达式在服务器渲染模板时仅处理一次。运行时表达式在管道执行时进行评估。
在您的情况下,您需要使用运行时表达式,但它们只能用于变量分配或 条件 参数。 示例:
condition: eq(variables['System.JobAttempt'], '1')

因此,使用这种方法,您无法直接配置failTaskOnFailedTests输入,但可以完全跳过该任务。

我没有测试过这一点,但为了实现所需的结果,您可以尝试使用脚本根据System.JobAttempt值设置failTaskOnFailedTests

例子:

- bash: echo "##vso[task.setvariable variable=FailTask]$((( $(System.JobAttempt) > 1 )) && echo false || echo true)"

- task: PublishTestResults@2
  displayName: 'Publish Test Results'
  inputs:
    testResultsFormat: 'JUnit'
    testResultsFiles: '*.xml'
    searchFolder: '$(testsOutputPath)'
    mergeTestResults: true
    failTaskOnFailedTests: $(FailTask)
    testRunTitle: 'Test Results $(System.JobAttempt)'

直接操作变量可能也有机会奏效。

示例:

variables:
  FailTask: $[ le( variables['System.JobAttempt'], 1 ) ]

- task: PublishTestResults@2
  displayName: 'Publish Test Results'
  inputs:
    testResultsFormat: 'JUnit'
    testResultsFiles: '*.xml'
    searchFolder: '$(testsOutputPath)'
    mergeTestResults: true
    failTaskOnFailedTests: $(FailTask)
    testRunTitle: 'Test Results $(System.JobAttempt)'

通过脚本设置变量并使用该变量,这对我很有帮助。感谢您的协助! - BigPigVT
1
@BigPigVT 很高兴听到这个消息,我还添加了一个直接使用变量赋值的示例,所以你可能根本不需要脚本。 - beatcracker

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