Powershell Toolmaking Thumbnail

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

Publié le novembre 7, 2018 par Patrick.lavallee Blogue Patrick Lavallée

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.

Utility Scripts

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.

Builds Pipelines

Pipeline d’intégration

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

Repository selection

Sélection du dépot de code

Nous partirons d’un patron vide.

Using An Empty Template

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.

Targeted Pipeline Definition

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
Install Required PS Modules

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

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.
Publish Test Results

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.
Publish Code Coverage

Publication de la couverture de code

Publish to PowerShell Gallery

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.
Publish To Powershell Gallery

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.

Api Keys

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!

Pipeline Variable

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.

Ci Pipeline Summary

Sommaire du pipeline d’intégration

Ci Pipeline Tests

Tests du pipeline d’intégration

And on PowerShell Gallery:

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

Vous avez un concept innovateur...

Laissez-nous vous proposer les meilleurs technologies