Ö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.
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.


Uygulama içinde projenize Azure DevOps, ör.
https://dev.azure.com/<your organization>/<your project name>Gezinti menüsünde dişlinin üzerine gelin ve HizmetKancaları'ı seçin.

İlk hizmet kancanız bu ise + 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 Hizmet Kancaları Aboneliği iletişim kutusunda, hizmet listesinden Web Kancaları'ı ve ardından Sonraki'yi seçin.

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

Eylem sayfasında, URL kutusuna 1. adımda kopyalanan URL'yi girin. Sunucunuza bir test olayı göndermek 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 OKdöndürüldü.HTTP Requests ------------- POST / 200 OKSunucunuzdan 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.

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.
Dosyalar görünümünden başlar. Readme.md dosyanızı (veya başka bir dosyanız yoksa) readme.md.

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

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

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

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.

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.

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.