Menggunakan Azure Functions untuk membuat kebijakan cabang kustom
Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019
Alur kerja permintaan pull (PR) memberi pengembang kesempatan untuk mendapatkan umpan balik tentang kode mereka dari rekan-rekan serta dari alat otomatis. Alat dan layanan pihak ke-3 dapat berpartisipasi dalam alur kerja PR dengan menggunakan PR Status API. Artikel ini memandu Anda melalui proses pembuatan kebijakan cabang kustom menggunakan Azure Functions untuk memvalidasi PR di repositori Git Azure DevOps Services. Dengan Azure Functions, Anda tidak perlu khawatir tentang penyediaan dan pemeliharaan server, terutama ketika beban kerja Anda tumbuh. Azure Functions menyediakan platform komputasi yang dikelola sepenuhnya dengan keandalan dan keamanan tinggi.
Untuk informasi selengkapnya tentang status PR, lihat Menyesuaikan dan memperpanjang alur kerja permintaan pull dengan status permintaan pull.
Prasyarat
Organisasi di Azure DevOps dengan repositori Git. Jika Anda tidak memiliki organisasi, daftar untuk mengunggah dan berbagi kode di repositori Git privat tanpa batas gratis.
Membuat fungsi Azure dasar untuk mendengarkan peristiwa Azure Repos
Ikuti dokumentasi buat fungsi Azure pertama Anda untuk membuat fungsi sederhana. Ubah kode dalam sampel agar terlihat seperti ini:
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);
}
}
Mengonfigurasi hook layanan untuk peristiwa PR
Kait layanan adalah fitur Azure DevOps Services yang dapat memperingatkan layanan eksternal saat peristiwa tertentu terjadi. Untuk sampel ini, Anda mungkin ingin menyiapkan hook layanan untuk peristiwa PR, fungsi Azure Anda akan diberi tahu saat permintaan pull berubah. Untuk menerima POST
permintaan saat permintaan pull berubah, Anda harus menyediakan hook layanan dengan URL fungsi Azure.
Untuk sampel ini, Anda perlu mengonfigurasi 2 kait layanan. Yang pertama adalah untuk peristiwa permintaan Pull yang dibuat dan yang kedua adalah untuk peristiwa yang diperbarui permintaan Pull.
Dapatkan URL fungsi dari portal Azure dengan mengklik DAPATKAN URL fungsi di tampilan fungsi Azure Anda dan salin URL.
Telusuri ke proyek Anda di Azure DevOps, misalnya.
https://dev.azure.com/<your organization>/<your project name>
Dari menu navigasi, arahkan mouse ke atas gigi dan pilih Service Hooks.
Jika ini adalah hook layanan pertama Anda, pilih + Buat langganan.
Jika Anda sudah memiliki kait layanan lain yang dikonfigurasi, pilih plus
(+)
hijau untuk membuat langganan hook layanan baru.Pada dialog Langganan Hook Layanan Baru, pilih Web Hook dari daftar layanan, lalu pilih Berikutnya.
Pilih Permintaan pull yang dibuat dari daftar pemicu peristiwa, lalu pilih Berikutnya.
Di halaman Tindakan, masukkan URL yang Anda salin di langkah 1 di kotak URL . Pilih Uji untuk mengirim peristiwa pengujian ke server Anda.
Di jendela log fungsi Azure, Anda akan melihat yang masuk
POST
yang mengembalikan200 OK
, yang menunjukkan fungsi Anda menerima peristiwa hook layanan.HTTP Requests ------------- POST / 200 OK
Di jendela Pemberitahuan Pengujian, pilih tab Respons untuk melihat detail respons dari server Anda. Anda akan melihat respons dari server Anda.
Tutup jendela Pemberitahuan Pengujian, dan pilih Selesai untuk membuat hook layanan.
Lanjutkan langkah 2-8 lagi tetapi kali ini konfigurasikan peristiwa yang diperbarui permintaan Pull.
Penting
Pastikan untuk melalui langkah-langkah sebelumnya dua kali dan buat kait layanan untuk permintaan Pull yang dibuat dan Peristiwa yang diperbarui permintaan Pull.
Buat permintaan pull untuk memverifikasi bahwa fungsi Azure Anda menerima pemberitahuan.
Posting status ke PR
Sekarang setelah server Anda dapat menerima peristiwa hook layanan saat PR baru dibuat, perbarui untuk memposting kembali status ke PR. Anda dapat menggunakan payload JSON yang diposting oleh kait layanan untuk menentukan status apa yang akan diatur pada PR Anda.
Perbarui kode fungsi Azure Anda agar terlihat seperti contoh berikut.
Pastikan untuk memperbarui kode dengan nama organisasi, nama proyek, nama repositori, dan token PAT Anda. Untuk memiliki izin untuk mengubah status PR, PAT memerlukan cakupan vso.code_status , yang dapat Anda berikan dengan memilih cakupan Kode (status) di halaman Buat token akses pribadi.
Penting
Kode sampel ini menyimpan PAT dalam kode untuk menyederhanakan sampel. Disarankan untuk menyimpan rahasia di KeyVault dan mengambilnya dari sana.
Sampel ini memeriksa judul PR untuk melihat apakah pengguna telah menunjukkan apakah PR sedang berlangsung dengan menambahkan WIP ke judul. Jika demikian, kode sampel mengubah status yang diposting kembali ke PR. Ganti kode di fungsi Azure Anda dengan kode berikut untuk menerapkan pembaruan status yang diposting kembali ke PR.
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"
}
});
}
Membuat PR baru untuk menguji server status
Sekarang setelah server Anda berjalan dan mendengarkan pemberitahuan hook layanan, buat permintaan pull untuk mengujinya.
Mulai dalam tampilan file. Edit file readme.md di repositori Anda (atau file lain jika Anda tidak memiliki readme.md).
Edit dan terapkan perubahan pada repositori.
Pastikan untuk menerapkan perubahan ke cabang baru sehingga Anda dapat membuat PR di langkah berikutnya.
Pilih tautan Buat permintaan pull.
Tambahkan WIP dalam judul untuk menguji fungsionalitas aplikasi. Pilih Buat untuk membuat PR.
Setelah PR dibuat, Anda akan melihat bagian status, dengan entri Pekerjaan sedang berlangsung yang menautkan ke URL yang ditentukan dalam payload.
Perbarui judul PR dan hapus teks WIP dan perhatikan bahwa status berubah dari Pekerjaan sedang berlangsung menjadi Siap untuk ditinjau.
Langkah berikutnya
- Dalam artikel ini, Anda mempelajari dasar-dasar cara membuat fungsi Azure tanpa server yang mendengarkan peristiwa PR melalui hook layanan dan dapat memposting pesan status menggunakan API status. Untuk informasi selengkapnya tentang API status permintaan pull, lihat dokumentasi REST API.
- Mengonfigurasi kebijakan cabang untuk layanan eksternal.