Vous avez donc appris à automatiser des tâches avec un script PowerShell. C’est génial ! Mais maintenant, vous vous retrouvez avec un désordre de scripts et de modules, avec un mélange d’exécutions de scripts manuelles, de tâches planifiées, et bien plus encore. Il est temps de mettre de l’ordre dans ce chaos et de mettre en place le moteur d’orchestration d’automatisation connu sous le nom de PowerShell PSake.
PSake est un moteur d’orchestration écrit en tant que module PowerShell qui apporte de l’ordre à vos scripts et vous donne un contrôle total sur ce qui s’exécute quand et dans quelles conditions. Bien que PSake soit un outil d’automatisation de build et qu’il soit principalement utilisé dans des scripts de build (généralement exécutés par un serveur de build dans des scénarios d’automatisation de mise en production), il est généralement négligé dans les scénarios de scripting quotidiens. Changeons cela.
Dans ce tutoriel, vous allez apprendre comment PSake fonctionne, avec de bons exemples à mettre en pratique dès aujourd’hui !
Prérequis
Cet article sera un tutoriel, nous supposons que vous allez suivre étape par étape. Si vous souhaitez suivre exactement les instructions, assurez-vous de disposer de :
- Windows PowerShell 3+. Le tutoriel utilise Windows PowerShell v5.1
- Le fichier zip PSake de Github. Ce tutoriel utilise la version 4.9.0.
Configuration du module PSake
En supposant que vous avez le projet PSake de GitHub sur votre machine locale, vous devrez d’abord suivre quelques étapes pour le configurer.
- Extrayez le fichier zip PSake téléchargé depuis GitHub.
- Déplacez le dossier src à l’intérieur du contenu du fichier ZIP extrait vers un chemin sous
$env:PSModulePath
pour vous assurer que PowerShell connaît le nouveau module. - Renommez le dossier src en PSake.
- Exécutez maintenant
Get-Module PSake -ListAvailable
pour confirmer qu’il apparaît. Si vous ne recevez pas d’erreur, vous êtes prêt à continuer.
Lié : Comprendre et construire des modules PowerShell
Création d’un script de base PowerShell PSake
Pour comprendre PSake, vous devez construire quelque chose. Construisons un script PSake simple pour voir ce qu’il peut faire.
- Créez un script nommé psakefile.ps1 avec une seule tâche. Au minimum, une tâche doit avoir un nom et un bloc d’action. Le nom psakefile.ps1 n’est pas obligatoire, mais c’est le nom par défaut attendu par le moteur.
A PSake task in its basic form is very similar to a PowerShell function:
a container for one or more commands that, when performed together, achieve a certain goal. These commands go into a script block that is passed to theAction
parameter. A task has many advantages over a function. You will learn about these advantages as you read along.
Voici un exemple d’un psakefile.ps1 avec une tâche assez simple:
2. Maintenant que vous avez construit le fichier PSake, vous pouvez l’appeler à partir d’une console PowerShell avec la commande Invoke-PSake
et transmettre le nom de la tâche en tant que valeur au paramètre TaskList
.
Invoke-PSake
est le moteur d’exécution de PSake. Cette commande déclenche les tâches définies dans psakefile.ps1. Vous pouvez passer un nom de tâche ou une liste de tâches séparées par des virgules au paramètreTaskList
. Si vous exécutez plusieurs tâches, chaque tâche s’exécutera dans l’ordre dans lequel vous les avez passées àTaskList
, indépendamment de leur emplacement dans psakefile.ps1.
Voici comment vous pouvez déclencher la tâche HelloWorld:
Tant que vous conservez le nom psakefile.ps1 et que vous définissez la console sur le dossier où il se trouve, vous pouvez omettre le paramètre
BuildFile
et sa valeur.
- En exécutant
Invoke-PSake
, vous verrez la sortie de PSake dans la console. Lorsque vous exécutez les tâches dans psakefile.ps1, vous verrez une sortie similaire à celle ci-dessous.

