Aller au contenu
English
English
CI/CD & Automatisation medium

Bien démarrer avec GitHub Actions : pipelines CI/CD et sécurité

Read this page in English

20 min de lecture

Avant de créer votre premier workflow, prenons le temps de comprendre ce qu'est un pipeline CI/CD, comment GitHub Actions fonctionne, et surtout pourquoi la sécurité doit être votre priorité dès le premier jour.

Imaginez que vous travaillez sur une application. À chaque modification du code, vous devez :

  1. Vérifier que le code compile et que les tests passent
  2. Construire l'application (créer un exécutable, une image Docker…)
  3. Déployer vers un environnement (staging, production…)

Faire tout ça à la main, c'est long, répétitif, et source d'erreurs. Un pipeline CI/CD automatise ces étapes.

  • CI (Continuous Integration) : À chaque modification, le code est automatiquement testé et intégré. On détecte les bugs très tôt.
  • CD (Continuous Delivery/Deployment) : Le code validé est automatiquement préparé (ou déployé) vers les environnements cibles.

L'idée : des petits changements fréquents, validés automatiquement, plutôt que des grosses releases risquées tous les mois.

Pour approfondir ces concepts indépendamment de l'outil, consultez le guide sur les pipelines CI/CD qui détaille l'histoire, les concepts et les enjeux de sécurité.

GitHub Actions est le service CI/CD intégré à GitHub. Quand quelque chose se passe sur votre dépôt (un push, une pull request, une release…), GitHub Actions peut automatiquement exécuter des tâches.

Pipeline CI/CD avec GitHub Actions

Concrètement :

  1. Un événement déclenche le pipeline (vous poussez du code)
  2. Un workflow définit quoi faire (tester, builder, déployer)
  3. Un runner exécute les tâches (une machine virtuelle fournie par GitHub)
  4. Un résultat est produit (succès/échec, artefacts, déploiement)

Les attaques sur les pipelines CI/CD ne relèvent plus du cas d'école. En mars 2025, la compromission de l'action tj-actions/changed-files a permis d'exfiltrer les secrets de milliers de dépôts en quelques heures. Le détail qui compte : l'attaquant a réécrit les tags de v1 à v45, si bien que les versions réputées les plus stables livraient elles aussi le code malveillant.

Quand vous écrivez actions/checkout@v4 derrière uses:, vous faites confiance à un tag Git, c'est-à-dire à une étiquette déplaçable. Le mainteneur du dépôt peut la faire pointer ailleurs quand il le veut, et rien dans votre code ne changera pour autant.

Tag mutable vs SHA immuable

Voici ce qui peut se passer :

  1. Vous utilisez actions/checkout@v4 dans votre workflow
  2. L'action fonctionne parfaitement pendant des mois
  3. Un attaquant compromet le compte du mainteneur
  4. Il déplace le tag v4 vers du code malveillant
  5. Votre prochain pipeline exécute le code de l'attaquant, sans que vous ayez rien changé

C'est exactement ce qui s'est passé avec tj-actions/changed-files.

Un SHA (Secure Hash Algorithm) est l'empreinte cryptographique d'un commit : elle se calcule à partir du contenu. Contrairement à un tag, elle est donc immuable, puisque modifier une seule ligne du code produit une autre empreinte, et votre workflow ne la trouverait plus.

SHA vs Tag

# ❌ DANGEREUX : tag mutable
- uses: actions/checkout@v4
# ✅ SÉCURISÉ : SHA épinglé
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

Le commentaire # v7.0.1 garde la trace de la version lisible derrière l'empreinte, sans quoi personne ne saurait dire ce qui est épinglé. Des outils comme Renovate et Dependabot savent mettre à jour ces SHA automatiquement en réécrivant le commentaire avec eux : il reste donc juste après chaque montée de version.

Dès votre premier workflow, adoptez ces pratiques :

1. Épingler les actions par SHA

# Toujours utiliser le SHA complet, pas le tag
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

2. Déclarer des permissions minimales

# Par défaut, un workflow a TROP de permissions
# Limitez explicitement au strict nécessaire
permissions:
contents: read # Lecture seule sur le code

3. Faire passer les secrets par env:

# ❌ Le secret devient un argument de commande, visible dans la liste des processus
- run: curl -H "Authorization: Bearer ${{ secrets.API_TOKEN }}" https://api.interne.lan/deploy
# ✅ Le secret entre par env: et ne quitte jamais l'environnement du step
- run: curl -H "Authorization: Bearer $API_TOKEN" https://api.interne.lan/deploy
env:
API_TOKEN: ${{ secrets.API_TOKEN }}

GitHub masque la valeur exacte d'un secret dans les journaux, quelle que soit la façon dont vous l'employez : les deux formes ci-dessus affichent ***. La différence est ailleurs, et elle est réelle : une valeur interpolée dans run: est écrite dans la ligne de commande du processus, donc lisible par tout ce qui tourne sur le runner. Le bloc env: l'y évite.

Maintenant que vous comprenez les enjeux, voici un exemple de workflow sécurisé pour une API Python :

.github/workflows/ci.yml
name: CI Pipeline
# Permissions minimales déclarées au niveau du workflow
permissions:
contents: read
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-24.04
steps:
# Actions épinglées par SHA
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Installer Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: '3.12'
- name: Installer les dépendances
run: pip install -r requirements.txt
- name: Lancer les tests
run: pytest

Trois choses méritent d'être relevées dans cet exemple, et ce sont exactement les trois réflexes vus plus haut :

  • il déclare permissions: contents: read, donc le jeton du workflow ne peut rien écrire ;
  • il épingle ses deux actions par SHA, avec la version en commentaire ;
  • il fait une seule chose, tester le code, ce qui le rend facile à relire.

Avant d'aller plus loin, voici le vocabulaire essentiel :

TermeDéfinitionExemple
WorkflowUn fichier YAML qui décrit votre pipeline.github/workflows/ci.yml
JobUn groupe de tâches qui s'exécutent sur la même machinetest, build, deploy
StepUne tâche individuelle dans un job« Installer Python », « Lancer pytest »
RunnerLa machine (VM) qui exécute le jobubuntu-24.04, windows-2025
ActionUn composant réutilisable (comme une bibliothèque)actions/checkout, actions/setup-python
SHAIdentifiant unique et immuable d'un commit3d3c42e5aac5ba805825da76410c181273ba90b1

Cette section Fondations vous donne les bases pour créer et comprendre vos premiers workflows en toute sécurité :

Vous disposez maintenant du vocabulaire et des réflexes qui rendent la suite lisible :

  • ce qu'est un pipeline CI/CD, et ce qu'il automatise réellement ;
  • comment GitHub Actions s'insère dans votre façon de travailler ;
  • pourquoi la sécurité se pose dès le premier workflow, et pas après ;
  • les trois réflexes : épingler par SHA, restreindre les permissions, faire passer les secrets par env:.

Passez au guide Qu'est-ce qu'un workflow ? pour découvrir la structure des fichiers et créer votre premier pipeline.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens ce site gratuitement, sans publicité, sans profilage et sans compte à créer. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn