Vytvoření vlastních zásad větvení pomocí Azure Functions

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

Pracovní postup žádosti o přijetí změn poskytuje vývojářům příležitost získat zpětnou vazbu ke svému kódu od partnerských partnerů i z automatizovaných nástrojů. Nástroje a služby třetích stran se můžou účastnit pracovního postupu žádosti o přijetí změn pomocí rozhraní API stavu žádosti o přijetí změn. Tento článek vás provede procesem vytvoření vlastních zásad větví pomocí Azure Functions k ověření žádostí o přijetí změn v úložišti Git služby Azure DevOps Services. S Azure Functions si nemusíte dělat starosti se zřizováním a údržbou serverů, zejména když se vaše úloha rozrůstá. Azure Functions poskytuje plně spravovanou výpočetní platformu s vysokou spolehlivostí a zabezpečením.

Další informace o stavu žádosti o přijetí změn najdete v tématu Přizpůsobení a rozšíření pracovních postupů žádostí o přijetí změn se stavem žádosti o přijetí změn.

Požadavky

Organizace v Azure DevOps s úložištěm Git. Pokud nemáte organizaci, zaregistrujte se a nahrajte a sdílejte kód v bezplatných neomezených privátních úložištích Git.

Vytvoření základní funkce Azure pro naslouchání událostem Azure Repos

Pokud chcete vytvořit jednoduchou funkci, postupujte podle první dokumentace k funkci Azure Functions. Upravte kód v ukázce tak, aby vypadal takto:

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

Konfigurace připojení služby pro události žádosti o přijetí změn

Háky služeb jsou funkce Azure DevOps Services, která může upozornit externí služby, když dojde k určitým událostem. Pro tuto ukázku budete chtít nastavit hook služby pro události žádosti o přijetí změn, funkce Azure bude upozorněna, když se žádost o přijetí změn změní. Pokud chcete přijímat POST žádosti při změně žádostí o přijetí změn, budete muset službě poskytnout háček služby s adresou URL funkce Azure.

Pro tuto ukázku budete muset nakonfigurovat 2 háky služby. První bude pro událost vytvoření žádosti o přijetí změn a druhá bude pro aktualizovanou událost žádosti o přijetí změn.

  1. Získejte adresu URL funkce z webu Azure Portal kliknutím na adresu URL funkce Získat v zobrazení funkce Azure a zkopírujte adresu URL.

    Získání adresy URL funkce

    Kopírovat adresu URL funkce

  2. Přejděte ke svému projektu v Azure DevOps, např. https://dev.azure.com/<your organization>/<your project name>

  3. V navigační nabídce najeďte myší na ozubené kolo a vyberte Připojit služby.

    V nabídce správce zvolte háky služby.

  4. Pokud se jedná o váš první háček služby, vyberte + Vytvořit předplatné.

    Na panelu nástrojů vyberte Vytvořit nové předplatné.

    Pokud už máte nakonfigurované další háky služeb, vyberte zelené plus (+) a vytvořte nové předplatné háku služby.

    Výběrem zeleného plus vytvořte nové předplatné háku služby.

  5. V dialogovém okně Nový odběr hooků služeb vyberte v seznamu služeb webhooky a pak vyberte Další.

    Výběr webových háků ze seznamu služeb

  6. V seznamu triggerů událostí vyberte Žádost o přijetí změn a pak vyberte Další.

    Výběr žádosti o přijetí změn vytvořené ze seznamu triggerů událostí

  7. Na stránce Akce zadejte adresu URL, kterou jste zkopírovali v kroku 1 do pole Adresa URL . Výběrem možnosti Test odešlete testovací událost na server.

    Zadejte adresu URL a výběrem možnosti Test otestujte připojení služby.

    V okně protokolu funkce Azure uvidíte příchozí POST zprávu, která vrátila 200 OKudálost volání služby.

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

    V okně Testovací oznámení vyberte kartu Odpověď a zobrazte podrobnosti odpovědi ze serveru. Měla by se zobrazit odpověď ze serveru.

    Výběrem karty odpovědi zobrazíte výsledky testu.

  8. Zavřete okno Testovací oznámení a výběrem možnosti Dokončit vytvořte volání služby.

