Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020
Met de pull-aanvraagwerkstroom (PR) kunnen ontwikkelaars feedback ontvangen over hun code van peers en geautomatiseerde hulpprogramma's. Hulpprogramma's en services van derde partijen kunnen ook deelnemen aan de PR-werkstroom met behulp van de PR-status-API. In dit artikel wordt u begeleid bij het maken van een aangepast vertakkingsbeleid met behulp van Azure Functions om PR's te valideren in een Azure DevOps Git-opslagplaats. Azure Functions elimineert de noodzaak om servers in te richten en te onderhouden, zelfs als uw workload groeit. Ze bieden een volledig beheerd rekenplatform met hoge betrouwbaarheid en beveiliging.
Voor meer informatie over de status van pull-aanvragen, zie Werkstromen voor pull-aanvragen aanpassen en uitbreiden met de status van pull-aanvragen.
Vereiste voorwaarden
| Categorie | Behoeften |
|---|---|
| Organisatie | Een organisatie in Azure DevOps met een Git-opslagplaats. |
| Azure-functie | Een Azure-functie, waarmee een serverloze, gebeurtenisgestuurde oplossing wordt geïmplementeerd die kan worden geïntegreerd met Azure DevOps om aangepast vertakkingsbeleid te maken en pr-validatie te automatiseren. |
| Servicehooks | Configureer servicehooks voor PR-gebeurtenissen om uw Azure-functie te informeren wanneer een pull request wordt gewijzigd. |
| Authenticatie | Microsoft Entra ID-token met het bereik Code (status) om toestemming te krijgen om de PR-status te wijzigen. Zie Microsoft Entra-verificatie voor meer informatie. |
Een eenvoudige Azure-functie maken om naar Azure Repos-gebeurtenissen te luisteren
Uw eerste Azure-functie maken. Wijzig vervolgens de code in het voorbeeld zodat deze eruitziet als de volgende code:
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);
}
}
Een servicehook configureren voor pr-gebeurtenissen
Servicehook is een Azure DevOps-functie waarmee externe services kunnen worden gewaarschuwd wanneer bepaalde gebeurtenissen optreden. Voor dit voorbeeld stelt u een servicehook in voor pr-gebeurtenissen. Uw Azure-functie wordt op de hoogte gesteld wanneer een pull-aanvraag wordt gewijzigd. Als u verzoeken wilt ontvangen POST wanneer pull-verzoeken worden gewijzigd, configureert u de servicehook met de URL van de Azure-functie.
Configureer voor dit voorbeeld twee servicehook. De eerste gebeurtenis is voor de pull-aanvraag die is gemaakt en de tweede gebeurtenis is voor de pull-aanvraag die is bijgewerkt.
Haal de functie-URL op uit de Azure-portal door te klikken op de functie-URL Ophalen in de Azure-functieweergave en de URL te kopiëren.
Blader naar uw project in Azure DevOps, bijvoorbeeld
https://dev.azure.com/<your organization>/<your project name>Beweeg in het navigatiemenu de cursor over het tandwiel en selecteer Service Hooks.
Als dit uw eerste servicehook is, selecteert u + Abonnement maken.
Als u al andere servicehooks hebt geconfigureerd, selecteert u het groene plusteken
(+)om een nieuw servicehooksubscriptie te maken.
Selecteer in het dialoogvenster Nieuw servicekoppelingsabonnement Webkoppeling in de lijst met services en selecteer vervolgens Volgende.
Selecteer pull-aanvraag die is gemaakt in de lijst met gebeurtenistriggers en selecteer vervolgens Volgende.
Voer op de pagina Actie de URL in die u in stap 1 in het vak URL hebt gekopieerd. Selecteer Test om een test gebeurtenis naar uw server te verzenden.
In het venster van het Azure-functielogboek ziet u een binnenkomende
POSTfunctie die een200 OKretourneert, waarmee wordt aangegeven dat uw functie de servicehookgebeurtenis heeft ontvangen.HTTP Requests ------------- POST / 200 OKSelecteer in het venster Testmelding het tabblad Antwoord om de details van het antwoord van uw server te bekijken. U ziet het antwoord van uw server.
Sluit het testnotificatievenster en selecteer Voltooien om de servicehook te maken.
Voer stappen 2 tot en met 8 opnieuw uit, maar configureer deze keer de Pull request bijgewerkt-gebeurtenis.
Belangrijk
Zorg ervoor dat u de voorgaande stappen twee keer doorloopt en servicehooks maakt voor zowel de gebeurtenis pull-verzoek aangemaakt als de gebeurtenis pull-verzoek bijgewerkt.
Maak een pull-aanvraag om te controleren of uw Azure-functie meldingen ontvangt.
Status plaatsen naar pull requests
Nu uw server service hook gebeurtenissen kan ontvangen wanneer er nieuwe pull-aanvragen worden gemaakt, werkt u deze bij om de status terug te sturen naar de pull-aanvraag. U kunt de JSON-payload gebruiken die door de service hook is gepost om de status van uw pull request te bepalen.
Werk de code van uw Azure-functie bij, vergelijkbaar met het volgende voorbeeld.
Zorg ervoor dat u de code bijwerkt met de naam van uw organisatie, de projectnaam, de naam van de opslagplaats en het Microsoft Entra ID-token. Als u toestemming wilt hebben om de pull request-status te wijzigen, vereist het token het vso.code_status bereik, dat u kunt verkrijgen via Microsoft Entra-verificatie.
Belangrijk
Met deze voorbeeldcode wordt het token opgeslagen in code, waardoor het voorbeeld wordt vereenvoudigd. Het wordt aanbevolen om geheimen op te slaan in Azure Key Vault en ze daar op te halen met behulp van een beheerde identiteit voor verbeterde beveiliging.
In dit voorbeeld wordt de titel van de pull-aanvraag gecontroleerd om te zien of de gebruiker heeft aangegeven of de pull-aanvraag wordt uitgevoerd door WIP toe te voegen aan de titel. Zo ja, dan past de voorbeeldcode de status aan die is teruggestuurd naar de pull request. Vervang de code in uw Azure-functie door de volgende code, waarmee de status wordt bijgewerkt die teruggeplaatst wordt naar de pull request.
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"
}
});
}
Een nieuwe PR maken en de statusserver testen
Nu uw server draait en luistert naar servicehook-meldingen, maakt u een pull-aanvraag aan om deze te testen.
Begin in de bestandsweergave. Bewerk het readme.md bestand in uw opslagplaats (of een ander bestand als u geen readme.md hebt).
Breng een bewerking aan en voer de wijzigingen door in de opslagplaats.
Zorg ervoor dat je de wijzigingen doorvoert in een nieuwe vertakking, zodat je in de volgende stap een pull request kunt maken.
Selecteer de Een pull-aanvraag maken koppeling.
Voeg WIP- toe aan de titel om de functionaliteit van de app te testen. Selecteer Maken om de pull request te maken.
Zodra de pull request is gemaakt, wordt de statussectie weergegeven, met de vermelding Werk in uitvoering die is gekoppeld aan de URL die is opgegeven in de payload.
Werk de titel van de pull request bij en verwijder de WIP tekst en houd er rekening mee dat de status verandert van Werk in uitvoering naar Klaar voor beoordeling.