Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020
Pracovní postup pro pull requesty (PR) umožňuje vývojářům získávat zpětnou vazbu ke svému kódu od kolegů a automatizovaných nástrojů. Nástroje a služby, které nejsou od Microsoftu, se mohou také zapojit do PR workflow pomocí PR Status API. Tento článek vás provede vytvořením vlastních zásad pro větve pomocí Azure Functions pro ověřování pull requestů v úložišti Git Azure DevOps. Azure Functions eliminuje potřebu zřizování a údržby serverů, i když roste zatížení. Poskytují plně spravovanou výpočetní platformu s vysokou spolehlivostí a zabezpečením.
Další informace o stavu žádosti o přijetí změn (PR) najdete v části Přizpůsobení a rozšíření pracovních postupů pro žádosti o přijetí změn s ohledem na jejich stav.
Požadavky
| Kategorie | Požadavky |
|---|---|
| Organizace | Organizace v Azure DevOps s úložištěm Git. |
| Funkce Azure | Funkce Azure, která implementuje bezserverové řešení řízené událostmi, které se integruje s Azure DevOps za účelem vytvoření vlastní zásady pro větve a automatizace validace pull requestů. |
| Háky služby | Nakonfigurujte webhooky služby pro události pull requestů tak, aby informovaly vaši funkci Azure, když dojde ke změně v pull requestu. |
| Autentizace | Token ID Microsoft Entra s oborem Kód (stav), který má oprávnění ke změně stavu žádosti o přijetí změn. Další informace naleznete v tématu ověřování Microsoft Entra. |
Vytvoření základní funkce Azure Functions pro naslouchání událostem Azure Repos
Vytvořte svou první funkci Azure. Potom upravte kód v ukázce tak, aby vypadal jako následující kód:
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);
}
}
Konfigurace webhooku pro události pull requestů
Háky služeb jsou funkce Azure DevOps, která může upozornit externí služby, když dojde k určitým událostem. Pro tuto ukázku nastavte služební hák pro události pull requestu, vaše funkce Azure je upozorněna, když se pull request změní. Pokud chcete přijímat POST žádosti při změně žádostí o přijetí změn, poskytněte háku služby s adresou URL funkce Azure.
Pro tuto ukázku nakonfigurujte dva háky služby. První je událost Vytvoření žádosti o přijetí změn a druhá je událost Aktualizace žádosti o přijetí změn.
Získejte adresu URL funkce z Azure portálu kliknutím na Získat adresu URL funkce ve vašem zobrazení funkce Azure a zkopírujte adresu URL.
Přejděte ke svému projektu v Azure DevOps, například
https://dev.azure.com/<your organization>/<your project name>V navigační nabídce najeďte myší na ozubené kolo a vyberte Service Hooks.
Pokud se jedná o první háček služby, vyberte + Vytvořit předplatné.
Pokud už máte nakonfigurované další háky služeb, vyberte zelené plus
(+)a vytvořte nové předplatné háku služby.
V dialogovém okně nového odběru služeb „Service Hooks“ vyberte Web Hooks ze seznamu služeb a pak vyberte Další.
V seznamu spouštěčů událostí vyberte Žádost o přijetí změn, poté vyberte Další.
Na stránce Akce zadejte adresu URL, kterou jste zkopírovali v kroku 1 do pole Adresa URL . Vyberte Test pro odeslání testovací události na server.
V okně protokolu funkce Azure se zobrazí příchozí
POST, která vrátila200 OK, což označuje, že vaše funkce přijala událost háčku služby.HTTP Requests ------------- POST / 200 OKV okně Testovací oznámení vyberte kartu Odpověď a zobrazte podrobnosti odpovědi ze serveru. Měla by se zobrazit odpověď ze serveru.
Zavřete okno Testovací oznámení a výběrem Dokončit vytvořte háček služby.
Znovu si projděte kroky 2 až 8, ale tentokrát nakonfigurujte událost Pull request updated.
Důležité
Nezapomeňte dvakrát projít předchozí kroky a vytvořit připojení služby jak pro událost vytvoření žádosti o přijetí změn, tak pro událost aktualizaci žádosti o přijetí změn.
Vytvořte pull request, abyste ověřili, že vaše funkce Azure přijímá oznámení.
Zveřejnění stavu do pull requestů
Teď, když váš server může přijímat události háku služby při vytváření nových žádostí o přijetí změn, aktualizujte ho tak, aby odeslal stav žádosti o přijetí změn zpět. Datovou část JSON, kterou publikoval prvok aplikace služby, můžete použít k určení stavu, který se má nastavit pro vaši žádost o přijetí změn.
Aktualizujte kód funkce Azure, podobně jako v následujícím příkladu.
Nezapomeňte aktualizovat kód názvem organizace, názvem projektu, názvem úložiště a tokenem ID Microsoft Entra. Aby bylo možné změnit stav PR, token vyžaduje rozsah vso.code_status, který můžete získat prostřednictvím ověřování Microsoft Entra.
Důležité
Tento ukázkový kód uloží token do kódu, což zjednodušuje ukázku. Doporučujeme ukládat tajné kódy ve službě Azure Key Vault a načítat je z ní pomocí spravované identity pro lepší zabezpečení.
Tato ukázka kontroluje název PR, aby zjistila, jestli uživatel označil PR jako rozpracovaný přidáním WIP do názvu. Pokud ano, vzorový kód změní stav vrácený zpět do požadavku na úpravy. Nahraďte kód ve funkci Azure tímto kódem, který aktualizuje stav zpětně odeslaný do 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 Azure Key Vault and retrieve them using managed identity.
*/
private static string accessToken = "[MICROSOFT_ENTRA_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("Bearer", accessToken);
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"
}
});
}
Vytvořte novou žádost o přijetí změn (PR) a otestujte stavový server
Teď, když je váš server spuštěný a naslouchá oznámení o service hook, vytvořte žádost o přijetí změn, abyste ji otestovali.
Začněte v zobrazení souborů. Upravte readme.md soubor v úložišti (nebo jakýkoli jiný soubor, pokud nemáte readme.md).
Proveďte úpravy a potvrďte změny v úložišti.
Nezapomeňte potvrdit změny do nové větve, abyste mohli v dalším kroku vytvořit pull request.
Vyberte odkaz Vytvořit pull request.
Přidejte do názvu WIP a otestujte funkčnost aplikace. Vyberte Vytvořit a vytvořte PR.
Po vytvoření PR se část stavu zobrazí s položkou Rozpracováno, která odkazuje na adresu URL zadanou v datové části.
Aktualizujte název PR a odeberte text WIP a všimněte si, že se stav mění z Práce na dokončení na Připraveno k recenzi.