Comment créer un pipeline CI/CD pour les images Docker CircleCI

Si vous cherchez un moyen de tester et déployer vos images Docker CircleCI, la création d’un pipeline CI/CD peut grandement améliorer la livraison logicielle.

Dans ce tutoriel, vous apprendrez comment développer potentiellement un pipeline CI/CD pour votre image Docker en utilisant CircleCI.

Lisez la suite et déployez vos images Docker, uniquement s’ils réussissent le test!

Prérequis

Ce tutoriel sera une démonstration pratique. Si vous souhaitez suivre, assurez-vous d’avoir ce qui suit:

Création d’une image Docker d’une application basée sur Python

Avant de créer un pipeline CI/CD, vous construirez d’abord une image Docker basée sur une application Python qui affiche du texte dans un navigateur web. Vous passerez brièvement en revue comment l’application est construite, rédigerez les cas de test pour l’application, puis conteneuriserez l’application.

1. Ouvrez votre terminal et exécutez la commande suivante pour installer Flask et Pytest. Flask est un framework utilisé pour construire des applications web en Python tandis que Pytest est utilisé pour écrire des tests en Python.

pip install flask pytest

2. Ensuite, créez un répertoire de projet avec le nom de votre choix, mais le répertoire de projet est appelé flask-circleci dans cette démo. Ce répertoire est l’endroit où vous stockerez vos ressources pour ce tutoriel.

mkdir flask-circleci

3. Créez un fichier appelé flask-circleci/main.py et remplissez le code suivant.

Le code ci-dessous affiche le texte « Bienvenue dans mon application Flask » sur une page d’accueil dans un navigateur.

from flask import Flask

app = Flask(__name__) # créez une instance de la classe Flask que vous venez d'importer

@app.route('/')
def main():
    # affichez une chaîne sur la page d'accueil
    return "Welcome to my Flask App"

4. Maintenant, créez un autre fichier appelé flask-circleci/test_main.py et copiez/collez le code suivant.

Le code ci-dessous crée un client de test pour votre application.

Pytest exige que le nom de votre fichier de test commence par test_ comme illustré ci-dessous.

from main import app

def test_main():
		# Crée un client de test pour cette application.
    response = app.test_client().get('/') 

		# vérifie que le code de statut de la page('/') est 200
    assert response.status_code == 200 
		# vérifie l'instruction de retour à la page
    assert response.data == b'Welcome to my Flask App' 

5. Exécutez les commandes suivantes pour accéder au répertoire de votre projet (flask-circleci), exécutez le test pour votre projet.

cd flask-circleci
pytest

Si le test réussit, vous obtiendrez un progrès de 100%, comme indiqué ci-dessous.

Running Test for the Project

6. Ensuite, créez un fichier texte (requirements.txt) pour documenter vos dépendances dans le répertoire racine et remplissez le texte ci-dessous. Ce fichier est essentiel lors de la construction de votre image Docker pour qu’elle fonctionne correctement.

Flask==2.0.3
pytest==6.2.5

7. Enfin, créez un nouveau fichier (flask-circleci/Dockerfile), et écrivez les instructions ci-dessous dans le Dockerfile pour construire votre image Docker.

Les instructions dans le Dockerfile effectuent ce qui suit:

  • Crée un fichier dans votre image.
  • Copie tous les fichiers dans les fichiers du répertoire actuel (flask-circleci).
  • Exécutez votre code
# Définissez l'image de base sur laquelle votre image sera construite
FROM python:3.8 
# Créez un répertoire appelé flask-circleci à la racine.
# Ce répertoire contiendra le code qui réside actuellement dans
RUN mkdir /flask-circleci

# Définissez /flask-circleci comme répertoire de travail
WORKDIR /flask-circleci

# Copiez votre fichier de dépendances dans le répertoire que vous venez de créer
COPY requirements.txt /flask-circleci 

RUN pip install -r requirements.txt

# Copiez le répertoire actuel de votre machine locale dans /flask-circleci dans votre image
ADD . /flask-circleci

EXPOSE 5000

CMD python main.py

Création d’un pipeline CI/CD CircleCI

Maintenant que votre image Docker est prête, vous allez créer un pipeline CI/CD pour tester votre code, et si tous les tests réussissent, l’image Docker sera poussée vers Docker Hub. Docker Hub est un service similaire à GitHub, mais pour les images Docker, qui vous aide à trouver et à partager des images de conteneurs avec votre équipe ou d’autres développeurs.

Pour créer le pipeline CI/CD, suivez les étapes ci-dessous :

1. Ouvrez votre navigateur Web préféré et connectez-vous à votre compte Docker Hub.

2. Sur la page d’accueil de Docker Hub, cliquez sur l’option Créer un dépôt pour créer un dépôt sur Docker Hub.

Creating a Repository

3. Attribuez un nom unique à votre référentiel. Ce tutoriel utilise un référentiel appelé circleci-tutorial, comme indiqué ci-dessous.

Naming and Creating the Docker Hub Repository

4. Créez un nouveau fichier (flask-circleci/config.yml) à la racine de votre projet et copiez/collez le code ci-dessous dans le fichier config.yml.

Le code ci-dessous utilise une image Python toute faite pour installer les dépendances, exécuter les tests unitaires, et construire/pousser votre image Docker vers votre référentiel Docker Hub.

Typiquement, pour un projet en production, vous voudriez protéger votre nom d’utilisateur et votre mot de passe dans CircleCI ou peut-être dans un fichier .env.

