Créer un serveur d’état de demande de tirage avec Node.js

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019

Le workflow de demande de tirage permet aux développeurs d’obtenir des commentaires sur leur code des pairs ainsi que des outils automatisés. Les outils et services tiers peuvent participer au flux de travail de demande de tirage à l’aide de l’API d’état de la demande de tirage. Cet article vous guide tout au long du processus de création d’un serveur d’état pour valider les demandes de tirage dans un référentiel Git Azure DevOps Services. Pour plus d’informations 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.

Prérequis

  • Une organisation dans Azure DevOps avec un référentiel Git. Si vous n’avez pas d’organisation, inscrivez-vous pour charger et partager du code dans des référentiels Git privés gratuits illimités.
  • Installez VS Code ou un autre éditeur de code de votre choix. Les instructions de ce guide utilisent VS Code, mais les étapes d’autres éditeurs de code sont similaires.

Installer Node.js

Pour installer Node.js, téléchargez la version LTS appropriée pour votre plateforme. Le téléchargement contient un programme d’installation, que vous pouvez exécuter pour installer le runtime Node.js sur votre ordinateur local. Lors de l’installation de Node.js, veillez à conserver la partie gestionnaire de package npm de l’installation, qui est sélectionnée par défaut.

Créer un serveur web de base à l’aide d’Express

Les étapes décrites dans cette section utilisent Express, qui est une infrastructure web légère pour Node.js qui fournit un certain nombre de méthodes d’utilitaire HTTP qui simplifient la création d’un serveur web. Cette infrastructure vous fournit les fonctions de base nécessaires pour écouter les événements de demande de tirage.

  1. À partir de la ligne de commande, créez un dossier de projet pour votre serveur web.

    mkdir pr-server
    cd pr-server
    
  2. Utilisez la commande npm init pour créer un nouveau fichier package.json pour le projet.

    npm init
    

    Appuyez sur Entrée pour accepter les valeurs par défaut pour toutes les options, à l’exception du point d’entrée. Remplacez la valeur par app.js.

    entry point: (index.js) app.js
    
  3. Installez Express dans le répertoire pr-server à l’aide de la commande suivante. Cela installe Express et l’enregistre dans la liste des dépendances.

    npm install express
    
  4. Créez une application Express simple à générer pour le serveur d’état de demande de tirage. Les étapes suivantes sont basées sur l’exemple Hello World d’Express. Ouvrez le dossier du projet dans VS Code en exécutant la commande suivante à partir du dossier pr-server.

    code .
    
  5. Créez un fichier (Ctrl + N) et collez-le dans l’exemple de code suivant.

    const express = require('express')
    const app = express()
    
    app.get('/', function (req, res) {
    res.send('Hello World!')
    })
    
    app.listen(3000, function () {
    console.log('Example app listening on port 3000!')
    })
    
  6. Enregistrez le fichier sous le nom app.js.

  7. Exécutez le serveur web de base à l’aide de la commande suivante :

    node app.js
    

    Vérifiez que le serveur est en cours d’exécution en accédant à http://localhost:3000/.

Écouter les requêtes HTTP POST

Le serveur web va recevoir POST demandes d’Azure DevOps Services. Vous devez donc gérer ces demandes dans votre serveur.

  1. À la fin du fichier app.js, ajoutez le code suivant et enregistrez le fichier.

    app.post('/', function (req, res) {
        res.send('Received the POST')
    })
    
  2. Réexécutez votre serveur web à l’aide de la commande suivante :

    node app.js
    

Configurer un crochet de service pour les événements de demande de tirage

Les crochets de service sont une fonctionnalité Azure DevOps Services qui peut alerter les services externes lorsque certains événements se produisent. Pour cet exemple, vous souhaiterez configurer deux crochets de service pour les événements de demande de tirage, afin que le serveur d’état puisse être averti. Le premier est destiné à l’événement Demande de tirage créée et le second est destiné à l’événement Demande de tirage mise à jour.

