4204d4

GitHub Action : Build et Push vers Docker Hub

1. Prérequis

A. Créer un compte Docker Hub

B. Créer un Access Token Docker Hub

  1. Connectez-vous à Docker Hub
  2. Allez dans Account Settings → Security
  3. Cliquez sur New Access Token
  4. Donnez un nom (ex: github-actions)
  5. Permissions : Read, Write, Delete
  6. Copiez le token généré (vous ne pourrez plus le voir après)

C. Ajouter les secrets dans GitHub

  1. Allez dans votre repo GitHub
  2. Settings → Secrets and variables → Actions
  3. Cliquez sur New repository secret
  4. Ajoutez deux secrets :
    • DOCKERHUB_USERNAME : votre username Docker Hub
    • DOCKERHUB_TOKEN : le token d’accès créé

2. Workflow de base (.github/workflows/docker-build.yml)

name: Build et Push Docker Image

on:
  push:
    branches: [ "main" ]
    tags:
      - 'v*'
  pull_request:
    branches: [ "main" ]
  workflow_dispatch:

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: $
          password: $
      
      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: $/mon-image
          tags: |
            type=ref,event=branch
            type=ref,event=pr
            type=semver,pattern=
            type=semver,pattern=.
            type=raw,value=latest,enable=
      
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: $
          labels: $
          cache-from: type=registry,ref=$/mon-image:buildcache
          cache-to: type=registry,ref=$/mon-image:buildcache,mode=max

3. Workflow avec plusieurs Dockerfiles

name: Build Multiple Docker Images

on:
  push:
    branches: [ "main" ]
  workflow_dispatch:

jobs:
  build-superminou:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: $
          password: $
      
      - name: Build and push SuperMinou
        uses: docker/build-push-action@v5
        with:
          context: ./superminou
          file: ./superminou/Dockerfile
          push: true
          tags: |
            $/superminou:latest
            $/superminou:$

  build-autre-app:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: $
          password: $
      
      - name: Build and push Autre App
        uses: docker/build-push-action@v5
        with:
          context: ./autre-app
          file: ./autre-app/Dockerfile
          push: true
          tags: $/autre-app:latest

4. Workflow avancé avec tests

name: Build, Test et Push Docker Image

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

env:
  IMAGE_NAME: $/mon-app

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      
      - name: Build image pour test
        uses: docker/build-push-action@v5
        with:
          context: .
          load: true
          tags: $:test
      
      - name: Test de l'image
        run: |
          docker run --rm $:test echo "Test réussi"
          # Ajoutez d'autres tests ici
      
      - name: Scan de sécurité avec Trivy
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: $:test
          format: 'table'
          exit-code: '1'
          ignore-unfixed: true
          severity: 'CRITICAL,HIGH'

  build-and-push:
    needs: test
    runs-on: ubuntu-latest
    if: github.event_name != 'pull_request'
    
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: $
          password: $
      
      - name: Extract metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: $
          tags: |
            type=ref,event=branch
            type=sha,prefix=-
            type=raw,value=latest,enable=
      
      - name: Build and push multi-platform
        uses: docker/build-push-action@v5
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: true
          tags: $
          labels: $
          cache-from: type=gha
          cache-to: type=gha,mode=max

5. Workflow déclenché par tags (versioning)

name: Release Docker Image

on:
  push:
    tags:
      - 'v*.*.*'

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: $
          password: $
      
      - name: Extract version from tag
        id: version
        run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
      
      - name: Build and push avec version
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: |
            $/mon-app:$
            $/mon-app:latest
      
      - name: Update Docker Hub description
        uses: peter-evans/dockerhub-description@v4
        with:
          username: $
          password: $
          repository: $/mon-app
          readme-filepath: ./README.md

6. Exemple avec build arguments

name: Build avec Arguments

on:
  push:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: $
          password: $
      
      - name: Build and push avec arguments
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: $/mon-app:latest
          build-args: |
            VERSION=$
            BUILD_DATE=$
            ENVIRONMENT=production

7. Structure de projet recommandée

mon-projet/
├── .github/
│   └── workflows/
│       └── docker-build.yml
├── app1/
│   ├── Dockerfile
│   └── src/
├── app2/
│   ├── Dockerfile
│   └── src/
├── .dockerignore
└── README.md

8. Fichier .dockerignore recommandé

.git
.github
.gitignore
README.md
.dockerignore
.env
.vscode
node_modules
*.log
.DS_Store

9. Utilisation après déploiement

Une fois l’image publiée, vous pouvez la télécharger :

# Pull l'image
docker pull votre-username/mon-app:latest

# Ou avec une version spécifique
docker pull votre-username/mon-app:v1.2.3

# Exécuter l'image
docker run -p 8080:80 votre-username/mon-app:latest

10. Exemple complet pour SuperMinou

name: Build SuperMinou

on:
  push:
    branches: [ "main" ]
    paths:
      - 'superminou/**'
      - '.github/workflows/superminou.yml'

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: $
          password: $
      
      - name: Build and push SuperMinou
        uses: docker/build-push-action@v5
        with:
          context: ./superminou
          file: ./superminou/Dockerfile
          push: true
          tags: |
            $/superminou:latest
            $/superminou:semaine08-labo2
          build-args: |
            PHP_VERSION=8.0.3

11. Troubleshooting

Erreur d’authentification

# Vérifiez que les secrets sont bien configurés
# Settings → Secrets → Actions

Image trop grosse

# Utilisez des images Alpine
FROM php:8.0-apache-alpine

# Multi-stage builds
FROM node:18 AS builder
# ... build steps
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html

Cache qui ne fonctionne pas

# Utilisez GitHub Actions cache
cache-from: type=gha
cache-to: type=gha,mode=max

12. Commandes utiles

# Tester localement le workflow
act push -s DOCKERHUB_USERNAME=xxx -s DOCKERHUB_TOKEN=xxx

# Voir les logs GitHub Actions
# Allez dans l'onglet "Actions" de votre repo

# Lister vos images sur Docker Hub
docker search votre-username

📚 Ressources