Azure devops 我们如何读取Azure DevOps任务日志?

Azure devops 我们如何读取Azure DevOps任务日志?,azure-devops,azure-pipelines,azure-devops-rest-api,Azure Devops,Azure Pipelines,Azure Devops Rest Api,我在azure管道中有一个任务,它执行一些动态测试,但由于测试的数量是多个的,所以单个测试是否通过取决于日志中的内容 因此,Azure DevOps步骤始终变为绿色。我想通过阅读日志来解决一个问题,然后根据日志是否包含故障来决定下一步要做什么。比如说,如果任务变为绿色并且日志检测到失败,我将决定不发布工件 如何通过在下一个任务中使用标准azure api读取上一个任务的日志,然后做出决定,以标准方式解决此问题 澄清:根据需要 这些测试不是单元,它们实际上是一些自定义java测试,通过从linux

我在azure管道中有一个任务,它执行一些动态测试,但由于测试的数量是多个的,所以单个测试是否通过取决于日志中的内容

因此,Azure DevOps步骤始终变为绿色。我想通过阅读日志来解决一个问题,然后根据日志是否包含故障来决定下一步要做什么。比如说,如果任务变为绿色并且日志检测到失败,我将决定不发布工件

如何通过在下一个任务中使用标准azure api读取上一个任务的日志,然后做出决定,以标准方式解决此问题

澄清:根据需要


这些测试不是单元,它们实际上是一些自定义java测试,通过从linux机器上的自托管代理调用
.sh
文件触发。

编辑:在澄清之后,我将我的注释分为两部分:您的自定义测试用例,然后是之前在这里的其余注释,适用于使用标准单元测试框架的情况

备选方案1:基于分析测试日志文件的定制测试解决方案可能性 首先,您需要一个脚本,例如PowerShell脚本,它解释日志文件,确定测试是否失败,并相应地设置vso task.complete results属性(参见下面的示例)

让我们调用此文件
evaluate test results.ps1
,并假设它解释某种
testResults.json
数据,其中包含名为
haveTestsPassed
的重要属性,决定测试是否通过:

evaluate-test-results.ps1文件内容:

param(
[参数(必需=$true)]
[字符串]$testResultsJson
)
试一试{
$testResults=$testResultsJson |从Json转换
if($testResults.haveTestsPassed)
{
写入主机“##vso[task.complete result=successed;]测试已成功通过”
}
其他的
{
写入主机“##vso[task.complete result=Failed;]测试未通过”
}
}
抓住{
写入主机“##vso[task.complete result=Failed;]从JSON日志文件解析测试结果时出错…”
}
然后,您可以在
PowerShell@2
任务,如下所示:
-任务:PowerShell@2
displayName:“PowerShell:从testResults.json评估测试结果”
投入:
targetType:文件路径
文件路径:“评估测试结果。ps1”
参数:“-testResultsJson'testResults.json'”
failOnStderr:true
注: 当haveTestsPassed为false时,您也可以抛出标准错误,或者,这要归功于failOnStderr属性。然而,这个解决方案在上面有点正式

备选方案2:标准单元测试框架的解决方案可能性 如果将
dotnet test
命令配置为运行测试,则解决方案更简单 如果您的测试绑定到
dotnettest
命令,那么简单的解决方案是这样的,例如使用xUnit。在这种情况下,如果您的一个单元测试失败,该任务将默认失败,而无需
PublishTestResults@2
任务:

#此任务将运行“dotnet test”命令,就像从CLI运行一样
-任务:DotNetCoreCLI@2
displayName:运行和发布测试
投入:
命令:“测试”
如果无法使用
dotnet测试
命令 在这种情况下,您必须使用
PublishTestResults@2
解释测试结果的任务。相应地设置测试框架/工具和测试结果文件。确保设置
failTaskOnFailedTests:true

-任务:PublishTestResults@2
投入:
testRunner:VSTest#或者。。。
testResultsFiles:“***.trx”#或其他。。。
failTaskOnFailedTests:真

如果无法使用标准错误使管道失败,则可以使用来调查任务,并根据结果设置一个变量,在其他任务中,与此变量一起使用,或者干脆使所有管道失败

因此,PowerShell脚本包含以下内容:

$token = "YOUR-PAT"
Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
 
# Construct the REST URL to obtain Build ID
$uri = "$(System.TeamFoundationCollectionUri)/$(System.TeamProject)/_apis/build/builds/logs/{logId}?api-version=5.1"
 
# Invoke the REST call and capture the results
$log= Invoke-RestMethod -Uri $uri -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

if($log -match "some error")
{
    # Option 1: set a variable
    Write-Host "##vso[task.setvariable variable=testsStatus]failed"
    # Now in the artifacts task use custom condition:
    # and(succeeded(), ne(variables['testsStatus'], 'failed'))

    # Option 1: fail the pipeline
    Write-Error "The tests not passed!"
}

(您可以通过API获取日志id)

它们是单元测试吗?如果他们失败了,他们应该会失败。@Pukli Balazs-我已经编辑了这个问题,并给出了更多的澄清。问题是你想要设置的标志,我没有办法,只能阅读日志并设置它。所以我问是否有一个标准的任务日志读取机制,可以用来查找表达式。@userx,感谢您的澄清!我在回答中为您创建了“备选方案1”部分。如果您还有任何问题,请告诉我!