Skip to content

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"
  1. Image de base : Utilisation de l’image officielle Python 3.10.
  2. Installation des dépendances : Les paquets listés dans requirements.txt sont installés.
  3. Lancement de l’application :
  4. Le fichier app.py est lancé.
  5. La commande sleep 5 laisse le temps de vérifier que l’application démarre correctement.
  6. 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
  1. Services :
  2. docker:dind (Docker-in-Docker) permet d’exécuter des commandes Docker dans GitLab CI/CD.
  3. Connexion aux registries :
  4. Docker Hub : Connexion via $DOCKER_USERNAME et $DOCKER_PASSWORD (à définir dans les variables CI/CD).
  5. GitLab Container Registry : Connexion automatique avec $CI_REGISTRY_USER et $CI_REGISTRY_PASSWORD.
  6. Build multi-tags : L’image Docker est construite avec deux tags :
  7. $DOCKER_USERNAME/$IMAGE_NAME:$DOCKER_TAG pour Docker Hub.
  8. $GITLAB_REGISTRY:$DOCKER_TAG pour GitLab.
  9. Push de l’image : L’image est poussée vers :
  10. Docker Hub
  11. GitLab Container Registry

Prérequis#

  1. Variables CI/CD à configurer dans GitLab :
  2. DOCKER_USERNAME : Votre nom d’utilisateur Docker Hub.
  3. DOCKER_PASSWORD : Votre mot de passe ou token Docker Hub.

Add Variables

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

Pipeline Result

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

Pipeline Result

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

Gitlab Docker Registry