在 Azure Devops 的构建管道中轻松捕获来自 Maven 安装任务的错误?

Easily catch error from maven install task in build pipeline in Azure Devops?

在 Azure Devops 中,当您的 Maven 构建任务失败时,它将在构建摘要中显示如下所示的错误:

Maven build error

现在,如果您单击并向上滚动,您将能够在反应器摘要旁边找到错误。这在家里用鼠标和大屏幕很容易做到,但对于我们在火车上或咖啡馆里的一些开发人员来说,要找到错误可能会非常费力。我希望能够使错误更容易找到。下面是我想到但不确定如何实施的一些建议。你还有什么好的想法吗?

所以我可以帮助您了解如何从构建日志中获取错误并将其发送到 slack。

假设我们要运行这个任务作为构建错误后的下一个任务。

  • 我们可以获得构建日志via the API. Make sure to add the system_access token so you can auth
  • 一旦我们拥有所有日志,就从响应中抓取 url 以下载最后一个日志
  • 下载最后一个日志
  • 解析它并找到 [[error]]
  • 将消息编组到 slack \ 或用它做任何你想做的事

YAML

- pwsh: |
    $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $env:System_AccessToken)))
    $uriLogs = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/builds/$env:BUILD_BUILDID/logs?api-version=5.1"
    $response = Invoke-RestMethod -Uri $uriLogs -Method 'GET' -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)}
    $logUrl =$response.value[-1].url
    $webContent = Invoke-WebRequest -Uri $logUrl -Method 'GET' -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)}
    $ErrorMessage = $webContent.Content.tostring() -split "[`r`n]" | select-string "[[Error]]"
    Write-Output "Error lines found " $ErrorMessage

    $postSlackMessage = @{token=$env:SLACK_TOKEN;channel="@user,#channel-name";text=$ErrorMessage}
    Invoke-RestMethod -Uri https://slack.com/api/chat.postMessage -Body $postSlackMessage
  env:
    system_accesstoken: $(System.AccessToken)
  condition: failed()

其他选择:

  • 解析日志,找到错误,然后直接在该行号处向失败发送 link。有一种众所周知的格式,可以直接 link 到每一行。
  • 直接发送 link 以下载日志的错误部分。参见 startLineendLine parameters here

我在 powershell 脚本的顶部添加了一行来解决错误

Invoke-RestMethod : The underlying connection was closed: An unexpected error occurred on a receive.

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

如果您对 tls 没有任何问题,则无需添加此行。

Powershell:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$uriLogs = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/builds/$env:BUILD_BUILDID/logs?api-version=5.0"
$response = Invoke-RestMethod -Uri $uriLogs -Method Get -Headers @{ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}
$logUrl = $response.value[-1].url
$webContent = Invoke-WebRequest -Uri $logUrl -Method GET -Headers @{ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}
$ErrorMessage = $webContent.Content.tostring() -split "[`r`n]" | select-string "[[error]]"
Write-Output "Error lines found " $ErrorMessage