Megosztás a következőn keresztül:


Egyéni ágszabályzatok létrehozása az Azure Functionsszel

Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019

A lekéréses kérelem (PR) munkafolyamat lehetővé teszi a fejlesztők számára, hogy visszajelzést kérjenek a kódjukról a társviszonyban lévőktől és az automatizált eszközöktől. A külső eszközök és szolgáltatások a PR status API használatával vehetnek részt a PR-munkafolyamatban. Ez a cikk végigvezeti azon folyamaton, amely során egyéni fiókszabályzatot hozhat létre az Azure Functions használatával az Azure DevOps Services Git-adattárban található PRS-ek ellenőrzéséhez. Az Azure Functions használatával nem kell aggódnia a kiszolgálók kiépítésével és karbantartásával, különösen akkor, ha a számítási feladat növekszik. Az Azure Functions teljes mértékben felügyelt számítási platformot biztosít, amely nagy megbízhatósággal és biztonsággal rendelkezik.

A lekéréses kérelmek állapotával kapcsolatos további információkért lásd a lekéréses kérelmek munkafolyamatainak testreszabását és kiterjesztését lekéréses kérelmek állapotával.

Előfeltételek

Egy Szervezet az Azure DevOpsban Egy Git-adattárral. Ha nem rendelkezik szervezettel, regisztráljon a kód ingyenes korlátlan privát Git-adattárakban való feltöltésére és megosztására.

Alapszintű Azure-függvény létrehozása az Azure Repos-események figyeléséhez

Egyszerű függvény létrehozásához kövesse az első Azure-függvénydokumentáció létrehozását. Módosítsa a mintában szereplő kódot a következőképpen:

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);
    }
}

Szolgáltatáshook konfigurálása PR-eseményekhez

A szolgáltatáshookok egy Azure DevOps Services-szolgáltatás, amely riasztást küld a külső szolgáltatásoknak bizonyos események bekövetkezésekor. Ebben a példában egy szolgáltatáshookot szeretne beállítani a PR-eseményekhez, az Azure-függvény értesítést kap a lekéréses kérelmek változásakor. Ahhoz, hogy kéréseket fogadhasson POST a lekéréses kérelmek változásakor, meg kell adnia a szolgáltatáshook számára az Azure-függvény URL-címét.

Ehhez a mintához 2 szolgáltatáshookot kell konfigurálnia. Az első a lekéréses kérelem által létrehozott eseményhez, a második pedig a lekéréses kérelem frissített eseményéhez lesz.

  1. Kérje le a függvény URL-címét az Azure Portalról az Azure-függvénynézetben a Függvény URL-címének lekérése gombra kattintva, és másolja ki az URL-címet.

    Függvény URL-címének lekérése

    Függvény URL-címének másolása

  2. Keresse meg a projektet az Azure DevOpsban, például: https://dev.azure.com/<your organization>/<your project name>

  3. A navigációs menüben vigye az egérmutatót a fogaskerék fölé, és válassza a Service Hooks lehetőséget.

    Válassza a Szolgáltatáshohook lehetőséget a rendszergazdai menüből

  4. Ha ez az első szolgáltatáshook, válassza a + Előfizetés létrehozása lehetőséget.

    Válassza az Új előfizetés létrehozása lehetőséget az eszköztárról

    Ha már konfigurálta a többi szolgáltatáshookot, válassza a zöld pluszt (+) egy új szolgáltatáshook-előfizetés létrehozásához.

    Válassza a zöld pluszt egy új szolgáltatáshook-előfizetés létrehozásához.

  5. Az Új szolgáltatáshook-előfizetés párbeszédpanelen válassza a Web Hooks lehetőséget a szolgáltatások listájából, majd válassza a Tovább lehetőséget.

    Webes horgok kiválasztása a szolgáltatások listájából

  6. Válassza az eseményindítók listájából létrehozott lekéréses kérelmet, majd válassza a Tovább gombot.

    Válassza ki az eseményindítók listájából létrehozott lekéréses kérelmet

  7. A Művelet lapon adja meg az 1. lépésben kimásolt URL-címet az URL-mezőbe . Válassza a Teszt lehetőséget, ha teszteseményt szeretne küldeni a kiszolgálónak.

    Adja meg az URL-címet, és válassza a Teszt lehetőséget a szolgáltatáshook teszteléséhez

    Az Azure-függvénynapló ablakában egy bejövő üzenet POST jelenik meg, amely azt jelzi, hogy 200 OKa függvény megkapta a szolgáltatáshoom eseményt.

    HTTP Requests
    -------------
    
    POST /                         200 OK
    

    A Tesztértesítés ablakban válassza a Válasz lapot a kiszolgáló válaszának részleteinek megtekintéséhez. Látnia kell a kiszolgáló válaszát.

    Válassza a válasz fület a teszt eredményeinek megtekintéséhez

  8. Zárja be a Tesztértesítés ablakot, és válassza a Befejezés lehetőséget a szolgáltatáshook létrehozásához.

