Azure DevOps yaml 管道表达式未评估
Azure DevOps yaml pipeline expression not evaluating
我正在尝试将 PublishTestResults@2 任务的 failTaskOnFailedTests
参数指定为 azure-pipelines.yml
文件中的表达式结果。第一次测试是 运行,如果有任何失败的测试我想让工作失败。在后续尝试 重试失败的作业时 我不想让作业失败。
我已经这样设置了任务(倒数第二行是我设置 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 中,您可以使用 compile time (${{ <expressions> }}
) and runtime ($[ <expression> ]
) expressions。
当服务器渲染模板时,编译时间表达式被处理一次。在管道执行时计算运行时表达式。
在您的情况下,您需要使用运行时表达式,但它们只能用于变量赋值或 condition 参数。
示例:
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)'
我正在尝试将 PublishTestResults@2 任务的 failTaskOnFailedTests
参数指定为 azure-pipelines.yml
文件中的表达式结果。第一次测试是 运行,如果有任何失败的测试我想让工作失败。在后续尝试 重试失败的作业时 我不想让作业失败。
我已经这样设置了任务(倒数第二行是我设置 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 中,您可以使用 compile time (${{ <expressions> }}
) and runtime ($[ <expression> ]
) expressions。
当服务器渲染模板时,编译时间表达式被处理一次。在管道执行时计算运行时表达式。
在您的情况下,您需要使用运行时表达式,但它们只能用于变量赋值或 condition 参数。
示例:
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)'