Aller au contenu principal

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 et test.
    • Créer deux jobs, un pour chaque stage, nommés build_job et test_job
    • actions du job build_job
    script: echo 'Hello Build'
    • actions du job test_job
    script: echo 'Hello Test'

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 variable APP_VERSION
    • Utiliser le nom d'image myapp

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.
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

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
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