Photo par Ian Taylor

Exécutez vos jobs Azure DevOps dans des conteneurs Docker

Buildez tous vos projets en utilisant des conteneur jobs !

Créé par Damien Aicheh le 10/03/2022 · 8 mins

Lors du build de projets sur Azure DevOps, vous avez peut-être déjà remarqué que vous disposez de deux méthodes pour tester, builder et déployer votre projet :

  • Utiliser vos propres pools d’agents
  • Utiliser les pools d’agents en ligne

Avec la première option, vous devez entretenir les agents et probablement les acheter ou les louer, puis installer les outils dont vous avez besoin. Avec la seconde option vous êtes limité par les outils installés par défaut sur chaque agent. Ceci étant dit, quelles autres options avez-vous ? Jetons un coup d’œil aux container jobs!

Créez vos propres conteneurs Docker

Les container jobs vous permettent d’exécuter votre job dans une image Docker. Avec cette approche, vous avez juste besoin d’un pool d’agents pouvant exécuter Docker. Quels en sont les avantages ?

  • Vous n’êtes pas dépendant de l’outillage de l’agent
  • Vous pouvez créer votre propre image Docker qui correspond à vos besoins
  • Ces images fonctionneront en ligne ou dans vos propres pools d’agents donc vous pouvez changer quand vous le souhaitez. Ce n’est donc pas une perte de temps.

Si vous pouvez conteneuriser la technologie que vous utilisez avec Docker, vous pouvez utiliser cette technique.

Voici un petit schéma pour vous aider à comprendre le concept :

Global architecture schema

Comme vous pouvez le voir ci-dessus vous créez une première image qui sera votre image de base pour toutes les autres. Ensuite, vous pouvez créer une image spécifique pour chaque type de technologie ou de projet que vous avez. Le but est de les garder les plus petites possible afin qu’elles se lancent rapdiment.

Créer l’image Docker de base

Pour créer votre propre image Docker, vous devez répondre aux exigences officielles pour rendre votre image compatible avec Azure DevOps.

Créons une image que nous utiliserons comme base pour toutes les autres images :

FROM ubuntu:18.04

# To make it easier for build and release pipelines to run apt-get,
# configure apt to not require confirmation (assume the -y argument by default)
ENV DEBIAN_FRONTEND=noninteractive
RUN echo "APT::Get::Assume-Yes \"true\";" > /etc/apt/apt.conf.d/90assumeyes

RUN apt-get update && apt-get install -y --no-install-recommends \
    ca-certificates \
    curl \
    jq \
    git \
    netcat \
    nodejs \
    unzip \
    && rm -rf /var/lib/apt/lists/*

Ce Dockerfile déclare une liste d’outils dont Azure DevOps a besoin pour exécuter des scripts et des tâches javascript. Vous pouvez ajouter également quelques outils utiles comme jq ou unzip par exemple. Ensuite, nous buildons cette image et la publions sur un Docker Registry. Nous appelerons cette première image your-username/container-base:1.0.0.

Cette image de base peut déjà exécuter vos scripts et tâches bash. Prochaine étape, créons une image spécifique en se basant sur celle-ci.

Créer une image Docker spécifique

Imaginons que nous ayons un projet qui exécute un serveur Dart. Par défaut, le framework Dart n’est pas installé sur l’agent en ligne, c’est donc un bon scénario pour nous. Créons cette image Docker spécifique :

FROM your-username/container-base:1.0.0

RUN apt-get -y update && \
    apt-get -y upgrade

RUN apt-get update && apt-get install -y --no-install-recommends \ 
    apt-transport-https \ 
    wget \
    gpg
RUN wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | gpg --dearmor -o /usr/share/keyrings/dart.gpg
RUN echo 'deb [signed-by=/usr/share/keyrings/dart.gpg arch=amd64] https://storage.googleapis.com/download.dartlang.org/linux/debian stable main' | tee /etc/apt/sources.list.d/dart_stable.list

RUN apt-get update && apt-get install dart && rm -rf /var/lib/apt/lists/*

ENV PATH="$PATH:/usr/lib/dart/bin:$HOME/.pub-cache/bin"

Comme vous pouvez le voir, nous créons une image avec la dernière version stable de Dart, biensûr vous pouvez créer une image génériques qui prendra en paramètre une version de Dart. Enfin vous pourriez ensuite builder une image pour chaque version que vous souhaitez cibler. Nous appelerons cette seconde image your-username/container-dart:stable. Nous avons maintenant notre image de Dart prête, utilisons-la !

Utilisation

Pour utiliser une image en tant que container job c’est très simple il vous suffit de la spécifier comme ceci :

container:
  image: your-username/your-container:1.0.0
  endpoint: # Optional service connection for private Docker registries

Ci-dessous, un exemple d’une commande Dart s’exécutant dans le container job que nous avons spécifié plus haut:

trigger: none

pool:
  vmImage: ubuntu-latest

stages:
- stage: Build_Dart_Server
  jobs:
  - job:
    displayName: "Build Dart Server"
    container:
      image: your-username/container-dart:stable
    steps:
    - script: dart --version
      displayName: 'Check Dart version'

    # All your Dart commands here...

Comme vous pouvez le voir, il vous suffit de le déclarer dans la section du job.

Touche finale

Vous savez maintenant comment créer facilement vos propres conteneurs Docker pour tester, builder et déployer vos projets. Il est maintenant temps pour vous de créer votre propre ensemble d’images Docker!

Happy coding!

N'hésitez pas à me suivre sur pour ne pas rater mon prochain tutoriel !