[{"data":1,"prerenderedAt":880},["ShallowReactive",2],{"search-api":-1,"listing-tag-Continuous Integration-page-1":3},[4],{"_path":5,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9,"description":10,"id":11,"date":12,"listed":13,"nocomments":7,"hidden":7,"categories":14,"tags":15,"--cover":20,"readingTime":21,"body":26,"_type":874,"_id":875,"_source":876,"_file":877,"_stem":878,"_extension":879},"/fr/pratiques-agiles/continuous-integration-fondamentaux","pratiques-agiles",false,"","Continuous Integration : les 5 fondamentaux non-négociables","Avoir Jenkins ou GitHub Actions n'est pas faire de la CI. La vraie CI implique des pratiques humaines que l'outil seul ne peut pas imposer.",27,"2026-03-06",true,[6],[16,17,18,19],"Continuous Integration","CI/CD","Pipeline","Qualité","covers/articles/continuous-integration-fondamentaux.jpg",{"text":22,"minutes":23,"time":24,"words":25},"9 min read",8.17,490200,1634,{"type":27,"children":28,"toc":864},"root",[29,37,43,48,53,58,63,67,74,79,90,100,110,115,118,124,129,134,139,283,288,291,297,302,307,312,597,610,613,619,624,629,634,639,642,648,653,658,663,666,672,686,691,730,735,738,744,749,754,767,770,776,791,804,817,830,843,846,858],{"type":30,"tag":31,"props":32,"children":34},"element","h1",{"id":33},"continuous-integration-les-5-fondamentaux-non-négociables",[35],{"type":36,"value":9},"text",{"type":30,"tag":38,"props":39,"children":40},"p",{},[41],{"type":36,"value":42},"Dans un client dans l'édition logicielle que j'accompagnais (15 développeurs, produit financier B2B), le pipeline CI durait 28 minutes. Les branches vivaient en moyenne 4 jours avant d'être mergées. L'équipe avait GitHub Actions configuré depuis 18 mois. Elle pensait pratiquer la Continuous Integration.",{"type":30,"tag":38,"props":44,"children":45},{},[46],{"type":36,"value":47},"Elle pratiquait le contraire.",{"type":30,"tag":38,"props":49,"children":50},{},[51],{"type":36,"value":52},"Les merges de longues branches généraient des conflits quotidiens. Les builds rouges duraient parfois 6 heures avant d'être corrigés. Et les développeurs avaient arrêté de regarder les alertes du pipeline depuis longtemps : trop de faux positifs, trop de délai entre le commit et le feedback.",{"type":30,"tag":38,"props":54,"children":55},{},[56],{"type":36,"value":57},"La Continuous Integration est une discipline humaine autant qu'une infrastructure technique. La plupart des équipes ont l'outil, et pratiquent le contraire de la CI sans le savoir.",{"type":30,"tag":38,"props":59,"children":60},{},[61],{"type":36,"value":62},"La définition originale vient de Kent Beck (Extreme Programming, 1999) et Martin Fowler : intégrer ses changements dans la branche principale plusieurs fois par jour. Pas une fois par semaine lors de la \"merge PR\". Plusieurs fois par jour. Selon les recherches DORA, les équipes qui pratiquent la vraie CI ont un lead time 4 fois inférieur et un taux d'échec de déploiement 3 fois plus bas. Ce n'est pas l'outil qui fait la différence : c'est la discipline.",{"type":30,"tag":64,"props":65,"children":66},"hr",{},[],{"type":30,"tag":68,"props":69,"children":71},"h2",{"id":70},"ce-que-la-ci-nest-pas",[72],{"type":36,"value":73},"Ce que la CI n'est pas",{"type":30,"tag":38,"props":75,"children":76},{},[77],{"type":36,"value":78},"Trois confusions fréquentes méritent d'être clarifiées avant d'aller plus loin.",{"type":30,"tag":38,"props":80,"children":81},{},[82,88],{"type":30,"tag":83,"props":84,"children":85},"strong",{},[86],{"type":36,"value":87},"La CI n'est pas un pipeline de build automatisé.",{"type":36,"value":89}," Lancer des tests automatiquement à chaque push n'est pas de la CI si les branches durent 2 semaines avant d'être mergées. L'automatisation sans intégration fréquente, c'est du quality assurance sur des changements isolés.",{"type":30,"tag":38,"props":91,"children":92},{},[93,98],{"type":30,"tag":83,"props":94,"children":95},{},[96],{"type":36,"value":97},"La CI n'est pas un gating de qualité.",{"type":36,"value":99}," Utiliser le pipeline pour bloquer les PRs avec des tests qui échouent est utile, mais c'est de l'assurance qualité, pas de la CI au sens strict.",{"type":30,"tag":38,"props":101,"children":102},{},[103,108],{"type":30,"tag":83,"props":104,"children":105},{},[106],{"type":36,"value":107},"La CI n'est pas une histoire de fréquence de déploiement.",{"type":36,"value":109}," Déployer souvent (CD) est différent d'intégrer souvent (CI). On peut déployer une fois par jour depuis une branche de longue durée : ce n'est pas de la CI.",{"type":30,"tag":38,"props":111,"children":112},{},[113],{"type":36,"value":114},"La définition précise de Martin Fowler : \"Continuous Integration is a practice where members of a team merge their work frequently, usually each person merges at least daily.\" L'accent est sur la fréquence d'intégration, pas sur l'automatisation.",{"type":30,"tag":64,"props":116,"children":117},{},[],{"type":30,"tag":68,"props":119,"children":121},{"id":120},"fondamental-1-intégrer-dans-le-trunk-au-moins-une-fois-par-jour",[122],{"type":36,"value":123},"Fondamental 1 : Intégrer dans le trunk au moins une fois par jour",{"type":30,"tag":38,"props":125,"children":126},{},[127],{"type":36,"value":128},"Chaque développeur intègre son code dans la branche principale (main, master, trunk) au moins une fois toutes les 24 heures.",{"type":30,"tag":38,"props":130,"children":131},{},[132],{"type":36,"value":133},"Ce qui rend cela difficile : ça suppose que chaque commit soit dans un état qui ne casse pas la branche principale. Ce qui implique des feature flags pour les fonctionnalités incomplètes, et une culture de \"never break the trunk\".",{"type":30,"tag":38,"props":135,"children":136},{},[137],{"type":36,"value":138},"Les feature flags permettent d'intégrer du code incomplet sans l'exposer aux utilisateurs. C'est le mécanisme qui rend la CI viable pour des fonctionnalités qui prennent plus d'une journée :",{"type":30,"tag":140,"props":141,"children":145},"pre",{"className":142,"code":143,"language":144,"meta":8,"style":8},"language-python shiki shiki-themes catppuccin-frappe github-dark","# La fonctionnalité n'est pas terminée mais le code est intégré\nif feature_flags.is_enabled('new_checkout_flow', user):\n    return new_checkout_flow(request)\nelse:\n    return legacy_checkout_flow(request)\n","python",[146],{"type":30,"tag":147,"props":148,"children":149},"code",{"__ignoreMap":8},[150,162,216,244,258],{"type":30,"tag":151,"props":152,"children":155},"span",{"class":153,"line":154},"line",1,[156],{"type":30,"tag":151,"props":157,"children":159},{"style":158},"--shiki-default:#737994;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit",[160],{"type":36,"value":161},"# La fonctionnalité n'est pas terminée mais le code est intégré\n",{"type":30,"tag":151,"props":163,"children":165},{"class":153,"line":164},2,[166,172,178,184,190,195,201,206,211],{"type":30,"tag":151,"props":167,"children":169},{"style":168},"--shiki-default:#CA9EE6;--shiki-dark:#F97583",[170],{"type":36,"value":171},"if",{"type":30,"tag":151,"props":173,"children":175},{"style":174},"--shiki-default:#C6D0F5;--shiki-dark:#E1E4E8",[176],{"type":36,"value":177}," feature_flags",{"type":30,"tag":151,"props":179,"children":181},{"style":180},"--shiki-default:#949CBB;--shiki-dark:#E1E4E8",[182],{"type":36,"value":183},".",{"type":30,"tag":151,"props":185,"children":187},{"style":186},"--shiki-default:#8CAAEE;--shiki-dark:#E1E4E8",[188],{"type":36,"value":189},"is_enabled",{"type":30,"tag":151,"props":191,"children":192},{"style":180},[193],{"type":36,"value":194},"(",{"type":30,"tag":151,"props":196,"children":198},{"style":197},"--shiki-default:#A6D189;--shiki-dark:#9ECBFF",[199],{"type":36,"value":200},"'new_checkout_flow'",{"type":30,"tag":151,"props":202,"children":203},{"style":180},[204],{"type":36,"value":205},",",{"type":30,"tag":151,"props":207,"children":208},{"style":174},[209],{"type":36,"value":210}," user",{"type":30,"tag":151,"props":212,"children":213},{"style":180},[214],{"type":36,"value":215},"):\n",{"type":30,"tag":151,"props":217,"children":219},{"class":153,"line":218},3,[220,225,230,234,239],{"type":30,"tag":151,"props":221,"children":222},{"style":168},[223],{"type":36,"value":224},"    return",{"type":30,"tag":151,"props":226,"children":227},{"style":186},[228],{"type":36,"value":229}," new_checkout_flow",{"type":30,"tag":151,"props":231,"children":232},{"style":180},[233],{"type":36,"value":194},{"type":30,"tag":151,"props":235,"children":236},{"style":174},[237],{"type":36,"value":238},"request",{"type":30,"tag":151,"props":240,"children":241},{"style":180},[242],{"type":36,"value":243},")\n",{"type":30,"tag":151,"props":245,"children":247},{"class":153,"line":246},4,[248,253],{"type":30,"tag":151,"props":249,"children":250},{"style":168},[251],{"type":36,"value":252},"else",{"type":30,"tag":151,"props":254,"children":255},{"style":180},[256],{"type":36,"value":257},":\n",{"type":30,"tag":151,"props":259,"children":261},{"class":153,"line":260},5,[262,266,271,275,279],{"type":30,"tag":151,"props":263,"children":264},{"style":168},[265],{"type":36,"value":224},{"type":30,"tag":151,"props":267,"children":268},{"style":186},[269],{"type":36,"value":270}," legacy_checkout_flow",{"type":30,"tag":151,"props":272,"children":273},{"style":180},[274],{"type":36,"value":194},{"type":30,"tag":151,"props":276,"children":277},{"style":174},[278],{"type":36,"value":238},{"type":30,"tag":151,"props":280,"children":281},{"style":180},[282],{"type":36,"value":243},{"type":30,"tag":38,"props":284,"children":285},{},[286],{"type":36,"value":287},"Le signal d'alerte est simple : si vos branches vivent plus de 2 jours, vous ne pratiquez pas la CI : vous faites du \"integrate when done.\"",{"type":30,"tag":64,"props":289,"children":290},{},[],{"type":30,"tag":68,"props":292,"children":294},{"id":293},"fondamental-2-le-pipeline-de-build-doit-passer-en-moins-de-10-minutes",[295],{"type":36,"value":296},"Fondamental 2 : Le pipeline de build doit passer en moins de 10 minutes",{"type":30,"tag":38,"props":298,"children":299},{},[300],{"type":36,"value":301},"Si le feedback du pipeline prend plus de 10 minutes, les développeurs arrêtent d'attendre le résultat avant de passer à la tâche suivante. Le feedback loop se rompt.",{"type":30,"tag":38,"props":303,"children":304},{},[305],{"type":36,"value":306},"Cette règle vient des recherches sur la productivité des développeurs : au-delà de 10 minutes, le développeur a changé de contexte mental. Quand le pipeline échoue 15 minutes plus tard, le coût de retour au contexte est élevé.",{"type":30,"tag":38,"props":308,"children":309},{},[310],{"type":36,"value":311},"Pour maintenir un pipeline sous 10 minutes : tests unitaires en parallèle, tests d'intégration sélectifs basés sur les changements, cache agressif des dépendances, et séparation en stages, avec un fast feedback en moins de 5 minutes et un slow feedback déclenché séparément.",{"type":30,"tag":140,"props":313,"children":317},{"className":314,"code":315,"language":316,"meta":8,"style":8},"language-yaml shiki shiki-themes catppuccin-frappe github-dark","# GitHub Actions — jobs parallèles\njobs:\n  unit-tests:\n    runs-on: ubuntu-latest\n    steps:\n      - run: npm run test:unit    # \u003C 3 min\n\n  lint-typecheck:\n    runs-on: ubuntu-latest\n    steps:\n      - run: npm run lint && npm run typecheck    # \u003C 2 min\n\n  integration-tests:\n    needs: [unit-tests]    # Seulement si les unit tests passent\n    runs-on: ubuntu-latest\n    steps:\n      - run: npm run test:integration    # \u003C 10 min\n","yaml",[318],{"type":30,"tag":147,"props":319,"children":320},{"__ignoreMap":8},[321,329,343,355,373,385,413,422,435,451,463,489,497,510,543,559,571],{"type":30,"tag":151,"props":322,"children":323},{"class":153,"line":154},[324],{"type":30,"tag":151,"props":325,"children":326},{"style":158},[327],{"type":36,"value":328},"# GitHub Actions — jobs parallèles\n",{"type":30,"tag":151,"props":330,"children":331},{"class":153,"line":164},[332,338],{"type":30,"tag":151,"props":333,"children":335},{"style":334},"--shiki-default:#8CAAEE;--shiki-dark:#85E89D",[336],{"type":36,"value":337},"jobs",{"type":30,"tag":151,"props":339,"children":341},{"style":340},"--shiki-default:#81C8BE;--shiki-dark:#E1E4E8",[342],{"type":36,"value":257},{"type":30,"tag":151,"props":344,"children":345},{"class":153,"line":218},[346,351],{"type":30,"tag":151,"props":347,"children":348},{"style":334},[349],{"type":36,"value":350},"  unit-tests",{"type":30,"tag":151,"props":352,"children":353},{"style":340},[354],{"type":36,"value":257},{"type":30,"tag":151,"props":356,"children":357},{"class":153,"line":246},[358,363,368],{"type":30,"tag":151,"props":359,"children":360},{"style":334},[361],{"type":36,"value":362},"    runs-on",{"type":30,"tag":151,"props":364,"children":365},{"style":340},[366],{"type":36,"value":367},":",{"type":30,"tag":151,"props":369,"children":370},{"style":197},[371],{"type":36,"value":372}," ubuntu-latest\n",{"type":30,"tag":151,"props":374,"children":375},{"class":153,"line":260},[376,381],{"type":30,"tag":151,"props":377,"children":378},{"style":334},[379],{"type":36,"value":380},"    steps",{"type":30,"tag":151,"props":382,"children":383},{"style":340},[384],{"type":36,"value":257},{"type":30,"tag":151,"props":386,"children":388},{"class":153,"line":387},6,[389,394,399,403,408],{"type":30,"tag":151,"props":390,"children":391},{"style":180},[392],{"type":36,"value":393},"      -",{"type":30,"tag":151,"props":395,"children":396},{"style":334},[397],{"type":36,"value":398}," run",{"type":30,"tag":151,"props":400,"children":401},{"style":340},[402],{"type":36,"value":367},{"type":30,"tag":151,"props":404,"children":405},{"style":197},[406],{"type":36,"value":407}," npm run test:unit",{"type":30,"tag":151,"props":409,"children":410},{"style":158},[411],{"type":36,"value":412},"    # \u003C 3 min\n",{"type":30,"tag":151,"props":414,"children":416},{"class":153,"line":415},7,[417],{"type":30,"tag":151,"props":418,"children":419},{"emptyLinePlaceholder":13},[420],{"type":36,"value":421},"\n",{"type":30,"tag":151,"props":423,"children":425},{"class":153,"line":424},8,[426,431],{"type":30,"tag":151,"props":427,"children":428},{"style":334},[429],{"type":36,"value":430},"  lint-typecheck",{"type":30,"tag":151,"props":432,"children":433},{"style":340},[434],{"type":36,"value":257},{"type":30,"tag":151,"props":436,"children":438},{"class":153,"line":437},9,[439,443,447],{"type":30,"tag":151,"props":440,"children":441},{"style":334},[442],{"type":36,"value":362},{"type":30,"tag":151,"props":444,"children":445},{"style":340},[446],{"type":36,"value":367},{"type":30,"tag":151,"props":448,"children":449},{"style":197},[450],{"type":36,"value":372},{"type":30,"tag":151,"props":452,"children":454},{"class":153,"line":453},10,[455,459],{"type":30,"tag":151,"props":456,"children":457},{"style":334},[458],{"type":36,"value":380},{"type":30,"tag":151,"props":460,"children":461},{"style":340},[462],{"type":36,"value":257},{"type":30,"tag":151,"props":464,"children":466},{"class":153,"line":465},11,[467,471,475,479,484],{"type":30,"tag":151,"props":468,"children":469},{"style":180},[470],{"type":36,"value":393},{"type":30,"tag":151,"props":472,"children":473},{"style":334},[474],{"type":36,"value":398},{"type":30,"tag":151,"props":476,"children":477},{"style":340},[478],{"type":36,"value":367},{"type":30,"tag":151,"props":480,"children":481},{"style":197},[482],{"type":36,"value":483}," npm run lint && npm run typecheck",{"type":30,"tag":151,"props":485,"children":486},{"style":158},[487],{"type":36,"value":488},"    # \u003C 2 min\n",{"type":30,"tag":151,"props":490,"children":492},{"class":153,"line":491},12,[493],{"type":30,"tag":151,"props":494,"children":495},{"emptyLinePlaceholder":13},[496],{"type":36,"value":421},{"type":30,"tag":151,"props":498,"children":500},{"class":153,"line":499},13,[501,506],{"type":30,"tag":151,"props":502,"children":503},{"style":334},[504],{"type":36,"value":505},"  integration-tests",{"type":30,"tag":151,"props":507,"children":508},{"style":340},[509],{"type":36,"value":257},{"type":30,"tag":151,"props":511,"children":513},{"class":153,"line":512},14,[514,519,523,528,533,538],{"type":30,"tag":151,"props":515,"children":516},{"style":334},[517],{"type":36,"value":518},"    needs",{"type":30,"tag":151,"props":520,"children":521},{"style":340},[522],{"type":36,"value":367},{"type":30,"tag":151,"props":524,"children":525},{"style":180},[526],{"type":36,"value":527}," [",{"type":30,"tag":151,"props":529,"children":530},{"style":197},[531],{"type":36,"value":532},"unit-tests",{"type":30,"tag":151,"props":534,"children":535},{"style":180},[536],{"type":36,"value":537},"]",{"type":30,"tag":151,"props":539,"children":540},{"style":158},[541],{"type":36,"value":542},"    # Seulement si les unit tests passent\n",{"type":30,"tag":151,"props":544,"children":546},{"class":153,"line":545},15,[547,551,555],{"type":30,"tag":151,"props":548,"children":549},{"style":334},[550],{"type":36,"value":362},{"type":30,"tag":151,"props":552,"children":553},{"style":340},[554],{"type":36,"value":367},{"type":30,"tag":151,"props":556,"children":557},{"style":197},[558],{"type":36,"value":372},{"type":30,"tag":151,"props":560,"children":562},{"class":153,"line":561},16,[563,567],{"type":30,"tag":151,"props":564,"children":565},{"style":334},[566],{"type":36,"value":380},{"type":30,"tag":151,"props":568,"children":569},{"style":340},[570],{"type":36,"value":257},{"type":30,"tag":151,"props":572,"children":574},{"class":153,"line":573},17,[575,579,583,587,592],{"type":30,"tag":151,"props":576,"children":577},{"style":180},[578],{"type":36,"value":393},{"type":30,"tag":151,"props":580,"children":581},{"style":334},[582],{"type":36,"value":398},{"type":30,"tag":151,"props":584,"children":585},{"style":340},[586],{"type":36,"value":367},{"type":30,"tag":151,"props":588,"children":589},{"style":197},[590],{"type":36,"value":591}," npm run test:integration",{"type":30,"tag":151,"props":593,"children":594},{"style":158},[595],{"type":36,"value":596},"    # \u003C 10 min\n",{"type":30,"tag":598,"props":599,"children":604},"cta",{"cta":600,"href":601,"title":602,"type":603},"Réserver mon diagnostic gratuit →","https://app.kamanga.fr/forms/discovery-call","Votre pipeline CI dépasse les 15 minutes et les développeurs ont arrêté de le surveiller ?","call",[605],{"type":30,"tag":38,"props":606,"children":607},{},[608],{"type":36,"value":609},"Un pipeline qui dérive vers 20-30 minutes nécessite un audit de la structure des tests et des stages. En 30 minutes, j'identifie les goulots d'étranglement et je vous donne une stratégie de réduction à moins de 10 minutes, applicable dès le sprint suivant.",{"type":30,"tag":64,"props":611,"children":612},{},[],{"type":30,"tag":68,"props":614,"children":616},{"id":615},"fondamental-3-les-tests-cassés-sont-la-priorité-absolue",[617],{"type":36,"value":618},"Fondamental 3 : Les tests cassés sont la priorité absolue",{"type":30,"tag":38,"props":620,"children":621},{},[622],{"type":36,"value":623},"Quand le pipeline est rouge, réparer le trunk est la priorité numéro un de toute l'équipe, avant les nouvelles features, avant les code reviews en attente, avant les réunions.",{"type":30,"tag":38,"props":625,"children":626},{},[627],{"type":36,"value":628},"Cette règle s'appelle le \"stop the line\", empruntée au Toyota Production System (Jidoka). Dans le TPS, quand un problème est détecté sur la ligne de production, la ligne s'arrête jusqu'à ce que le problème soit résolu. En CI, le trunk cassé est la ligne arrêtée.",{"type":30,"tag":38,"props":630,"children":631},{},[632],{"type":36,"value":633},"En pratique : pipeline rouge → alerte immédiate à toute l'équipe via Slack et dashboard. La personne qui a cassé le trunk a 10 minutes pour proposer un fix ou reverter. Si pas de fix en 10 minutes : revert automatique ou manuel. Pas de nouveaux commits sur trunk tant qu'il est rouge.",{"type":30,"tag":38,"props":635,"children":636},{},[637],{"type":36,"value":638},"Ce qui arrive sans cette règle : les builds cassés s'accumulent, les développeurs ignorent les alertes, et le pipeline devient du décor plutôt qu'un signal utile. J'ai vu des équipes avec un pipeline rouge depuis 3 semaines : tout le monde avait arrêté de regarder.",{"type":30,"tag":64,"props":640,"children":641},{},[],{"type":30,"tag":68,"props":643,"children":645},{"id":644},"fondamental-4-tout-le-monde-voit-létat-du-pipeline",[646],{"type":36,"value":647},"Fondamental 4 : Tout le monde voit l'état du pipeline",{"type":30,"tag":38,"props":649,"children":650},{},[651],{"type":36,"value":652},"L'état du pipeline doit être visible passivement par toute l'équipe, pas seulement quand quelqu'un pense à aller le vérifier.",{"type":30,"tag":38,"props":654,"children":655},{},[656],{"type":36,"value":657},"Les mécanismes de visibilité : dashboard de build sur un écran visible dans l'espace de travail, notification Slack dans le canal de l'équipe (pas seulement à la personne qui a pushé), badge de statut sur le README du repo, statut visible dans l'IDE.",{"type":30,"tag":38,"props":659,"children":660},{},[661],{"type":36,"value":662},"La différence entre \"notification opt-in\" et \"visibilité passive\" est fondamentale : si le développeur doit aller chercher l'information, il ne le fera pas systématiquement. La visibilité passive crée une conscience collective de l'état de la CI sans effort individuel.",{"type":30,"tag":64,"props":664,"children":665},{},[],{"type":30,"tag":68,"props":667,"children":669},{"id":668},"fondamental-5-les-tests-sont-la-définition-de-trunk-en-bonne-santé",[670],{"type":36,"value":671},"Fondamental 5 : Les tests sont la définition de \"trunk en bonne santé\"",{"type":30,"tag":38,"props":673,"children":674},{},[675,677,684],{"type":36,"value":676},"Les tests automatisés définissent ce que \"trunk en bonne santé\" signifie : intégrez ce critère dans votre ",{"type":30,"tag":678,"props":679,"children":681},"a",{"href":680},"/fr/dette-technique/definition-of-done-qualite",[682],{"type":36,"value":683},"Definition of Done",{"type":36,"value":685},". Si un comportement n'est pas testé, la CI ne peut pas le protéger.",{"type":30,"tag":38,"props":687,"children":688},{},[689],{"type":36,"value":690},"La pyramide de tests en CI définit la structure optimale :",{"type":30,"tag":692,"props":693,"children":694},"ul",{},[695,706,720],{"type":30,"tag":696,"props":697,"children":698},"li",{},[699,704],{"type":30,"tag":83,"props":700,"children":701},{},[702],{"type":36,"value":703},"Tests unitaires",{"type":36,"value":705}," (70-80% des tests) : rapides, sans dépendances externes. Feedback en moins de 2 minutes.",{"type":30,"tag":696,"props":707,"children":708},{},[709,718],{"type":30,"tag":83,"props":710,"children":711},{},[712],{"type":30,"tag":678,"props":713,"children":715},{"href":714},"/fr/dette-technique/tests-integration-legacy-pieges",[716],{"type":36,"value":717},"Tests d'intégration",{"type":36,"value":719}," (15-20% des tests) : avec base de données ou services externes. Feedback en moins de 8 minutes.",{"type":30,"tag":696,"props":721,"children":722},{},[723,728],{"type":30,"tag":83,"props":724,"children":725},{},[726],{"type":36,"value":727},"Tests end-to-end",{"type":36,"value":729}," (5-10% des tests) : sur les flux critiques uniquement. Déclenchés moins fréquemment.",{"type":30,"tag":38,"props":731,"children":732},{},[733],{"type":36,"value":734},"Un pipeline vert ne garantit pas que le logiciel est correct : il garantit qu'il est cohérent avec ses tests. La qualité des tests détermine la qualité du signal.",{"type":30,"tag":64,"props":736,"children":737},{},[],{"type":30,"tag":68,"props":739,"children":741},{"id":740},"ce-que-ça-change-concrètement",[742],{"type":36,"value":743},"Ce que ça change concrètement",{"type":30,"tag":38,"props":745,"children":746},{},[747],{"type":36,"value":748},"Dans l'équipe mentionnée en introduction, après 6 semaines de travail sur les 5 fondamentaux (parallélisation des tests, feature flags systématiques, règle du stop the line, dashboard visible, refonte de la pyramide de tests), le résultat était mesurable. Le pipeline est passé de 28 minutes à 8 minutes. La durée des branches est passée de 4 jours à 18 heures. Le lead time de delivery a baissé de 40%.",{"type":30,"tag":38,"props":750,"children":751},{},[752],{"type":36,"value":753},"Aucun recrutement. Aucun changement de framework. Seulement des pratiques humaines appliquées avec discipline.",{"type":30,"tag":38,"props":755,"children":756},{},[757,759,765],{"type":36,"value":758},"Les métriques de maturité CI à suivre (ces indicateurs font partie des ",{"type":30,"tag":678,"props":760,"children":762},{"href":761},"/fr/management/metriques-management-developpeurs-motivation",[763],{"type":36,"value":764},"4 métriques DORA",{"type":36,"value":766},") : fréquence d'intégration par développeur (cible : plus de 2 fois par jour), MTTR du pipeline en cas de rupture (cible : moins de 30 minutes), durée du pipeline en p95 (cible : moins de 10 minutes), taux de flakiness des tests (cible : moins de 5%).",{"type":30,"tag":64,"props":768,"children":769},{},[],{"type":30,"tag":68,"props":771,"children":773},{"id":772},"faq-sur-la-continuous-integration",[774],{"type":36,"value":775},"FAQ sur la Continuous Integration",{"type":30,"tag":777,"props":778,"children":779},"details",{},[780,786],{"type":30,"tag":781,"props":782,"children":783},"summary",{},[784],{"type":36,"value":785},"1. Quelle est la différence entre CI et CD (Continuous Delivery / Deployment) ?",{"type":30,"tag":38,"props":787,"children":788},{},[789],{"type":36,"value":790},"La CI est l'intégration fréquente du code dans le trunk avec vérification automatique. La CD (Delivery) est la capacité à déployer n'importe quel commit en production de façon fiable à tout moment. La CD (Deployment) est le déploiement automatique de chaque commit qui passe la CI. La CI est un prérequis à la CD. On peut pratiquer la CI sans CD, mais pas l'inverse de façon viable.",{"type":30,"tag":777,"props":792,"children":793},{},[794,799],{"type":30,"tag":781,"props":795,"children":796},{},[797],{"type":36,"value":798},"2. Comment convaincre une équipe de passer des feature branches longues aux intégrations quotidiennes ?",{"type":30,"tag":38,"props":800,"children":801},{},[802],{"type":36,"value":803},"Par la data. Calculer le temps moyen passé à résoudre les conflits de merge sur les 3 derniers mois. Dans la plupart des équipes avec des branches de 1-2 semaines, les merge conflicts représentent 10 à 15% du temps de développement. Proposer un pilote de 4 sprints avec des branches courtes et feature flags, et mesurer. Le résultat parle de lui-même.",{"type":30,"tag":777,"props":805,"children":806},{},[807,812],{"type":30,"tag":781,"props":808,"children":809},{},[810],{"type":36,"value":811},"3. Les feature flags créent-ils une dette technique ?",{"type":30,"tag":38,"props":813,"children":814},{},[815],{"type":36,"value":816},"Oui, si mal gérés. Un feature flag non supprimé après le lancement de la feature est de la dette. La règle : chaque feature flag a une date d'expiration définie au moment de sa création. Un linter ou un test automatique vérifie que les flags expirés sont supprimés. En pratique, un backlog dédié à la suppression des flags (2 à 3 par sprint) suffit pour maintenir le stock sous contrôle.",{"type":30,"tag":777,"props":818,"children":819},{},[820,825],{"type":30,"tag":781,"props":821,"children":822},{},[823],{"type":36,"value":824},"4. Comment gérer la CI dans un monorepo avec de nombreux services ?",{"type":30,"tag":38,"props":826,"children":827},{},[828],{"type":36,"value":829},"Avec des pipelines sélectifs basés sur les changements. Les outils comme Nx pour JavaScript/TypeScript, Bazel pour les environnements multi-langages, ou les \"path filters\" dans GitHub Actions permettent de ne lancer que les tests des services impactés par les changements. Cela maintient un pipeline sous 10 minutes même dans un monorepo de 20 services.",{"type":30,"tag":777,"props":831,"children":832},{},[833,838],{"type":30,"tag":781,"props":834,"children":835},{},[836],{"type":36,"value":837},"5. Que faire quand les tests sont trop lents pour permettre une intégration quotidienne ?",{"type":30,"tag":38,"props":839,"children":840},{},[841],{"type":36,"value":842},"C'est le signal pour revoir la pyramide de tests. Audit en 3 étapes : identifier les 20% de tests les plus lents qui représentent 80% du temps, évaluer si ces tests d'intégration pourraient être remplacés par des tests unitaires avec mocks, puis déplacer les tests lents dans un stage séparé déclenché toutes les 2 heures. Le pipeline fast feedback reste sous 10 minutes, le reste se vérifie en continu.",{"type":30,"tag":64,"props":844,"children":845},{},[],{"type":30,"tag":598,"props":847,"children":852},{"cta":848,"href":849,"title":850,"type":851},"Télécharger le guide gratuit →","/mes-ressources","Ressource gratuite : Guide Lead Time -50% en 90 jours","resource",[853],{"type":30,"tag":38,"props":854,"children":855},{},[856],{"type":36,"value":857},"Le guide complet pour réduire votre lead time en 90 jours inclut un chapitre sur l'optimisation du pipeline CI/CD et les pratiques d'intégration qui font la différence sur la fréquence de delivery, avec les métriques DORA à suivre.",{"type":30,"tag":859,"props":860,"children":861},"style",{},[862],{"type":36,"value":863},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":8,"searchDepth":164,"depth":164,"links":865},[866,867,868,869,870,871,872,873],{"id":70,"depth":164,"text":73},{"id":120,"depth":164,"text":123},{"id":293,"depth":164,"text":296},{"id":615,"depth":164,"text":618},{"id":644,"depth":164,"text":647},{"id":668,"depth":164,"text":671},{"id":740,"depth":164,"text":743},{"id":772,"depth":164,"text":775},"markdown","content:fr:pratiques-agiles:continuous-integration-fondamentaux.md","content","fr/pratiques-agiles/continuous-integration-fondamentaux.md","fr/pratiques-agiles/continuous-integration-fondamentaux","md",1775679768997]