Aller au contenu

Quiz : CI/CD, les principes

100 Comprendre ⏱ 30 min ci-cd

Ce quiz valide le niveau 100 (Comprendre) des notions du cours CI/CD : les principes. Visez au moins 16 bonnes réponses sur 20 ; chaque réponse renvoie à la leçon à relire.

Intégrer en continu

1. Jez Humble pose trois questions pour savoir si une équipe pratique l'intégration continue. Laquelle ne fait pas partie du test ?

  • a) Chacun pousse sur la branche principale au moins une fois par jour
  • b) Chaque commit sur la branche principale déclenche construction et tests automatiques
  • c) La couverture de code dépasse 80 %
  • d) Une construction cassée est réparée en moins de dix minutes
Réponse

c. Le test de Humble porte sur l'intégration quotidienne, la vérification automatique de chaque commit, et la réparation immédiate d'une construction rouge. La couverture n'en fait pas partie. Leçon 1.

2. Deux branches modifient des lignes différentes de app.py, se fusionnent sans conflit, mais le programme ne fonctionne plus. Comment appelle-t-on cela, et qu'est-ce qui le révèle ?

Réponse

Un conflit sémantique. Git ne compare que du texte et ne le détecte pas ; seule l'exécution des tests sur le résultat de la fusion le révèle. Leçon 1.

3. Pourquoi le travail en petits lots est-il au cœur de l'intégration continue ?

  • a) Parce que les petits commits compilent plus vite
  • b) Parce qu'un petit changement se relit, se teste, se comprend quand il casse, et s'annule facilement
  • c) Parce que Git refuse les gros commits
  • d) Parce que cela augmente le nombre de commits, un bon indicateur
Réponse

b. La valeur vient de la petite taille du lot, pas de la vitesse brute. Un gros lot entremêle les conflits et rend le diagnostic difficile. Leçon 1.

4. Une branche de fonctionnalité ouverte depuis trois semaines, dans laquelle on fait régulièrement git pull origin main, est-elle de l'intégration continue ?

Réponse

Non. Récupérer main dans sa branche n'est qu'une demi-intégration : le travail de la branche reste invisible pour les autres, qui ne découvriront les conflits avec lui qu'à la fusion finale. Intégrer, c'est pousser son travail dans la branche principale. Leçon 1.

Anatomie d'un pipeline

5. Sur quoi un système de CI se fonde-t-il pour décider qu'une étape a réussi ou échoué ?

  • a) Sur la présence du mot « error » dans la sortie
  • b) Sur le code de sortie du processus (0 = succès)
  • c) Sur la durée de l'étape
  • d) Sur le nombre de lignes de journal
Réponse

b. Le système ne comprend pas la sortie ; il lit le code de sortie. C'est pourquoi un commande | tee fichier sans set -o pipefail, qui masque le code, rend le pipeline toujours vert. Leçon 2.

6. Quelle est la différence entre un artefact et un cache ?

Réponse

L'artefact est le résultat du commit (image, binaire, rapport) : le perdre oblige à reconstruire. Le cache n'est qu'un accélérateur (dépendances téléchargées) : le perdre ne fait que ralentir. Une étape ne doit jamais dépendre du contenu du cache pour être correcte. Leçon 2.

7. ruff==0.16.9 plutôt que ruff dans un pipeline : pourquoi épingler la version d'un outil ?

Réponse

Pour qu'une nouvelle version de l'outil ne change pas le comportement du pipeline sans changement de code. La version 0.16.0 de Ruff a fait passer son jeu de règles de 59 à 413 : les pipelines non épinglés sont devenus rouges du jour au lendemain. La mise à jour doit être un commit délibéré. Leçon 2.

8. Dans les plateformes de CI modernes, qui initie la communication entre l'agent et le serveur ?

  • a) Le serveur ouvre une connexion vers l'agent
  • b) L'agent ouvre une connexion sortante vers le serveur pour chercher du travail
  • c) Les deux ouvrent des connexions mutuelles permanentes
  • d) La communication passe par le dépôt Git
Réponse

b. C'est l'agent qui interroge le serveur (sondage régulier, ou connexion HTTPS longue). Un agent peut donc vivre dans un réseau privé sans aucun port entrant ouvert. Leçon 2.

Tests et qualité

9. Dans quel ordre placer ces étapes pour obtenir un retour rapide : tests de bout en bout (6 min), formatage (10 s), tests unitaires (1 min) ?

Réponse

Formatage, puis tests unitaires, puis bout en bout : ce qui est rapide et échoue souvent passe en premier (principe d'échec rapide). Inutile d'attendre six minutes pour apprendre qu'une ligne est mal formatée. Leçon 3.

10. L'analyse statique (Ruff) et les tests unitaires passent, mais l'application échoue contre un vrai PostgreSQL à cause d'un nom de colonne inexistant. Quelle famille de tests aurait dû l'attraper ?

  • a) Les tests unitaires, mieux écrits
  • b) Les tests d'intégration, contre un vrai PostgreSQL
  • c) L'analyse statique, avec plus de règles
  • d) Aucune : c'est inévitable
Réponse

