【问题标题】:Azure DevOps yaml pipeline expression not evaluatingAzure DevOps yaml 管道表达式未评估
【发布时间】:2021-04-08 18:12:07
【问题描述】:

我正在尝试将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 被设置为表达式语句,而不是表达式的计算值。我对自己做错了什么感到茫然。该表达式似乎与Expressions documentation 中的其他表达式一致。

我错过了什么?

【问题讨论】:

    标签: azure-devops azure-devops-pipelines


    【解决方案1】:

    在 Azure DevOps 中,您可以使用 compile time (${{ <expressions> }}) 和 runtime ($[ <expression> ]) expressions

    编译时表达式在服务器渲染模板时处理一次。运行时表达式在管道执行时进行评估。

    在您的情况下,您需要使用运行时表达式,但它们只能用于变量赋值或condition 参数。

    示例:

    condition: eq(variables['System.JobAttempt'], '1')
    

    所以使用这种方法你不能直接配置failTaskOnFailedTests输入,但是你可以完全跳过这个任务。

    我没有对此进行测试,但为了达到预期的效果,您可以尝试使用脚本来设置 failTaskOnFailedTests,具体取决于 System.JobAttempt 的值。

    示例:

    - 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 很高兴听到这个消息,我还添加了一个直接使用变量赋值的示例,因此您可能根本不需要脚本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2020-05-23
    • 2020-08-27
    • 1970-01-01
    • 2019-02-18
    • 2022-11-14
    相关资源
    最近更新 更多