Özel dal ilkeleri oluşturmak için Azure İşlevleri kullanma

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Çekme isteği (PR) iş akışı, geliştiricilere hem eşlerden hem de otomatik araçlardan kodları hakkında geri bildirim alma fırsatı sunar. Üçüncü taraf araçlar ve hizmetler, ÇEKME İsteği Durumu API'sini kullanarak çekme isteği iş akışına katılabilir. Bu makale, Azure DevOps Services Git deposundaki ÇEKME'leri doğrulamak için Azure İşlevleri kullanarak özel dal ilkesi oluşturma işleminde size yol gösterir. Azure İşlevleri özellikle iş yükünüz büyüdükçe sunucuları sağlama ve bakımını yapma konusunda endişelenmeniz gerekmez. Azure İşlevleri yüksek güvenilirlik ve güvenliğe sahip tam olarak yönetilen bir işlem platformu sağlar.

Çekme isteği durumu hakkında daha fazla bilgi için bkz . Çekme isteği durumuyla çekme isteği iş akışlarını özelleştirme ve genişletme.

Önkoşullar

Azure DevOps'ta Git deposu olan bir kuruluş. Kuruluşunuz yoksa ücretsiz sınırsız özel Git depolarında kod yüklemek ve paylaşmak için kaydolun .

Azure Repos olaylarını dinlemek için temel bir Azure işlevi oluşturma

Basit bir işlev oluşturmak için ilk Azure işlevinizi oluşturma belgelerini izleyin. Örnekteki kodu aşağıdaki gibi görünecek şekilde değiştirin:

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

Çekme isteği olayları için hizmet kancası yapılandırma

Hizmet kancaları, belirli olaylar gerçekleştiğinde dış hizmetleri uyarabilen bir Azure DevOps Services özelliğidir. Bu örnek için çekme isteği olayları için bir hizmet kancası ayarlamak isteyeceksiniz. Çekme isteği değiştiğinde Azure işlevinize bildirim gönderilir. Çekme istekleri değiştiğinde istekleri almak POST için Azure işlev URL'si ile hizmet kancasını sağlamanız gerekir.

Bu örnek için 2 hizmet kancası yapılandırmanız gerekir. Birincisi Çekme isteği oluşturulan olayı için, ikincisi çekme isteği güncelleştirilmiş olayı için olacaktır.

  1. Azure işlev görünümünüzde İşlev URL'sini al'a tıklayarak Azure portalından işlev URL'sini alın ve URL'yi kopyalayın.

    İşlev url'sini alma

    İşlev url'sini kopyalama

  2. Azure DevOps'ta projenize göz atın, örneğin. https://dev.azure.com/<your organization>/<your project name>

  3. Gezinti menüsünde dişlinin üzerine gelin ve Hizmet Kancaları'nı seçin.

    Yönetici menüsünden Hizmet kancaları'nı seçin

  4. Bu ilk hizmet kancanızsa + Abonelik oluştur'u seçin.

    Araç çubuğundan Yeni abonelik oluştur'u seçin

    Yapılandırılmış başka hizmet kancalarınız varsa, yeni bir hizmet kancası aboneliği oluşturmak için yeşil artıyı (+) seçin.

    Yeni bir hizmet kancası aboneliği oluşturmak için yeşil artıyı seçin.

  5. Yeni Hizmet Kancaları Aboneliği iletişim kutusunda, hizmetler listesinden Web Kancaları'nı ve ardından İleri'yi seçin.

    Hizmet listesinden web kancaları seçme

  6. Olay tetikleyicileri listesinden oluşturulan çekme isteği'ni ve ardından İleri'yi seçin.

    Olay tetikleyicileri listesinden oluşturulan çekme isteğini seçin

  7. Eylem sayfasında, 1. adımda kopyaladığınız URL'yi URL kutusuna girin. Test'i seçerek sunucunuza bir test olayı gönderin.

    HIZMET kancasını test etmek için URL'yi girin ve Test et'i seçin

    Azure işlev günlüğü penceresinde, işlevinizin hizmet kancası olayını aldığını belirten ve döndüren bir 200 OKgelen POST görürsünüz.

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

    Test Bildirimi penceresinde Yanıt sekmesini seçerek sunucunuzdan gelen yanıtın ayrıntılarını görüntüleyin. Sunucunuzdan gelen yanıtı görmeniz gerekir.

    Testin sonuçlarını görmek için yanıt sekmesini seçin

  8. Hizmet kancasını oluşturmak için Test Bildirimi penceresini kapatın ve Son'u seçin.

