Loupe

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 valeur latest)

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 !

01-build-docker-image-on-azure-with-acr-tasks

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 pool Default 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…
02-two-minutes-to-start-a-custom-build-agent-with-azure-container-instances

…et boum ! (non pas la duchesse d’aquitaine) Dites bonjour à votre nouvel agent de Build :)

03-build-custom-agent-on-docker-in-azure-devops

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 :

04-build-failing-without-dotnet-sdk-installed-on-docker-custom-build-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…

05-build-succeeding-with-dotnet-sdk-installed-on-custom-docker-build-agent

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 !

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus