How to create a comment in Azure DevOps PR in case of build failure?

后端 未结 2 790
耶瑟儿~
耶瑟儿~ 2021-01-03 06:19

I have a custom build step that fails under certain conditions during my Pull Request build, within Azure DevOps.

I would like to extend it further by raising a PR co

相关标签:
2条回答
  • 2021-01-03 06:33

    I can help with an example. There is a bunch of value in posting custom messages\status to PRs from your pipelines.

    First things first, make sure your build service has permissions to contribute to pull requests in your repository.

    Then you want to add a conditional PowerShell step. This one is just based on it being a PR build, but you might want to add a depends on failure for the previous step, based on your workflow.

    - 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
    

    So the basic workflow is:

    • Build the Markdown Message
    • Build the JSON Body
    • Post the Message to the 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
    }
    

    And you end up with a nice markdown table with custom status information in your PR!

    0 讨论(0)
  • 2021-01-03 06:40

    If you mean creating PR comment in the build pipeline, then you can add a PowerShell task in your pipeline and run the script to call the REST API (Pull Request Thread Comments - Create).

    Below PowerShell script for your reference:

    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)}
    
    0 讨论(0)
提交回复
热议问题