Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020
Arbetsflödet för pull-begäran (PR) gör det möjligt för utvecklare att få feedback på sin kod från kollegor och automatiserade verktyg. Verktyg och tjänster som inte kommer från Microsoft kan också delta i PR-arbetsflödet med hjälp av API:et FÖR PR-status. Den här artikeln vägleder dig genom att skapa en anpassad grenpolicy med hjälp av Azure Functions för att verifiera PR:er i en Azure DevOps Git-lagringsplats. Azure Functions eliminerar behovet av att etablera och underhålla servrar, även när arbetsbelastningen växer. De ger en fullständigt hanterad beräkningsplattform med hög tillförlitlighet och säkerhet.
Mer information om PR-status finns i Anpassa och utöka arbetsflöden för pull requests med PR-status.
Förutsättningar
| Kategori | Kravspecifikation | 
|---|---|
| Organisation | En organisation i Azure DevOps med en Git-lagringsplats. | 
| Azure-funktion | En Azure-funktion som implementerar en serverlös, händelsedriven lösning som integreras med Azure DevOps för att skapa anpassade grenprinciper och automatisera PR-validering. | 
| Serviceanslutningar | Konfigurera tjänstkrokar för PR-händelser för att meddela din Azure-funktion när en pull-begäran ändras. | 
| autentisering | Microsoft Entra ID-token med kodomfånget (status) för att ha behörighet att ändra PR-status. Mer information finns i Microsoft Entra-autentisering. | 
Skapa en grundläggande Azure-funktion för att lyssna på Azure Repos-händelser
Skapa din första Azure-funktion. Ändra sedan koden i exemplet så att den ser ut som följande kod:
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    try
    {
        log.Info("Service Hook Received.");
        // Get request body
        dynamic data = await req.Content.ReadAsAsync<object>();
        log.Info("Data Received: " + data.ToString());
        // Get the pull request object from the service hooks payload
        dynamic jObject = JsonConvert.DeserializeObject(data.ToString());
        // Get the pull request id
        int pullRequestId;
        if (!Int32.TryParse(jObject.resource.pullRequestId.ToString(), out pullRequestId))
        {
            log.Info("Failed to parse the pull request id from the service hooks payload.");
        };
        // Get the pull request title
        string pullRequestTitle = jObject.resource.title;
        log.Info("Service Hook Received for PR: " + pullRequestId + " " + pullRequestTitle);
        return req.CreateResponse(HttpStatusCode.OK);
    }
    catch (Exception ex)
    {
        log.Info(ex.ToString());
        return req.CreateResponse(HttpStatusCode.InternalServerError);
    }
}
Konfigurera en tjänstehook för PR-händelser
Tjänstkrokar är en Azure DevOps-funktion som kan varna externa tjänster när vissa händelser inträffar. I det här exemplet konfigurerar du en servicehook för PR-händelser. Din Azure-funktion meddelas när en pull request ändras. Om du vill ta emot POST-begäranden när pull-requests ändras konfigurerar du tjänstkroken med Azure-funktionens URL.
För det här exemplet konfigurerar du två webbtjänstkrokar. Den första är för händelsen när Pull-begäran skapades, och den andra är för händelsen när Pull-begäran uppdaterades.
- Hämta funktions-URL:en från Azure-portalen genom att klicka på hämta funktions-URL:en i Azure-funktionsvyn och kopiera URL:en.     
- Bläddra till projektet i Azure DevOps, till exempel - https://dev.azure.com/<your organization>/<your project name>
- Hovra över växeln på navigeringsmenyn och välj Service Hooks.   
- Om det är din första tjänsthook väljer du + Skapa prenumeration.   - Om du redan har konfigurerat andra tjänstkrokar väljer du det gröna plustecknet - (+)för att skapa en ny prenumeration på tjänstkroken.  
- I dialogrutan Prenumeration på nya tjänstkrokar väljer du Web Hooks i listan över tjänster och väljer sedan Nästa.   
- Välj Pull-begäran som skapats i listan över händelseutlösare och välj sedan Nästa.   
- På åtgärdssidan anger du den URL som du kopierade i steg 1 i URL-rutan. Välj Test för att skicka en testhändelse till servern.   - I Azure-funktionsloggfönstret ser du en inkommande - POSTsom returnerade en- 200 OK, vilket indikerar att din funktion har mottagit service hook-händelsen.- HTTP Requests ------------- POST / 200 OK- I fönstret Testmeddelande väljer du fliken Svar för att se information om svaret från servern. Du bör se svaret från servern.   
- Stäng testmeddelandefönstret och välj knappen Slutför för att skapa servicehooken. 
Gå igenom steg 2–8 igen, men den här gången konfigurerar du händelsen Pull Request uppdaterad.
Viktigt!
Se till att gå igenom de föregående stegen två gånger och skapa tjänstkrokar för både händelserna Pull-begäran skapad och Pull-begäran uppdaterad.
Skapa en pull-begäran för att kontrollera att azure-funktionen tar emot meddelanden.
Publicera status på PRs
Nu när din server kan ta emot servicehook-händelser när nya pull-begäranden skapas, uppdaterar du den för att skicka tillbaka status till PR. Du kan använda JSON-nyttolasten som publicerats av tjänstkroken för att avgöra vilken status som ska anges för din PR.
Uppdatera koden för din Azure-funktion, ungefär som i följande exempel.
Se till att uppdatera koden med ditt organisationsnamn, projektnamn, lagringsplatsnamn och Microsoft Entra-ID-token. För att få behörighet att ändra PR-status kräver token vso.code_status omfång som du kan hämta via Microsoft Entra-autentisering.
Viktigt!
Den här exempelkoden lagrar token i kod, vilket förenklar exemplet. Vi rekommenderar att du lagrar hemligheter i Azure Key Vault och hämtar dem därifrån med hjälp av hanterad identitet för ökad säkerhet.
Det här exemplet inspekterar PR-titeln för att se om användaren angav om PR är ett pågående arbete genom att lägga till WIP i rubriken. I så fall ändrar exempelkoden statusen som publiceras tillbaka till PR. Ersätt koden i din Azure-funktion med följande kod, som uppdaterar den status som skickas tillbaka till PR.
using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;
private static string organizationName = "[Organization Name]";  // Organization name
private static string projectName      = "[Project Name]";       // Project name
private static string repositoryName   = "[Repo Name]";          // Repository name
/*
    This is here just to simplify the sample, it is recommended to store
    secrets in Azure Key Vault and retrieve them using managed identity.
*/
private static string accessToken = "[MICROSOFT_ENTRA_TOKEN]";
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    try
    {
        log.Info("Service Hook Received.");
        // Get request body
        dynamic data = await req.Content.ReadAsAsync<object>();
        log.Info("Data Received: " + data.ToString());
        // Get the pull request object from the service hooks payload
        dynamic jObject = JsonConvert.DeserializeObject(data.ToString());
        // Get the pull request id
        int pullRequestId;
        if (!Int32.TryParse(jObject.resource.pullRequestId.ToString(), out pullRequestId))
        {
            log.Info("Failed to parse the pull request id from the service hooks payload.");
        };
        // Get the pull request title
        string pullRequestTitle = jObject.resource.title;
        log.Info("Service Hook Received for PR: " + pullRequestId + " " + pullRequestTitle);
        PostStatusOnPullRequest(pullRequestId, ComputeStatus(pullRequestTitle));
        return req.CreateResponse(HttpStatusCode.OK);
    }
    catch (Exception ex)
    {
        log.Info(ex.ToString());
        return req.CreateResponse(HttpStatusCode.InternalServerError);
    }
}
private static void PostStatusOnPullRequest(int pullRequestId, string status)
{
    string Url = string.Format(
        @"https://dev.azure.com/{0}/{1}/_apis/git/repositories/{2}/pullrequests/{3}/statuses?api-version=4.1",
        organizationName,
        projectName,
        repositoryName,
        pullRequestId);
    using (HttpClient client = new HttpClient())
    {
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
        var method = new HttpMethod("POST");
        var request = new HttpRequestMessage(method, Url)
        {
            Content = new StringContent(status, Encoding.UTF8, "application/json")
        };
        using (HttpResponseMessage response = client.SendAsync(request).Result)
        {
            response.EnsureSuccessStatusCode();
        }
    }
}
private static string ComputeStatus(string pullRequestTitle)
{
    string state = "succeeded";
    string description = "Ready for review";
    if (pullRequestTitle.ToLower().Contains("wip"))
    {
        state = "pending";
        description = "Work in progress";
    }
    return JsonConvert.SerializeObject(
        new
        {
            State = state,
            Description = description,
            TargetUrl = "https://visualstudio.microsoft.com",
            Context = new
            {
                Name = "PullRequest-WIT-App",
                Genre = "pr-azure-function-ci"
            }
        });
}
Skapa en ny PR och testa statusservern
Nu när servern körs och lyssnar efter tjänstehook-notiser, skapar du en pull-förfrågan för att testa den.
- Börja i filvyn. Redigera readme.md filen på lagringsplatsen (eller någon annan fil om du inte har en readme.md).   
- Gör en redigering och committa ändringarna till kodförrådet.   
- Se till att kommitta ändringarna till en ny branch så att du kan skapa en PR i nästa steg.   
- Välj länken Skapa en pull-begäran.   
- Lägg till WIP- i rubriken för att testa appens funktioner. Välj Skapa för att skapa PR.   
- När PR:en har skapats visas statusavsnittet med posten Arbete pågår som länkar till url:en som anges i nyttolasten.   
- Uppdatera PR-rubriken och ta bort WIP- text och observera att statusen ändras från Pågående arbete till Redo för granskning.