Azure Pipelines : Comment ajouter un agent de build avec Azure Container Instances - partie 2 : Agent Custom
Dans l’article précédent, nous avons vu l’une des manières les plus simples d’ajouter un agent de build à une organisation Azure DevOps en 1 seule ligne de commande.
Cependant, étant donné que cette méthode nécessite environ 10 minutes pour que notre agent devienne disponible, voyons voir s’il n’est pas possible de faire mieux en créant son propre agent de build docker custom.
Démarrer avec le template de la documentation de Microsoft
Se rendre sur Running a self-hosted agent in Docker et récupérer le contenu des fichiers Dockerfile
et start.sh
.
Ces 2 fichiers contiennent le strict minimum nécessaire pour exécuter un containeur avec un agent Azure Pipeline installé à l’intérieur.
Création d’un registre privé en utilisant Azure Container Registry
Suivre la documentation officielle de Microsoft pour ça, en utilisant le Portail Azure ou la CLI Azure.
Builder l’image sans avoir Docker installé sur son poste, en utilisant ACR Tasks !
Dans cette étape, nous allons générer une image docker et la pousser sur le registre privé précédemment créé sans même avoir docker installé sur son poste ! Plutôt sympa n’est-ce pas ? :)
Connectez-vous à votre souscription Azure avec l’Azure CLI via az login
et az account set
pour sélectionner votre souscription Azure (si ce n’est pas déjà fait), puis exécuter la ligne de commande suivante :
az acr build --registry MY_ACR_NAME --image MY_IMAGE_NAME .
Où :
MY_ACR_NAME
est le nom de l’Azure Container Registry créé dans l’étape précédente,MY_IMAGE_NAME
est le nom de l’image qui sera générée et poussée sur le registre. Vous pouvez aussi préciser un Tag en suffixe (qui par défaut est configuré à la valeurlatest
)
Note: Le `.` à la fin de la ligne de commande est important et permet de préciser le contexte de Build, `.` correspondant au répertoire actuel.
Cette commande prend tous les fichiers du répertoire courant (c’est à dire notre fichier Dockerfile
et start.sh
de l’étape précédente), les place dans une archive zip, les envoie sur Azure Container Registry, puis exécute la commande docker build
.
Après quelques secondes, votre image devrait être générée !
Exécuter l’agent custom Docker dans Azure Container Instances
Afin de rester sur un scénario assez simple, activons le compte Admin de l’Azure Container Registry afin de se connecter plus facilement depuis Azure Container Instances.
Conservez précieusement le login et mot de passe qui seront à réutiliser dans les étapes suivantes.
Pour un scénario plus sécurisé, je vous laisse regarder du côté de l’authentification par
Service Principal
en suivant le lien : Authenticate with Azure Container Registry from Azure Container Instances using a Service Principal
Exécutez ensuite la ligne de commande suivante :
az container create -g MY_RESOURCE_GROUP -n MY_CONTAINER_NAME --image MY_ACR_NAME.azurecr.io/MY_IMAGE_NAME:latest --registry-username MY_ADMIN_LOGIN --registry-password MY_ADMIN_PASSWORD --cpu 4 --memory 14 --environment-variables AZP_URL=MY_ACCOUNT_URL AZP_TOKEN=MY_AZUREDEVOPS_TOKEN AZP_AGENT_NAME=MY_AGENT_NAME AZP_POOL=Default AZP_WORK=_work
Où :
--image
est l'URI complète de l’image Docker générée précédemment.--registry-username
est le login admin d’ACR.--registry-password
est le password admin d’ACR.AZP_URL
est l’url du compte Azure DevOps.AZP_TOKEN
est un PAT (Personal Access Token), utilisé pour accéder à votre compte Azure DevOps. (Pour en générer un, suivre Create personal access tokens to authenticate access).AZP_AGENT_NAME
est le nom de l’agent de build, affiché dans Azure DevOps.AZP_POOL
est le nom de l’agent pool où l’agent sera inscrit. Par défaut c’est l’agent poolDefault
qui est utilisé.
Plus d’informations sur les autres paramètres de la ligne de commande
az container create
sur docs.microsoft.com
Exemple
az container create -g aci-vfa-rg -n mycustomdockeragent --image acrvfa.azurecr.io/dockeragent:latest --registry-username acrvfa --registry-password E5O7wLHtxVsnfGorE5O7wLHtxVsnfGor --cpu 4 --memory 14 --environment-variables AZP_URL=https://dev.azure.com/vivien AZP_TOKEN=cu6zvey2eqsfipsb2m5wexdxwabdpdky7emq7asbz3eqkxjgehma AZP_AGENT_NAME=mycustomdockeragent AZP_POOL=Default AZP_WORK=_work
Patientez quelques minutes…
…et boum ! (non pas la duchesse d’aquitaine) Dites bonjour à votre nouvel agent de Build :)
Personnaliser son agent de build avec le SDK .NET Core
Essayons d’exécuter une nouvelle build d’un projet ASP.NET Core sur notre nouvel agent :
Oh non ! La build échoue car le SDK .NET Core n’est pas présent sur notre agent…
Puisque notre conteneur Docker est basé sur Ubuntu 16.04, voyons voir comment installer ce SDK dessus.
Selon la documentation, nous pouvons l’installer en exécutant les lignes suivantes dans notre fichier Dockerfile
:
RUN apt-get install -y wget
RUN wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb
RUN dpkg -i packages-microsoft-prod.deb
RUN apt-get install apt-transport-https
RUN apt-get update
RUN apt-get install dotnet-sdk-2.2
Regénérons notre image sur ACR, puis recréons notre container sur ACI, et enfin exécutons notre build ASP.NET Core, et…
Et voilà ! La build se termine maintenant avec succès ! Et elle n’a pas pris 10 minutes pour provisionner son agent en utilisant ACI :) (Le provisionnement prend toujours un peu moins de 2 minutes, mais c'est sans réelle optimisation du Dockerfile
)
Maintenant que nous avons vu qu’il est possible de déployer un agent de Build Azure DevOps en quelques minutes, et si nous pouvions créer cet agent de Build au démarrage de la Build, puis le supprimer à la fin ?
Je garde ce sujet pour un futur article :)
Que le code soit avec vous !
P.S.: Un exemple de Dockerfile fonctionnant est trouvable sur github, et si vous souhaitez juste jouer avec et démarrer un agent, vous pouvez tester l'image correspondante sur dockerhub en utilisant la ligne de commande suivante :
az container create -g aci-vfa-rg -n MY_CONTAINER_NAME --image vfabing/azure-pipelines-agent-dotnet-core-sdk:latest --cpu 4 --memory 14 --environment-variables AZP_URL=MY_ACCOUNT_URL AZP_TOKEN=MY_AZUREDEVOPS_TOKEN AZP_AGENT_NAME=MY_AGENT_NAME
Have fun !
Commentaires