La sortie se compose des éléments suivants:
- Les détails sur la version de PSake.
- Le nom de chaque tâche de construction juste avant son exécution (PSake considère chaque tâche comme une tâche de construction). Dans l’exemple : Exécution de HelloWorld en cyan.
- Toute sortie générée par la tâche. Dans l’exemple : Hello World en jaune.
- Message de succès/échec. Dans l’exemple : psake a réussi… en vert.
- Résumé du temps (appelé Rapport de temps de construction) avec la durée de chaque tâche, ainsi que la durée totale du script.
Installation de SQL avec PSake
Dans la section précédente, vous n’avez pas fait grand-chose, mais vous avez invoqué un script PSake factice. Maintenant, construisez là-dessus et créez un script PSake qui installe SQL !
Dans cet exemple, vous allez créer un script PSake qui :
- Vérifie l’espace disque libre sur une machine.
- Télécharge un fichier ZIP SQL à partir d’un référentiel local.
- Extrait le fichier ZIP.
- Exécute l’installation sur le lecteur C ou D (celui des deux qui existe).
Voyons maintenant comment nous pouvons utiliser PSake pour accomplir cette tâche.
Conception des blocs de construction
PSake consiste à orchestrer des tâches. Chaque tâche doit avoir un nom unique et idéalement effectuer une opération atomique unique, comme une fonction PowerShell. En utilisant ce concept, vous pouvez décrire les étapes ci-dessous pour créer une tâche pour chacune.
- ValidateDiskSpace
- DownloadSql
- ExtractSql
- InstallSqlDriveC
- InstallSqlDriveD
À ce stade, vous ne construisez pas réellement le code pour accomplir quoi que ce soit ; vous créez simplement l’infrastructure des tâches et créez le fichier PSake. Vous remarquerez les références Write-Host
dans les tâches ci-dessous ; vous ajouterez du code aux tâches plus tard.
Vous devriez toujours utiliser le paramètre
Description
pour chaque tâche. Le paramètreDescription
fournit plus d’informations sur chaque tâche lors de l’exécution des tâches et lors de l’examen du code.
Définition de l’ordre d’exécution des tâches
Vous disposez maintenant d’un fichier PSake qui contient un ensemble de tâches. À ce stade, vous pouvez exécuter toutes les tâches à la fois ou choisir d’en exécuter uniquement certaines avec la commande Invoke-PSake
.
Vous pouvez appeler certaines (ou toutes les tâches) en utilisant Invoke-PSake
et le paramètre TaskList
comme vous l’avez fait précédemment dans l’exemple simple. Si vous avez plus d’une tâche à appeler, créez un tableau et définissez le nom de chaque tâche comme un élément, comme indiqué ci-dessous.
Invoke-PSake
exécutera chaque tâche dans l’ordre défini dans le tableau.
Lorsque vous exécutez le code ci-dessus, vous devriez obtenir un résultat comme celui-ci :

