[{"data":1,"prerenderedAt":1469},["ShallowReactive",2],{"/fr-fr/blog/automated-detection-testing-framework":3,"navigation-fr-fr":694,"banner-fr-fr":1117,"footer-fr-fr":1126,"blog-post-authors-fr-fr-Evan Baltman":1367,"blog-related-posts-fr-fr-automated-detection-testing-framework":1383,"blog-promotions-fr-fr":1407,"next-steps-fr-fr":1460},{"id":4,"title":5,"authors":6,"body":8,"category":674,"date":675,"description":676,"extension":677,"externalUrl":678,"featured":679,"heroImage":680,"meta":681,"navigation":207,"path":682,"seo":683,"slug":686,"stem":687,"tags":688,"template":692,"updatedDate":678,"__hash__":693},"blogPosts/fr-fr/blog/automated-detection-testing-framework.md","Créez un framework de tests de détection automatisés avec GitLab CI/CD et GitLab Duo",[7],"Evan Baltman",{"type":9,"value":10,"toc":665},"minimark",[11,15,18,21,26,29,32,47,50,54,57,60,108,112,115,127,137,143,150,160,164,171,490,504,525,538,544,548,555,564,580,583,586,625,629,636,639,643,653,661],[12,13,14],"p",{},"Lorsqu'il s'agit de maintenir un système d'alerte sain au sein de votre centre des opérations de sécurité (SOC), le réglage des faux positifs ne suffit pas à lui seul. Un aspect souvent négligé de ce système est de s'assurer que les détections critiques, celles qui se déclenchent rarement, n'ont pas tout simplement cessé de fonctionner sans que personne ne s'en aperçoive.",[12,16,17],{},"Chez GitLab, l'équipe Signals Engineering teste les détections en simulant des comportements malveillants réels sur une infrastructure qui nous appartient, afin de valider le fonctionnement de bout en bout de nos détections : de la source des logs à l'ingestion, en passant par le système de gestion des informations et des événements de sécurité (SIEM), jusqu'au routage des alertes via notre système Security Orchestration, Automation and Response (SOAR). C'est l'approche adoptée par les outils commerciaux de simulation de brèches et d'attaques, mais ces solutions sont coûteuses, génériques et inadaptées à notre pile de détection spécifique. Nous avons donc construit notre propre framework entièrement automatisé, que nous avons baptisé WATCH (Weekly Attack Testing for Continuous Health).",[12,19,20],{},"Dans cet article, vous découvrirez pourquoi nous avons développé ce framework, comment il fonctionne et comment l'utiliser dans votre propre environnement.",[22,23,25],"h2",{"id":24},"une-lacune-dans-la-validation-des-détections","Une lacune dans la validation des détections",[12,27,28],{},"Entre les modifications de schéma de logs, les mises à jour du SIEM et les erreurs de configuration des pipelines, il existe une multitude de façons pour que vos détections échouent en silence, mais une seule pour qu’elles se déclenchent comme prévu. Face à cette situation, une conclusion s'impose : il nous faut déclencher d'anciennes détections. Cette solution soulève cependant les questions suivantes : « Comment déclencher concrètement des détections ? » et « À quelle fréquence ? »",[12,30,31],{},"Une première approche consiste à réintroduire dans votre SIEM des logs qui simulent un comportement malveillant, puis à vérifier si votre règle de détection identifie le faux incident et déclenche une alerte. Cette approche, en plus de ne pas prouver le fonctionnement de la détection en conditions réelles, ne valide pas l'une des étapes les plus sujettes aux erreurs du cycle de vie des alertes : l'ingestion des logs (c'est-à-dire de la source du log au SIEM).",[12,33,34,35,41,42,46],{},"Nous avons précédemment décrit comment notre système ",[36,37,40],"a",{"href":38,"rel":39},"https://about.gitlab.com/fr-fr/blog/automating-cybersecurity-threat-detections-with-gitlab-ci-cd/",[],"GitLab Universal Automated Response and Detection (GUARD)"," automatise la création et le déploiement des détections via un pipeline de détections en tant que code (DaC), ainsi que le routage et le classement des alertes via notre SOAR. Nos pipelines DaC résolvent le problème de la validation du déploiement d'une détection sans erreur, mais ne répondent pas à la question de savoir si cette détection ",[43,44,45],"em",{},"se déclenchera"," réellement lorsque le comportement ciblé se produira en conditions réelles.",[12,48,49],{},"Le framework WATCH comble cette lacune : il s'agit de la couche de validation continue qui confirme que nos détections fonctionnent correctement.",[22,51,53],{"id":52},"fonctionnement-du-framework-watch","Fonctionnement du framework WATCH",[12,55,56],{},"À un niveau global, le framework WATCH fonctionne en exécutant des simulations d'attaques scriptées dans notre environnement de préproduction, puis en vérifiant que les alertes attendues se propagent à travers l'ensemble de notre pile de surveillance de sécurité : le SIEM pour les règles de détection, le SOAR pour le routage des alertes, et enfin les tableaux de bord utilisés par notre équipe pour surveiller l'état des détections.",[12,58,59],{},"Le cycle de vie d'un test WATCH se déroule comme suit :",[61,62,63,78,84,90,96,102],"ol",{},[64,65,66,70,71,77],"li",{},[67,68,69],"strong",{},"Planification :"," chaque semaine, un pipeline ",[36,72,76],{"href":73,"rel":74,"title":75},"https://about.gitlab.com/fr-fr/blog/what-is-gitlab-ci-cd/",[],"Qu'est-ce que GitLab CI/CD ?","GitLab CI/CD"," planifié découvre tous les tests actifs et les répartit dans des créneaux horaires aléatoires tout au long de la semaine. Cette randomisation est essentielle : nous ne voulons pas que les tests se déclenchent à des moments prévisibles, ce qui faciliterait la distinction entre l'activité de test et les menaces réelles, et pourrait masquer des problèmes liés à la temporalité dans nos détections.",[64,79,80,83],{},[67,81,82],{},"Notification préalable :"," avant l'exécution d'un test, WATCH notifie notre SOAR via une story dédiée « WATCH Heads Up » qui enregistre les détections qu'il prévoit de déclencher. Des enregistrements traçables sont créés pour que notre SOAR puisse anticiper la suite des événements.",[64,85,86,89],{},[67,87,88],{},"Exécution :"," le test lance le comportement malveillant simulé. Par exemple, il réinitialise le mot de passe d'un compte administrateur ou effectue des appels API suspects sur l'environnement de préproduction.",[64,91,92,95],{},[67,93,94],{},"Détection :"," le SIEM traite les logs d'activité de l'environnement de préproduction et déclenche (en principe) les règles de détection correspondantes.",[64,97,98,101],{},[67,99,100],{},"Corrélation :"," à mesure que les alertes arrivent dans notre SOAR, une vérification qui vise à identifier les tests WATCH détermine si chaque alerte correspond à un test enregistré en s'appuyant sur trois facteurs : la fenêtre temporelle entre l'exécution du test et l'alerte, l'identité de l'acteur (adresse IP ou nom d'utilisateur) et l'identifiant de la règle de détection déclenchée. C'est ce mécanisme qui empêche les alertes générées par WATCH d'être escaladées comme de vrais incidents auprès de l'équipe Security Incident Response Team (SIRT), tout en validant l'ensemble du pipeline.",[64,103,104,107],{},[67,105,106],{},"Vérification :"," une étape ultérieure du pipeline vérifie si toutes les détections attendues se sont déclenchées, met à jour les métadonnées de statut des détections et déploie les résultats mis à jour sur notre tableau de bord GitLab Pages. Si une détection ne se déclenche pas, une notification est envoyée sur le canal Slack de notre équipe.",[22,109,111],{"id":110},"utilisation-du-framework-watch-avec-gitlab-cicd","Utilisation du framework WATCH avec GitLab CI/CD",[12,113,114],{},"WATCH s'appuie sur GitLab CI/CD et l'utilise comme colonne vertébrale d'orchestration à travers trois étapes de pipeline.",[12,116,117,118,121,122,126],{},"L'étape ",[67,119,120],{},"schedule_pipelines"," s'exécute chaque semaine et gère la répartition des tests. Elle repère tous les tests actifs, les regroupe par lots et crée des pipelines planifiés configurés pour s'exécuter à des moments aléatoires au cours de la semaine. Chaque pipeline planifié reçoit une variable ",[123,124,125],"code",{},"TESTS_TO_RUN"," qui précise les tests à exécuter.",[12,128,117,129,132,133,136],{},[67,130,131],{},"run_tests"," est celle où la simulation d'attaque a lieu. Elle exécute les tests assignés au pipeline en cours, enregistre les statistiques d'exécution dans ",[123,134,135],{},"detection_status.json"," et consigne les identifiants des enregistrements SOAR pour permettre la corrélation des alertes en aval.",[12,138,117,139,142],{},[67,140,141],{},"pages"," gère la vérification et le reporting. Elle interroge notre SOAR pour confirmer que les alertes ont été générées et correctement acheminées, met à jour les métadonnées de détection avec les résultats de vérification et déploie le tableau de bord GitLab Pages avec les derniers résultats de tests.",[12,144,145,146,149],{},"Voici un exemple de fichier de configuration GitLab CI/CD ",[123,147,148],{},"gitlab-ci.yml"," pour le pipeline WATCH :",[151,152,157],"pre",{"className":153,"code":155,"language":156},[154],"language-text","spec:\n  inputs:\n    weekly_scheduling:\n      type: boolean\n      default: false\n      description: \"Enable weekly scheduling of detection tests.\"\n    update_pages:\n      type: boolean\n      default: false\n      description: \"For triggering the update of GitLab Pages dashboard.\"\n\n---\n\n# Specify the Docker image to use for the job\nimage: python:3.12\n\nstages:\n  - schedule_pipelines\n  - run_tests\n  - pages\n\n# Job to manage scheduled pipelines (runs when weekly_scheduling input is true)\nmanage_scheduled_pipelines:\n  stage: schedule_pipelines\n  script:\n    - pip install -r requirements.txt\n    - python scripts/manage_scheduled_pipelines.py\n  rules:\n    - if: $TESTS_TO_RUN == null && $CI_PIPELINE_SOURCE == \"schedule\" && [[ inputs.weekly_scheduling ]] == true\n      when: on_success\n    - when: never\n\n# Job to run detection tests, save tines_record_id to detection_status.json, and commit\nrun_detection_tests:\n  stage: run_tests\n  script:\n    - pip install -r requirements.txt\n    - python main.py --prod --save-stats --scheduled-tests\n  rules:\n    - if: $TESTS_TO_RUN\n      when: on_success\n    - when: never\n\n# Job to verify alerts, update detection_status.json, commit, and deploy pages\npages:\n  stage: pages\n  script:\n    - pip install -r requirements.txt\n    - python scripts/verify_and_update_detections.py --tines-api-key ${TINES_API_KEY}\n    - mkdir -p public/data\n    - cp detection_status.json public/data/\n    - cp -r static/* public/\n  pages: true  # Required for GitLab 17.9+ to trigger Pages deployment\n  artifacts:\n    paths:\n      - public\n  rules:\n    - if: $TESTS_TO_RUN == null && [[ inputs.update_pages ]] == true\n      when: on_success\n    - when: never\n","text",[123,158,155],{"__ignoreMap":159},"",[22,161,163],{"id":162},"rédaction-de-tests-avec-gitlab-duo","Rédaction de tests avec GitLab Duo",[12,165,166,167,170],{},"L'une des priorités de conception de WATCH était de faciliter l'ajout de nouveaux tests par n'importe quel membre de l'équipe Signals Engineering ou SIRT. Le framework fournit une classe abstraite ",[123,168,169],{},"BaseSecurityTest"," qui prend en charge toutes les tâches répétitives (génération de l'identifiant de test, gestion de l'identité de l'acteur, coordination avec le SOAR) de sorte que les auteurs de tests n'ont qu'à se concentrer sur trois aspects : la préparation de l'environnement de test, l'exécution du comportement malveillant simulé et le nettoyage post-test.",[151,172,176],{"className":173,"code":174,"language":175,"meta":159,"style":159},"language-py shiki shiki-themes github-light","class BaseSecurityTest(ABC):\n\n    def __init__(self, config = {}, test_id: Optional[str] = None):\n        self.test_id = test_id or str(uuid.uuid4())\n        self.test_name = self.__class__.__name__\n        self.expected_detections = {}\n        self.actor_id = config.get('gitlab', {}).get(\n            'default_actor_id',\n            \"sirt_detection_test_user_\" + self.test_id[:8]\n        )\n        self.isActive = True\n        self.test_run_time = 300\n        self.config = config\n\n    @abstractmethod\n    def setup(self) -> bool:\n        \"\"\"Prepare test environment and resources\"\"\"\n\n    @abstractmethod\n    def execute(self) -> Dict[str, Any]:\n        \"\"\"Execute the malicious behavior simulation\"\"\"\n\n    @abstractmethod\n    def cleanup(self) -> bool:\n        \"\"\"Clean up test environment and resources\"\"\"\n","py",[123,177,178,202,209,240,263,287,300,320,329,349,355,368,381,394,399,405,422,428,433,438,454,460,465,470,484],{"__ignoreMap":159},[179,180,183,187,191,195,199],"span",{"class":181,"line":182},"line",1,[179,184,186],{"class":185},"sD7c4","class",[179,188,190],{"class":189},"s7eDp"," BaseSecurityTest",[179,192,194],{"class":193},"sgsFI","(",[179,196,198],{"class":197},"sYu0t","ABC",[179,200,201],{"class":193},"):\n",[179,203,205],{"class":181,"line":204},2,[179,206,208],{"emptyLinePlaceholder":207},true,"\n",[179,210,212,215,218,221,224,227,230,233,235,238],{"class":181,"line":211},3,[179,213,214],{"class":185},"    def",[179,216,217],{"class":197}," __init__",[179,219,220],{"class":193},"(self, config ",[179,222,223],{"class":185},"=",[179,225,226],{"class":193}," {}, test_id: Optional[",[179,228,229],{"class":197},"str",[179,231,232],{"class":193},"] ",[179,234,223],{"class":185},[179,236,237],{"class":197}," None",[179,239,201],{"class":193},[179,241,243,246,249,251,254,257,260],{"class":181,"line":242},4,[179,244,245],{"class":197},"        self",[179,247,248],{"class":193},".test_id ",[179,250,223],{"class":185},[179,252,253],{"class":193}," test_id ",[179,255,256],{"class":185},"or",[179,258,259],{"class":197}," str",[179,261,262],{"class":193},"(uuid.uuid4())\n",[179,264,266,268,271,273,276,279,282,284],{"class":181,"line":265},5,[179,267,245],{"class":197},[179,269,270],{"class":193},".test_name ",[179,272,223],{"class":185},[179,274,275],{"class":197}," self",[179,277,278],{"class":193},".",[179,280,281],{"class":197},"__class__",[179,283,278],{"class":193},[179,285,286],{"class":197},"__name__\n",[179,288,290,292,295,297],{"class":181,"line":289},6,[179,291,245],{"class":197},[179,293,294],{"class":193},".expected_detections ",[179,296,223],{"class":185},[179,298,299],{"class":193}," {}\n",[179,301,303,305,308,310,313,317],{"class":181,"line":302},7,[179,304,245],{"class":197},[179,306,307],{"class":193},".actor_id ",[179,309,223],{"class":185},[179,311,312],{"class":193}," config.get(",[179,314,316],{"class":315},"sYBdl","'gitlab'",[179,318,319],{"class":193},", {}).get(\n",[179,321,323,326],{"class":181,"line":322},8,[179,324,325],{"class":315},"            'default_actor_id'",[179,327,328],{"class":193},",\n",[179,330,332,335,338,340,343,346],{"class":181,"line":331},9,[179,333,334],{"class":315},"            \"sirt_detection_test_user_\"",[179,336,337],{"class":185}," +",[179,339,275],{"class":197},[179,341,342],{"class":193},".test_id[:",[179,344,345],{"class":197},"8",[179,347,348],{"class":193},"]\n",[179,350,352],{"class":181,"line":351},10,[179,353,354],{"class":193},"        )\n",[179,356,358,360,363,365],{"class":181,"line":357},11,[179,359,245],{"class":197},[179,361,362],{"class":193},".isActive ",[179,364,223],{"class":185},[179,366,367],{"class":197}," True\n",[179,369,371,373,376,378],{"class":181,"line":370},12,[179,372,245],{"class":197},[179,374,375],{"class":193},".test_run_time ",[179,377,223],{"class":185},[179,379,380],{"class":197}," 300\n",[179,382,384,386,389,391],{"class":181,"line":383},13,[179,385,245],{"class":197},[179,387,388],{"class":193},".config ",[179,390,223],{"class":185},[179,392,393],{"class":193}," config\n",[179,395,397],{"class":181,"line":396},14,[179,398,208],{"emptyLinePlaceholder":207},[179,400,402],{"class":181,"line":401},15,[179,403,404],{"class":189},"    @abstractmethod\n",[179,406,408,410,413,416,419],{"class":181,"line":407},16,[179,409,214],{"class":185},[179,411,412],{"class":189}," setup",[179,414,415],{"class":193},"(self) -> ",[179,417,418],{"class":197},"bool",[179,420,421],{"class":193},":\n",[179,423,425],{"class":181,"line":424},17,[179,426,427],{"class":315},"        \"\"\"Prepare test environment and resources\"\"\"\n",[179,429,431],{"class":181,"line":430},18,[179,432,208],{"emptyLinePlaceholder":207},[179,434,436],{"class":181,"line":435},19,[179,437,404],{"class":189},[179,439,441,443,446,449,451],{"class":181,"line":440},20,[179,442,214],{"class":185},[179,444,445],{"class":189}," execute",[179,447,448],{"class":193},"(self) -> Dict[",[179,450,229],{"class":197},[179,452,453],{"class":193},", Any]:\n",[179,455,457],{"class":181,"line":456},21,[179,458,459],{"class":315},"        \"\"\"Execute the malicious behavior simulation\"\"\"\n",[179,461,463],{"class":181,"line":462},22,[179,464,208],{"emptyLinePlaceholder":207},[179,466,468],{"class":181,"line":467},23,[179,469,404],{"class":189},[179,471,473,475,478,480,482],{"class":181,"line":472},24,[179,474,214],{"class":185},[179,476,477],{"class":189}," cleanup",[179,479,415],{"class":193},[179,481,418],{"class":197},[179,483,421],{"class":193},[179,485,487],{"class":181,"line":486},25,[179,488,489],{"class":315},"        \"\"\"Clean up test environment and resources\"\"\"\n",[12,491,492,493,496,497,500,501,503],{},"L'élément de configuration clé est le dictionnaire ",[123,494,495],{},"expected_detections",", qui associe les noms de règles SIEM des détections attendues à l'identité de l'acteur et à l'heure d'arrivée prévue de l'alerte. Un nouveau test est simplement un fichier Python dans le répertoire ",[123,498,499],{},"tests/"," qui hérite de ",[123,502,169],{},", définit son comportement simulé et déclare les détections qu'il prévoit de déclencher. Le runner de tests le détecte automatiquement lors de la prochaine exécution planifiée.",[12,505,506,507,510,511,514,515,518,519,524],{},"Cette interface à faible friction est essentielle, car les tests de détection ne fonctionnent en tant que pratique que si l'équipe rédige réellement des tests. Si l'ajout d'un test nécessite de comprendre l'intégralité des mécanismes internes du pipeline, personne ne le fera. Le contrat simple consistant à implémenter ",[123,508,509],{},"setup",", ",[123,512,513],{},"execute"," et ",[123,516,517],{},"cleanup",", et à déclarer les détections attendues, fait également des tests WATCH d'excellents candidats pour ",[36,520,523],{"href":521,"rel":522},"https://about.gitlab.com/fr-fr/gitlab-duo/",[],"GitLab Duo",", l'assistant d'IA de GitLab. Il vous suffit d'indiquer à GitLab Duo la classe de base et un prompt tel que « Crée-moi un test qui clone un grand nombre de projets à partir d'un groupe cible » ou « Crée-moi un test qui accède à toutes les variables CI de ce projet via GraphQL », voire « Renomme tous ces projets pour utiliser le même schéma de nommage ». GitLab Duo peut alors générer un test WATCH fonctionnel qui s'intègre directement au framework et simplifie encore davantage l'accessibilité. Un ingénieur qui souhaite tester une détection peut rapidement passer de l'idée à un test opérationnel, car GitLab Duo prend en charge l'essentiel de l'implémentation.",[12,526,527,528,533,534,537],{},"Astuce : pour renforcer l'efficacité de GitLab Duo, nous avons utilisé l'",[36,529,532],{"href":530,"rel":531},"https://docs.gitlab.com/user/duo_agent_platform/customize/agent_skills/",[],"agent Skills",", qui est idéal pour définir des normes et des procédures pour les tâches récurrentes comme la rédaction de tests. Dans le répertoire de notre projet se trouve un dossier ",[123,535,536],{},"skills/WATCH-test-creator"," contenant un fichier SKILL.md qui décrit les caractéristiques d'un bon test, les fonctions utilitaires disponibles et la finalité du projet. Ce fichier est lu immédiatement après la saisie d'un prompt comme ceux mentionnés ci-dessus, ce qui évite de devoir rappeler constamment à GitLab Duo le contexte de travail et la méthodologie à suivre. Surtout, les résultats obtenus sont cohérents et de meilleure qualité. Voici un extrait de ce fichier :",[151,539,542],{"className":540,"code":541,"language":156,"meta":159},[154],"---\nname: WATCH-test-creator\ndescription: Create WATCH (Orchestrated Offensive Penetration Simulator) security detection tests that simulate malicious behavior on GitLab infrastructure to validate SIEM detection rules and alerting pipelines.\n---\n\n## WATCH Test Creator\n\nYou are an expert at writing security detection tests for the WATCH framework. WATCH tests simulate malicious activities on GitLab-owned infrastructure to verify that the SecOps security monitoring stack (Elastic SIEM, Tines SOAR, alerting rules) properly detects and responds to threats.\n\n### Architecture Overview\n```\nProject Root\n├── core/\n│   ├── base_test.py          # Abstract base class all tests inherit from\n│   ├── test_runner.py         # Auto-discovers and executes tests\n│   └── webhook_manager.py     # Tines/SOAR notification integration\n├── tests/\n│   ├── gitlab/                # GitLab-specific detection tests\n│   └── gcp/                   # GCP-specific detection tests\n├── utils/\n│   ├── gitlab_helper.py       # GitLab API wrapper (users, projects, tokens, webhooks, OAuth)\n│   └── crypto_utils.py        # Password generation utility\n├── config/\n│   ├── settings.py            # Config loader (reads YAML + GITLAB_ADMIN_PAT env var)\n│   └── environments/\n│       ├── dev.yaml           # Local GDK config\n│       └── prod.yaml          # Production staging.gitlab.com config\n├── main.py                    # Entry point with CLI args\n└── detection_status.json      # Test results and detection metadata\n```\n\n",[123,543,541],{"__ignoreMap":159},[22,545,547],{"id":546},"visibilité-renforcée-grâce-aux-tableaux-de-bord-de-tests","Visibilité renforcée grâce aux tableaux de bord de tests",[12,549,550],{},[551,552],"img",{"alt":553,"src":554},"Tableaux de bord de tests","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1777574679/ylrc96iip682sinfg7zi.png",[12,556,557,558,563],{},"WATCH déploie également deux tableaux de bord interactifs via ",[36,559,562],{"href":560,"rel":561},"https://docs.gitlab.com/user/project/pages/",[],"GitLab Pages"," qui offrent à l'équipe une visibilité en temps réel sur l'état des détections.",[565,566,567,574],"ul",{},[64,568,569,570,573],{},"Le ",[67,571,572],{},"tableau de bord de statut des détections"," fournit une vue d'ensemble de toutes les règles de détection et de leur statut de test actuel, y compris des indicateurs tels que le nombre de déclenchements de chaque détection, son état de réussite/échec actuel et sa durée d'activité. Le tableau est filtrable et triable et permet aux ingénieurs d'identifier rapidement les détections qui requièrent une attention particulière.",[64,575,569,576,579],{},[67,577,578],{},"tableau de bord d'exécution des tests"," offre une vue détaillée des exécutions de tests individuels, regroupées par identifiant de test avec des analyses de couverture de détection. Il inclut une visualisation chronologique des délais de propagation des alertes pour aider à évaluer le temps écoulé entre l'exécution du test et la réception de l'alerte, ainsi que des liens directs vers les alertes correspondantes dans notre SIEM.",[12,581,582],{},"Ces tableaux de bord ont remplacé un processus auparavant manuel qui consistait à consulter les logs des pipelines et les requêtes SIEM pour déterminer si nos détections étaient opérationnelles.",[12,584,585],{},"Comme le reste de GUARD, WATCH s'appuie fortement sur GitLab en tant que plateforme :",[565,587,588,595,601,607,612],{},[64,589,590,591,594],{},"Les ",[67,592,593],{},"pipelines GitLab CI/CD et les pipelines planifiés"," orchestrent l'ensemble du cycle de vie des tests, de la planification hebdomadaire à l'exécution et au déploiement des tableaux de bord.",[64,596,590,597,600],{},[67,598,599],{},"données d'entrée de pipeline"," permettent de déclencher les étapes indépendamment : il est possible de relancer uniquement l'étape de vérification ou la mise à jour du tableau de bord sans exécuter à nouveau l'ensemble des tests.",[64,602,590,603,606],{},[67,604,605],{},"variables CI/CD"," stockent de manière sécurisée les clés API nécessaires pour accéder à Tines et à l'environnement de préproduction GitLab.",[64,608,609,611],{},[67,610,562],{}," héberge les tableaux de bord WATCH sans infrastructure supplémentaire, ce qui signifie aucun hébergement distinct à gérer, aucun outil de déploiement additionnel.",[64,613,614,615,624],{},"Étant donné que les tests sont de simples fichiers Python dans un projet GitLab, ils bénéficient du ",[67,616,617,623],{},[36,618,622],{"href":619,"rel":620,"title":621},"https://about.gitlab.com/fr-fr/topics/version-control/",[],"Qu'est-ce que le contrôle de version ?","contrôle de version",", des revues de merge request et de la propriété du code",", tout comme nos règles de détection dans le cadre du DaC.",[22,626,628],{"id":627},"watch-nous-permet-de-rester-proactifs","WATCH nous permet de rester proactifs",[12,630,631,632,635],{},"La mise en place du framework WATCH a transformé la relation de notre équipe avec la qualité des détections, passant d'une posture réactive à une posture proactive. Avant WATCH, une détection défaillante ne se manifestait que lors d'un incident, lorsque l'alerte attendue était absente, soit le pire moment possible pour découvrir une lacune. Désormais, nous recevons des mises à jour régulières sur l'état de santé de nos détections et savons quand elles cessent de fonctionner ",[43,633,634],{},"avant"," qu'un problème réel ne survienne. C'est la garantie que les nouvelles détections développées ne seront pas défaillantes puis oubliées.",[12,637,638],{},"Un autre avantage de WATCH est l'enregistrement des tactiques, techniques et procédures (TTP) utilisées par notre red team lors d'opérations flash. Une fois les détections implémentées et l'analyse rétrospective d'une opération de test de pénétration réalisée, WATCH peut être utilisé pour rejouer les TTP utilisées afin de valider ces détections. En substance, WATCH transforme les tests atomiques de détection en TTP réutilisables.",[22,640,642],{"id":641},"essayez-le-framework-watch","Essayez le framework WATCH",[12,644,645,646,652],{},"Si vous gérez un SOC et que vous comptez sur les détections SIEM pour identifier les menaces, la question n'est pas de savoir si vos détections échoueront, mais si vous le saurez quand cela arrivera. Vous n'avez pas besoin d'une plateforme commerciale de simulation de brèches et d'attaques pour commencer à répondre à cette question. Un environnement sandbox, un ",[36,647,651],{"href":648,"rel":649,"title":650},"https://about.gitlab.com/fr-fr/topics/ci-cd/cicd-pipeline/",[],"Qu'est-ce qu'un pipeline CI/CD ?","pipeline CI/CD"," et un framework de scripts de simulation d'attaques sont d'excellents points de départ.",[12,654,655,656,278],{},"Commencez à construire votre propre framework de tests de détection en ",[36,657,660],{"href":658,"rel":659},"https://about.gitlab.com/fr-fr/free-trial/?utm_medium=blog&utm_source=blog&utm_campaign=eg_emea_x_trial_x_fr_blog_fr",[],"essayant gratuitement GitLab Ultimate",[662,663,664],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}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);}",{"title":159,"searchDepth":204,"depth":204,"links":666},[667,668,669,670,671,672,673],{"id":24,"depth":204,"text":25},{"id":52,"depth":204,"text":53},{"id":110,"depth":204,"text":111},{"id":162,"depth":204,"text":163},{"id":546,"depth":204,"text":547},{"id":627,"depth":204,"text":628},{"id":641,"depth":204,"text":642},"security-labs","2026-06-08","Découvrez comment l'équipe Signals Engineering de GitLab a conçu le framework WATCH pour valider en continu son pipeline de surveillance de sécurité.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1772195014/ooezwusxjl1f7ijfmbvj.png",{},"/fr-fr/blog/automated-detection-testing-framework",{"config":684,"title":685,"description":676},{"noIndex":679},"GitLab CI/CD et GitLab Duo : tests de détection automatisés","automated-detection-testing-framework","fr-fr/blog/automated-detection-testing-framework",[689,690,691],"security","security research","features","BlogPost","U292m5eTuUwz1CkVybaY-7xFtzZvTVw1D9nFcW-DPPQ",{"logo":695,"freeTrial":700,"sales":705,"login":710,"items":715,"search":1032,"minimal":1068,"duo":1087,"switchNav":1096,"pricingDeployment":1107},{"config":696},{"href":697,"dataGaName":698,"dataGaLocation":699},"/fr-fr/","gitlab logo","header",{"text":701,"config":702},"Commencer un essai gratuit",{"href":703,"dataGaName":704,"dataGaLocation":699},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":706,"config":707},"Contacter l’équipe commerciale",{"href":708,"dataGaName":709,"dataGaLocation":699},"/fr-fr/sales/","sales",{"text":711,"config":712},"Connexion",{"href":713,"dataGaName":714,"dataGaLocation":699},"https://gitlab.com/users/sign_in/","sign in",[716,745,847,852,956,1012],{"text":717,"config":718,"menu":720},"Plateforme",{"dataNavLevelOne":719},"platform",{"type":721,"columns":722},"cards",[723,729,737],{"title":717,"description":724,"link":725},"La plateforme d’orchestration intelligente pour le DevSecOps",{"text":726,"config":727},"Explorer notre plateforme",{"href":728,"dataGaName":719,"dataGaLocation":699},"/fr-fr/platform/",{"title":730,"description":731,"link":732},"GitLab Duo Agent Platform","L’IA agentique pour l’ensemble du cycle de développement logiciel",{"text":733,"config":734},"Découvrir GitLab Duo",{"href":735,"dataGaName":736,"dataGaLocation":699},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":738,"description":739,"link":740},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":741,"config":742},"En savoir plus",{"href":743,"dataGaName":744,"dataGaLocation":699},"/fr-fr/why-gitlab/","why gitlab",{"text":746,"left":207,"config":747,"menu":749},"Produit",{"dataNavLevelOne":748},"solutions",{"type":750,"link":751,"columns":755,"feature":826},"lists",{"text":752,"config":753},"Voir toutes les solutions",{"href":754,"dataGaName":748,"dataGaLocation":699},"/fr-fr/solutions/",[756,781,804],{"title":757,"description":758,"link":759,"items":764},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":760},{"icon":761,"href":762,"dataGaName":763,"dataGaLocation":699},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[765,769,772,777],{"text":766,"config":767},"CI/CD",{"href":768,"dataGaLocation":699,"dataGaName":766},"/fr-fr/solutions/continuous-integration/",{"text":730,"config":770},{"href":735,"dataGaLocation":699,"dataGaName":771},"gitlab duo agent platform - product menu",{"text":773,"config":774},"Gestion du code source",{"href":775,"dataGaLocation":699,"dataGaName":776},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":778,"config":779},"Livraison de logiciels automatisée",{"href":762,"dataGaLocation":699,"dataGaName":780},"Automated software delivery",{"title":782,"description":783,"link":784,"items":789},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":785},{"href":786,"dataGaName":787,"dataGaLocation":699,"icon":788},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[790,794,799],{"text":791,"config":792},"Tests de sécurité des applications",{"href":786,"dataGaName":793,"dataGaLocation":699},"Application security testing",{"text":795,"config":796},"Sécurité de la chaîne d’approvisionnement logicielle",{"href":797,"dataGaLocation":699,"dataGaName":798},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":800,"config":801},"Conformité logicielle",{"href":802,"dataGaName":803,"dataGaLocation":699},"/fr-fr/solutions/software-compliance/","software compliance",{"title":805,"link":806,"items":811},"Mesures",{"config":807},{"icon":808,"href":809,"dataGaName":810,"dataGaLocation":699},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[812,816,821],{"text":813,"config":814},"Visibilité et mesures",{"href":809,"dataGaLocation":699,"dataGaName":815},"Visibility and Measurement",{"text":817,"config":818},"Gestion de la chaîne de valeur",{"href":819,"dataGaLocation":699,"dataGaName":820},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":822,"config":823},"Analyses et informations",{"href":824,"dataGaLocation":699,"dataGaName":825},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":827,"type":750,"items":828},"GitLab",[829,835,841],{"text":830,"config":831},"Pour les entreprises",{"icon":832,"href":833,"dataGaLocation":699,"dataGaName":834},"Building","/fr-fr/enterprise/","enterprise",{"text":836,"config":837},"Pour les PME",{"icon":838,"href":839,"dataGaLocation":699,"dataGaName":840},"Work","/fr-fr/small-business/","small business",{"text":842,"config":843},"Pour le secteur public",{"icon":844,"href":845,"dataGaLocation":699,"dataGaName":846},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":848,"config":849},"Tarifs",{"href":850,"dataGaName":851,"dataGaLocation":699,"dataNavLevelOne":851},"/fr-fr/pricing/","pricing",{"text":853,"config":854,"menu":856},"Ressources",{"dataNavLevelOne":855},"resources",{"type":750,"link":857,"columns":861,"feature":945},{"text":858,"config":859},"Afficher toutes les ressources",{"href":860,"dataGaName":855,"dataGaLocation":699},"/fr-fr/resources/",[862,895,917],{"title":863,"items":864},"Premiers pas",[865,870,875,880,885,890],{"text":866,"config":867},"Installation",{"href":868,"dataGaName":869,"dataGaLocation":699},"/fr-fr/install/","install",{"text":871,"config":872},"Guides de démarrage",{"href":873,"dataGaName":874,"dataGaLocation":699},"/fr-fr/get-started/","quick setup checklists",{"text":876,"config":877},"Apprentissage",{"href":878,"dataGaLocation":699,"dataGaName":879},"https://university.gitlab.com/","learn",{"text":881,"config":882},"Documentation",{"href":883,"dataGaName":884,"dataGaLocation":699},"https://docs.gitlab.com/","product documentation",{"text":886,"config":887},"Vidéos sur les bonnes pratiques",{"href":888,"dataGaName":889,"dataGaLocation":699},"/fr-fr/getting-started-videos/","best practice videos",{"text":891,"config":892},"Intégrations",{"href":893,"dataGaName":894,"dataGaLocation":699},"/fr-fr/integrations/","integrations",{"title":896,"items":897},"Découvrir",[898,903,908,912],{"text":899,"config":900},"Témoignages clients",{"href":901,"dataGaName":902,"dataGaLocation":699},"/fr-fr/customers/","customer success stories",{"text":904,"config":905},"Blog",{"href":906,"dataGaName":907,"dataGaLocation":699},"/fr-fr/blog/","blog",{"text":909,"config":910},"The Source",{"href":911,"dataGaName":907,"dataGaLocation":699},"/fr-fr/the-source/",{"text":913,"config":914},"Travail à distance",{"href":915,"dataGaName":916,"dataGaLocation":699},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":918,"items":919},"Connecter",[920,925,930,935,940],{"text":921,"config":922},"Services GitLab",{"href":923,"dataGaName":924,"dataGaLocation":699},"/fr-fr/services/","services",{"text":926,"config":927},"Communauté",{"href":928,"dataGaName":929,"dataGaLocation":699},"/community/","community",{"text":931,"config":932},"Forum",{"href":933,"dataGaName":934,"dataGaLocation":699},"https://forum.gitlab.com/","forum",{"text":936,"config":937},"Événements",{"href":938,"dataGaName":939,"dataGaLocation":699},"/events/","events",{"text":941,"config":942},"Partenaires",{"href":943,"dataGaName":944,"dataGaLocation":699},"/fr-fr/partners/","partners",{"config":946,"title":949,"text":950,"link":951},{"background":947,"textColor":948},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Nouveautés de GitLab","Restez informé des dernières fonctionnalités et améliorations.",{"text":952,"config":953},"Lire les articles les plus récents",{"href":954,"dataGaName":955,"dataGaLocation":699},"/fr-fr/whats-new/","whats new",{"text":957,"config":958,"menu":960},"Société",{"dataNavLevelOne":959},"company",{"type":750,"columns":961},[962],{"items":963},[964,969,975,977,982,987,992,997,1002,1007],{"text":965,"config":966},"À propos",{"href":967,"dataGaName":968,"dataGaLocation":699},"/fr-fr/company/","about",{"text":970,"config":971,"footerGa":974},"Carrières",{"href":972,"dataGaName":973,"dataGaLocation":699},"/jobs/","jobs",{"dataGaName":973},{"text":936,"config":976},{"href":938,"dataGaName":939,"dataGaLocation":699},{"text":978,"config":979},"Leadership",{"href":980,"dataGaName":981,"dataGaLocation":699},"/company/team/e-group/","leadership",{"text":983,"config":984},"Manuel",{"href":985,"dataGaName":986,"dataGaLocation":699},"https://handbook.gitlab.com/","handbook",{"text":988,"config":989},"Relations avec les investisseurs",{"href":990,"dataGaName":991,"dataGaLocation":699},"https://ir.gitlab.com/","investor relations",{"text":993,"config":994},"Trust Center",{"href":995,"dataGaName":996,"dataGaLocation":699},"/fr-fr/security/","trust center",{"text":998,"config":999},"Centre pour la transparence de l’IA",{"href":1000,"dataGaName":1001,"dataGaLocation":699},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":1003,"config":1004},"Newsletter",{"href":1005,"dataGaName":1006,"dataGaLocation":699},"/company/contact/#contact-forms","newsletter",{"text":1008,"config":1009},"Presse",{"href":1010,"dataGaName":1011,"dataGaLocation":699},"/press/","press",{"text":1013,"config":1014,"menu":1015},"Nous contacter",{"dataNavLevelOne":959},{"type":750,"columns":1016},[1017],{"items":1018},[1019,1022,1027],{"text":706,"config":1020},{"href":708,"dataGaName":1021,"dataGaLocation":699},"talk to sales",{"text":1023,"config":1024},"Portail d'assistance",{"href":1025,"dataGaName":1026,"dataGaLocation":699},"https://support.gitlab.com","support portal",{"text":1028,"config":1029},"Portail clients GitLab",{"href":1030,"dataGaName":1031,"dataGaLocation":699},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1033,"login":1034,"suggestions":1041},"Fermer",{"text":1035,"link":1036},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":1037,"config":1038},"GitLab.com",{"href":713,"dataGaName":1039,"dataGaLocation":1040},"search login","search",{"text":1042,"default":1043},"Suggestions",[1044,1047,1052,1054,1059,1064],{"text":730,"config":1045},{"href":735,"dataGaName":1046,"dataGaLocation":1040},"GitLab Duo Agent Platform",{"text":1048,"config":1049},"Suggestions de code (IA)",{"href":1050,"dataGaName":1051,"dataGaLocation":1040},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":766,"config":1053},{"href":768,"dataGaName":766,"dataGaLocation":1040},{"text":1055,"config":1056},"GitLab sur AWS",{"href":1057,"dataGaName":1058,"dataGaLocation":1040},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":1060,"config":1061},"GitLab sur Google Cloud",{"href":1062,"dataGaName":1063,"dataGaLocation":1040},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1065,"config":1066},"Pourquoi utiliser GitLab ?",{"href":743,"dataGaName":1067,"dataGaLocation":1040},"Why GitLab?",{"freeTrial":1069,"mobileIcon":1074,"desktopIcon":1079,"secondaryButton":1082},{"text":1070,"config":1071},"Commencer votre essai gratuit",{"href":1072,"dataGaName":704,"dataGaLocation":1073},"https://gitlab.com/-/trials/new/","nav",{"altText":1075,"config":1076},"Icône GitLab",{"src":1077,"dataGaName":1078,"dataGaLocation":1073},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1075,"config":1080},{"src":1081,"dataGaName":1078,"dataGaLocation":1073},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1083,"config":1084},"Commencer",{"href":1085,"dataGaName":1086,"dataGaLocation":1073},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":1088,"mobileIcon":1092,"desktopIcon":1094},{"text":1089,"config":1090},"En savoir plus sur GitLab Duo",{"href":735,"dataGaName":1091,"dataGaLocation":1073},"gitlab duo",{"altText":1075,"config":1093},{"src":1077,"dataGaName":1078,"dataGaLocation":1073},{"altText":1075,"config":1095},{"src":1081,"dataGaName":1078,"dataGaLocation":1073},{"button":1097,"mobileIcon":1102,"desktopIcon":1104},{"text":1098,"config":1099},"/switch",{"href":1100,"dataGaName":1101,"dataGaLocation":1073},"#contact","switch",{"altText":1075,"config":1103},{"src":1077,"dataGaName":1078,"dataGaLocation":1073},{"altText":1075,"config":1105},{"src":1106,"dataGaName":1078,"dataGaLocation":1073},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1108,"mobileIcon":1113,"desktopIcon":1115},{"text":1109,"config":1110},"Retour aux tarifs",{"href":850,"dataGaName":1111,"dataGaLocation":1073,"icon":1112},"back to pricing","GoBack",{"altText":1075,"config":1114},{"src":1077,"dataGaName":1078,"dataGaLocation":1073},{"altText":1075,"config":1116},{"src":1081,"dataGaName":1078,"dataGaLocation":1073},{"title":1118,"button":1119,"config":1124},"Découvrez comment l'IA agentique transforme la livraison logicielle",{"text":1120,"config":1121},"Rejoindre GitLab Transcend en direct le 10 juin",{"href":1122,"dataGaName":1123,"dataGaLocation":699},"/fr-fr/events/transcend/virtual/","transcend event",{"layout":1125,"disabled":679},"release",{"data":1127},{"text":1128,"source":1129,"edit":1135,"contribute":1140,"config":1145,"items":1150,"minimal":1358},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":1130,"config":1131},"Afficher le code source de la page",{"href":1132,"dataGaName":1133,"dataGaLocation":1134},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1136,"config":1137},"Modifier cette page",{"href":1138,"dataGaName":1139,"dataGaLocation":1134},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1141,"config":1142},"Veuillez contribuer",{"href":1143,"dataGaName":1144,"dataGaLocation":1134},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1146,"facebook":1147,"youtube":1148,"linkedin":1149},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1151,1198,1251,1295,1325],{"title":848,"links":1152,"subMenu":1167},[1153,1157,1162],{"text":1154,"config":1155},"Voir les forfaits",{"href":850,"dataGaName":1156,"dataGaLocation":1134},"view plans",{"text":1158,"config":1159},"GitLab Premium",{"href":1160,"dataGaName":1161,"dataGaLocation":1134},"/fr-fr/pricing/premium/","why premium",{"text":1163,"config":1164},"GitLab Ultimate",{"href":1165,"dataGaName":1166,"dataGaLocation":1134},"/fr-fr/pricing/ultimate/","why ultimate",[1168],{"title":1013,"links":1169},[1170,1173,1176,1178,1183,1188,1193],{"text":1171,"config":1172},"Contacter l'équipe commerciale",{"href":708,"dataGaName":709,"dataGaLocation":1134},{"text":1174,"config":1175},"Assistance GitLab",{"href":1025,"dataGaName":1026,"dataGaLocation":1134},{"text":1028,"config":1177},{"href":1030,"dataGaName":1031,"dataGaLocation":1134},{"text":1179,"config":1180},"Statut",{"href":1181,"dataGaName":1182,"dataGaLocation":1134},"https://status.gitlab.com/","status",{"text":1184,"config":1185},"Conditions d'utilisation",{"href":1186,"dataGaName":1187,"dataGaLocation":1134},"/terms/","terms of use",{"text":1189,"config":1190},"Politique de confidentialité",{"href":1191,"dataGaName":1192,"dataGaLocation":1134},"/fr-fr/privacy/","privacy statement",{"text":1194,"config":1195},"Gérer vos cookies",{"dataGaName":1196,"dataGaLocation":1134,"id":1197,"isOneTrustButton":207},"cookie preferences","ot-sdk-btn",{"title":746,"links":1199,"subMenu":1208},[1200,1204],{"text":1201,"config":1202},"Plateforme DevSecOps",{"href":728,"dataGaName":1203,"dataGaLocation":1134},"devsecops platform",{"text":1205,"config":1206},"Développement assisté par l'IA",{"href":735,"dataGaName":1207,"dataGaLocation":1134},"ai-assisted development",[1209],{"title":1210,"links":1211},"Thèmes",[1212,1216,1221,1226,1231,1236,1241,1246],{"text":766,"config":1213},{"href":1214,"dataGaName":1215,"dataGaLocation":1134},"/fr-fr/topics/ci-cd/","cicd",{"text":1217,"config":1218},"GitOps",{"href":1219,"dataGaName":1220,"dataGaLocation":1134},"/fr-fr/topics/gitops/","gitops",{"text":1222,"config":1223},"DevOps",{"href":1224,"dataGaName":1225,"dataGaLocation":1134},"/fr-fr/topics/devops/","devops",{"text":1227,"config":1228},"Contrôle de version",{"href":1229,"dataGaName":1230,"dataGaLocation":1134},"/fr-fr/topics/version-control/","version control",{"text":1232,"config":1233},"DevSecOps",{"href":1234,"dataGaName":1235,"dataGaLocation":1134},"/fr-fr/topics/devsecops/","devsecops",{"text":1237,"config":1238},"Cloud-native",{"href":1239,"dataGaName":1240,"dataGaLocation":1134},"/fr-fr/topics/cloud-native/","cloud native",{"text":1242,"config":1243},"IA pour la programmation",{"href":1244,"dataGaName":1245,"dataGaLocation":1134},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":1247,"config":1248},"IA agentique",{"href":1249,"dataGaName":1250,"dataGaLocation":1134},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":1252,"links":1253},"Solutions",[1254,1257,1259,1264,1267,1270,1273,1276,1279,1282,1285,1290],{"text":791,"config":1255},{"href":786,"dataGaName":1256,"dataGaLocation":1134},"Application Security Testing",{"text":778,"config":1258},{"href":762,"dataGaName":763,"dataGaLocation":1134},{"text":1260,"config":1261},"Développement Agile",{"href":1262,"dataGaName":1263,"dataGaLocation":1134},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":773,"config":1265},{"href":775,"dataGaName":1266,"dataGaLocation":1134},"source code management",{"text":766,"config":1268},{"href":768,"dataGaName":1269,"dataGaLocation":1134},"continuous integration & delivery",{"text":817,"config":1271},{"href":819,"dataGaName":1272,"dataGaLocation":1134},"value stream management",{"text":1217,"config":1274},{"href":1275,"dataGaName":1220,"dataGaLocation":1134},"/fr-fr/solutions/gitops/",{"text":1277,"config":1278},"Entreprises",{"href":833,"dataGaName":834,"dataGaLocation":1134},{"text":1280,"config":1281},"PME",{"href":839,"dataGaName":840,"dataGaLocation":1134},{"text":1283,"config":1284},"Secteur public",{"href":845,"dataGaName":846,"dataGaLocation":1134},{"text":1286,"config":1287},"Éducation",{"href":1288,"dataGaName":1289,"dataGaLocation":1134},"/fr-fr/solutions/education/","education",{"text":1291,"config":1292},"Services financiers",{"href":1293,"dataGaName":1294,"dataGaLocation":1134},"/fr-fr/solutions/finance/","financial services",{"title":853,"links":1296},[1297,1299,1301,1303,1306,1308,1311,1313,1315,1317,1319,1321,1323],{"text":866,"config":1298},{"href":868,"dataGaName":869,"dataGaLocation":1134},{"text":871,"config":1300},{"href":873,"dataGaName":874,"dataGaLocation":1134},{"text":876,"config":1302},{"href":878,"dataGaName":879,"dataGaLocation":1134},{"text":881,"config":1304},{"href":883,"dataGaName":1305,"dataGaLocation":1134},"docs",{"text":904,"config":1307},{"href":906,"dataGaName":907,"dataGaLocation":1134},{"text":1309,"config":1310},"Quoi de neuf",{"href":954,"dataGaName":955,"dataGaLocation":1134},{"text":899,"config":1312},{"href":901,"dataGaName":902,"dataGaLocation":1134},{"text":913,"config":1314},{"href":915,"dataGaName":916,"dataGaLocation":1134},{"text":921,"config":1316},{"href":923,"dataGaName":924,"dataGaLocation":1134},{"text":926,"config":1318},{"href":928,"dataGaName":929,"dataGaLocation":1134},{"text":931,"config":1320},{"href":933,"dataGaName":934,"dataGaLocation":1134},{"text":936,"config":1322},{"href":938,"dataGaName":939,"dataGaLocation":1134},{"text":941,"config":1324},{"href":943,"dataGaName":944,"dataGaLocation":1134},{"title":957,"links":1326},[1327,1329,1331,1333,1335,1337,1342,1347,1349,1351,1353],{"text":965,"config":1328},{"href":967,"dataGaName":959,"dataGaLocation":1134},{"text":970,"config":1330},{"href":972,"dataGaName":973,"dataGaLocation":1134},{"text":978,"config":1332},{"href":980,"dataGaName":981,"dataGaLocation":1134},{"text":983,"config":1334},{"href":985,"dataGaName":986,"dataGaLocation":1134},{"text":988,"config":1336},{"href":990,"dataGaName":991,"dataGaLocation":1134},{"text":1338,"config":1339},"Développement durable",{"href":1340,"dataGaName":1341,"dataGaLocation":1134},"/sustainability/","Sustainability",{"text":1343,"config":1344},"Diversité, inclusion et appartenance (DIB)",{"href":1345,"dataGaName":1346,"dataGaLocation":1134},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":993,"config":1348},{"href":995,"dataGaName":996,"dataGaLocation":1134},{"text":1003,"config":1350},{"href":1005,"dataGaName":1006,"dataGaLocation":1134},{"text":1008,"config":1352},{"href":1010,"dataGaName":1011,"dataGaLocation":1134},{"text":1354,"config":1355},"Déclaration de transparence sur l'esclavage moderne",{"href":1356,"dataGaName":1357,"dataGaLocation":1134},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1359},[1360,1362,1365],{"text":1184,"config":1361},{"href":1186,"dataGaName":1187,"dataGaLocation":1134},{"text":1363,"config":1364},"Gestion des cookies",{"dataGaName":1196,"dataGaLocation":1134,"id":1197,"isOneTrustButton":207},{"text":1189,"config":1366},{"href":1191,"dataGaName":1192,"dataGaLocation":1134},[1368],{"id":1369,"title":7,"body":678,"config":1370,"content":1372,"description":678,"extension":1377,"meta":1378,"navigation":207,"path":1379,"seo":1380,"stem":1381,"__hash__":1382},"blogAuthors/en-us/blog/authors/evan-baltman.yml",{"template":1371},"BlogAuthor",{"name":7,"config":1373},{"headshot":1374,"socialProof":1375},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1777579628/fkgn1kh0c1ndgba9yrkq.png",{"gitlabHandle":1376},"ebaltman","yml",{},"/en-us/blog/authors/evan-baltman",{},"en-us/blog/authors/evan-baltman","lIHS0uxztwtRrA-cy594VFaaYQp9r_oqQeUFF1B8eTU",[1384,1392,1400],{"title":1385,"description":1386,"heroImage":1387,"category":674,"date":1388,"authors":1389,"slug":1391,"externalUrl":678},"Automatiser l'analyse des lacunes de détection avec GitLab Duo Agent Platform","Découvrez comment l'équipe Signals Engineering de GitLab utilise notre plateforme d'IA pour identifier automatiquement les lacunes de détection après chaque incident de sécurité.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1773147991/op5xyroonltdwqix0x3u.png","2026-05-21",[1390],"Matt Coons","automating-detection-gap-analysis-with-gitlab-duo-agent-platform",{"title":1393,"description":1394,"heroImage":1395,"category":674,"date":1396,"authors":1397,"slug":1399,"externalUrl":678},"Sécurité des pipelines : quelles leçons tirer des attaques de la chaîne d'approvisionnement de mars 2026 ?","Découvrez comment les politiques de pipeline centralisées peuvent détecter et bloquer les attaques récentes de la chaîne d'approvisionnement.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1772630163/akp8ly2mrsfrhsb0liyb.png","2026-04-10",[1398],"Grant Hickman","pipeline-security-lessons-from-march-supply-chain-incidents",{"title":1401,"description":1402,"heroImage":1395,"category":674,"date":1403,"authors":1404,"slug":1406,"externalUrl":678},"Comment GitLab a créé un framework de contrôle de sécurité de A à Z","Découvrez le framework de contrôle personnalisé créé par l'équipe Security Compliance de GitLab, qui couvre plusieurs certifications et produits.","2026-03-24",[1405],"Davoud Tu","how-gitlab-built-a-security-control-framework-from-scratch",{"promotions":1408},[1409,1423,1435,1446],{"id":1410,"categories":1411,"header":1413,"text":1414,"button":1415,"image":1420},"ai-modernization",[1412],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":1416,"config":1417},"Obtenez votre score de maturité IA",{"href":1418,"dataGaName":1419,"dataGaLocation":907},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":1421},{"src":1422},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1424,"categories":1425,"header":1427,"text":1414,"button":1428,"image":1432},"devops-modernization",[1426,1235],"product","Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":1429,"config":1430},"Obtenez votre score de maturité DevOps",{"href":1431,"dataGaName":1419,"dataGaLocation":907},"/fr-fr/assessments/devops-modernization-assessment/",{"config":1433},{"src":1434},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1436,"categories":1437,"header":1438,"text":1414,"button":1439,"image":1443},"security-modernization",[689],"Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":1440,"config":1441},"Obtenez votre score de maturité en matière de sécurité",{"href":1442,"dataGaName":1419,"dataGaLocation":907},"/fr-fr/assessments/security-modernization-assessment/",{"config":1444},{"src":1445},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1447,"paths":1448,"header":1451,"text":1452,"button":1453,"image":1458},"github-azure-migration",[1449,1450],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Votre équipe est-elle prête pour la migration de GitHub vers Azure ?","GitHub a déjà commencé sa migration vers Azure. Découvrez ce que cela signifie pour vous.",{"text":1454,"config":1455},"Découvrez les différences entre GitLab et GitHub",{"href":1456,"dataGaName":1457,"dataGaLocation":907},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1459},{"src":1434},{"header":1461,"blurb":1462,"button":1463,"secondaryButton":1467},"Commencez à développer plus rapidement dès aujourd'hui","Découvrez ce que votre équipe peut accomplir avec la plateforme d'orchestration intelligente pour le DevSecOps.\n",{"text":701,"config":1464},{"href":1465,"dataGaName":704,"dataGaLocation":1466},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":1171,"config":1468},{"href":708,"dataGaName":709,"dataGaLocation":1466},1781392700002]