b. Ni Ruff ni le mode mémoire ne connaissent le schéma SQL. Seul un test d'intégration, contre un vrai PostgreSQL éphémère, exerce le code qui parle à la base. Leçon 3.

11. Un test réussit quand on le lance seul et échoue quand on le lance après d'autres. De quelle catégorie d'instabilité s'agit-il, et comment la corriger ?

Réponse

Une dépendance à l'ordre des tests, causée par un état partagé non remis à zéro. On la corrige en remettant l'état à zéro avant chaque test (une fixture autouse qui vide la donnée partagée). L'ordre aléatoire avec graine affichée la révèle. Leçon 3.

12. La couverture de code d'un module est de 95 %. Que peut-on en conclure ?

  • a) Le module est bien testé
  • b) Le module n'a presque pas de bugs
  • c) Seulement que 5 % des lignes ne sont exécutées par aucun test
  • d) Que l'on peut supprimer les tests restants
Réponse

c. La couverture dit quel code n'est jamais exécuté, pas si ce qui est exécuté est vérifié (un test sans assertion couvre sans rien prouver). C'est une carte des zones non testées, pas une mesure de qualité. Leçon 3.

Livraison et déploiement continus

13. Quelle est la différence entre livraison continue et déploiement continu ?

Réponse

En livraison continue, la branche principale est déployable à tout moment et la mise en production est un geste humain unique. En déploiement continu, ce geste disparaît : chaque commit qui passe le pipeline part automatiquement en production. Le second suppose le premier. Leçon 4.

14. Pourquoi construit-on l'artefact une seule fois, plutôt que de le reconstruire pour la production ?

  • a) Pour économiser du temps de calcul
  • b) Parce qu'une reconstruction, même du même commit, peut différer (dépendance ou image de base mise à jour) : ce ne serait plus l'artefact testé
  • c) Parce que Docker interdit de reconstruire
  • d) Pour réduire la taille du registre
Réponse

b. Ce qui a été testé en recette doit être exactement ce qui tourne en production. On fait donc circuler le même artefact, désigné par son empreinte. Leçon 4.

15. Où doit vivre la configuration propre à un environnement (adresse de base, mot de passe, nom de l'environnement) ?

Réponse

Hors de l'artefact, fournie par l'environnement d'exécution. La version, elle, fait partie de l'artefact et y est figée à la construction. C'est le principe « build, release, run » de la méthode Twelve-Factor. Leçon 4.

16. Revenir en arrière après un déploiement défaillant consiste à redéployer l'artefact précédent. Dans quel cas cela ne suffit-il pas ?

Réponse

Quand la nouvelle version a modifié le schéma de données de façon incompatible (renommer une colonne) : l'ancienne version ne sait plus lire la base. Il faut alors découper le changement en étapes compatibles (changement parallèle, ou expand and contract). Leçon 4.

Sécuriser le pipeline

17. Un contributeur externe ouvre une demande de fusion qui modifie le pipeline pour afficher un secret. Comment s'appelle cette attaque, et quelle est la défense de principe ?

Réponse

Une demande de fusion empoisonnée (poisoned pipeline execution, PPE, ou pwn request). Défense : le code non relu ne voit jamais les secrets ; ceux-ci ne sont fournis qu'aux exécutions de la branche protégée, pas aux demandes de fusion venant d'un dépôt dupliqué. Leçon 5.

18. Pourquoi épingler une action ou une image de base par empreinte (@sha256:...) plutôt que par étiquette (@v44, :latest) ?

  • a) Pour télécharger plus vite
  • b) Parce qu'une étiquette peut être réécrite avec du code hostile, alors qu'une empreinte désigne un contenu immuable
  • c) Parce que les étiquettes sont dépréciées
  • d) Pour réduire la taille de l'image
Réponse

b. C'est la leçon de l'incident tj-actions (2025) : les dépôts qui suivaient une étiquette ont exécuté le code malveillant, ceux qui épinglaient par empreinte non. L'empreinte protège contre la réécriture d'une référence, pas contre une dépendance mauvaise dès le départ. Leçon 5.

19. Le masquage des secrets dans les journaux remplace la valeur du secret par ***. Peut-on s'y fier entièrement ?

Réponse

Non. Le masquage ne reconnaît que la valeur exacte déclarée ; un secret transformé (encodé en base64, découpé) passe au travers. C'est une défense de dernier recours : la seule garantie est de ne jamais exposer le secret. Un secret qui a pu fuiter doit être renouvelé. Leçon 5.

Mesurer avec DORA

20. Pourquoi ne regarde-t-on jamais un indicateur DORA de débit (fréquence de déploiement) sans un indicateur d'instabilité (taux d'échec) ?

Réponse

Parce qu'on « améliore » trivialement le débit en déployant n'importe quoi, au prix de l'instabilité, et inversement. La découverte de DORA est que vitesse et stabilité progressent ensemble quand les pratiques sont bonnes : on lit donc les deux familles ensemble. Et jamais comme un objectif (loi de Goodhart), ni pour classer des équipes. Leçon 6.

Et ensuite

Si vous visez le niveau 200, faites le lab : construire un serveur d'intégration continue. Les cours GitHub Actions et GitOps avec Argo CD du chapitre Livrer appliquent ces principes avec de vrais outils.

Plan du cours