4.5 · CI : construire et pousser une image à chaque commit

Niveau 4 · Registres, fiabilité & CI

4.5CI : construire et pousser une image à chaque commit

Objectif : Automatiser build + push d'une image versionnée avec GitHub Actions.
Temps estimé : 13 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

L'essentiel en 30 secondes

  • La CI est la seule usine à images : à chaque push sur main, elle récupère le code, se connecte au registre et construit + pousse — fini les builds « à la main sur le portable ».
  • On tague SHA + version : l'empreinte du commit pour la traçabilité exacte, la version pour la lisibilité — la production déploie le SHA ou la version, jamais un alias mouvant.
  • Réflexe d'Idir : cache activé pour des builds rapides, identifiants en secrets du dépôt, jamais dans le fichier de workflow.

Mini-cas filé — Idir branche l'usine à images de son équipe

Idir, devops junior à Alger, en a assez des images construites à la main dont personne ne connaît le contenu : il écrit un workflow qui, à chaque push sur main, se connecte à GHCR via le token du dépôt, construit avec cache et pousse l'image taguée avec l'empreinte du commit. L'équipe tire ensuite l'image du commit exact. Dernier jalon du fil rouge : chaque commit donne une image déployable et traçable, sans intervention manuelle.

Dernier cas du fil rouge 4.1-4.5 — Idir boucle son niveau : publier, fiabiliser, exposer, sauvegarder, automatiser.

1. Le pipeline minimal qui change tout

À chaque push sur main : récupération du code, connexion au registre (secret du dépôt), build + push tagués. Plus aucun build « à la main sur le portable » : la CI est la seule usine à images — comme l'usine d'Idir, chaque image a une origine connue.

Et on ne versionne que le vert : un job de tests avant le build évite de pousser des images cassées.

2. Taguer intelligemment en CI

On pousse l'empreinte du commit (traçabilité exacte : cette image = ce code) + la version (lisible, sur tag git) + un alias de branche en développement. En production on déploie l'empreinte ou la version, jamais un alias mouvant — Idir peut ainsi redéployer exactement le commit validé.

Ne pousser que l'alias mouvant, c'est redevenir intraçable : le pipeline doit toujours produire au moins un tag exact.

3. Cache et secrets : les deux réglages

Le cache réutilise les couches entre les runs et divise les temps de build. Les identifiants vivent en secrets du dépôt, jamais dans le fichier de workflow. Un pipeline qui affiche un secret dans les logs est un pipeline à corriger d'urgence — puis on révoque le secret exposé.

Permission minimale : le job ne reçoit que les droits dont il a besoin (écriture des paquets, rien de plus).

Erreur d'interprétation fréquente : « Builder en local puis pousser vite fait, taguer seulement l'alias mouvant et mettre le token dans le fichier : c'est plus rapide ». Non. Le build local est irreproductible, l'alias mouvant seul est intraçable en production, et le token en clair dans le fichier fuit dès le premier partage. CI seule usine, tag exact systématique, secrets hors du fichier : c'est ce trio qui fait une usine fiable.
L'usine à images Commit, build caché, push tagué Push sur main Testspuis buildConnexion au registre Secretdu dépôtBuild + cache CouchesréutiliséesPush tagué exact Empreinte+ version
Commit, build caché, push tagué
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Idir écrit un workflow déclenché à chaque push sur main, avec un job de tests avant le build. 2) Le workflow se connecte à GHCR via le token stocké en secret du dépôt, avec des permissions minimales. 3) Il construit avec cache et pousse l'image taguée avec l'empreinte du commit (plus la version sur tag git). 4) L'équipe déploie l'empreinte exacte, jamais l'alias mouvant. Leçon : la CI build et pousse, le tag exact trace, les secrets restent hors du fichier.

🔎 Exemple concret — 🔎 Exemple concret — Workflow GitHub Actions minimal

L'usine d'Idir : connexion par token du dépôt, build + push de l'empreinte.

name: image
on:
  push:
    branches: [main]
jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      packages: write
    steps:
      - uses: actions/checkout@v4
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          push: true
          tags: ghcr.io/monequipe/app:${{ github.sha }}

Lecture : connexion par token automatique, build + push de l'empreinte du commit.

Leçon : chaque commit donne une image déployable et traçable.

Vocabulaire de la section

Pipeline
La CHAÎNE automatique : test, puis build, puis push (puis déploiement).

Exemple simple : À chaque push, l'usine d'Idir teste, construit et pousse sans intervention.

