Si vous cherchez un moyen de tester et de déployer vos images CircleCI Docker, la création d'un pipeline CI/CD peut vous permettre d'améliorer considérablement la livraison des logiciels.
Dans ce didacticiel, vous apprendrez comment vous pouvez potentiellement développer un pipeline CI/CD pour votre image Docker à l'aide de CircleCI.
Continuez à lire et déployez vos images Docker, uniquement si elles réussissent le test !
Prérequis
Ce tutoriel sera une démonstration pratique. Si vous souhaitez suivre, assurez-vous d'avoir les éléments suivants :
- Un GitHub compte et dépôt GitHub qui est déjà configuré.
- Un compte CircleCI lié à votre compte GitHub.
- Un compte Docker Hub.
- Docker installé.
- Une machine Linux :ce didacticiel utilise Ubuntu 20.04.3 LTS.
Création d'une image Docker d'une application basée sur Python
Avant de passer à la création d'un pipeline CI/CD, vous allez d'abord créer une image Docker basée sur une application Python qui affiche des textes sur un navigateur Web. Vous expliquerez brièvement 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 install
Flacon et Pytest. Flask est un framework utilisé pour créer des applications Web en Python tandis que Pytest est utilisé pour écrire des tests de code Python.
pip install flask pytest
2. Ensuite, créez un répertoire de projet avec votre nom préféré, mais le répertoire de projet s'appelle flask-circleci
dans cette démo. Ce répertoire est l'endroit où vous stockerez vos ressources pour ce didacticiel.
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__) #create an instance of the Flask class you just imported
@app.route('/')
def main():
# display a string in the home page
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():
# Creates a test client for this application.
response = app.test_client().get('/')
# assert the stutus code of the page('/') is 200
assert response.status_code == 200
# assert the return statement to the 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 une progression de 100 %, comme indiqué ci-dessous.
6. Ensuite, créez un fichier texte (requirements.txt ) pour documenter vos dépendances dans le répertoire racine et remplir le texte ci-dessous. Ce fichier est essentiel lors de la construction de votre image Docker afin 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 créer votre image Docker.
Les instructions dans le Dockerfile effectuez les actions suivantes :
- Créez un fichier à votre image.
- Copie tous les fichiers dans les fichiers du répertoire courant (flask-circleci ).
- Exécutez votre code
# set the Base Image from which your image will be built on
FROM python:3.8
# create a directory called flask-circleci in root.
# This directory will contain the code which currently resides in
RUN mkdir /flask-circleci
# make /flask-circleci the working directory
WORKDIR /flask-circleci
# copy your requirements file to the directory you just created
COPY requirements.txt /flask-circleci
RUN pip install -r requirements.txt
# copy the current directory in you local machine to /flask-circleci in your 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 et sont poussés vers Docker Hub. Docker Hub est un service comme 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 Créer un référentiel possibilité de créer un référentiel sur Docker Hub.
3. Définissez un nom unique pour votre référentiel. Ce tutoriel utilise un référentiel appelé circleci-tutorial , comme indiqué ci-dessous.
4. Créez un nouveau fichier (flask-circleci/config.yml) à la racine de votre projet, et copiez/collez le code ci-dessous dans le config.yml dossier.
Le code ci-dessous récupère une image Python prête à l'emploi et l'utilise pour installer les dépendances et exécuter les tests unitaires pour créer et pousser votre image Docker vers votre référentiel Docker Hub.
Généralement, pour un projet en direct, vous voudriez mettre votre nom d'utilisateur et votre mot de passe protégés dans CircleCI ou peut-être dans un fichier .env.
version: 2 # Version of CircleCI
jobs:
build:
docker:
- image: python:3.8
steps:
- checkout
- run:
# creates a virtual environment for you project,
# install dependencies in it and run tests
name: Run unit tests
command: |
python3 -m venv venv
. venv/bin/activate
pip install -r requirements.txt
pytest
# Creates a remote Docker environment configured to execute Docker commands.
- setup_remote_docker
- run:
# installs a docker client that will be used to run the docker commands
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:
# Builds a docker image to push to Docker Hub
# Tag (-t) pattern is below, where CircleCI
# to get the Dockerfile from the current directory.
# <docker_hub_username/docker-hub-password:version>.
name: Build Docker image
command: docker build -t khabdrick/circleci-tutorial:v1 .
- run:
# Pushes the Docker image you created to the Docker Hub.
# Replace khabdrick/circleci-tutorial:v1 with the
# <docker_hub_username/docker-hub-password:version> you used to build the image above
name: Push to Docker Hub
command: |
docker login -u unsername -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 ) à votre référentiel GitHub.
git add . # adds changes to staging area
git commit -m "update" # commits your changes
git push # Push to GitHub
Activation du pipeline CI/CD CircleCI
Vous venez de créer votre pipeline CircleCI CI/CD, mais pour le moment, il est juste là et ne fait pas grand-chose. Vous devrez 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 Projets dans le panneau de gauche, puis cliquez sur Configurer le projet sur le côté droit de votre projet pour activer le pipeline CircleCI sur le projet.
Depuis que vous vous êtes connecté à CircleCI avec votre compte GitHub, vos projets se synchronisent avec CircleCI, comme dans l'image ci-dessous.
3. Revenez au tableau de bord et vous verrez l'onglet Succès statut. Le succès status indique que tout s'est déroulé comme prévu et que l'image a été transmise à votre référentiel Docker Hub.
Cliquez sur construire pour voir toutes les étapes qui se sont déroulées dans le pipeline.
Ci-dessous, vous pouvez voir la liste des étapes suivies par CircleCI pour exécuter le pipeline.
4. Enfin, revenez à votre référentiel Docker Hub et vous verrez l'image que vous avez transmise à Docker Hub via le pipeline CircleCI.
Apporter des modifications à GitHub pour déclencher le pipeline CircleCI
À présent, vous disposez déjà d'un pipeline CircleCI fonctionnel. Mais peut-être avez-vous apporté des modifications à votre projet. Si oui, comment sauriez-vous que le pipeline fonctionne toujours ? Vous pouvez déclencher CircleCI en envoyant des modifications à votre référentiel GitHub et voir si le test réussira.
1. Sur votre machine locale, remplacez le code que vous avez dans test_main.py avec le code ci-dessous. Le code ci-dessous garantit délibérément que le test échoue car le code d'état est passé de 200
à 400
.
from main import app
def test_main():
# Creates a test client for this application.
response = app.test_client().get('/')
# assert the status code of the page('/') is 400 when it isn't,
# causing the test to fail.
assert response.status_code == 400
# assert the return statement ton the page
assert response.data == b'Flask App'
2. Ensuite, remplacez les steps
dans le config.yml qui construit l'image Docker et la transmet à 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 transmises à votre référentiel GitHub.
- run:
name: Build Docker image
command: docker build -t khabdrick/circleci-tutorial:v2 .
- run:
name: Push to DockerHub
command: |
docker login -u khabdrick -p Muhammed-1998
docker push khabdrick/circleci-tutorial:v2
3. Exécutez les commandes suivantes à la racine de votre projet pour commit
et push
le code dans votre référentiel GitHub.
git add . # adds changes to staging area
git commit -m "v2" # commits your changes
git push # Push to GitHub
4. Maintenant, accédez à votre tableau de bord CircleCI et vous verrez que la construction Échec , comme indiqué ci-dessous.
Cliquez sur la construction pour voir les étapes suivies pour pousser les modifications et confirmer ce qui a causé l'échec de la construction.
5. Enfin, accédez à votre référentiel Docker Hub et confirmez que les modifications n'ont pas été transmises.
Comme vous pouvez le voir dans l'image ci-dessous, la v2 n'a pas été téléchargée car le test a échoué.
Conclusion
Tout au long de ce didacticiel, vous avez appris à é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 transmet votre image Docker à Docker Hub.
À ce stade, vous avez déjà une connaissance de base du développement d'un pipeline CI/CD avec CircleCI. Maintenant, comment comptez-vous utiliser ces nouvelles connaissances ? Peut-être créer un pipeline CI/CD qui déploie votre image Docker sur Heroku ?