Ajout d’une condition préalable
Il se peut que vous ayez besoin d’effectuer une action seulement si une certaine condition est remplie. Dans l’exemple de script d’installation de SQL de ce tutoriel, par exemple, vous devez peut-être tester si le volume où vous stockez l’installateur est disponible avant d’exécuter la tâche pour invoquer ledit installateur.
Vous pouvez utiliser le paramètre PreCondition
pour exécuter un morceau de code qui renvoie soit un True ou un False booléen qui dicte si cette tâche s’exécute ou non.
Remarquez dans l’exemple ci-dessous les variables $installSqlOn_C_Drive
et $installSqlOn_D_Drive
. Lorsque Invoke-PSake
invoque ce script, ces variables contiendront une valeur True ou False en fonction de l’existence d’un volume C ou D.
Sur chaque ligne de task
, vous pouvez voir que chaque tâche a un paramètre de scriptblock PreCondition
qui contient la valeur de ces variables. Au moment de l’exécution, soit la tâche InstallSqlDriveC
soit la tâche InstallSqlDriveD
s’exécutera, en fonction de ces variables.
Paramètres de tâche
En plus des Action
et Description
, une tâche prend également en charge ces paramètres :
PreCondition
– Bloc de script renvoyant une valeur booléenne. Si False, la tâche spécifique est ignorée. (Un exemple d’utilisation est montré ci-dessus).PostCondition
– Étape de validation. Un bloc de script renvoyant une valeur booléenne. False signifie que la validation a échoué et entraîne l’arrêt complet du script.PreAction
– Un bloc de script à exécuter avant la tâche.PostAction
– Un bloc de script à exécuter immédiatement après la fin réussie de la tâche.ContinueOnError
– Paramètre de commutation. S’il est utilisé, toutes les erreurs pouvant survenir pendant l’exécution de la tâche ne provoqueront pas l’arrêt complet du script.Depends
– Nom d’une tâche (ou une liste de noms de tâches) qui doit être exécutée avant l’exécution de la tâche actuelle. PSake utilisera cette information pour exécuter les dépendances de tâches dans le bon ordre. Par exemple, si la tâche A dépend de la tâche B, le moteur PSake exécutera B avant A.
Dans un premier temps, le mécanisme de dépendance semble être une bonne idée. Il permet de définir les tâches dans un ordre logique. Cependant, l’utilisation du paramètre
Depends
lie différentes tâches ensemble, ce qui rend ensuite difficile leur test indépendant. Mais, puisque l’utilisateur peut définir explicitement l’ordre d’exécution des tâches et passer cet ordre lors de l’appel du fichier PSake, l’utilisation du paramètreDepends
peut être évitée complètement.
Voyons maintenant un exemple d’utilisation de certains de ces paramètres de tâche :
Ajout de PreAction et PostCondition
En utilisant la tâche InstallSqlDriveD de l’exemple ci-dessus comme point de départ, peut-être avez-vous une demande supplémentaire pour l’installation.
Peut-être avez-vous besoin d’enregistrer les heures de début et de fin de l’installation. Vous devez enregistrer ces heures dans deux variables d’environnement nommées SqlSetupStartDate et SqlSetupEndDate. Deuxièmement, après la fin de l’installation, vous devez vérifier que le dossier D:\TempSqlFiles n’existe pas.
Heureusement, les paramètres de tâche PSake PreAction
, PostAction
et PostCondition
(respectivement) répondent exactement à ces nouvelles exigences. Voici un exemple de comment cela peut être fait :
Exécution de scripts PSake dans des tests Pester
Où vous pouvez invoquer un script PowerShell, vous pouvez invoquer un fichier PSake. Si vous construisez des tests d’infrastructure avec Pester, vous pouvez invoquer PSake dans les tests.
Relatif : Écriture de tests Pester pour PowerShell
Par exemple, vous avez peut-être un test Pester pour confirmer que le fichier ZIP de configuration de SQL existe dans un dossier après avoir exécuté la tâche DownloadSql
. Dans ce cas, vous créez un test Pester simple et invoquez la tâche DownloadSql
dans le test et vérifiez la présence du fichier ZIP juste après son exécution.
Passage des paramètres aux tâches
Une fois que vous commencez à utiliser PSake, vous voudrez peut-être paramétrer certaines des tâches. Généralement, avec les fonctions et scripts PowerShell, vous passerez différents paramètres nommés à la fonction/script; PSake est différent.
Pour passer des paramètres aux fichiers PSake, vous pouvez utiliser un bloc Properties
qui définit des paires clé/valeur que PSake rend ensuite disponibles à l’intérieur de chaque tâche du fichier.
Assurez-vous de définir le bloc
Properties
en haut du fichier PSake. Toutes les opérations PSake sont lues de haut en bas.
Par exemple, pour passer les variables dynamiques SqlYear
et SqlVersion
à chaque tâche dans le fichier PSake, vous pouvez les définir comme indiqué ci-dessous.
Lorsque vous invoquez ensuite le fichier PSake avec Invoke-PSake
, vous verrez alors la sortie suivante. Remarquez que les variables $SqlYear
et $SqlVersion
ont été étendues avec les valeurs définies dans le bloc Properties
.
Utilisation du paramètre Properties
Si vous préférez passer des paramètres à une tâche via un paramètre traditionnel, PSake peut vous aider. Vous devez toujours garder le bloc Properties en haut du psakefile.ps1, comme dans l’exemple ci-dessus, mais PSake vous permet de remplacer les valeurs.
Pour ce faire, définissez une table de hachage avec chacune des paires clé/valeur que vous souhaitez remplacer. Ensuite, passez la table de hachage en tant que paramètre Properties
. Le moteur PSake utilisera les valeurs de la table de hachage passée en paramètre plutôt que celles spécifiées dans le bloc Properties
du script psakefile.ps1.
Notez les différences de syntaxe entre le bloc
Properties
et le paramètreProperties
. Dans le blocProperties
, chaque ligne est une variable et est donc précédée d’un signe dollar, tandis que le paramètreProperties
est une table de hachage, donc chaque élément est une clé et est écrit sans le signe $. Une autre différence est que la table de hachage est précédée du caractère @.
Voici un exemple d’utilisation du paramètre Properties
.
Modularisation des tâches PSake : Les tâches en tant que fichiers
À un moment donné, votre fichier PSake va probablement croître de manière exponentielle, surtout si vous devez orchestrer de grandes tâches d’automatisation. Pour vous assurer de pouvoir gérer toutes ces tâches, vous devriez vous concentrer sur la modularisation ou la division des tâches pour faciliter la gestion.
Lié : Comment survivre à la refonte d’un script PowerShell de l’enfer
Dans l’exemple de ce tutoriel, vous avez travaillé avec cinq tâches :
- ValidateDiskSpace
- DownloadSql
- ExtractSql
- InstallSqlDriveC
- InstallSqlDriveD
Chacune de ces tâches est définie à l’intérieur d’un seul script pssakefile.ps1. Si vous prévoyez d’ajouter de nombreuses tâches au fil du temps, vous devriez diviser ces tâches en fichiers séparés, chaque tâche étant incluse dans un fichier différent, par exemple ValidateDiskSpace.ps1, DownloadSql.ps1, InstallSqlDriveD.ps1, InstallSqlDriveD.ps1, etc.
Par exemple, le fichier InstallSqlDriveD.ps1 contiendra uniquement ce code:
Une fois les tâches déplacées, importez les fichiers dans psakefile.ps1 en utilisant la fonction Include
. Une fois cela fait, le contenu du fichier psakefile.ps1 est réduit à ce code:
Lorsque
Invoke-PSake
déclenche le script psakefile.ps1,Invoke-PSake
ne sait pas et ne se soucie pas si les tâches se trouvent dans le fichier psake ou ont été importées par la méthodeInclude
.
Étapes suivantes
PSake est un puissant orchestrateur de scripts qui peut être utilisé à de nombreuses fins : construction de logiciels, CI/CD, déploiement de packages, création d’installateurs, etc. La seule limite est votre imagination. S’habituer à construire de grands scripts avec PSake vous oblige à penser en termes de tâches (blocs de code). Le concept de tâches exploite la syntaxe PowerShell, et en utilisant des tâches, vous enrichissez vos connaissances existantes en ligne de commande.
Le code que vous produisez avec PSake devient plus lisible, plus facile à maintenir et plus facile à tester. Après un peu de pratique, vous constaterez que diviser vos étapes en différentes tâches les rend plus faciles à scripter. Le léger effort supplémentaire nécessaire porte ses fruits à moyen et long terme.
Où voyez-vous la place de PSake dans vos projets professionnels ?