Ce que ce n'est pas : des commandes tapées à la main sur un portable.

Réflexe : répéter un build à la main : l'écrire en pipeline.

SHA
L'EMPREINTE du commit : tag de traçabilité exacte (cette image = ce code).

Exemple simple : Idir redéploie exactement l'image du commit validé.

Ce que ce n'est pas : un alias mouvant qui change de contenu.

Réflexe : production : déployer une empreinte ou une version, jamais un alias.

Secret CI
Variable SENSIBLE stockée dans le dépôt, masquée des logs et jamais écrite dans le fichier.

Exemple simple : Le token de registre d'Idir vit en secret, pas dans le workflow.

Ce que ce n'est pas : un mot de passe collé en clair dans le fichier.

Réflexe : identifiant en CI : secret du dépôt, toujours.

Usine unique
La CI SEULE produit les images déployées : origine connue, builds reproductibles.

Exemple simple : L'équipe d'Idir ne déploie que des images sorties du pipeline.

Ce que ce n'est pas : des images poussées « vite fait » depuis un portable.

Réflexe : image dont on ignore l'origine : interdire, passer par la CI.

En pratique — En pratique — Votre première usine

  1. Créez le workflow ci-dessus dans .github/workflows/image.yml.
  2. Poussez sur main et suivez le run (vert ?).
  3. Vérifiez l'image taguée dans les paquets du registre.
  4. Tirez-la et lancez-la : le commit tourne.
Chaque commit produit une image traçable, sans intervention manuelle.

Script prêt à dire — annoncer l'usine à l'équipe (30 s)

« C'est Idir : à chaque push sur main, la CI teste, construit avec cache et pousse l'image taguée avec l'empreinte du commit. Le token reste en secret du dépôt, jamais dans le fichier. On déploie l'empreinte exacte : fini les images dont personne ne connaît le contenu. »

À dire en revue : montrez le run vert et l'image du commit dans le registre.

Modèle copier-coller — workflow build + push (générique, valide)

name: image
on:
  push:
    branches: [main]
jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
    steps:
      - uses: actions/checkout@v4
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: ghcr.io/monequipe/app:${{ github.sha }}

Version lisible en plus

Comme Idir : empreinte du commit + version sur tag git — traçabilité exacte et lecture humaine.

Builds trop lents

Activer le cache entre runs : les couches inchangées sont réutilisées, les builds sont divisés.

Image cassée poussée

Ajouter le job de tests avant le build : on ne versionne que le vert.

Secret affiché en log

Corriger d'urgence, retirer tout affichage de débogage, puis révoquer et remplacer le secret exposé.

Prudence : Les tokens de registre en CI sont des secrets : stockez-les dans les secrets du dépôt, jamais en dur dans le workflow — et ne les affichez jamais dans les logs. Donnez au job les permissions minimales (écriture des paquets uniquement) et révoquez tout secret exposé avant de continuer.

✓ Bonnes pratiques

  • Tag exact systématique + version sur tag git.
  • Activer le cache des builds.
  • Secrets en secrets dépôt, jamais en clair.

✗ Pièges fréquents

  • Builder en local puis pousser « vite fait ».
  • Ne pousser que l'alias mouvant (intraçable).
  • Afficher un secret en echo de débogage.

Points clés à retenir

  • La CI build + pousse, pas le portable.
  • Empreinte = traçabilité, version = lisibilité.
  • Cache = builds rapides.
  • Secrets hors workflow, toujours.

Défi 48h — appliquez demain

Sur un vrai dépôt : créez le workflow, poussez sur main, vérifiez l'image taguée dans le registre puis lancez-la.

Checklist sortie de section
  • Je sais écrire un workflow build + push déclenché sur main.
  • Je sais taguer empreinte + version et déployer l'exact.
  • Je sais gérer secrets, cache et permissions minimales.
Auto-évaluation 1-5 : saurais-je dire quel commit a produit l'image de production ?mon workflow expose-t-il un secret quelque part ?

Questions fréquentes

Faut-il tester avant de builder ?

Oui : un job de tests avant le build évite de pousser des images cassées. On ne versionne que le vert.

Et le déploiement auto ?

Étape suivante : d'abord une usine fiable (build + push traçables), ensuite la livraison. Sans usine fiable, l'automatisation du déploiement ne fait qu'accélérer les erreurs.

Vérifiez votre compréhension

En CI, quel tag déployer en production ?

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 4Questions inédites et durcies pour valider vos acquis