如何配置VSTS在构建/测试失败邮件中包含详细错误信息?
这个需求太实用了!默认的VSTS(现在叫Azure DevOps)通知邮件确实只给个结果和链接,不够直观。不过要实现带详细错误信息的自定义邮件,有几种靠谱的方案,我给你拆解下:
方案1:优化内置通知订阅(快速上手)
如果不想写代码,可以先试试扩展内置通知的内容:
- 进入你的Azure DevOps项目,打开项目设置 → 通知
- 新建一个订阅,触发事件选「构建完成」或「测试运行完成」,并设置只在失败时触发
- 在「通知内容」编辑界面,尝试添加动态变量,比如
$(TestResults.FailedTestsCount)、$(Build.Reason)这类基础变量 - 不过默认变量能展示的细节有限,如果要拿到具体错误消息和堆栈跟踪,还是得结合下面的方案
方案2:用PowerShell任务发送自定义邮件(灵活度拉满)
这个方法能完全自定义邮件内容,把你想要的所有细节都塞进去:
- 在构建/发布管道里添加一个PowerShell任务,设置运行条件为「只有当构建失败时」(条件表达式:
eq(variables['Agent.JobStatus'], 'Failed')) - 编写脚本提取测试失败的详细信息,这里提供两种思路:
- 解析测试结果文件(trx):测试任务默认会生成
.trx格式的测试报告,直接解析这个文件就能拿到错误消息和堆栈跟踪 - 调用Azure DevOps REST API:通过API获取测试运行的详细结果,适合更复杂的场景
- 解析测试结果文件(trx):测试任务默认会生成
下面是一个解析trx文件的示例脚本:
# 找到最新的测试结果trx文件 $trxFiles = Get-ChildItem -Path "$(System.DefaultWorkingDirectory)" -Filter "*.trx" -Recurse $latestTrx = $trxFiles | Sort-Object LastWriteTime -Descending | Select-Object -First 1 if ($latestTrx) { $xml = [xml](Get-Content $latestTrx.FullName) $failedTests = $xml.TestRun.Results.UnitTestResult | Where-Object { $_.outcome -eq 'Failed' } # 构建邮件HTML内容 $emailBody = @" <h2>⚠️ 构建/测试失败通知</h2> <p>构建名称: $(Build.DefinitionName) #$(Build.BuildNumber)</p> <p>失败测试总数: $($failedTests.Count)</p> <h3>详细失败信息:</h3> <ul> "@ foreach ($test in $failedTests) { $emailBody += @" <li> <strong>测试名称:</strong> $($test.TestName)<br> <strong>错误消息:</strong> $($test.Output.ErrorInfo.Message)<br> <strong>堆栈跟踪:</strong> <pre>$($test.Output.ErrorInfo.StackTrace)</pre> </li> <hr> "@ } $emailBody += "</ul><p>完整报告: $(Build.BuildUri)</p>" # 发送邮件(这里以Office 365 SMTP为例) $smtpCredential = New-Object System.Management.Automation.PSCredential ` ("your-sender-email@domain.com", (ConvertTo-SecureString "$(SmtpPassword)" -AsPlainText -Force)) Send-MailMessage ` -From "your-sender-email@domain.com" ` -To "your-alert-email@domain.com" ` -Subject "构建失败: $(Build.DefinitionName) #$(Build.BuildNumber)" ` -Body $emailBody ` -BodyAsHtml ` -SmtpServer "smtp.office365.com" ` -Port 587 ` -UseSsl ` -Credential $smtpCredential } else { Write-Warning "未找到测试结果文件" }
- 注意:把脚本里的邮箱信息换成你自己的,并且在管道里添加
SmtpPassword作为秘密变量,避免泄露凭据
方案3:借助Marketplace扩展(零代码配置)
如果不想写脚本,可以直接用Azure DevOps Marketplace里的第三方扩展,比如「Extended Email」「Custom Notification Tasks」这类:
- 打开Azure DevOps Marketplace,搜索「email notification」
- 安装合适的扩展后,在管道里添加对应的任务,配置时选择包含测试失败的详细信息(比如错误消息、堆栈跟踪)
- 这类扩展通常已经封装好了解析逻辑,配置起来非常省心
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

