Egyéni ágszabályzatok létrehozása az Azure Functionsszel
Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019
A lekéréses kérelem (PR) munkafolyamat lehetővé teszi a fejlesztők számára, hogy visszajelzést kérjenek a kódjukról a társviszonyban lévőktől és az automatizált eszközöktől. A külső eszközök és szolgáltatások a PR status API használatával vehetnek részt a PR-munkafolyamatban. Ez a cikk végigvezeti azon folyamaton, amely során egyéni fiókszabályzatot hozhat létre az Azure Functions használatával az Azure DevOps Services Git-adattárban található PRS-ek ellenőrzéséhez. Az Azure Functions használatával nem kell aggódnia a kiszolgálók kiépítésével és karbantartásával, különösen akkor, ha a számítási feladat növekszik. Az Azure Functions teljes mértékben felügyelt számítási platformot biztosít, amely nagy megbízhatósággal és biztonsággal rendelkezik.
A lekéréses kérelmek állapotával kapcsolatos további információkért lásd a lekéréses kérelmek munkafolyamatainak testreszabását és kiterjesztését lekéréses kérelmek állapotával.
Előfeltételek
Egy Szervezet az Azure DevOpsban Egy Git-adattárral. Ha nem rendelkezik szervezettel, regisztráljon a kód ingyenes korlátlan privát Git-adattárakban való feltöltésére és megosztására.
Alapszintű Azure-függvény létrehozása az Azure Repos-események figyeléséhez
Egyszerű függvény létrehozásához kövesse az első Azure-függvénydokumentáció létrehozását. Módosítsa a mintában szereplő kódot a következőképpen:
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);
}
}
Szolgáltatáshook konfigurálása PR-eseményekhez
A szolgáltatáshookok egy Azure DevOps Services-szolgáltatás, amely riasztást küld a külső szolgáltatásoknak bizonyos események bekövetkezésekor. Ebben a példában egy szolgáltatáshookot szeretne beállítani a PR-eseményekhez, az Azure-függvény értesítést kap a lekéréses kérelmek változásakor. Ahhoz, hogy kéréseket fogadhasson POST
a lekéréses kérelmek változásakor, meg kell adnia a szolgáltatáshook számára az Azure-függvény URL-címét.
Ehhez a mintához 2 szolgáltatáshookot kell konfigurálnia. Az első a lekéréses kérelem által létrehozott eseményhez, a második pedig a lekéréses kérelem frissített eseményéhez lesz.
Kérje le a függvény URL-címét az Azure Portalról az Azure-függvénynézetben a Függvény URL-címének lekérése gombra kattintva, és másolja ki az URL-címet.
Keresse meg a projektet az Azure DevOpsban, például:
https://dev.azure.com/<your organization>/<your project name>
A navigációs menüben vigye az egérmutatót a fogaskerék fölé, és válassza a Service Hooks lehetőséget.
Ha ez az első szolgáltatáshook, válassza a + Előfizetés létrehozása lehetőséget.
Ha már konfigurálta a többi szolgáltatáshookot, válassza a zöld pluszt
(+)
egy új szolgáltatáshook-előfizetés létrehozásához.Az Új szolgáltatáshook-előfizetés párbeszédpanelen válassza a Web Hooks lehetőséget a szolgáltatások listájából, majd válassza a Tovább lehetőséget.
Válassza az eseményindítók listájából létrehozott lekéréses kérelmet, majd válassza a Tovább gombot.
A Művelet lapon adja meg az 1. lépésben kimásolt URL-címet az URL-mezőbe . Válassza a Teszt lehetőséget, ha teszteseményt szeretne küldeni a kiszolgálónak.
Az Azure-függvénynapló ablakában egy bejövő üzenet
POST
jelenik meg, amely azt jelzi, hogy200 OK
a függvény megkapta a szolgáltatáshoom eseményt.HTTP Requests ------------- POST / 200 OK
A Tesztértesítés ablakban válassza a Válasz lapot a kiszolgáló válaszának részleteinek megtekintéséhez. Látnia kell a kiszolgáló válaszát.
Zárja be a Tesztértesítés ablakot, és válassza a Befejezés lehetőséget a szolgáltatáshook létrehozásához.
Folytassa újra a 2–8. lépést, de ezúttal konfigurálja a lekéréses kérelem frissített eseményét.
Fontos
Mindenképpen végezze el kétszer az előző lépéseket, és hozzon létre szolgáltatáshookokat mind a létrehozott lekéréses kérelemhez, mind a lekéréses kérelem frissített eseményeihez.
Hozzon létre egy lekéréses kérelmet, amely ellenőrzi, hogy az Azure-függvény értesítéseket kap-e.
Állapot közzététele a PRS-eknek
Most, hogy a kiszolgáló fogadni tudja a szolgáltatáshohoom-eseményeket az új PRS-ek létrehozásakor, frissítse az állapotot a lekéréses kérelemre. A szolgáltatáshook által közzétett JSON hasznos adatok segítségével meghatározhatja, hogy milyen állapotot állítson be a lekéréses kérelemhez.
Frissítse az Azure-függvény kódját az alábbi példához hasonlóan.
Frissítse a kódot a szervezet nevével, a projekt nevével, az adattár nevével és a PAT-jogkivonattal. A lekéréses kérelem állapotának módosításához a PAT-nak vso.code_status hatókörre van szüksége, amelyet a Kód (állapot) hatókör kiválasztásával adhat meg a személyes hozzáférési jogkivonat létrehozása lapon.
Fontos
Ez a mintakód kódban tárolja a PAT-t a minta egyszerűsítése érdekében. Javasoljuk, hogy titkos kulcsokat tároljon a KeyVaultban, és onnan kérje le őket.
Ez a minta a lekéréses kérelem címét vizsgálja meg, hogy a felhasználó jelezte-e, hogy a lekérés folyamatban van-e, ha wip-t ad hozzá a címhez. Ha igen, a mintakód módosítja a lekéréses kérelemhez visszaküldött állapotot. Cserélje le az Azure-függvényben lévő kódot a következő kódra a lekéréses kérelemre visszaküldött állapot frissítésének implementálásához.
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"
}
});
}
Új lekéréses kérelem létrehozása az állapotkiszolgáló teszteléséhez
Most, hogy a kiszolgáló fut és figyeli a szolgáltatáshoom-értesítéseket, hozzon létre egy lekéréses kérelmet a teszteléshez.
Kezdje a fájlnézetben. Szerkessze a readme.md fájlt az adattárban (vagy bármely más fájlban, ha nincs readme.md).
Szerkessze és véglegesítse az adattár módosításait.
Mindenképpen véglegesítse a módosításokat egy új ágra, hogy a következő lépésben létrehozhasson egy lekéréses kérelmet.
Válassza a Lekéréses kérelem létrehozása hivatkozást.
Adja hozzá a WIP-t a címhez az alkalmazás működésének teszteléséhez. Válassza a Létrehozás lehetőséget a lekéréses kérelem létrehozásához.
A lekéréses kérelem létrehozása után megjelenik az állapotszakasz a Folyamatban lévő munka bejegyzéssel, amely a hasznos adatban megadott URL-címre hivatkozik.
Frissítse a pr címet, és távolítsa el a WIP-szöveget, és vegye figyelembe, hogy az állapot a Folyamatban lévő munka állapotáról a Felülvizsgálatra kész állapotra változik.
Következő lépések
- Ebben a cikkben megismerhette egy kiszolgáló nélküli Azure-függvény létrehozásának alapjait, amelyek szolgáltatáshookok segítségével figyelik a PR-eseményeket, és állapotüzeneteket tehetnek közzé az állapot API használatával. A lekéréses kérelem állapotának API-járól további információt a REST API dokumentációjában talál.
- Fiókházirend konfigurálása külső szolgáltatáshoz.