Znovu si projděte kroky 2 až 8, ale tentokrát nakonfigurujte aktualizovanou událost žádosti o přijetí změn.

Důležité

Nezapomeňte projít předchozí kroky dvakrát a vytvořit volání služby pro události vytvořené žádostí o přijetí změn i aktualizované události žádosti o přijetí změn.

Vytvořte žádost o přijetí změn, abyste ověřili, že funkce Azure přijímá oznámení.

Publikování stavu do žádostí o přijetí změn

Teď, když váš server může přijímat události háku služby při vytváření nových žádostí o přijetí změn, aktualizujte ho tak, aby odeslal stav žádosti o přijetí změn zpět. Datovou část JSON publikované hákem služby můžete použít k určení stavu, který se má nastavit pro vaši žádost o přijetí změn.

Aktualizujte kód funkce Azure tak, aby vypadal jako v následujícím příkladu.

Nezapomeňte aktualizovat kód názvem organizace, názvem projektu, názvem úložiště a tokenem PAT. Pokud chcete mít oprávnění ke změně stavu žádosti o přijetí změn, vyžaduje pat vso.code_status rozsah, který můžete udělit tak, že na stránce Vytvořit osobní přístupový token vyberete obor Kód (stav).

Důležité

Tento vzorový kód ukládá pat do kódu, aby se ukázka zjednodušila. Doporučujeme ukládat tajné kódy do služby KeyVault a načítat je odtud.

Tato ukázka zkontroluje název žádosti o přijetí změn a zjistí, jestli uživatel uvedl, jestli žádost o přijetí změn probíhá, přidáním WIP do názvu. Pokud ano, vzorový kód změní stav publikovaný zpět do žádosti o přijetí změn. Nahraďte kód ve funkci Azure následujícím kódem, který implementuje aktualizaci stavu publikovaného zpět do žádosti o přijetí změn.

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

Vytvoření nové žádosti o přijetí změn pro otestování stavového serveru

Teď, když je váš server spuštěný a naslouchá oznámením o připojení služby, vytvořte žádost o přijetí změn, která ji otestuje.

  1. Začněte v zobrazení souborů. Upravte readme.md soubor v úložišti (nebo jakýkoli jiný soubor, pokud nemáte readme.md).

    V místní nabídce vyberte Upravit.

  2. Proveďte úpravy a potvrďte změny v úložišti.

    Upravte soubor a na panelu nástrojů vyberte Potvrdit.

  3. Nezapomeňte potvrdit změny do nové větve, abyste mohli vytvořit žádost o přijetí změn v dalším kroku.

    Zadejte název nové větve a vyberte Potvrdit.

  4. Vyberte odkaz Vytvořit žádost o přijetí změn.

    Na panelu návrhů vyberte Vytvořit žádost o přijetí změn.

  5. Přidejte do názvu WIP a otestujte funkčnost aplikace. Výběrem možnosti Vytvořit vytvořte žádost o přijetí změn.

    Přidání WIP do výchozího názvu žádosti o přijetí změn

  6. Po vytvoření žádosti o přijetí změn se zobrazí oddíl stavu s položkou Probíhá práce, která odkazuje na adresu URL zadanou v datové části.

    Oddíl Stav s probíhající položkou Práce

  7. Aktualizujte název žádosti o přijetí změn a odeberte text WIP a všimněte si, že se stav probíhající práce změní na Připraveno ke kontrole.

Další kroky

  • V tomto článku jste se dozvěděli základy vytvoření funkce Azure bez serveru, která naslouchá událostem žádosti o přijetí změn prostřednictvím háků služby a může publikovat stavové zprávy pomocí rozhraní API stavu. Další informace o rozhraní API pro stav žádosti o přijetí změn najdete v dokumentaci k rozhraní REST API.
  • Nakonfigurujte zásady větve pro externí službu.