PowerShell pour gérer vos déploiements Octopus

Dans le cadre de la mise en place d’une démarche DevOps, l’automatisation est un élément essentiel. Une des étapes clé à automatiser est le déploiement, notamment pour pouvoir faire du déploiement continu.
Plusieurs outils permettent d’automatiser les déploiements. La fonctionnalité Release Management de VSTS (Visual Studio Team Services) est l’outil de Microsoft dédié aux déploiements. D’autres outils sont également disponibles pour gérer les déploiements, comme Octopus Deploy.
Quelques mots sur Octopus Deploy
Octopus Deploy est un outil d’automatisation de déploiements pour des projets .NET, on y définit des environnements, des projets ou encore les cycles de vie des applications. Un projet Octopus comporte un process de déploiement grâce auquel vous pouvez déployer un ou plusieurs packages. Pour ce projet vous définissez un ensemble de variables, un cycle de vie etc…
Vous pourrez alors vite avoir une quantité assez importante de projets, d’autant plus si vous évoluez dans une architecture microservices. Avec Octopus vous avez la possibilité d’organiser les projets dans des groupes, néanmoins chaque projet se déploie toujours unitairement.

Octopus met à disposition des API et un outil de commande Octo.exe vous permettant de gérer vos projets, vos variables et de lancer des déploiements sans passer par l’interface. Voici quelques exemples d’actions que les API permettent de réaliser :
- Lister les projets dans lesquels on a un lien vers une base de données
- Lister les projets d’un groupe de projets
- Récupérer le numéro de version de la dernière release déployée sur un environnement
- Mettre à jour le snapshot des variables d’une release
Scénario
Dans le cas d’un problème de production ou pour modifier une configuration sur tout un groupe de projets, vous pouvez avoir besoin de redéployer un ensemble de projets de façon simple et rapide. Le déploiement via l’interface reste assez contraignant pour ce type d’action.
Prenons le cas d’une configuration qui doit être modifiée sur tous les projets d’un groupe pour un environnement donné. La valeur à modifier a été configurée dans un « variable set » partagé par plusieurs projets. Il faut ensuite pour chacun des projets :
- Reprendre la dernière release déployée sur l’environnement concerné
- Mettre à jour le snapshot des variables pour cette release
- Redéployer cette release avec les variables à jour
Réaliser ces actions manuellement n’apporte aucune valeur ajoutée, ce sera fastidieux et on risque en plus d’oublier de mettre à jour le snapshot des variables pour un des projets…
Réalisation
On peut créer un outil qui fait appel aux API directement… mais les actions principales sont exécutables à partir de l’outil de commande Octo.exe et un certain nombre d’actions supplémentaires sont exécutables avec PowerShell à l’aide du module Octoposh.
Quelques mots sur Octoposh
Octoposh est donc un module PowerShell qui fournit les cmdlets pour gérer vos instances Octopus Deploy. Ce module fait appel au client .NET Octopus ainsi qu’aux API REST.
Pour plus de détails, je vous invite à consulter le Github https://github.com/Dalmirog/OctoPosh.
Pour notre scénario nous allons utiliser à la fois les cmdlet Octoposh et l’outil Octo.exe pour pouvoir redéployer tout notre environnement.
Le Script PowerShell
Pour exécuter des actions sur votre instance Octopus, vous aurez besoin :
- De l’URL de votre instance Octopus
- Des credentials d’un compte qui ont les droits adaptés sur l’instance
Pour notre scénario, nous aurons besoin en entrée :
- Du nom du groupe de projets que nous souhaitons redéployer
- L’environnement Octopus concerné par ce redéploiement
param( [Parameter(Mandatory=$true)] [System.Management.Automation.PSCredential] $OctopusCred, [Parameter(Mandatory=$true)] [String] $OctopusURL, [Parameter(Mandatory=$true)] [String] $OctopusProjectGroup, [Parameter(Mandatory=$true)] [String] $OctopusEnv ) # Get Username and password $username=$OctopusCred.UserName $pwd=$OctopusCred.GetNetworkCredential().Password # Set Connection $key=New-OctopusAPIKey -Purpose "PowerShell" -Username $username -Password $pwd -OctopusURL $OctopusURL Set-OctopusConnectionInfo -URL $OctopusURL -APIKey $key.ApiKey # Get projects from the group $Group=Get-OctopusProjectGroup -ProjectGroupName $OctopusProjectGroup $GroupProjects=$Group.Projects foreach($projectName in $GroupProjects) { $project=Get-OctopusProject -ProjectName $projectName.ProjectName # Get the last release deployment for the selected environment $LastDeployment=$project.LatestDeployments | where {$_.EnvironmentName -eq $OctopusEnv} $LastReleaseVersion=$LastDeployment.ReleaseVersion $Release=Get-OctopusRelease -ProjectName $project.Name -ReleaseVersion $LastReleaseVersion # Update the Variable Snapshot Update-OctopusReleaseVariableSet -ReleaseVersion $release.ReleaseVersion -ProjectName $release.ProjectName # Deploy the release with the new variables octo deploy-release --project $Release.ProjectName --releaseNumber $Release.ReleaseVersion --deployto $OctopusEnv --server $OctopusURL --apiKey $key.ApiKey }
Exécution
La commande de déploiement de la release n’attend pas la fin du déploiement pour nous rendre la main. Tous les déploiements se lancent donc rapidement les uns à la suite des autres. Le résultat est ensuite disponible sur l’interface mais vous pouvez aussi compléter le script pour récupérer le statut du déploiement à l’aide des API !
Conclusion
Profitez des API Octopus pour aller un peu plus loin dans l’automatisation de vos déploiements !
Si vous avez des outils d’automatisation de workflows tels qu’Azure Automation, les cmdlets PowerShell Octoposh faciliteront l’intégration vos processus de déploiement Octopus.