2-8 arası adımları yeniden uygulayın, ancak bu kez Çekme isteği güncelleştirildi olayını yapılandırın.

Önemli

Önceki adımları iki kez ilerletip hem Çekme isteği oluşturulan hem de Çekme isteği güncelleştirilmiş olayları için hizmet kancaları oluşturduğunuzdan emin olun.

Azure işlevinizin bildirim aldığını doğrulamak için bir çekme isteği oluşturun.

Durumu PR'lere gönderme

Yeni PR'ler oluşturulduğunda sunucunuz hizmet kancası olaylarını alabildiğine göre, bunu pr'ye geri gönderme durumu olarak güncelleştirin. Çekme isteğinizde hangi durumun ayarlandığını belirlemek için hizmet kancası tarafından gönderilen JSON yükünü kullanabilirsiniz.

Azure işlevinizin kodunu aşağıdaki örneğe benzer şekilde güncelleştirin.

Kodu kuruluşunuzun adı, proje adı, depo adı ve PAT belirteci ile güncelleştirdiğinden emin olun. ÇEKME isteği durumunu değiştirme iznine sahip olmak için PAT, Kişisel erişim belirteci oluştur sayfasında Kod (durum) kapsamını seçerek verebileceğiniz vso.code_status kapsamı gerektirir.

Önemli

Bu örnek kod, örneği basitleştirmek için PAT'yi kodda depolar. Gizli dizileri KeyVault'ta depolamak ve oradan almak önerilir.

Bu örnek, kullanıcının başlığa WIP ekleyerek çekme isteğinin devam eden bir iş olup olmadığını belirtip belirtmediğini görmek için çekme isteği başlığını inceler. Bu durumda, örnek kod çekme isteğine geri gönderilen durumu değiştirir. Çekme isteğine geri gönderilen durumun güncelleştirilmesini uygulamak için Azure işlevinizdeki kodu aşağıdaki kodla değiştirin.

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

Durum sunucusunu test etmek için yeni bir çekme isteği oluşturma

Sunucunuz çalıştığına ve hizmet kancası bildirimlerini dinlediğini göre, test etmek için bir çekme isteği oluşturun.

  1. Dosyalar görünümünden başlayın. Deponuzdaki readme.md dosyasını (veya readme.md yoksa başka bir dosyayı) düzenleyin.

    Bağlam menüsünden Düzenle'yi seçin

  2. Düzenleme yapın ve değişiklikleri depoya işleyin.

    Dosyayı düzenleyin ve araç çubuğundan İşle'yi seçin

  3. Sonraki adımda çekme isteği oluşturabilmek için değişiklikleri yeni bir dala işlemeyi unutmayın.

    Yeni bir dal adı girin ve İşle'yi seçin

  4. Çekme isteği oluştur bağlantısını seçin.

    Öneri çubuğundan Çekme isteği oluştur'u seçin

  5. Uygulamanın işlevselliğini test etmek için başlığa WIP ekleyin. Çekme isteğini oluşturmak için Oluştur'u seçin.

    WiP'yi varsayılan çekme isteği başlığına ekleme

  6. Çekme isteği oluşturulduktan sonra, yükte belirtilen URL'ye bağlanan Devam ediyor girdisi ile durum bölümünü görürsünüz.

    Devam eden çalışma girdisi olan Durum bölümü.

  7. Çekme isteği başlığını güncelleştirin ve WIP metnini kaldırın ve durumun Çalışma devam ediyor durumundan Gözden geçirılmaya hazır olarak değiştiğine dikkat edin.

Sonraki Adımlar

  • Bu makalede, hizmet kancaları aracılığıyla PR olaylarını dinleyen ve durum API'sini kullanarak durum iletileri gönderebilen sunucusuz bir Azure işlevi oluşturmanın temellerini öğrendiniz. Çekme isteği durum API'si hakkında daha fazla bilgi için REST API belgelerine bakın.
  • Dış hizmet için dal ilkesi yapılandırın.