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.

Définition d’un cycle de vie dans Octopus

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.