My company has an Azure DevOps pipeline which publishes the development branch to cloudflare and prints a link to that deployment in the log.
I would like that link to appear in a PR comment so that the dev doesn't need to click through to the logs to find it.
How do I achieve this?
We can use this REST API Pull Request Threads - Create in the pipeline.
Result:
First of all, make sure your build service has permissions to contribute to pull requests in your repository. Otherwise, you may get the error like this
"message":"TF401027: You need the Git 'PullRequestContribute' permission to perform this action. Details: identity 'Build\\xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx', scope 'repository'.
There are two build service accounts ProjectName Build Service (OrganizationName)
and Project Collection Build Service (OrganizationName)
. It depends on your pipeline configuration. The doc is here.
If you are not sure which account you are using, you can search the id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
in the error message and you will see the account.
If you are using the yaml pipeline, here is the sample. The first task is to set your link as variable DeployURL
. Then we can use the variable in the following tasks.
trigger: none
jobs:
- job: Job_1
displayName: Agent job 1
pool:
vmImage: windows-2019
steps:
- checkout: self
- task: PowerShell@2
displayName: set variable DeployURL
inputs:
targetType: inline
script: >-
$url="https://dev.azure.com/"
Write-Host "##vso[task.setvariable variable=DeployURL]$url"
- task: PowerShell@2
displayName: check the variable DeployURL
inputs:
targetType: inline
script: Write-Host $(DeployURL)
- task: PowerShell@2
condition: eq(variables['Build.Reason'], 'PullRequest')
displayName: write comment to the PR with DeployURL
env:
MY_ACCESS_TOKEN: $(System.AccessToken)
inputs:
targetType: inline
script: >-
$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"
$body = @"
{
"comments": [
{
"parentCommentId": 0,
"content": "The DeployURL is $(DeployURL)",
"commentType": 1
}
],
"status": 4
}
"@
$result = Invoke-RestMethod -Uri $url -Method POST -Headers @{Authorization = "Bearer $(System.AccessToken)"} -Body $Body -ContentType application/json
If you are using the classic build pipeline, please check the Allow scripts to access the OAuth token.
The Custom condition is set to only run the task when the build reason is pullrequest.