version: 2  # Version de CircleCI
jobs:
  build:
    docker:
      - image: python:3.8
    steps:
      - checkout

      - run:
        # crée un environnement virtuel pour votre projet,
				# installe les dépendances et exécute les tests
          name: Run unit tests
          command: |
            python3 -m venv venv
            . venv/bin/activate
            pip install -r requirements.txt
            pytest
			# Crée un environnement Docker distant configuré pour exécuter des commandes Docker.
      - setup_remote_docker 
       
      - run:
        # installe un client Docker qui sera utilisé pour exécuter les commandes Docker
          name: Install Docker client
          command: |
            set -x
            VER="17.03.0-ce"
            curl -L -o /tmp/docker-$VER.tgz https://get.docker.com/builds/Linux/x86_64/docker-$VER.tgz
            tar -xz -C /tmp -f /tmp/docker-$VER.tgz
            mv /tmp/docker/* /usr/bin
      - run:
         # Construit une image Docker à pousser vers Docker Hub
				 # Le modèle de tag (-t) est ci-dessous, où CircleCI
				 # récupère le Dockerfile du répertoire actuel.
         # .
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v1 .

      - run:
        # Pousse l'image Docker que vous avez créée vers Docker Hub.
        # Remplacez khabdrick/circleci-tutorial:v1 par le
				#  que vous avez utilisé pour construire l'image ci-dessus
          name: Push to Docker Hub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v1

5. Enfin, exécutez les commandes suivantes à la racine de votre projet pour commit et push le code (flask-circleci/config.yml) vers votre dépôt GitHub.

git add . # ajoute les modifications à la zone de staging
git commit -m "update" # commet vos modifications
git push # Pousse vers GitHub

Activation du pipeline CI/CD CircleCI

Vous venez de créer votre pipeline CI/CD CircleCI, mais pour le moment, il ne fait pas grand-chose. Vous devez activer votre pipeline en configurant un projet dans votre compte CircleCI.

1. Connectez-vous à votre compte CircleCI avec votre compte GitHub sur votre navigateur web.

2. Ensuite, cliquez sur l’onglet Projets dans le panneau de gauche, puis cliquez sur le bouton Configurer le projet sur le côté droit de votre projet pour activer le pipeline CircleCI sur le projet.

Comme vous vous êtes connecté à CircleCI avec votre compte GitHub, vos projets se synchronisent avec CircleCI, comme sur l’image ci-dessous.

Setting up a Project

3. Revenez à l’onglet Tableau de bord et vous verrez le statut Succès. Le statut Succès indique que tout s’est déroulé comme prévu et que l’image a été poussée vers votre référentiel Docker Hub.

Cliquez sur la construction pour voir toutes les étapes qui se sont déroulées dans le pipeline.

Viewing Project Status

Ci-dessous, vous pouvez voir la liste des étapes que CircleCI a effectuées pour exécuter le pipeline.

Viewing Steps that Ran the Pipeline

4. Enfin, revenez à votre référentiel Docker Hub et vous verrez l’image que vous avez poussée vers Docker Hub via le pipeline CircleCI.

Viewing Pushed circleci docker images in Docker Hub Repository

Pousser des modifications vers GitHub pour déclencher le pipeline CircleCI.

À présent, vous avez déjà un pipeline CircleCI fonctionnel. Mais peut-être avez-vous apporté des modifications à votre projet. Si c’est le cas, comment sauriez-vous si le pipeline fonctionne toujours ? Vous pouvez déclencher CircleCI en poussant des modifications vers votre dépôt GitHub et voir si le test réussit.

1. Sur votre machine locale, remplacez le code que vous avez dans test_main.py par le code ci-dessous. Le code ci-dessous vise à faire échouer le test car le code d’état est passé de 200 à 400.

from main import app

def test_main():
		# Crée un client de test pour cette application.
    response = app.test_client().get('/') 

		# Vérifie que le code d'état de la page ('/') est 400 quand ce n'est pas le cas, 
		# ce qui provoque l'échec du test.
    assert response.status_code == 400 
		# Vérifie l'instruction de retour sur la page
    assert response.data == b'Flask App' 

2. Ensuite, remplacez les étapes dans le config.yml qui construit l’image Docker et la pousse vers Docker Hub avec le code ci-dessous.

Dans le code ci-dessous, vous modifiez simplement la version pour vous assurer que seules les nouvelles modifications sont poussées vers votre dépôt GitHub.

      - run:
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v2 .

      - run:
          name: Push to DockerHub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v2

3. Exécutez les commandes suivantes à la racine de votre projet pour commit et push le code vers votre dépôt GitHub.

git add . # ajoute les modifications à la zone de staging
git commit -m "v2" # effectue le commit des modifications
git push # Pousse vers GitHub

4. Maintenant, accédez à votre tableau de bord CircleCI et vous verrez que la construction a échoué, comme indiqué ci-dessous.

Cliquez sur Construire pour voir les étapes prises pour pousser les changements et confirmer ce qui a causé l’échec de la construction.

Viewing Project Status (Failed)
Showing Failed Tests

5. Enfin, accédez à votre dépôt Docker Hub et confirmez que les changements n’ont pas été poussés.

Comme vous pouvez le voir dans l’image ci-dessous, la version 2 n’a pas été téléchargée car le test a échoué.

Viewing Repository in Docker Hub

Conclusion

Tout au long de ce tutoriel, vous avez appris comment écrire des tests et dockeriser votre application Python. Vous avez créé un pipeline CI/CD avec CircleCI qui exécute le test pour votre application et pousse votre image Docker vers Docker Hub.

À ce stade, vous avez déjà des connaissances fondamentales sur le développement d’un pipeline CI/CD avec CircleCI. Maintenant, comment avez-vous l’intention d’utiliser ces nouvelles connaissances? Peut-être en créant un pipeline CI/CD qui déploie votre image Docker sur Heroku?

Source:
https://adamtheautomator.com/circleci-docker-images/