Déployer rapidement des agents VSTS avec Windows Containers, Docker et Azure

Dans cet article on va mettre en application une nouvelle fonctionnalité disponible pour Windows Server 2016 et Windows 10 Anniversary Edition : les Windows Containers.
En effet, depuis peu, il est maintenant possible de monter des images Docker Windows sur ces 2 versions de Windows ! On va mettre en pratique cette nouvelle fonctionnalité en construisant une image Docker permettant de créer facilement et rapidement des agents de build/release pour VSTS/TFS !
Ensuite, pour faciliter sa distribution, on mettra le container créé dans un Container Registry sur Azure.

Installation manuelle

Pour l’installation, je vous invite à lire l’article de Julien Corioland : Getting Started with Windows Containers.
Je vous laisse 5 minutes… C’est bon ? Tout est installé ? 🙂 Pour ceux du fond qui n’ont pas lu, rapide résumé :

  • Activation de la feature Windows Containers
Enable-WindowsOptionalFeature -Online -FeatureName containers –All
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V –All 
Restart-Computer –Force

Il suffit de dézipper ce que l’on vient de télécharger dans le répertoire C:\Program Files\Docker.

  • Enregistrement de Docker
[Environment]::SetEnvironmentVariable(“Path”, $env:Path + “;C:\Program Files\Docker”, [EnvironmentVariableTarget]::Machine)
dockerd –register-service
  • Démarrage du service
Start-Service Docker
Installation via Chocolatey

Ou plus simplement, on peut installer Docker via Chocolatey via la commande

choco install docker

En suivant les instruction, l’installation se fait sans soucis :

Vérification de l’installation

On peut vérifier que Docker est correctement installer en faisant

Docker version

Création de notre image

Microsoft a mis à disposition une image sur le Hub Docker avec un agent VSTS, mais celle-ci est basée sur Ubuntu, on va donc ici se créer une image basée sur Windows Server et l’enregistrer sur un Container Registry privé sur Azure.

Pour simplifier, on va utiliser un fichier dockerfile qui va contenir l’ensemble des actions que l’on veut faire, ce qui va permettre de créer l’image directement avec tout ce qu’il faut dedans. Et on pourra ainsi créer de nouvelles images lorsque les outils évolueront !

Le contenu du fichier est le suivant :

FROM microsoft/windowsservercore
MAINTAINER ThomasCharrier

COPY ["buildtools_full.exe", "c:/BuildTools/buildtools_full.exe"]
RUN c:/BuildTools/buildtools_full.exe -quiet

COPY ["NDP46-KB3045557-x86-x64-AllOS-ENU.exe", "c:/Framework/NDP46-KB3045557-x86-x64-AllOS-ENU.exe"]
RUN c:/Framework/NDP46-KB3045557-x86-x64-AllOS-ENU.exe /q /norestart

COPY ["vsts-agent-win7-x64-2.110.0.zip", "c:/VSTSAgentInstall/vsts-agent-win7-x64-2.110.0.zip"]

WORKDIR C:/
COPY ./start.* ./

ENV VSTS_ACCOUNT ""
ENV VSTS_TOKEN ""
ENV VSTS_AGENTNAME ""
ENV VSTS_POOL ""

CMD ["start.cmd"]

De plus, l’ensemble des outils ainsi que le fichier DockerFile seront dans un même répertoire, afin de simplifier les commandes de copie et de création de l’image:

Regardons maintenant ce qui se passe sous le capot.

Récupération l’image a partir du Hub Docker

Pour commencer, on va récupérer sur notre serveur l’image qui nous intéresse, on va partir de l’image de base Windows Server Core.

docker search microsoft
docker pull microsoft/windowsservercore

Ensuite dans notre fichier DockerFile on indique que notre image sera basé sur celle-ci.
On indique également qui a créé cette image.

FROM microsoft/windowsservercore
MAINTAINER ThomasCharrier

Installation des Build Tools

Afin de pouvoir compiler nos projets, on va installer le Framework ainsi que les Build Tools. Dans notre dockerfile on aura une commande de COPY et une de RUN afin de lancer l’installation, comme paramètre on ajoutera le fait de faire ces installations en mode silencieux.

COPY ["buildtools_full.exe", "c:/BuildTools/buildtools_full.exe"]
RUN c:/BuildTools/buildtools_full.exe -quiet

COPY ["NDP46-KB3045557-x86-x64-AllOS-ENU.exe", "c:/Framework/NDP46-KB3045557-x86-x64-AllOS-ENU.exe"]
RUN c:/Framework/NDP46-KB3045557-x86-x64-AllOS-ENU.exe /q /norestart

