Retour aux articles de blogue

Ce que j’ai appris à me construire des outils PowerShell partie 2: Automatisation de métriques avec AzureDevOps

8 minutes de lecture - Technologie
Partager :

Pour ceux et celles qui l’auraient manqué, voici le premier article de la série

Ce que j’ai appris à me construire des outils PowerShell partie1 : La cueillette de métriques

Parlons d’automatisation

Nous nous sommes laissés avec une panoplie de métriques qui pouvaient être mises à bon escient pour aider votre organisation à bâtir des tableaux de bords utiles. (Je les adore toujours!)

Dans cet article l’emphase sera mise sur la démonstration que de bonnes pratiques de génie logiciel peuvent s’appliquer à PowerShell via des mécanismes d’intégration continue (CI) et de déploiement continu (CD) en utilisant Azure DevOps (anciennement VSTS).

Le module PowerShell faisant l’objet de la démonstration vise à automatiser des tâches de DevOps pour le produit Valo : Tombez en amour avec votre intranet.

Les étapes à accomplir sont les suivantes :

  1. Obtenir les fichiers sources du projet
  2. Exécuter les outils de qualité
  3. Produire de merveilleux tableaux de bord
  4. Publier/déployer le module

En rappel, voici l’architecture du module. Cette fois-ci cependant nous allons porter notre attention sur les scripts utilitaires pour accomplir respectivement les étapes 2 et 4.

Scripts Utilitaires

Hypothèses du flot de travail

Avant de continuer, posons quelques hypothèses :

  • Du nouveau code livré par un programmeur proviendra d’une Feature branch isolée
  • Une demande de revue de code (pull request) sera faite sur la branche visée (dans notre cas il s’agira de la branche « develop »)
  • Le code est intégré dans la branche visée seulement après avoir subi une révision par les pairs

Mettre en place un pipeline d’intégration

Premièrement, nous allons créer une définition vide en utilisant la nouvelle interface utilisateur d’Azure DevOps.

Pipeline d’intégration

Ensuite, sélectionner le type d’entrepôt (repository) et la branche visée.

Sélection du dépot de code

Nous partirons d’un patron vide.

Utilisation d’un patron vide

Ajout de tâche au patron vide

Voici donc la définition du pipeline que nous visons. À remarquer que les scripts utilitaires seront utilisés au tout début et à la fin du processus d’intégration. La tâche Pester s’obtient du Visual Studio Marketplace et les tâches de publication sont fournies par la plateforme. Avant de continuer, garder en tête qu’il s’agit toujours d’une pratique sécuritaire de sauvegarder (sans nécessairement mettre en queue) le pipeline d’intégration entre chaque étape.

Par mesure de clarté, les sections subséquentes feront référence directement au nom des tâches dans la capture d’écran ci-dessous et n’ont pas fait l’objet de traduction.

Définition de pipeline visée

Installing Required PS Modules

Ajouter une tâche PowerShell

  1. Donner un nom significatif à celle-ci (optionnel)
  2. Taper le File Path afin d’indiquer quel script sera exécuté
  3. Pour Script Path, choisir le script indiqué ci-dessous
Installation des modules PS requis

Le script exécuté est tout simple. Il installe le NuGet Package Provider sur l’agent en cours d’exécution afin d’assurer l’accès aux modules requis.

Dans le cas de mon module, j’ai besoin de PSScriptAnalyzer comme analyseur de code et AzureRm.

# This script installs dependencies required by the Toolkit. 
# It is intended to be used by the Azure DevOps Agent and 
# is the reason why Module installations are scoped to current User.
Install-PackageProvider -Name NuGet -Force -Scope CurrentUser
Install-Module -Name PSScriptAnalyzer -Force -Scope CurrentUser
Install-Module -Name AzureRm -Force -Scope CurrentUser -AllowClobber

Pester Test Runner

La tâche Pester Test Runner, développée par Black Marble, s’obtient gratuitement à partir du Visual Studio Marketplace.

  1. Donner un nom significatif à la tâche (optionnel)
  2. Spécifier le dossier contenant les tests. Dans mon cas, je suis paresseux et lui indique simplement la racine du projet.
  3. Spécifier le fichier qui contiendra le résultat des tests
  4. Spécifier le fichier qui contiendra le résultat de couverture de code

Dans la section Advanced, forcer la version 4.0.8 et ne pas oublier de cocher la Force the use of a Pester Module shipped within this task sinon la version ne sera pas vraiment forcée… Plusieurs précieuses minutes d’intégration se sont perdues pour découvrir cette configuration .

Pester Test Runner

Publish Tests Results

Cette tâche est déjà préconfigurée pour la plupart des cas d’utilisation et servira à la production du tableau de bord contenant les résultats des tests : notre première métrique.

  1. Donner un nom significatif à la tâche (optionnel)
  2. Le format des résultats de test est NUnit
  3. La valeur par défaut peut être laissée telle quelle si vous avez suivi cet article jusqu’à maintenant. Référez-vous à votre configuration dans la tâche Pester.
Publication des résultats de test

Publish Code Results

Cette tâche est aussi préconfigurée pour la plupart des cas d’utilisation et servira à la création de notre deuxième tableau de bord, joie!

  1. Donner un nom significatif à la tâche (optionnel)
  2. Choisir JaCoCo comme outil de couverture de code
  3. Utiliser la configuration de la tâche Pester pour le nom de fichier adéquat. Je recommande l’utilisation des variables d’Azure DevOps pour référencer le fichier en question.
Publication de la couverture de code

Finalement, la dernière étape de notre pipeline d’intégration est de déployer le module sois sur un environnement privé qui peux être utilisé à l’interne par votre organisation ou comme dans le cas présent, être déployé publiquement afin de partager ces fonctionnalités avec la communauté.

  1. Donner un nom significatif à votre tâche (La répétition est la clé ici)
  2. Pour Script Path, choisir le script indiqué ci-dessous
  3. Le script utilise un argument qui sera défini comme une variable privée du pipeline d’intégration. Ne vous inquiétez pas, je vais couvrir cette partie aussi.
Publication vers PowerShell Gallery

Voici le contenu du script qui sera utilisé pour la publication vers PowerShell Gallery.

[CmdletBinding()]
Param (
    [ValidateScript({-not([string]::IsNullOrEmpty($_))})]
    [Parameter(Mandatory=$true)]
    [string]$NuGetApiKey
)

$moduleName = "Nexus.Valo.Modern"
Push-Location $PSScriptRoot

try {
    Write-Output "Creating module staging folder"
    $module = New-Item -Name $moduleName -Type Directory

    Write-Verbose "Copying module scripts to staging folder"
    Get-ChildItem -Recurse -Path ".Sources" | ForEach-Object {
        Write-Verbose "Copying $($_.FullName) to $($module.FullName)"
        Copy-Item $_.FullName -Destination $module.FullName -Force
    }

    Write-Output "Publishing module to PowerShell Gallery"
    Publish-Module -Path $module.FullName -NuGetApiKey $NuGetApiKey

} finally {
    if(Test-Path $moduleName) {
        Write-Warning "Removing module staging folder"
        Remove-Item $moduleName -Force -Recurse
    }

    Pop-Location
}

Et maintenant, la pièce manquante est celle de définir une variable privée qui contiendra la clé d’API NuGet qui s’obtient de PowerShell Gallery directement sous votre profil.

Clés d’API

À partir du menu du pipeline, appuyer sur Variables. Assurez-vous d’avoir sélectionné Pipeline variables. Appuyez ensuite sur Add. Attribuez-lui le même nom que l’argument de script Publish-NexusValo.ps1 et n’oubliez pas d’activer le petit cadenas au bout de la ligne afin de vous assurer que votre clé d’API reste secrète!

Variable de pipeline

Nous avons officiellement terminé avec la plomberie, ceux encore parmi nous sont officiellement des guerriers DevOps!

Et maintenant… des tableaux de bord!

Il est maintenant temps de voir ces métriques présentées de manière conviviale permettant d’avoir un visuel clair sur le code.

Maintenant, appuyez sur le bouton Queue, attendez qu’un agent soit disponible et sur l’exécution du pipeline d’intégration.

Une fois l’intégration complétée, nous pouvons basculer entre les tests et la couverture de code, télécharger l’artéfact produit et même avoir un aperçu de la journalisation de l’agent. Azure DevOps est vraiment un bel outil permettant de monitorer de près l’évolution de votre logiciel.

Sommaire du pipeline d’intégration
Tests du pipeline d’intégration

And on PowerShell Gallery:

Module publié sur PowerShell Gallery

Conclusion

Voici donc le tour de roue complet. Dans un monde où la complexité ne cesse d’augmenter, avoir en place des bonnes pratiques de génie logiciel telles que l’écriture systématique de tests, de l’analyse de code, de l’intégration et du déploiement continu, est un incontournable. Ceux-ci permettront à votre organisation de sauver temps et argent mais aussi de nombreuses migraines à votre équipe de développement.

Restez à l’affut pour la prochaine série d’articles qui démontreront comment nous, chez Nexus, assurons un processus de génie logiciel visant à standardiser, automatiser et accélérer des déploiements d’intranets Valo Moderne en utilisant notamment PowerShell et les générateurs Yeoman.

Laissez-nous participer à votre transformation.

Contactez-nous
This site is registered on wpml.org as a development site. Switch to a production site key to remove this banner.