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 SettingsSecurity
  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. SettingsSecrets and variablesActions
  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