Azure Functions ve Github Webhooks Entegrasyonu

68 dakikada yazıldı

Düzenle

Daha önceki Azure Functions ve Webhooks konusundaki yazıda Github'ı örnek olarak kullanmıştık. Fakat aslına bakarsanız Azure Functions ile beraber Github ve Slack için hazır entegrasyon yapıları geliyor. Örneğin yine Azure Functions ve Webhooks yazısından hatırlarsanız Github implementasyonunda Secret'ı kullanmamış ve o kısmı size bırakmıştım. Onun yerine biz URL üzerinden giden Function based Authentication kullanmıştık. Oysa Secret kullansaydık buna da gerek kalmayacaktı :) Peki neden o yazıyı öyle yazdın? derseniz :) ben konuyu daha genel bir yapıda anlatmak istedim. Bu yazıda ise Azure Functions için httpTrigger'lardaki webHookType özelliğine bakacağız.

httpTrigger'da webHookType

Azure Functions'da trigger olarak httpTrigger kullanırken webHookType denilen bir özelliği de opsyonel olarak tanımlayabiliyorsunuz. Bu özelliğin alabildiği şu an için üç değer var;

[function.js]

{
  "bindings": [
    {
      "type": "httpTrigger",
      "direction": "in",
      "webHookType": "github",
      "name": "req"
    },
    {
      "name": "cikanNesneler",
      "type": "table",
      "tableName": "Cikanlar",
      "connection": "AzureWebJobsStorage",
      "direction": "out"
    }
  ],
  "disabled": false
}

Yukarıdaki bindinglerden de anlayabileceğiniz üzere örneğimizde bir httpTrigger ile input binding kullanırken yine Azure Functions ve Webhooks konusundaki yazıda yaptığımız gibi kayıtları alıp Table Services'a atacağız. Normal şartlardaki bir httpTrigger'dan farklı olarak burada bir de webHookType denilen bir özelliğe github değerini veriyoruz.

Github Secret doğrudan ekranda.

webHookTypegithub olarak ayarladığınız anda Azure Web Portal'ındaki Azure Functions editöründe bir değişiklik göreceksiniz. Artık code parametresi ile URL üzerinden bir erişim kodu gitmeyecek. Onun yerine doğrudan Github Secret adında bir field ekleniyor. Bu fielddeki değeri alıp Github'da WebHook tanımlarken doğrudan Github Secret olarak vereceğiz.

Github Secret'ı Webhook tanımlarken Github'a veriyoruz.

Azure Portal'ından aldığımız key'i yukarıdaki gibi github'da WebHook'a Secret olarak verdiğimizde aslında işimiz neredeyse bitmiş oluyor.

[run.csx]

using System.Net;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, ICollector<GithubKaydi> cikanNesneler, TraceWriter log)
{
   dynamic data = await req.Content.ReadAsAsync<object>();

   GithubKaydi cikanLog = new GithubKaydi();
   cikanLog.PartitionKey = data?.action;
   cikanLog.RowKey = System.Guid.NewGuid().ToString();
   cikanLog.JSONPayload = data?.ToString();
   cikanNesneler.Add(cikanLog);

   return req.CreateResponse(HttpStatusCode.OK, new
   {
      body = $"From GitHub : {data.assignee.id}"
   });
}

public class GithubKaydi
{
   public string PartitionKey { get; set; }
   public string RowKey { get; set; }
   public string JSONPayload { get; set; }
}

Yukarıdaki örnek yine Azure Functions ve Webhooks konusundaki yazıdan çalıntı :) Değişen tek kısım benim Newtonsoft kullanmaktan vazgeçmem oldu :) Onun dışında kod bire bir aynı.

Github'dan gelen webhook verileri Table Services'da.

Verileri yine alıp Table Services'a attığımız için yukarıdaki gibi full JSON Payload'u görebiliyoruz.

İtiraf etmek gerekirse webhooktypelar zamanla artacak gibi hissediyorum :) Hatta bu konuda ipucu olarak Github'da yakaladağım fakat daha resmi dokümantasyonda olmayan şeyler de var :) Bakalım ilerleyen zamanlarda başka neler göreceğiz :)

Görüşmek üzere.