Pour recevoir les notifications de crochet de service, vous devez exposer un port à l’Internet public. L’utilitaire ngrok est très utile pour ce faire dans un environnement de développement.

  1. Téléchargez et décompressez la version ngrok appropriée pour votre plateforme.

  2. Utilisez ngrok pour commencer à écouter sur le même port que votre exemple de serveur - port 3000. Exécutez la commande suivante dans une nouvelle fenêtre de commande.

    ngrok http 3000
    

    Ngrok crée une URL publique qui est transférée vers localhost:3000. Notez que l’URL comme vous en aurez besoin à l’étape suivante. Elle doit ressembler à ceci :

    http://c3c1bffa.ngrok.io
    
  3. Accédez à votre projet dans Azure DevOps, par exemple https://dev.azure.com/<your account>/<your project name>

  4. Dans le menu de navigation, pointez sur l’engrenage et sélectionnez Crochets de service.

    Choisir des crochets de service dans le menu d’administrateur

  5. S’il s’agit de votre premier crochet de service, sélectionnez + Créer un abonnement.

    Sélectionnez Créer un nouvel abonnement dans la barre d’outils

    Si vous avez déjà configuré d’autres crochets de service, sélectionnez le (+) vert plus pour créer un abonnement de crochet de service.

    Sélectionnez le plus vert pour créer un nouvel abonnement de crochet de service.

  6. 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électionner des webhooks dans la liste des services

  7. Sélectionnez Demande de tirage créée dans la liste des déclencheurs d’événements, puis sélectionnez Suivant.

    Sélectionner la demande de tirage créée dans la liste des déclencheurs d’événements

  8. Dans la page Action, entrez l’URL de ngrok dans la zone URL. Sélectionnez Test pour envoyer un événement de test à votre serveur.

    Entrez l’URL et sélectionnez Test pour tester le crochet de service

    Dans la fenêtre de console ngrok, vous verrez un POST entrant qui a retourné un 200 OK indiquant que votre serveur a reçu l’événement de crochet de service.

    HTTP Requests
    -------------
    
    POST /                         200 OK
    

    Dans 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 une longueur de contenu de 17 qui correspond à la longueur de la chaîne de votre gestionnaire POST (par exemple, « Reçu le POST »).

    Sélectionnez l’onglet réponse pour afficher les résultats du test

  9. Fermez la fenêtre Notification de test, puis sélectionnez Terminer pour créer le crochet de service.

