azure-devopscloudflare-pages

How do I get azure DevOps to put the cloudflare url in a PR comment


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?


Solution

  • We can use this REST API Pull Request Threads - Create in the pipeline.

    Result:

    enter image description here

    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.

    enter image description here

    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.

    enter image description here

    The Custom condition is set to only run the task when the build reason is pullrequest.

    enter image description here