Mettre en place la CI pour l’application Flask + Redis
On veut mettre en pratique les principes de l’Intégration Continue.
Pour cela on va construire et tester l’image Docker Flask + Redis dans GitLab CI.
On va aussi gérer le tagging et la promotion de l’image selon la branche.
Etape 0 : Initialisation du projet Gitlab
Avec le code du projet Flask, initialisez un projet git puis créez chacun.e un projet Gitlab individuel pour l'héberger.
# Exemple
git init
git add .
git commit -m "feat: first version"
git remote add origin ...
git push -u origin main
Etape 1 : Initialisation du pipeline CI
- Action : Créer ou compléter le fichier
.gitlab-ci.yml
minimal pour déclencher un pipeline sur chaque push. - Observation : Le pipeline doit s’exécuter à chaque commit poussé.
- Contraintes :
- Définir deux stages minimum :
build
ettest
. - Créer deux jobs, un pour chaque stage, nommés
build_job
ettest_job
- actions du job
build_job
script: echo 'Hello Build'
- actions du job
test_job
script: echo 'Hello Test'
- Définir deux stages minimum :
Etape 2 : Construction de l’image Docker
- Action : Ajouter le job de build du
Dockerfile
pour l’application Flask + Redis - Observation : Le job doit reporter une réussite du build
- Contraintes :
- Créer un job
build_job
- Utiliser une image
docker:cli
- Utiliser le
services: docker
- Utiliser un tag
semver
1.0.0
stocké dans la variableAPP_VERSION
- Utiliser le nom d'image
myapp
- Créer un job
Etape 3 : Exécution des tests (lint)
- Action : Créer un job
test
qui exécute Flake8 sur le code Flask. - Observation : Les erreurs de style doivent bloquer la suite du pipeline.
- Contraintes :
- Ajouter flake8 et pytest dans le fichier
requirements.test.txt
. - Exécuter le lint puis les tests unitaires dans le job.
- Ajouter flake8 et pytest dans le fichier
Indice
Ajoutez la dépendance flake8 dans le fichier requirements.test.txt, puis lancez flake .
en script.
Documentation: https://flake8.pycqa.org/en/latest/
Etape 4 : Push vers le registre GitLab
- Action : Envoyer l’image Docker générée vers le GitLab Container Registry.
- Observation : Vérifier la présence de l’image dans
Deploy > Container Registry
- Contraintes :
- Ajouter une action au
build_job
- S’authentifier avant de pousser :
docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
- Utiliser une variable pour le nom d'image
DOCKER_IMAGE_NAME: $CI_REGISTRY_IMAGE:CI_COMMIT_SHORT_SHA
- Ajouter une action au
Etape 5 : Analyse de l’image Docker avec Trivy uniquement sur main
- Action : Scanner l’image Docker pour détecter d’éventuelles vulnérabilités avec Trivy (outil d’analyse de vulnérabilités).
- Observation : Le job doit échouer si des vulnérabilités sont trouvées.
- Contraintes :
- nom du job :
scan_with_trivy
- stage :
test
- filtrer sur :
only: [main]
- spécifier un runner docker :
services : [docker:dind]
- image docker :
image:
name: aquasec/trivy:latest
entrypoint: [""]- script :
TRIVY_PASSWORD=$CI_REGISTRY_PASSWORD trivy image --username $CI_REGISTRY_USER $DOCKER_IMAGE_NAME
- nom du job :
Indice
Installez Trivy ou utilisez une image contenant Trivy. Limitez le job à la branche main
avec only: [main]
.
Solution
Afficher
Solution - Etape 1
Exemple minimal de .gitlab-ci.yml
pour initialiser un pipeline et définir les stages :
stages:
- build
- test
build_job:
stage: build
script: echo 'Hello Build'
test_job:
stage: test
script: echo 'Hello Test'
Solution - Etape 2
Job de build dans .gitlab-ci.yml
:
variables :
- APP_VERSION="1.0.0"
build_job:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t "myapp:$APP_VERSION" .
Solution - Etape 3
Job de test avec flake8 :
test_job:
stage: test
image: python:3.12
script:
- pip install -r requirements.test.txt
- flake8 .
Solution - Etape 4
variables:
DOCKER_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
build_and_push:
stage: build
image: docker:latest
script:
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
Solution - Etape 5
scan_with_trivy:
stage: test
image:
name: aquasec/trivy:latest
entrypoint: [""]
only:
- master
script:
- TRIVY_PASSWORD=$CI_REGISTRY_PASSWORD trivy image --username $CI_REGISTRY_USER $DOCKER_IMAGE_NAME