在 Azure Devops 的构建管道中轻松捕获来自 Maven 安装任务的错误?
Easily catch error from maven install task in build pipeline in Azure Devops?
在 Azure Devops 中,当您的 Maven 构建任务失败时,它将在构建摘要中显示如下所示的错误:
Maven build error
现在,如果您单击并向上滚动,您将能够在反应器摘要旁边找到错误。这在家里用鼠标和大屏幕很容易做到,但对于我们在火车上或咖啡馆里的一些开发人员来说,要找到错误可能会非常费力。我希望能够使错误更容易找到。下面是我想到但不确定如何实施的一些建议。你还有什么好的想法吗?
- 减少 maven 日志的输出 - 我已经尝试了 -q 标志,但它似乎不适用于此任务?
- 使用 rest api 以某种方式找到错误,然后使用 webhook 将其发送到松弛通道 - 不确定如何使用 rest api 找到日志或错误 [=20] =]
所以我可以帮助您了解如何从构建日志中获取错误并将其发送到 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 以下载日志的错误部分。参见
startLine
和 endLine
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
在 Azure Devops 中,当您的 Maven 构建任务失败时,它将在构建摘要中显示如下所示的错误:
Maven build error
现在,如果您单击并向上滚动,您将能够在反应器摘要旁边找到错误。这在家里用鼠标和大屏幕很容易做到,但对于我们在火车上或咖啡馆里的一些开发人员来说,要找到错误可能会非常费力。我希望能够使错误更容易找到。下面是我想到但不确定如何实施的一些建议。你还有什么好的想法吗?
- 减少 maven 日志的输出 - 我已经尝试了 -q 标志,但它似乎不适用于此任务?
- 使用 rest api 以某种方式找到错误,然后使用 webhook 将其发送到松弛通道 - 不确定如何使用 rest api 找到日志或错误 [=20] =]
所以我可以帮助您了解如何从构建日志中获取错误并将其发送到 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 以下载日志的错误部分。参见
startLine
和endLine
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