Passez à nouveau les étapes 3 à 9, 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.

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.

  1. Les demandes de crochet de service incluent une charge utile JSON décrivant l’événement. Pour aider à analyser le JSON retourné par le crochet de service, installez le package d’analyseur de corps.

    npm install body-parser
    
  2. Mettez à jour app.js pour utiliser l’analyseur de corps pour l’analyse application/json.

    var bodyParser = require('body-parser')
    
    app.use(bodyParser.json())
    
  3. Pour simplifier l’exécution d’appels d’API REST à Azure Repos, installez le package azure-devops-node-api.

    npm install azure-devops-node-api 
    
  4. Mettez à jour app.js pour utiliser le package azure-devops-node-api, configurez les détails d’une connexion à votre compte et obtenez une instance de l’API Git.

    const vsts = require("azure-devops-node-api")
    
    const collectionURL = process.env.COLLECTIONURL    
    const token = process.env.TOKEN
    
    var authHandler = vsts.getPersonalAccessTokenHandler(token)
    var connection = new vsts.WebApi(collectionURL, authHandler)
    
    var vstsGit = connection.getGitApi().then( 
        vstsGit => {                                    
            vstsGit.createPullRequestStatus(prStatus, repoId, pullRequestId).then( result => {
                console.log(result);
            },
            error => {
                console.log(error);
            })
        }, 
        error => { 
            console.log(error);
        } 
    );
    
  5. Créez une variable d’environnement pour votre URL de collection, en remplaçant <your account> par le nom de votre organisation Azure DevOps.

    setx COLLECTIONURL "https://dev.azure.com/<your account>"
    
  6. Créez un jeton d’authentification personnel (PAT) pour que votre application utilise les instructions suivantes : Authentification avec des jetons d’accès personnels. Vous devez créer un nouveau PAT pour chaque service que vous utilisez pour accéder à votre compte, en le nommant correctement.

  7. Créez une variable d’environnement pour votre PAT.

    setx TOKEN "yourtokengoeshere"
    
  8. Mettez à jour la fonction post() pour lire les détails de la demande de tirage à partir de la charge utile du crochet de service. Vous aurez besoin de ces valeurs pour publier l’état de retour.

    var repoId = req.body.resource.repository.id
    var pullRequestId = req.body.resource.pullRequestId
    var title = req.body.resource.title
    
  9. Générez l’objet d’état à publier sur la demande de tirage.

    State est une énumération de type GitStatusState. Utilisez succeeded pour indiquer que la demande de tirage a passé la vérification de l’état et est prête à être fusionnée.

    Le description est une valeur de chaîne qui sera affichée à l’utilisateur dans la section État et le flux d’activité dans la vue détails de la demande de tirage.

    Le targetUrl est une URL qui sera utilisée pour créer un lien pour le texte de description dans la section État et le flux d’activité. Il s’agit de l’endroit auquel les utilisateurs peuvent accéder pour obtenir plus d’informations sur l’état, par exemple, un rapport de build ou une exécution de test. Si aucune URL n’est spécifiée, la description s’affiche sous forme de texte sans lien.

    Le contexte name et genre sont utilisés pour catégoriser l’état et le distinguer des autres services affichant l’état.

        var prStatus = {
            "state": "succeeded",
            "description": "Ready for review",
            "targetUrl": "https://visualstudio.microsoft.com",
            "context": {
                "name": "wip-checker",
                "genre": "continuous-integration"
            }
        }
    
  10. Au lieu de publier aveuglément l’état succeeded, inspectez le titre de demande de tirage pour voir si l’utilisateur a indiqué si la demande de tirage est un travail en cours en ajoutant WIP au titre. Si tel est le cas, remplacez l’état publié par la demande de tirage.

        if (title.includes("WIP")) {
            prStatus.state = "pending"
            prStatus.description = "Work in progress"
        }
    
  11. Enfin, publiez l’état à l’aide de la méthode createPullRequestStatus(). Il nécessite l’objet d’état, l’ID de référentiel et l’ID de demande de tirage. Affichez la réponse à la console de nœud afin que vous puissiez voir le résultat du billet.

    vstsGit.createPullRequestStatus(prStatus, repoId, pullRequestId).then( result => {
        console.log(result)
    })
    
  12. La méthode résultante doit ressembler à ceci :

    app.post("/", function (req, res) {
    
        // Get the details about the PR from the service hook payload
        var repoId = req.body.resource.repository.id
        var pullRequestId = req.body.resource.pullRequestId
        var title = req.body.resource.title
    
        // Build the status object that we want to post.
        // Assume that the PR is ready for review...
        var prStatus = {
            "state": "succeeded",
            "description": "Ready for review",
            "targetUrl": "https://visualstudio.microsoft.com",
            "context": {
                "name": "wip-checker",
                "genre": "continuous-integration"
            }
        }
    
        // Check the title to see if there is "WIP" in the title.
        if (title.includes("WIP")) {
    
            // If so, change the status to pending and change the description.
            prStatus.state = "pending"
            prStatus.description = "Work in progress"
        }
    
        // Post the status to the PR
        vstsGit.createPullRequestStatus(prStatus, repoId, pullRequestId).then( result => {
            console.log(result)
        })
    
        res.send("Received the POST")
    })
    
  13. Enregistrez app.js et redémarrez votre application de nœud.

    node app.js
    

Créer une nouvelle demande de tirage pour tester le serveur d’état

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.

  1. Démarrez dans la vue fichiers. Modifiez le fichier readme.md dans votre référentiel (ou tout autre fichier si vous n’avez pas de readme.md).

    Sélectionner Modifier dans le menu contextuel

  2. Apportez une modification et validez les modifications apportées au référentiel.

    Modifier le fichier et sélectionner Valider dans la barre d’outils

  3. Veillez à valider les modifications apportées à une nouvelle branche afin de pouvoir créer une demande de tirage à l’étape suivante.

    Entrer un nouveau nom de branche et sélectionner Valider

  4. Sélectionnez le lien Créer une demande de tirage.

    Sélectionnez Créer une demande de tirage à partir de la barre de suggestions

  5. Ajoutez WIP dans le titre pour tester les fonctionnalités de l’application. Sélectionnez Créer pour créer la demande de tirage.

    Ajouter WIP au titre de la demande de tirage par défaut

  6. Une fois la demande de tirage créée, vous verrez la section d’état, avec l’entrée Travail en cours qui lie l’URL spécifiée dans la charge utile.

    Section État avec l’entrée Travail en cours.

  7. 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.

Étapes suivantes