Publié le

Réaliser des Builds Docker avec un Agent Auto-hébergé dans Azure Pipelines

Auteurs

Lorsque vous réalisez des builds Docker dans une pipeline CI/CD, il est souvent nécessaire d'utiliser des images Docker capables de lancer elles-mêmes des commandes Docker.
Dans certains cas, comme pour une utilisation personnelle, il est souvent plus avantageux d'utiliser un agent auto-hébergé, que ce soit sur un serveur tiers ou sur votre machine personnelle, plutôt que de recourir aux agents proposés par Azure.

Pour vous faciliter la tâche, j'ai préparé une image Docker prête à l'emploi : https://github.com/CultureDevOps/simple-azp-agent-docker-dind.

Fonctionnement d’une Pipeline Azure avec un Agent Auto-hébergé

Pipeline Azure

Le développeur effectue un commit de son code avec un Dockerfile dans le dépôt Azure. Ce commit déclenche alors l'exécution de la pipeline.
Pendant ce temps, l'agent auto-hébergé fonctionne en arrière-plan sur une machine et interroge régulièrement la pipeline Azure pour vérifier s'il doit commencer à travailler.
Lorsque la pipeline est déclenchée, l'agent construit l'image Docker et la pousse dans Azure Container Registry.

Utilisation de l’Agent sur une Machine Linux

Dans le dépôt GitHub, vous trouverez le fichier docker-compose-linux.yml.

Commencez par adapter les variables d'environnement pour qu'elles correspondent à votre compte Azure DevOps :

docker-compose-linux.yml
version: "3.8"

services:  
  dind:  
    image: culturedevops/simple-azp-agent-docker-dind:latest  
    tty: true  
    restart: unless-stopped  
    volumes:  
      - "/var/run/docker.sock:/var/run/docker.sock"  
    environment:  
      AZP_URL: "https://dev.azure.com/youraccount"  
      AZP_AGENT_NAME: "azure-agent-desktop"  
      AZP_POOL: "azure-agent"  
      AZP_TOKEN: "Your Token Here"  

Pour lancer l'agent, placez-vous dans le répertoire et exécutez la commande suivante :

docker-compose -f "docker-compose-linux.yml" up -d

Utilisation de l’Agent sur une Machine Windows

De la même manière, dans le dépôt GitHub, vous trouverez le fichier docker-compose-windows.yml. Modifiez également les variables d’environnement comme indiqué.

docker-compose-windows.yml
version: "3.8"

services:  
  dind:  
    image: culturedevops/simple-azp-agent-docker-dind:latest  
    tty: true  
    restart: unless-stopped  
    volumes:  
      - "//var/run/docker.sock:/var/run/docker.sock"  
    group_add:  
      - "0"  
    environment:  
      AZP_URL: "https://dev.azure.com/youraccount"  
      AZP_AGENT_NAME: "azure-agent-desktop"  
      AZP_POOL: "azure-agent"  
      AZP_TOKEN: "Your Token Here"  

Pour lancer l'agent, placez-vous dans le répertoire et exécutez la commande suivante :

docker-compose -f "docker-compose-windows.yml" up -d

Vérification de l’Agent dans Azure

Une fois l'agent lancé, vous pouvez vérifier qu'il fonctionne correctement en vous rendant dans Organisation Settings > Agent pools > Votre pool > Agents.

Azure Agent

Exemple de Pipeline Azure pour la Construction d’une Image Docker

Créez un fichier azure-pipelines.yml à la racine de votre projet et configurez les variables comme suit :

azure-pipelines.yml
# Docker  
# Build and push an image to Azure Container Registry  
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker

trigger:  
- main

resources:  
- repo: self

variables:  
  dockerRegistryServiceConnection: '<SERVICE_CONNECTION_NAME>'  
  imageRepository: '<IMAGE_NAME>'  
  containerRegistry: 'yourregistry.azurecr.io'  
  tag: '$(Build.BuildId)'
  dockerfile: '$(Build.SourcesDirectory)/Dockerfile'
  dockerimage: '$(imageRepository)/docker_image'
  agentName: 'azure-agent'
  vmImageName: 'alpine'

stages:  
- stage: Build  
  displayName: Build and push stage  
  pool:  
    name: $(agentName)
    vmImage: $(vmImageName)    
  jobs:  
  - job: Build_docker_image  
    displayName: Build Docker Image  
    steps:  
    - task: Docker@2  
      displayName: Build and push an image to container registry  
      inputs:  
        command: buildAndPush  
        repository: $(dockerimage)
        dockerfile: $(dockerfile)
        containerRegistry: $(dockerRegistryServiceConnection)  
        tags: |  
          latest

Une fois ces configurations effectuées, poussez votre Dockerfile dans Azure Repos. Après quelques secondes, la pipeline sera automatiquement déclenchée et votre image Docker sera construite. Vous pourrez suivre l'exécution de la pipeline dans l'onglet Pipelines de votre projet.

Conclusion

Vous disposez désormais d'une méthode simple et efficace pour réaliser des builds Docker dans Azure Pipelines. Grâce à l’utilisation d’un agent auto-hébergé, vous pouvez facilement intégrer Docker dans votre chaîne CI/CD sur Azure.

Build Success