On vérifie que l’installation est terminée et que nous disposons de tout ce qu’il nous faut en allant voir dans le répertoire « c:/Program Files (x86)/MSBuild/ » par exemple.

Installation de l’agent VSTS

On ne va pas vraiment installer l’agent, on va juste le dézipper dans un répertoire, afin que l’installation se fasse lors du lancement de l’image.
Même chose qu’au dessus, on copie le fichier, qui sera dezippé dans le script de démarrage.

COPY ["vsts-agent-win7-x64-2.110.0.zip", "C:\VSTSAgentInstall\vsts-agent-win7-x64-2.110.0.zip"]

Afin de gérer les paramètres d’installation de l’agent, on va créer des variables d’environnements qu’on va surcharger selon nos besoins à chaque lancement :

  • VSTS_ACCOUNT : Url de notre VSTS,
  • VSTS_TOKEN : Personnal Access Token que vous avez généré sur votre profil VSTS,
  • VSTS_AGENTNAME : Nom que vous voulez donner à votre agent,
  • VSTS_POOL : Nom de la pool dans laquelle doit être enregisté l’agent,
  • VSTS_HTTP_PROXY : Proxy pour l’agent VSTS (si besoin, il est fort a parier que oui si votre machine est On-Premise).

Ça donne ceci dans notre fichier DockerFile

ENV VSTS_ACCOUNT ""
ENV VSTS_TOKEN ""
ENV VSTS_AGENTPWD = ""
ENV VSTS_POOL ""

Installation automatique de l’agent

On va faire en sorte que lors du lancement du container à partir de notre image, l’installation et l’enregistrement de l’agent sur VSTS/TFS se fassent automatiquement.
On va créer des scripts shell/Powershell pour lancer la commande d’instanciation. L’installation de l’agent se fera donc avec des valeurs qui sont présentes dans des variables d’environnement.

CMD ["start.cmd"]

Contenu du fichier start.cmd

PowerShell.exe -ExecutionPolicy ByPass .\Start.ps1

Contenu du fichier start.ps1

#Dezip agent
$file = "C:\VSTSAgentInstall\vsts-agent-win7-x64-2.110.0.zip"
$path = $env:HOMEDRIVE + "\VSTSAgent\"
New-item $path -type directory

Add-Type -assembly "system.io.compression.filesystem"
[io.compression.zipfile]::ExtractToDirectory($file,$path)

#Install agent
C:\VSTSAgent\bin\Agent.Listener.exe configure --url "$env:VSTS_ACCOUNT" --auth PAT --token "$env:VSTS_TOKEN" --agent "$env:VSTS_AGENTNAME" --pool "$env:VSTS_POOL" --work "c:\_work" --unattended

#Run agent
C:\VSTSAgent\bin\Agent.Listener.exe run

Création

Pour lancer la création de notre image il suffit d’exécuter la commande suivante, on y indique le nom de notre future image

docker build -t vstsagent .

Lors de la construction, les différentes étapes apparaissent. Puis on vérifie la présence de notre image.

Enregistrement de l’image sur Azure

Pour rebondir sur l’article de Matthieu : Docker sur Azure Web App avec Container Registry, qui vous a appris à créer un Container Registry sur Azure.

On va donc enregistrer cette image sur notre Container Registry

docker login dockerthomas-on.azurecr.io -u "dockerthomas" -p "XXXXX"
docker tag vstsagent dockerthomas-on.azurecr.io/vstsagent
docker push dockerthomas-on.azurecr.io/vstsagent

On peut voir via le portail Azure que notre image est disponible

Nos collègues pourront disposer de cette image et la lancer de leur côté.

docker login dockerthomas-on.azurecr.io -u "dockerthomas" -p "XXXXX"
docker pull dockerthomas-on.azurecr.io/vstsagent

Lancement de notre image

Justement ! Comment lancer cette image avec les différents paramètres ?
L’image est configurée pour lancer l’installation de l’agent VSTS à son instanciation, on va juste avoir besoin de surcharger les différentes variables d’environnement pour y entrer nos paramètres

docker run 
-e VSTS_ACCOUNT="https://myaccount.visualstudio.com" 
-e VSTS_TOKEN="PAT" 
-e VSTS_AGENTNAME="$(hostname)-agent-01" 
-e VSTS_POOL="Default" 
-it --rm -P vstsagent

Résultat

Et voila l’agent qu’on vient de créer apparait dans le pool et on peut lancer une build dessus.

L’avantage est la rapidité de mise en place de nouvel agent, il suffit alors de recréer un container avec cette image, 1 fois, 10 fois…

Pas de commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *