Skip to content

Build d'une application Flask avec GitHub Actions#

flask-docker-githubactions

Objectif#

Ce Lab vise à : 1. Automatiser le build d'une application Flask via GitHub Actions. 2. Construire une image Docker de l'application Flask. 3. Pousser l'image Docker vers Docker Hub et GitHub Container Registry.

Prérequis#

  • Une application Flask conteneurisée avec un fichier Dockerfile.
  • Un compte Docker Hub.
  • Un repository GitHub pour héberger le projet Flask.
  • Une image Python de base et les dépendances Flask spécifiées dans un fichier requirements.txt.
  • Les secrets configurés dans GitHub :
  • DOCKER_USERNAME : votre identifiant Docker Hub.
  • DOCKER_PASSWORD : votre mot de passe Docker Hub.
  • GITHUB_TOKEN : votre token d'accès au GitHub Container Registry.

Étapes#

1. Créer le fichier GitHub Actions (.github/workflows/build.yml)#

Créez un fichier dans votre projet Flask sous le chemin suivant :
.github/workflows/build.yml.

build-workflow

Voici le contenu du fichier :

name: Build Flask Application

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    # Étape 1 : Checkout du code source
    - name: Checkout source code
      uses: actions/checkout@v4

    # Étape 2 : Installer Python et les dépendances
    - name: Set up Python environment
      uses: actions/setup-python@v4
      with:
        python-version: '3.10'

    - name: Install dependencies
      run: |
        pip install --no-cache-dir -r requirements.txt
        echo "Dependencies installed successfully."

    # Étape 3 : Lancer l'application pour vérification
    - name: Run application for verification
      run: |
        python app/app.py &
        sleep 5
        curl -f http://localhost:8000 || exit 1
        echo "Application started successfully."

    # Étape 4 : Run tests
    - name: Run tests
      run: |
        echo "Running the Tests"
        echo "Tests completed successfully."

  docker:
    runs-on: ubuntu-latest
    needs: build
    permissions:
      contents: read
      packages: write
    steps:
    # Étape 1 : Checkout du code source
    - name: Checkout source code
      uses: actions/checkout@v4

    # Étape 2 : Configuration Docker
    - name: Log in to Docker Hub
      run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

    - name: Log in to GitHub Container Registry
      run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin

    # Étape 3 : Build et tag de l'image Docker
    - name: Build Docker image
      run: |
        docker build -t ${{ secrets.DOCKER_USERNAME }}/flask-app:latest .
        docker tag ${{ secrets.DOCKER_USERNAME }}/flask-app:latest ghcr.io/${{ github.repository }}:latest

    # Étape 4 : Push de l'image vers Docker Hub
    - name: Push to Docker Hub
      run: docker push ${{ secrets.DOCKER_USERNAME }}/flask-app:latest

    # Étape 5 : Push de l'image vers GitHub Container Registry
    - name: Push to GitHub Container Registry
      run: docker push ghcr.io/${{ github.repository }}:latest

    # Étape 6 : Cleanup Docker resources
    #- name: Cleanup Docker resources
    #  run: |
    #    docker rmi ${{ secrets.DOCKER_USERNAME }}/flask-app:latest
    #    docker rmi ghcr.io/${{ github.repository }}:latest

Explications#

1. Triggers#

Le workflow est déclenché sur : - Un push sur la branche main. - Une pull request vers la branche main.

2. Étape de Build#

  • Vérifie le code source en exécutant le fichier app.py pour valider que l'application fonctionne.
  • Exécute des tests automatisés avec pytest.

3. Étape Docker#

  • Connexion à Docker Hub et GitHub Container Registry via des secrets stockés dans GitHub.
  • Construction de l'image Docker et assignation des tags nécessaires.
  • Push de l'image Docker :
  • Vers Docker Hub.
  • Vers le GitHub Container Registry.
  • Nettoyage des ressources Docker après le push.

flask-build-push-ci

Là on vois le build en cours.

result-on-docker-hub

A la fin on retrouve notre image au niveau de notre registry docker

result-on-ghcr

Et au niveau du registry interne de github


Conclusion#

Ce workflow GitHub Actions permet d'automatiser tout le processus de build et de push des images Docker. Il s'intègre parfaitement dans une chaîne CI/CD. Vous pouvez personnaliser ce workflow pour inclure d'autres étapes comme des scans de sécurité ou un déploiement automatique.