Build d'une application Flask avec GitHub Actions#

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.

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

Là on vois le build en cours.

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

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.