Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Le workflow de pull request (PR) permet aux développeurs de recevoir des commentaires sur leur code de la part de leurs pairs et des outils automatisés. Les outils et services non Microsoft peuvent également participer au workflow PR en utilisant l’API de statut PR. Cet article vous guide dans la création d’une stratégie de branche personnalisée à l’aide d’Azure Functions pour valider les PR dans un référentiel Git Azure DevOps. Azure Functions élimine la nécessité de provisionner et de gérer des serveurs, même lorsque votre charge de travail augmente. Ils fournissent une plateforme de calcul entièrement managée avec une fiabilité et une sécurité élevées.
Pour en savoir plus sur l’état des demandes de tirage, consultez Personnaliser et étendre les flux de travail de demande de tirage avec l’état des demandes de tirage.
Conditions préalables
| Catégorie | Spécifications |
|---|---|
| Organisation | Une organisation dans Azure DevOps avec un dépôt Git. |
| Fonction Azure | Une Azure Function, qui met en œuvre une solution sans serveur, axée sur les événements, qui s’intègre à Azure DevOps pour créer des stratégies de branche personnalisées et automatiser la validation des PR. |
| Crochets de service | Configurez des crochets de service pour les événements PR afin de notifier votre fonction Azure lorsqu’une demande de tirage change |
| Authentification | Jeton Microsoft Entra ID avec l’étendue Code (status) pour avoir l’autorisation de modifier le statut de la demande de tirage. Pour plus d’informations, consultez Authentification Microsoft Entra. |
Créer une fonction Azure de base pour écouter les événements Azure Repos
Créez votre première fonction Azure. Ensuite, modifiez le code dans l’exemple pour ressembler au code suivant :
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);
}
}
Configurer un crochet de service pour les événements de demande de tirage
Les hooks de service sont une fonctionnalité Azure DevOps qui peut alerter les services externes lorsque certains événements se produisent. Pour cet exemple, configurez un service hook pour les événements PR, votre fonction Azure est notifiée lorsqu’une demande de tirage change. Pour recevoir des requêtes POST lorsque les demandes de tirage changent, fournissez le crochet de service avec l’URL de la fonction Azure.
Pour cet exemple, configurez deux hooks de service. Le premier concerne l’événement Requête pull créée et le second l’événement Requête pull mise à jour.
Obtenez l’URL de la fonction à partir du portail Azure en cliquant sur l’URL de la fonction Get dans la vue de votre fonction Azure et copiez l’URL.
Accédez à votre projet dans Azure DevOps, par exemple,
https://dev.azure.com/<your organization>/<your project name>Dans le menu de navigation, pointez sur l’engrenage et sélectionnez Crochets de service.
S’il s’agit de votre premier hook de service, sélectionnez + Créer un abonnement.
Si vous avez déjà configuré d’autres connecteurs de service, sélectionnez le plus
(+)vert pour créer un nouvel abonnement à un connecteur de service.
Dans la boîte de dialogue Nouvel abonnement de crochets de service, sélectionnez Webhooks dans la liste des services, puis sélectionnez Suivant.
Sélectionnez Demande de tirage créée dans la liste des déclencheurs d’événements, puis sélectionnez Suivant.
Dans la page Action, entrez l’URL que vous avez copiée à l’étape 1 dans la zone URL . Sélectionnez Test pour envoyer un événement de test à votre serveur.
Dans la fenêtre du journal de la fonction Azure, vous voyez un
POSTentrant qui a renvoyé un200 OK, indiquant que votre fonction a reçu l’événement de crochet de service.HTTP Requests ------------- POST / 200 OKDans la fenêtre Notification de test, sélectionnez l’onglet Réponse pour afficher les détails de la réponse à partir de votre serveur. Vous devez voir la réponse de votre serveur.
Fermez la fenêtre Notification de test, puis sélectionnez Terminer pour créer le crochet de service.
Passez à nouveau les étapes 2 à 8, mais cette fois configurez l’événement Demande de tirage mise à jour.
Important
Veillez à parcourir les étapes précédentes à deux reprises et à créer des crochets de service pour les événements Demande de tirage créée et Demande de tirage mise à jour.
Créez une pull request pour vérifier que votre fonction Azure reçoit des notifications.
Publier l’état sur les demandes de tirage
Maintenant que votre serveur peut recevoir des événements de crochet de service lorsque de nouvelles demandes de tirage sont créées, mettez-le à jour pour publier l’état de retour à la demande de tirage. Vous pouvez utiliser la charge utile JSON publiée par le crochet de service pour déterminer l’état à définir sur votre demande de tirage.
Mettez à jour le code de votre fonction Azure, comme dans l’exemple suivant.
Veillez à mettre à jour le code avec le nom de votre organisation, le nom du projet, le nom du dépôt et le jeton d’ID Microsoft Entra. Pour obtenir l’autorisation de modifier le statut de la demande de tirage, le jeton doit inclure l’étendue vso.code_status, que vous pouvez obtenir via l’authentification Microsoft Entra.
Important
Cet exemple de code stocke le jeton dans le code, ce qui simplifie l’exemple. Il est recommandé de stocker des secrets dans Azure Key Vault et de les récupérer à partir de là à l’aide de l’identité managée pour renforcer la sécurité.
Cet exemple inspecte le titre de la demande de tirage (PR) pour voir si l’utilisateur a indiqué si la demande de tirage (PR) est en cours de traitement en ajoutant WIP au titre. Si c’est le cas, l’exemple de code modifie l’état de retour publié sur la demande de tirage. Remplacez le code de votre fonction Azure par le code suivant, qui met à jour le statut renvoyé à la demande de tirage.
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"
}
});
}
Créez un nouveau PR et testez le serveur de statut
Maintenant que votre serveur est en cours d’exécution et écoute des notifications de crochet de service, créez une demande de tirage pour la tester.
Démarrez dans la vue fichiers. Modifiez le fichier readme.md dans votre dépôt (ou tout autre fichier si vous n’avez pas de readme.md).
Apportez une modification et validez les modifications apportées au dépôt.
Veillez à valider les modifications apportées à une nouvelle branche afin de pouvoir créer une demande de tirage à l’étape suivante.
Sélectionnez le lien Créer une demande de tirage.
Ajoutez WIP dans le titre pour tester les fonctionnalités de l’application. Sélectionnez Créer pour créer la demande de tirage.
Une fois le PR créé, la section de statut s’affiche, avec l’entrée Work in progress qui renvoie à l’URL spécifiée dans le payload.
Mettez à jour le titre de la demande de tirage et supprimez le texte WIP et notez que l’état passe de Travail en cours à Prêt pour la révision.