Folytassa újra a 2–8. lépést, de ezúttal konfigurálja a lekéréses kérelem frissített eseményét.

Fontos

Mindenképpen végezze el kétszer az előző lépéseket, és hozzon létre szolgáltatáshookokat mind a létrehozott lekéréses kérelemhez, mind a lekéréses kérelem frissített eseményeihez.

Hozzon létre egy lekéréses kérelmet, amely ellenőrzi, hogy az Azure-függvény értesítéseket kap-e.

Állapot közzététele a PRS-eknek

Most, hogy a kiszolgáló fogadni tudja a szolgáltatáshohoom-eseményeket az új PRS-ek létrehozásakor, frissítse az állapotot a lekéréses kérelemre. A szolgáltatáshook által közzétett JSON hasznos adatok segítségével meghatározhatja, hogy milyen állapotot állítson be a lekéréses kérelemhez.

Frissítse az Azure-függvény kódját az alábbi példához hasonlóan.

Frissítse a kódot a szervezet nevével, a projekt nevével, az adattár nevével és a PAT-jogkivonattal. A lekéréses kérelem állapotának módosításához a PAT-nak vso.code_status hatókörre van szüksége, amelyet a Kód (állapot) hatókör kiválasztásával adhat meg a személyes hozzáférési jogkivonat létrehozása lapon.

Fontos

Ez a mintakód kódban tárolja a PAT-t a minta egyszerűsítése érdekében. Javasoljuk, hogy titkos kulcsokat tároljon a KeyVaultban, és onnan kérje le őket.

Ez a minta a lekéréses kérelem címét vizsgálja meg, hogy a felhasználó jelezte-e, hogy a lekérés folyamatban van-e, ha wip-t ad hozzá a címhez. Ha igen, a mintakód módosítja a lekéréses kérelemhez visszaküldött állapotot. Cserélje le az Azure-függvényben lévő kódot a következő kódra a lekéréses kérelemre visszaküldött állapot frissítésének implementálásához.

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 KeyVault and retrieve them from there.
*/
private static string pat = "[PAT 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("Basic", Convert.ToBase64String(
                ASCIIEncoding.ASCII.GetBytes(
                string.Format("{0}:{1}", "", pat))));

        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"
            }
        });
}

Új lekéréses kérelem létrehozása az állapotkiszolgáló teszteléséhez

Most, hogy a kiszolgáló fut és figyeli a szolgáltatáshoom-értesítéseket, hozzon létre egy lekéréses kérelmet a teszteléshez.

  1. Kezdje a fájlnézetben. Szerkessze a readme.md fájlt az adattárban (vagy bármely más fájlban, ha nincs readme.md).

    Válassza a Szerkesztés lehetőséget a helyi menüből

  2. Szerkessze és véglegesítse az adattár módosításait.

    Szerkessze a fájlt, és válassza a Véglegesítés lehetőséget az eszköztáron

  3. Mindenképpen véglegesítse a módosításokat egy új ágra, hogy a következő lépésben létrehozhasson egy lekéréses kérelmet.

    Adjon meg egy új ágnevet, és válassza a Véglegesítés lehetőséget

  4. Válassza a Lekéréses kérelem létrehozása hivatkozást.

    Válassza a Lekéréses kérelem létrehozása lehetőséget a javaslati sávon

  5. Adja hozzá a WIP-t a címhez az alkalmazás működésének teszteléséhez. Válassza a Létrehozás lehetőséget a lekéréses kérelem létrehozásához.

    WiP hozzáadása az alapértelmezett pr-címhez

  6. A lekéréses kérelem létrehozása után megjelenik az állapotszakasz a Folyamatban lévő munka bejegyzéssel, amely a hasznos adatban megadott URL-címre hivatkozik.

    Állapotszakasz a Folyamatban lévő munka bejegyzéssel.

  7. Frissítse a pr címet, és távolítsa el a WIP-szöveget, és vegye figyelembe, hogy az állapot a Folyamatban lévő munka állapotáról a Felülvizsgálatra kész állapotra változik.

Következő lépések

  • Ebben a cikkben megismerhette egy kiszolgáló nélküli Azure-függvény létrehozásának alapjait, amelyek szolgáltatáshookok segítségével figyelik a PR-eseményeket, és állapotüzeneteket tehetnek közzé az állapot API használatával. A lekéréses kérelem állapotának API-járól további információt a REST API dokumentációjában talál.
  • Fiókházirend konfigurálása külső szolgáltatáshoz.