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

Azure Repos | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

Çekme isteği (PR) iş akışı, geliştiricilere hem eşlerden hem de otomatik araçlardan kendi kodlarıyla ilgili geri bildirim almak için bir fırsat sağlar. 3. taraf araçlar ve hizmetler, PR Durum API'sini kullanarak PR iş akışına katılabilir. Bu makale, bir Git deposundaki PR'leri doğrulamak için Azure İşlevleri kullanarak özel bir dal ilkesi Azure DevOps Services size yol sağlar. Bu Azure İşlevleri özellikle iş yükünüz arttıkça sunucuları sağlama ve bakım konusunda endişelenmenize gerek yok. Azure İşlevleri güvenilirlik ve güvenlik özelliklerine 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

Git Azure DevOps bir kuruluş. Bir kuruluş yoksa ücretsiz sınırsız özel Git depolarında kod yüklemek ve paylaşmak için kaydolabilirsiniz.

Olayları dinlemek için temel bir Azure Azure Repos oluşturma

Basit bir işlev oluşturmak için ilk Azure işlevinizi oluşturma belgelerinizi izleyin. Örnekteki kodu aşağıdaki gibi olacak şekilde değiştirme:

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

Pr olayları için hizmet kancası yapılandırma

Hizmet kancaları, Azure DevOps Services olduğunda dış hizmetleri uyaran bir özelliktir. Bu örnekte çekme isteği olayları için bir hizmet kancası ayarlamak istediğiniz için çekme isteği değiştinde Azure işleviniz size bildirilecek. Çekme istekleri POST değişirken istekleri almak için Azure işlev URL'sini hizmet kancası ile birlikte sağlamanız gerekir.

Bu örnek için 2 hizmet kancası yapılandırmalısiniz. Birincisi Çekme isteği tarafından oluşturulan olay, ikincisi ise Çekme isteği güncelleştirilmiş olayı için olacak.

  1. Azure işlev görünümde İşlev URL'Azure portal al'a tıklayarak işlev URL'sini seçin ve URL'yi kopyalayın.

    İşlev URL'sini al

    İşlev URL'sini kopyalama

  2. Uygulama içinde projenize Azure DevOps, ör.https://dev.azure.com/<your organization>/<your project name>

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

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

  4. İlk hizmet kancanız bu ise + Abonelik oluştur'a tıklayın.

    Araç çubuğundan Yeni abonelik oluştur'a tıklayın

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

    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, hizmet listesinden Web Kancaları'ı ve ardından Sonraki'yi seçin.

    Hizmet listesinden web kancalarını seçme

  6. Olay tetikleyicileri listesinden oluşturulan Çekme isteği'ne ve ardından Sonraki'ye tıklayın.

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

  7. Eylem sayfasında, URL kutusuna 1. adımda kopyalanan URL'yi girin. Sunucunuza bir test olayı göndermek için Test'i seçin.

    URL'yi girin ve hizmet kancası test etmek için Test'i seçin

    Azure işlev günlüğü penceresinde, işlevinizin hizmet kancası olayını aldığına işaret eden bir gelen POST200 OK döndürüldü.

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

    Sunucunuzdan gelen yanıtın ayrıntılarını görmek için Test Bildirimi penceresinde Yanıt sekmesini seçin. Sunucunuzdan gelen yanıtı görüyor olun.

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

  8. Test Bildirimi penceresini kapatın ve Son'a seçerek hizmet kancası oluşturun.

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

Önemli

Önceki adımları iki kez tamamlaya ve hem oluşturulan Çekme isteği 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.

DURUM BILGI SİS'lere yayınla

Artık sunucunuz yeni PR'ler oluşturulduğunda hizmet kancası olaylarını alsa da, pr'ye geri durum göndersin diye güncelleştirin. Pr'niz üzerinde hangi durumun ayarlanana karar olarak hizmet kancası tarafından gönderilen JSON yükünü kullanabilirsiniz.

Azure işlevinizin kodunu aşağıdaki örnekteki gibi olacak şekilde güncelleştirin.

Kodu kuruluş adı, proje adı, depo adı ve PAT belirteci ile güncelleştirin. PR durumunu değiştirme iznine sahip olmak için PAT, kişisel vso.code_status belirteci oluştur sayfasındaKi Kod (durum) kapsamını seçerek verebilirsiniz.

Önemli

Bu örnek kod, örneği basitleştirmek için PAT'i kodda depolar. Gizli dizileri KeyVault'ta depolama ve buradan alma önerilir.

Bu örnek, kullanıcıya WIP ekleyerek pr'nin devam eden bir iş olup olduğunu belirtip belirtemesini görmek için PR başlığını inceler. Öyleyse, örnek kod PR'ye geri gönderilen durumu değiştirir. Pr'ye geri gönderilen durumu güncelleştirmek için Azure işlevinizin kodunu 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 PR oluşturma

Sunucunuz çalışıyor 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şlar. Readme.md dosyanızı (veya başka bir dosyanız yoksa) readme.md.

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

  2. Bir düzenleme yapın ve değişiklikleri bir repoya işin.

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

  3. Sonraki adımda pr oluştur oluşturmak için değişiklikleri yeni bir dalda işleyenin.

    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'a seçin

  5. Uygulamanın işlevselliğini test etmek için başliğe WIP ekleyin. Pr'yi oluşturmak için Oluştur'a basın.

    Varsayılan PR başlığına WIP ekleme

  6. Pr oluşturulduktan sonra durum bölümünü ve yükte belirtilen URL'ye bağlantı oluşturan Devam ediyor girdisini görüntülersiniz.

    Devam eden iş girdisi olan durum bölümü.

  7. PR başlığını güncelleştirin ve WIP metnini kaldırın ve devam eden çalışma durumunda gözden geçirme için hazır olarak değişir.

Sonraki Adımlar

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