Build d’une application Flask avec GitLab CI#
Objectif#
L’objectif est de montrer comment : 1. Automatiser le build d'une application flask 2. Construire et pousser une image Docker vers Docker Hub et GitLab Container Registry en utilisant GitLab CI.
Structure de l’application#
L’application Flask est organisée comme suit :
FLASK-APP/
│-- app/
│ ├── static/ # Fichiers statiques (Bootstrap, JS, images)
│ ├── templates/ # Fichiers HTML (index.html, 404.html, etc.)
│ ├── app.py # Fichier principal de l'application Flask
│-- .gitignore # Exclusion des fichiers non nécessaires
│-- Dockerfile # Fichier de construction de l'image Docker
│-- requirements.txt # Dépendances Python pour l'application
Pour commencer il faut créer le projet sur gitlab et envoyer le code sur le repo distant.
Ensuite il faut créer un fichier .gitlab-ci.yml au niveau de la racine du projet.
Fichier .gitlab-ci.yml#
stages:
- build
- build-docker
variables:
IMAGE_NAME: "flask-app-ci"
DOCKER_TAG: "latest"
GITLAB_REGISTRY: "$CI_REGISTRY_IMAGE/$IMAGE_NAME"
# Étape 1 : Build (sans Docker)
build:
stage: build
image: python:3.10
script:
- echo "===> Installation des dépendances Flask"
- pip install --no-cache-dir -r requirements.txt
- echo "===> Lancement de l'application pour vérification"
- python app/app.py &
- sleep 5
- echo "===> Build terminé avec succès"
# Étape 2 : Build avec Docker
build_docker:
stage: build-docker
image: docker:latest
services:
- docker:dind
before_script:
- echo "===> Connexion au Docker Hub"
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
- echo "===> Connexion au GitLab Container Registry"
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" $CI_REGISTRY --password-stdin
script:
- echo "===> Construction de l'image Docker"
- docker build -t $DOCKER_USERNAME/$IMAGE_NAME:$DOCKER_TAG -t $GITLAB_REGISTRY:$DOCKER_TAG .
- echo "===> Push de l'image vers Docker Hub"
- docker push $DOCKER_USERNAME/$IMAGE_NAME:$DOCKER_TAG
- echo "===> Push de l'image vers GitLab Container Registry"
- docker push $GITLAB_REGISTRY:$DOCKER_TAG
Explications détaillées#
Définition des étapes (stages)#
Le pipeline est divisé en deux étapes : - build : Construire et vérifier l’application sans Docker. - build-docker : Construire une image Docker et la pousser vers Docker Hub et GitLab Container Registry.
Variables globales#
Les variables permettent de centraliser certaines informations : - IMAGE_NAME : Nom de l’image Docker. - DOCKER_TAG : Tag de l’image Docker, par défaut latest. - GITLAB_REGISTRY : L’URL du container registry GitLab, automatiquement basée sur $CI_REGISTRY_IMAGE.
Étape 1 : Build sans Docker#
build:
stage: build
image: python:3.10
script:
- echo "===> Installation des dépendances Flask"
- pip install --no-cache-dir -r requirements.txt
- echo "===> Lancement de l'application pour vérification"
- python app/app.py &
- sleep 5
- echo "===> Build terminé avec succès"
- Image de base : Utilisation de l’image officielle Python 3.10.
- Installation des dépendances : Les paquets listés dans requirements.txt sont installés.
- Lancement de l’application :
- Le fichier app.py est lancé.
- La commande sleep 5 laisse le temps de vérifier que l’application démarre correctement.
- Validation : Un simple message confirme la fin de l’étape.
Étape 2 : Build avec Docker#
build_docker:
stage: build-docker
image: docker:latest
services:
- docker:dind
before_script:
- echo "===> Connexion au Docker Hub"
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
- echo "===> Connexion au GitLab Container Registry"
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" $CI_REGISTRY --password-stdin
script:
- echo "===> Construction de l'image Docker"
- docker build -t $DOCKER_USERNAME/$IMAGE_NAME:$DOCKER_TAG -t $GITLAB_REGISTRY:$DOCKER_TAG .
- echo "===> Push de l'image vers Docker Hub"
- docker push $DOCKER_USERNAME/$IMAGE_NAME:$DOCKER_TAG
- echo "===> Push de l'image vers GitLab Container Registry"
- docker push $GITLAB_REGISTRY:$DOCKER_TAG
- Services :
- docker:dind (Docker-in-Docker) permet d’exécuter des commandes Docker dans GitLab CI/CD.
- Connexion aux registries :
- Docker Hub : Connexion via $DOCKER_USERNAME et $DOCKER_PASSWORD (à définir dans les variables CI/CD).
- GitLab Container Registry : Connexion automatique avec $CI_REGISTRY_USER et $CI_REGISTRY_PASSWORD.
- Build multi-tags : L’image Docker est construite avec deux tags :
- $DOCKER_USERNAME/$IMAGE_NAME:$DOCKER_TAG pour Docker Hub.
- $GITLAB_REGISTRY:$DOCKER_TAG pour GitLab.
- Push de l’image : L’image est poussée vers :
- Docker Hub
- GitLab Container Registry
Prérequis#
- Variables CI/CD à configurer dans GitLab :
- DOCKER_USERNAME : Votre nom d’utilisateur Docker Hub.
- DOCKER_PASSWORD : Votre mot de passe ou token Docker Hub.

- GitLab Container Registry activé : GitLab fournit automatiquement les variables nécessaires (CI_REGISTRY, etc.).
Résultat attendu#
- Étape 1 : Vérification de l’application Flask sans Docker.

- Étape 2 : Construction d’une image Docker et push vers :
- Docker Hub : docker.io/
/flask-app-ci:latest

- GitLab Registry : registry.gitlab.com/
/flask-app-ci:latest
