Как создать комментарий в Azure DevOps PR в случае сбоя сборки?
У меня есть настраиваемый этап сборки, который при определенных условиях не работает во время сборки с запросом на слияние в Azure DevOps.
Я хотел бы расширить его, подняв PR-комментарий, аналогичный тому, что есть в GitHub:https://developer.github.com/v3/issues/comments/
У меня нет примеров кода, которые можно было бы добавить сюда, поскольку я не мог найти полезных примеров, на которых можно было бы опираться. Я использую PowerShell для своего настраиваемого шага сборки - как мне добиться этого при запуске PR-сборки моей ветки?
3 ответа
Могу помочь на примере. Публикация пользовательских сообщений \ статуса в PR из ваших конвейеров имеет большую ценность.
Перво-наперво убедитесь, что у вашей службы сборки есть разрешения на внесение пул-реквестов в ваш репозиторий.
Затем вы хотите добавить условный шаг PowerShell. Этот просто основан на том, что это PR-сборка, но вы можете добавить зависимость от сбоя для предыдущего шага в зависимости от вашего рабочего процесса.
- task: PowerShell@2
condition: eq(variables['Build.Reason'], 'PullRequest')
displayName: Post Message to PR
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
inputs:
targetType: filePath
filePath: PostToPR.ps1
Итак, основной рабочий процесс:
- Создайте сообщение Markdown
- Создайте тело JSON
- Разместите сообщение в PR
PostToPR.ps1
#Going to create the comment in an Active state, assuming it needs to be resolved
#See https://docs.microsoft.com/en-us/dotnet/api/microsoft.teamfoundation.sourcecontrol.webapi.commentthreadstatus?view=azure-devops-dotnet
$StatusCode = 1
$Stuff = $env:Build_Repository_Name
$Things = "Other things you might want in the message"
#Build Up a Markdown Message to
$Markdown = @"
## Markdown Message here
|Column0 |Column1|
|--------|---------|
|$Stuff|$Things|
"@
#Build the JSON body up
$body = @"
{
"comments": [
{
"parentCommentId": 0,
"content": "$Markdown",
"commentType": 1
}
],
"status": $StatusCode
}
"@
Write-Debug $Body
#Post the message to the Pull Request
#https://docs.microsoft.com/en-us/rest/api/azure/devops/git/pull%20request%20threads?view=azure-devops-rest-5.1
try {
$url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/git/repositories/$($env:Build_Repository_Name)/pullRequests/$($env:System_PullRequest_PullRequestId)/threads?api-version=5.1"
Write-Host "URL: $url"
$response = Invoke-RestMethod -Uri $url -Method POST -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"} -Body $Body -ContentType application/json
if ($response -ne $Null) {
Write-Host "*******************Bingo*********************************"
}
}
catch {
Write-Error $_
Write-Error $_.Exception.Message
}
И вы получите красивую таблицу уценки с пользовательской информацией о статусе в вашем PR!
Основываясь на уже предоставленных отличных ответах, это эквивалентный встроенный сценарий конвейера YAML:
- powershell: |
$body = @"
{
"comments": [
{
"parentCommentId": 0,
"content": "Your comment here",
"commentType": 1
}
],
"status": 4
}
"@
$url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/git/repositories/$($env:Build_Repository_Name)/pullRequests/$($env:System_PullRequest_PullRequestId)/threads?api-version=5.1"
$result = Invoke-RestMethod -Uri $url -Method POST -Headers @{Authorization = "Bearer $(System.AccessToken)"} -Body $Body -ContentType application/json
displayName: Post comment on PR
Если вы имеете в виду создание PR-комментария в конвейере сборки, вы можете добавить задачу PowerShell в свой конвейер и запустить сценарий для вызова REST API (комментарии к потоку запроса на вытягивание - Создать).
Ниже сценарий PowerShell для справки:
Param(
[string]$baseurl = "https://dev.azure.com/{organization}",
[string]$projectName = "0508-t",
[string]$repositoryId = "62c8ce54-a7bb-4e08-8ed7-40b27831bd8b",
[string]$pullRequestId = "35",
[string]$threadId = "229",
[string]$user = "",
[string]$token = "PAT"
)
# Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
write-host $WorkitemType
#Create Jason body
function CreateJsonBody
{
$value = @"
{
"content": "Test Comment 0204",
"parentCommentId": 1,
"commentType": 1
}
"@
return $value
}
$json = CreateJsonBody
$uri = "$baseurl/$projectName/_apis/git/repositories/$repositoryId/pullRequests/$pullRequestId/threads/$threadId/comments?api-version=5.1"
Write-Host $uri
$result = Invoke-RestMethod -Uri $uri -Method Post -Body $json -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}