[{"data":1,"prerenderedAt":3160},["ShallowReactive",2],{"/fr-fr/blog/secure-rust-development-with-gitlab":3,"navigation-fr-fr":2377,"banner-fr-fr":2810,"footer-fr-fr":2818,"blog-post-authors-fr-fr-Fernando Diaz":3057,"blog-related-posts-fr-fr-secure-rust-development-with-gitlab":3072,"blog-promotions-fr-fr":3097,"next-steps-fr-fr":3151},{"id":4,"title":5,"authors":6,"body":8,"category":2357,"date":2358,"description":2359,"extension":2360,"externalUrl":2361,"faq":2361,"featured":199,"heroImage":2362,"meta":2363,"navigation":199,"path":2364,"seo":2365,"slug":2369,"stem":2370,"tags":2371,"template":2375,"updatedDate":2361,"__hash__":2376},"blogPosts/fr-fr/blog/secure-rust-development-with-gitlab.md","Rust : développement sécurisé avec GitLab",[7],"Fernando Diaz",{"type":9,"value":10,"toc":2332},"minimark",[11,15,33,38,53,62,69,81,87,91,94,99,102,118,628,631,650,653,657,663,935,938,960,964,973,982,991,995,1001,1163,1169,1175,1179,1182,1302,1308,1314,1318,1321,1330,1333,1343,1432,1435,1586,1589,1595,1606,1612,1621,1627,1631,1639,1646,1650,1656,1836,1845,1851,1856,1862,1866,1869,1872,1876,1886,2048,2054,2060,2064,2079,2083,2086,2092,2096,2103,2106,2111,2120,2123,2129,2135,2141,2147,2160,2164,2173,2176,2182,2188,2192,2201,2204,2210,2216,2223,2227,2230,2235,2261,2266,2286,2291,2317,2320,2328],[12,13,14],"p",{},"Rust s'est imposé comme l'un des langages de programmation les plus appréciés grâce à ses performances,\nsa mémoire sécurisée et ses fonctionnalités attractives. Alors que l'adoption de Rust continue de croître,\nde nombreux développeurs recherchent des plateformes CI/CD robustes pour prendre en charge leurs projets Rust.",[12,16,17,18,25,26,32],{},"Pour les équipes de développement qui utilisent Rust, l'attrait de GitLab va bien au-delà du simple hébergement de code. La plateforme offre\ndes capacités ",[19,20,24],"a",{"href":21,"rel":22,"title":23},"https://about.gitlab.com/fr-fr/topics/ci-cd/",[],"Qu'est-ce que le CI/CD ?","CI/CD"," robustes qui s'alignent parfaitement avec l'accent mis par Rust sur la sécurité, les performances et la fiabilité. GitLab facilite la création de dépôts et l'utilisation de conteneurs ",[19,27,31],{"href":28,"rel":29,"title":30},"https://about.gitlab.com/fr-fr/blog/what-is-docker-comprehensive-guide/",[],"Qu'est-ce que Docker ?","Docker"," prêts à l'emploi\npour exécuter des jobs CI personnalisés. Les équipes peuvent facilement configurer des tests automatisés, des compilations multiplateformes et la génération de documentation. L'approche intégrée de la plateforme DevSecOps résonne avec la philosophie de Rust qui consiste à fournir des outils complets prêts à l'emploi.",[34,35,37],"h2",{"id":36},"à-propos-de-lapplication-de-démonstration","À propos de l'application de démonstration",[12,39,40,41,46,47,52],{},"Nous nous intéressons à l'impact des taux hypothécaires sur les paiements mensuels et à la difficulté d'acheter une maison dans le contexte actuel, c'est pourquoi nous avons décidé d'écrire un ",[19,42,45],{"href":43,"rel":44},"https://gitlab.com/gitlab-da/tutorials/security-and-governance/devsecops/rust/mortgage-calculator",[],"calculateur de prêt hypothécaire"," en Rust, que nous utiliserons comme exemple tout au long de ce tutoriel. N'hésitez pas à ",[19,48,51],{"href":49,"rel":50},"https://docs.gitlab.com/user/project/import/repo_by_url/",[],"importer ce projet"," pour mieux suivre la démonstration.",[12,54,55,56,61],{},"Le calculateur de prêt hypothécaire aidera les utilisateurs à calculer les paiements mensuels d'un prêt hypothécaire, qui incluent le capital, les intérêts, les taxes foncières, l'assurance, l'assurance du prêt hypothécaire privée et les frais d'association de propriétaires. Il fournit une interface graphique moderne et intuitive au moyen du framework ",[19,57,60],{"href":58,"rel":59},"https://www.egui.rs/",[],"egui",", ainsi qu'une interface de ligne de commande pour l'exécuter dans le terminal.",[12,63,64],{},[65,66],"img",{"alt":67,"src":68},"Interface graphique du calculateur de prêt hypothécaire","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756314538/l5bjnzqvpoyikuyxpx2a.png",[12,70,71,72,80],{},"Cette application contient un fichier ",[19,73,76],{"href":74,"rel":75},"https://gitlab.com/gitlab-da/tutorials/security-and-governance/devsecops/rust/mortgage-calculator/-/blob/main/.gitlab-ci.yml?ref_type=heads",[],[77,78,79],"code",{},".gitlab-ci.yml"," qui génère un pipeline, lequel va construire, tester, empaqueter, analyser et déployer le logiciel. Nous examinerons cette définition du pipeline en détail dans les sections ci-dessous.",[12,82,83],{},[65,84],{"alt":85,"src":86},"Pipeline du calculateur de prêt hypothécaire","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756314540/llmsfoaupedhkem0hjqp.png",[34,88,90],{"id":89},"compilation-et-test-des-applications-rust","Compilation et test des applications Rust",[12,92,93],{},"Le système CI/CD basé sur Docker de GitLab excelle dans les workflows de développement Rust, car il fournit une base robuste\npour la compilation, les tests et les vérifications de qualité du code. Les mécanismes de mise en cache de la plateforme\nsont particulièrement précieux pour les projets Rust, qui peuvent avoir des temps de compilation longs en raison des\nprocessus approfondis d'optimisation et de vérification de sécurité du langage.",[95,96,98],"h3",{"id":97},"compilation","Compilation",[12,100,101],{},"Les excellentes capacités de compilation croisée de Rust combinées au système CI/CD flexible de GitLab\ncréent une solution puissante pour construire des applications sur plusieurs plateformes. Cette combinaison est particulièrement utile pour les applications Rust qui doivent fonctionner sur divers systèmes d'exploitation et architectures sans impacter les performances ou nécessiter du code spécifique à la plateforme.",[12,103,104,108,109,111,112,117],{},[105,106,107],"strong",{},"Remarque :"," vous pouvez en apprendre davantage sur le fichier ",[77,110,79],{}," en consultant la ",[19,113,116],{"href":114,"rel":115},"https://docs.gitlab.com/ci/yaml/",[],"référence dédiée à la syntaxe YAML CI/CD",".",[119,120,125],"pre",{"className":121,"code":122,"language":123,"meta":124,"style":124},"language-yaml shiki shiki-themes github-light","# Cache configuration to speed up builds by reusing dependencies\ncache:\n  key: $CI_COMMIT_REF_SLUG                               # Use branch name as cache key\n  paths:\n    - .cargo/                                            # Cache Cargo registry and git dependencies\n    - target/                                            # Cache compiled artifacts\n\n# Base template for Rust jobs - shared configuration\n.rust-template:\n  image: rust:$RUST_VERSION-slim                         # Use slim Rust image for faster downloads\n  before_script:\n    # Install system dependencies required for building the Rust application\n    - apt-get update && apt-get install -y pkg-config libssl-dev libgtk-3-dev libxcb-shape0-dev libxcb-xfixes0-dev\n\n# Template for cross-compilation build jobs\n.build-template:\n  extends: .rust-template                                # Inherit from rust-template\n  stage: build                                           # Execute during build stage\n  script:\n    - rustup target add $TARGET                          # Add the target platform for cross-compilation\n    - cargo build --release --target $TARGET             # Build optimized release binary for target platform\n\n# Build for Linux x86_64 (primary target platform)\nbuild-linux:\n  extends: .build-template                               # Use build template configuration\n  variables:\n    TARGET: x86_64-unknown-linux-gnu                     # Linux 64-bit target\n  artifacts:\n    paths:\n      - target/$TARGET/release/mortgage-calculator       # Save the compiled binary\n    expire_in: 1 week                                    # Keep artifacts for 1 week\n  allow_failure: false                                   # This build must succeed\n\n# Build for Windows x86_64 (cross-compilation)\nbuild-windows:\n  extends: .build-template                               # Use build template configuration\n  variables:\n    TARGET: x86_64-pc-windows-gnu                        # Windows 64-bit target\n  artifacts:\n    paths:\n      - target/$TARGET/release/mortgage-calculator       # Save the compiled binary\n    expire_in: 1 week                                    # Keep artifacts for 1 week\n  allow_failure: true                                    # Allow this build to fail (cross-compilation can be tricky)\n\n# Build for macOS x86_64 (cross-compilation)\nbuild-macos:\n  extends: .build-template                               # Use build template configuration\n  variables:\n    TARGET: x86_64-apple-darwin                          # macOS 64-bit target\n  artifacts:\n    paths:\n      - target/$TARGET/release/mortgage-calculator       # Save the compiled binary\n    expire_in: 1 week                                    # Keep artifacts for 1 week\n  allow_failure: true\n","yaml","",[77,126,127,136,147,163,171,183,194,201,207,215,229,237,243,251,256,262,270,283,297,305,316,327,332,338,346,358,366,380,388,396,408,422,437,442,448,456,467,474,487,494,501,510,521,534,539,545,553,564,571,584,591,598,607,618],{"__ignoreMap":124},[128,129,132],"span",{"class":130,"line":131},"line",1,[128,133,135],{"class":134},"sAwPA","# Cache configuration to speed up builds by reusing dependencies\n",[128,137,139,143],{"class":130,"line":138},2,[128,140,142],{"class":141},"shJU0","cache",[128,144,146],{"class":145},"sgsFI",":\n",[128,148,150,153,156,160],{"class":130,"line":149},3,[128,151,152],{"class":141},"  key",[128,154,155],{"class":145},": ",[128,157,159],{"class":158},"sYBdl","$CI_COMMIT_REF_SLUG",[128,161,162],{"class":134},"                               # Use branch name as cache key\n",[128,164,166,169],{"class":130,"line":165},4,[128,167,168],{"class":141},"  paths",[128,170,146],{"class":145},[128,172,174,177,180],{"class":130,"line":173},5,[128,175,176],{"class":145},"    - ",[128,178,179],{"class":158},".cargo/",[128,181,182],{"class":134},"                                            # Cache Cargo registry and git dependencies\n",[128,184,186,188,191],{"class":130,"line":185},6,[128,187,176],{"class":145},[128,189,190],{"class":158},"target/",[128,192,193],{"class":134},"                                            # Cache compiled artifacts\n",[128,195,197],{"class":130,"line":196},7,[128,198,200],{"emptyLinePlaceholder":199},true,"\n",[128,202,204],{"class":130,"line":203},8,[128,205,206],{"class":134},"# Base template for Rust jobs - shared configuration\n",[128,208,210,213],{"class":130,"line":209},9,[128,211,212],{"class":141},".rust-template",[128,214,146],{"class":145},[128,216,218,221,223,226],{"class":130,"line":217},10,[128,219,220],{"class":141},"  image",[128,222,155],{"class":145},[128,224,225],{"class":158},"rust:$RUST_VERSION-slim",[128,227,228],{"class":134},"                         # Use slim Rust image for faster downloads\n",[128,230,232,235],{"class":130,"line":231},11,[128,233,234],{"class":141},"  before_script",[128,236,146],{"class":145},[128,238,240],{"class":130,"line":239},12,[128,241,242],{"class":134},"    # Install system dependencies required for building the Rust application\n",[128,244,246,248],{"class":130,"line":245},13,[128,247,176],{"class":145},[128,249,250],{"class":158},"apt-get update && apt-get install -y pkg-config libssl-dev libgtk-3-dev libxcb-shape0-dev libxcb-xfixes0-dev\n",[128,252,254],{"class":130,"line":253},14,[128,255,200],{"emptyLinePlaceholder":199},[128,257,259],{"class":130,"line":258},15,[128,260,261],{"class":134},"# Template for cross-compilation build jobs\n",[128,263,265,268],{"class":130,"line":264},16,[128,266,267],{"class":141},".build-template",[128,269,146],{"class":145},[128,271,273,276,278,280],{"class":130,"line":272},17,[128,274,275],{"class":141},"  extends",[128,277,155],{"class":145},[128,279,212],{"class":158},[128,281,282],{"class":134},"                                # Inherit from rust-template\n",[128,284,286,289,291,294],{"class":130,"line":285},18,[128,287,288],{"class":141},"  stage",[128,290,155],{"class":145},[128,292,293],{"class":158},"build",[128,295,296],{"class":134},"                                           # Execute during build stage\n",[128,298,300,303],{"class":130,"line":299},19,[128,301,302],{"class":141},"  script",[128,304,146],{"class":145},[128,306,308,310,313],{"class":130,"line":307},20,[128,309,176],{"class":145},[128,311,312],{"class":158},"rustup target add $TARGET",[128,314,315],{"class":134},"                          # Add the target platform for cross-compilation\n",[128,317,319,321,324],{"class":130,"line":318},21,[128,320,176],{"class":145},[128,322,323],{"class":158},"cargo build --release --target $TARGET",[128,325,326],{"class":134},"             # Build optimized release binary for target platform\n",[128,328,330],{"class":130,"line":329},22,[128,331,200],{"emptyLinePlaceholder":199},[128,333,335],{"class":130,"line":334},23,[128,336,337],{"class":134},"# Build for Linux x86_64 (primary target platform)\n",[128,339,341,344],{"class":130,"line":340},24,[128,342,343],{"class":141},"build-linux",[128,345,146],{"class":145},[128,347,349,351,353,355],{"class":130,"line":348},25,[128,350,275],{"class":141},[128,352,155],{"class":145},[128,354,267],{"class":158},[128,356,357],{"class":134},"                               # Use build template configuration\n",[128,359,361,364],{"class":130,"line":360},26,[128,362,363],{"class":141},"  variables",[128,365,146],{"class":145},[128,367,369,372,374,377],{"class":130,"line":368},27,[128,370,371],{"class":141},"    TARGET",[128,373,155],{"class":145},[128,375,376],{"class":158},"x86_64-unknown-linux-gnu",[128,378,379],{"class":134},"                     # Linux 64-bit target\n",[128,381,383,386],{"class":130,"line":382},28,[128,384,385],{"class":141},"  artifacts",[128,387,146],{"class":145},[128,389,391,394],{"class":130,"line":390},29,[128,392,393],{"class":141},"    paths",[128,395,146],{"class":145},[128,397,399,402,405],{"class":130,"line":398},30,[128,400,401],{"class":145},"      - ",[128,403,404],{"class":158},"target/$TARGET/release/mortgage-calculator",[128,406,407],{"class":134},"       # Save the compiled binary\n",[128,409,411,414,416,419],{"class":130,"line":410},31,[128,412,413],{"class":141},"    expire_in",[128,415,155],{"class":145},[128,417,418],{"class":158},"1 week",[128,420,421],{"class":134},"                                    # Keep artifacts for 1 week\n",[128,423,425,428,430,434],{"class":130,"line":424},32,[128,426,427],{"class":141},"  allow_failure",[128,429,155],{"class":145},[128,431,433],{"class":432},"sYu0t","false",[128,435,436],{"class":134},"                                   # This build must succeed\n",[128,438,440],{"class":130,"line":439},33,[128,441,200],{"emptyLinePlaceholder":199},[128,443,445],{"class":130,"line":444},34,[128,446,447],{"class":134},"# Build for Windows x86_64 (cross-compilation)\n",[128,449,451,454],{"class":130,"line":450},35,[128,452,453],{"class":141},"build-windows",[128,455,146],{"class":145},[128,457,459,461,463,465],{"class":130,"line":458},36,[128,460,275],{"class":141},[128,462,155],{"class":145},[128,464,267],{"class":158},[128,466,357],{"class":134},[128,468,470,472],{"class":130,"line":469},37,[128,471,363],{"class":141},[128,473,146],{"class":145},[128,475,477,479,481,484],{"class":130,"line":476},38,[128,478,371],{"class":141},[128,480,155],{"class":145},[128,482,483],{"class":158},"x86_64-pc-windows-gnu",[128,485,486],{"class":134},"                        # Windows 64-bit target\n",[128,488,490,492],{"class":130,"line":489},39,[128,491,385],{"class":141},[128,493,146],{"class":145},[128,495,497,499],{"class":130,"line":496},40,[128,498,393],{"class":141},[128,500,146],{"class":145},[128,502,504,506,508],{"class":130,"line":503},41,[128,505,401],{"class":145},[128,507,404],{"class":158},[128,509,407],{"class":134},[128,511,513,515,517,519],{"class":130,"line":512},42,[128,514,413],{"class":141},[128,516,155],{"class":145},[128,518,418],{"class":158},[128,520,421],{"class":134},[128,522,524,526,528,531],{"class":130,"line":523},43,[128,525,427],{"class":141},[128,527,155],{"class":145},[128,529,530],{"class":432},"true",[128,532,533],{"class":134},"                                    # Allow this build to fail (cross-compilation can be tricky)\n",[128,535,537],{"class":130,"line":536},44,[128,538,200],{"emptyLinePlaceholder":199},[128,540,542],{"class":130,"line":541},45,[128,543,544],{"class":134},"# Build for macOS x86_64 (cross-compilation)\n",[128,546,548,551],{"class":130,"line":547},46,[128,549,550],{"class":141},"build-macos",[128,552,146],{"class":145},[128,554,556,558,560,562],{"class":130,"line":555},47,[128,557,275],{"class":141},[128,559,155],{"class":145},[128,561,267],{"class":158},[128,563,357],{"class":134},[128,565,567,569],{"class":130,"line":566},48,[128,568,363],{"class":141},[128,570,146],{"class":145},[128,572,574,576,578,581],{"class":130,"line":573},49,[128,575,371],{"class":141},[128,577,155],{"class":145},[128,579,580],{"class":158},"x86_64-apple-darwin",[128,582,583],{"class":134},"                          # macOS 64-bit target\n",[128,585,587,589],{"class":130,"line":586},50,[128,588,385],{"class":141},[128,590,146],{"class":145},[128,592,594,596],{"class":130,"line":593},51,[128,595,393],{"class":141},[128,597,146],{"class":145},[128,599,601,603,605],{"class":130,"line":600},52,[128,602,401],{"class":145},[128,604,404],{"class":158},[128,606,407],{"class":134},[128,608,610,612,614,616],{"class":130,"line":609},53,[128,611,413],{"class":141},[128,613,155],{"class":145},[128,615,418],{"class":158},[128,617,421],{"class":134},[128,619,621,623,625],{"class":130,"line":620},54,[128,622,427],{"class":141},[128,624,155],{"class":145},[128,626,627],{"class":432},"true\n",[12,629,630],{},"Cette configuration GitLab CI définit trois jobs de compilation qui compilent de manière croisée une application\nde calculateur de prêt hypothécaire Rust pour différentes plateformes :",[632,633,634,640,645],"ul",{},[635,636,637,639],"li",{},[77,638,343],{}," crée un binaire Linux x86_64 (requis pour réussir)",[635,641,642,644],{},[77,643,453],{}," crée des binaires Windows (autorisés à échouer)",[635,646,647,649],{},[77,648,550],{}," crée des binaires macOS x86_64 (autorisés à échouer)",[12,651,652],{},"Toutes les compilations utilisent des templates partagés pour la mise en cache des dépendances et des environnements de compilation cohérents.",[95,654,656],{"id":655},"tests","Tests",[12,658,659,660,662],{},"GitLab CI/CD simplifie les tests de code grâce à son système de pipeline intégré qui déclenche automatiquement\nles suites de tests chaque fois qu'un push du code est effectué vers le dépôt. Les développeurs peuvent définir plusieurs types de tests (tests unitaires, tests d'intégration, linting et vérifications de formatage) dans un seul fichier de configuration ",[77,661,79],{},". Chaque test s'exécute dans des conteneurs Docker isolés pour garantir des environnements cohérents.",[119,664,666],{"className":121,"code":665,"language":123,"meta":124,"style":124},"  # Run unit tests\ntest:unit:\n  extends: .rust-template                                # Use Rust template configuration\n  stage: test                                            # Execute during test stage\n  script:\n    - cargo test --verbose                               # Run all unit tests with verbose output\n\n# Run integration tests using the compiled binary\ntest:integration:\n  extends: .rust-template                                # Use Rust template configuration\n  stage: test                                            # Execute during test stage\n  script:\n    # Test the compiled binary with sample inputs and verify expected output\n    - target/x86_64-unknown-linux-gnu/release/mortgage-calculator --cli calculate --property-value 350000 --down-payment 70000 --interest-rate 5.0 | grep -q \"TOTAL MONTHLY PAYMENT\"\n  needs:\n    - build-linux                                        # Depends on Linux build job completing\n\n# Run Clippy linter for code quality checks\ntest:clippy:\n  extends: .rust-template                                # Use Rust template configuration\n  stage: test                                            # Execute during test stage\n  script:\n    - rustup component add clippy                        # Install Clippy linter\n    - cargo clippy -- -D warnings                       # Run Clippy and treat warnings as errors\n  allow_failure: true                                    # Allow linting failures (can be improved over time)\n\n# Check code formatting\ntest:format:\n  extends: .rust-template                                # Use Rust template configuration\n  stage: test                                            # Execute during test stage\n  script:\n    - rustup component add rustfmt                       # Install Rust formatter\n    - cargo fmt -- --check                              # Check if code is properly formatted\n  allow_failure: true                                    # Allow formatting failures (can be improved over time)\n",[77,667,668,673,680,691,703,709,719,723,728,735,745,755,761,766,773,780,789,793,798,805,815,825,831,841,851,862,866,871,878,888,898,904,914,924],{"__ignoreMap":124},[128,669,670],{"class":130,"line":131},[128,671,672],{"class":134},"  # Run unit tests\n",[128,674,675,678],{"class":130,"line":138},[128,676,677],{"class":141},"test:unit",[128,679,146],{"class":145},[128,681,682,684,686,688],{"class":130,"line":149},[128,683,275],{"class":141},[128,685,155],{"class":145},[128,687,212],{"class":158},[128,689,690],{"class":134},"                                # Use Rust template configuration\n",[128,692,693,695,697,700],{"class":130,"line":165},[128,694,288],{"class":141},[128,696,155],{"class":145},[128,698,699],{"class":158},"test",[128,701,702],{"class":134},"                                            # Execute during test stage\n",[128,704,705,707],{"class":130,"line":173},[128,706,302],{"class":141},[128,708,146],{"class":145},[128,710,711,713,716],{"class":130,"line":185},[128,712,176],{"class":145},[128,714,715],{"class":158},"cargo test --verbose",[128,717,718],{"class":134},"                               # Run all unit tests with verbose output\n",[128,720,721],{"class":130,"line":196},[128,722,200],{"emptyLinePlaceholder":199},[128,724,725],{"class":130,"line":203},[128,726,727],{"class":134},"# Run integration tests using the compiled binary\n",[128,729,730,733],{"class":130,"line":209},[128,731,732],{"class":141},"test:integration",[128,734,146],{"class":145},[128,736,737,739,741,743],{"class":130,"line":217},[128,738,275],{"class":141},[128,740,155],{"class":145},[128,742,212],{"class":158},[128,744,690],{"class":134},[128,746,747,749,751,753],{"class":130,"line":231},[128,748,288],{"class":141},[128,750,155],{"class":145},[128,752,699],{"class":158},[128,754,702],{"class":134},[128,756,757,759],{"class":130,"line":239},[128,758,302],{"class":141},[128,760,146],{"class":145},[128,762,763],{"class":130,"line":245},[128,764,765],{"class":134},"    # Test the compiled binary with sample inputs and verify expected output\n",[128,767,768,770],{"class":130,"line":253},[128,769,176],{"class":145},[128,771,772],{"class":158},"target/x86_64-unknown-linux-gnu/release/mortgage-calculator --cli calculate --property-value 350000 --down-payment 70000 --interest-rate 5.0 | grep -q \"TOTAL MONTHLY PAYMENT\"\n",[128,774,775,778],{"class":130,"line":258},[128,776,777],{"class":141},"  needs",[128,779,146],{"class":145},[128,781,782,784,786],{"class":130,"line":264},[128,783,176],{"class":145},[128,785,343],{"class":158},[128,787,788],{"class":134},"                                        # Depends on Linux build job completing\n",[128,790,791],{"class":130,"line":272},[128,792,200],{"emptyLinePlaceholder":199},[128,794,795],{"class":130,"line":285},[128,796,797],{"class":134},"# Run Clippy linter for code quality checks\n",[128,799,800,803],{"class":130,"line":299},[128,801,802],{"class":141},"test:clippy",[128,804,146],{"class":145},[128,806,807,809,811,813],{"class":130,"line":307},[128,808,275],{"class":141},[128,810,155],{"class":145},[128,812,212],{"class":158},[128,814,690],{"class":134},[128,816,817,819,821,823],{"class":130,"line":318},[128,818,288],{"class":141},[128,820,155],{"class":145},[128,822,699],{"class":158},[128,824,702],{"class":134},[128,826,827,829],{"class":130,"line":329},[128,828,302],{"class":141},[128,830,146],{"class":145},[128,832,833,835,838],{"class":130,"line":334},[128,834,176],{"class":145},[128,836,837],{"class":158},"rustup component add clippy",[128,839,840],{"class":134},"                        # Install Clippy linter\n",[128,842,843,845,848],{"class":130,"line":340},[128,844,176],{"class":145},[128,846,847],{"class":158},"cargo clippy -- -D warnings",[128,849,850],{"class":134},"                       # Run Clippy and treat warnings as errors\n",[128,852,853,855,857,859],{"class":130,"line":348},[128,854,427],{"class":141},[128,856,155],{"class":145},[128,858,530],{"class":432},[128,860,861],{"class":134},"                                    # Allow linting failures (can be improved over time)\n",[128,863,864],{"class":130,"line":360},[128,865,200],{"emptyLinePlaceholder":199},[128,867,868],{"class":130,"line":368},[128,869,870],{"class":134},"# Check code formatting\n",[128,872,873,876],{"class":130,"line":382},[128,874,875],{"class":141},"test:format",[128,877,146],{"class":145},[128,879,880,882,884,886],{"class":130,"line":390},[128,881,275],{"class":141},[128,883,155],{"class":145},[128,885,212],{"class":158},[128,887,690],{"class":134},[128,889,890,892,894,896],{"class":130,"line":398},[128,891,288],{"class":141},[128,893,155],{"class":145},[128,895,699],{"class":158},[128,897,702],{"class":134},[128,899,900,902],{"class":130,"line":410},[128,901,302],{"class":141},[128,903,146],{"class":145},[128,905,906,908,911],{"class":130,"line":424},[128,907,176],{"class":145},[128,909,910],{"class":158},"rustup component add rustfmt",[128,912,913],{"class":134},"                       # Install Rust formatter\n",[128,915,916,918,921],{"class":130,"line":439},[128,917,176],{"class":145},[128,919,920],{"class":158},"cargo fmt -- --check",[128,922,923],{"class":134},"                              # Check if code is properly formatted\n",[128,925,926,928,930,932],{"class":130,"line":444},[128,927,427],{"class":141},[128,929,155],{"class":145},[128,931,530],{"class":432},[128,933,934],{"class":134},"                                    # Allow formatting failures (can be improved over time)\n",[12,936,937],{},"Cette configuration GitLab CI crée quatre jobs de test qui valident l'application de calculateur de prêt hypothécaire Rust :",[632,939,940,945,950,955],{},[635,941,942,944],{},[77,943,677],{}," exécute les tests unitaires",[635,946,947,949],{},[77,948,732],{}," exécute le binaire Linux compilé avec des intrants d'exemple pour vérifier la fonctionnalité",[635,951,952,954],{},[77,953,802],{}," effectue le linting de la qualité du code (autorisé à échouer)",[635,956,957,959],{},[77,958,875],{}," vérifie la conformité du formatage du code (autorisé à échouer)",[34,961,963],{"id":962},"registres-de-paquets-et-de-conteneurs","Registres de paquets et de conteneurs",[12,965,966,967,972],{},"Le ",[19,968,971],{"href":969,"rel":970},"https://docs.gitlab.com/user/packages/package_registry/",[],"registre de paquets"," de GitLab fournit une solution sécurisée au partage de bibliothèques internes et de code propriétaire au sein des organisations. Cette fonctionnalité est essentielle pour les entreprises et équipes qui doivent maintenir des artefacts et continuer à utiliser l'écosystème Rust au sens large.",[12,974,975,976,981],{},"Le registre prend en charge les ",[19,977,980],{"href":978,"rel":979},"https://docs.gitlab.com/user/packages/generic_packages/",[],"artefacts génériques"," avec des contrôles d'accès granulaires en fonction des permissions de projet de GitLab. Les équipes peuvent donc partager des bibliothèques en toute sécurité entre les projets ainsi que respecter la protection de la propriété intellectuelle et les exigences de conformité.",[12,983,984,985,990],{},"De plus, nous pouvons conteneuriser notre application et stocker les images de conteneur dans\nle ",[19,986,989],{"href":987,"rel":988},"https://docs.gitlab.com/user/packages/container_registry/",[],"registre des conteneurs"," intégré de GitLab.",[95,992,994],{"id":993},"publication-vers-le-registre-de-paquets-gitlab","Publication vers le registre de paquets GitLab",[12,996,997,998,1000],{},"Cette section de notre ",[77,999,79],{}," démontre comment packager et publier des applications Rust\nsous forme d'archives tar vers le registre de paquets génériques de GitLab au moyen de l'automatisation CI/CD.",[119,1002,1004],{"className":121,"code":1003,"language":123,"meta":124,"style":124},"# Package application as tar archive\npackage:tar:\n  image: alpine/curl:8.12.1                             # Lightweight image with curl for uploading\n  stage: package                                         # Execute during package stage\n  variables:\n    PACKAGE_NAME: mortgage-calculator.tar.gz             # Name of the archive file\n  script:\n    # Create tar archive of the Linux binary\n    - tar -czvf $PACKAGE_NAME target/x86_64-unknown-linux-gnu/release/mortgage-calculator\n    # Upload archive to GitLab Package Registry using API\n    - |\n      curl -v --location --header \"JOB-TOKEN: $CI_JOB_TOKEN\" \\\n      --upload-file $PACKAGE_NAME \\\n      \"$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/tar/$CI_COMMIT_BRANCH/$PACKAGE_NAME\"\n  artifacts:\n    paths:\n      - target/x86_64-unknown-linux-gnu/release/mortgage-calculator  # Save binary\n      - mortgage-calculator.tar.gz                      # Save archive\n    expire_in: 1 week                                    # Keep artifacts for 1 week\n  needs:\n    - build-linux                                        # Depends on Linux build completing\n",[77,1005,1006,1011,1018,1030,1042,1048,1061,1067,1072,1079,1084,1092,1097,1102,1107,1113,1119,1129,1138,1148,1154],{"__ignoreMap":124},[128,1007,1008],{"class":130,"line":131},[128,1009,1010],{"class":134},"# Package application as tar archive\n",[128,1012,1013,1016],{"class":130,"line":138},[128,1014,1015],{"class":141},"package:tar",[128,1017,146],{"class":145},[128,1019,1020,1022,1024,1027],{"class":130,"line":149},[128,1021,220],{"class":141},[128,1023,155],{"class":145},[128,1025,1026],{"class":158},"alpine/curl:8.12.1",[128,1028,1029],{"class":134},"                             # Lightweight image with curl for uploading\n",[128,1031,1032,1034,1036,1039],{"class":130,"line":165},[128,1033,288],{"class":141},[128,1035,155],{"class":145},[128,1037,1038],{"class":158},"package",[128,1040,1041],{"class":134},"                                         # Execute during package stage\n",[128,1043,1044,1046],{"class":130,"line":173},[128,1045,363],{"class":141},[128,1047,146],{"class":145},[128,1049,1050,1053,1055,1058],{"class":130,"line":185},[128,1051,1052],{"class":141},"    PACKAGE_NAME",[128,1054,155],{"class":145},[128,1056,1057],{"class":158},"mortgage-calculator.tar.gz",[128,1059,1060],{"class":134},"             # Name of the archive file\n",[128,1062,1063,1065],{"class":130,"line":196},[128,1064,302],{"class":141},[128,1066,146],{"class":145},[128,1068,1069],{"class":130,"line":203},[128,1070,1071],{"class":134},"    # Create tar archive of the Linux binary\n",[128,1073,1074,1076],{"class":130,"line":209},[128,1075,176],{"class":145},[128,1077,1078],{"class":158},"tar -czvf $PACKAGE_NAME target/x86_64-unknown-linux-gnu/release/mortgage-calculator\n",[128,1080,1081],{"class":130,"line":217},[128,1082,1083],{"class":134},"    # Upload archive to GitLab Package Registry using API\n",[128,1085,1086,1088],{"class":130,"line":231},[128,1087,176],{"class":145},[128,1089,1091],{"class":1090},"sD7c4","|\n",[128,1093,1094],{"class":130,"line":239},[128,1095,1096],{"class":158},"      curl -v --location --header \"JOB-TOKEN: $CI_JOB_TOKEN\" \\\n",[128,1098,1099],{"class":130,"line":245},[128,1100,1101],{"class":158},"      --upload-file $PACKAGE_NAME \\\n",[128,1103,1104],{"class":130,"line":253},[128,1105,1106],{"class":158},"      \"$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/tar/$CI_COMMIT_BRANCH/$PACKAGE_NAME\"\n",[128,1108,1109,1111],{"class":130,"line":258},[128,1110,385],{"class":141},[128,1112,146],{"class":145},[128,1114,1115,1117],{"class":130,"line":264},[128,1116,393],{"class":141},[128,1118,146],{"class":145},[128,1120,1121,1123,1126],{"class":130,"line":272},[128,1122,401],{"class":145},[128,1124,1125],{"class":158},"target/x86_64-unknown-linux-gnu/release/mortgage-calculator",[128,1127,1128],{"class":134},"  # Save binary\n",[128,1130,1131,1133,1135],{"class":130,"line":285},[128,1132,401],{"class":145},[128,1134,1057],{"class":158},[128,1136,1137],{"class":134},"                      # Save archive\n",[128,1139,1140,1142,1144,1146],{"class":130,"line":299},[128,1141,413],{"class":141},[128,1143,155],{"class":145},[128,1145,418],{"class":158},[128,1147,421],{"class":134},[128,1149,1150,1152],{"class":130,"line":307},[128,1151,777],{"class":141},[128,1153,146],{"class":145},[128,1155,1156,1158,1160],{"class":130,"line":318},[128,1157,176],{"class":145},[128,1159,343],{"class":158},[128,1161,1162],{"class":134},"                                        # Depends on Linux build completing\n",[12,1164,1165,1166,1168],{},"Cette configuration GitLab CI définit un job d'empaquetage ",[77,1167,1015],{}," qui crée une archive tar compressée\ndu binaire de calculateur de prêt hypothécaire Linux et l'importe vers le registre de paquets de GitLab, et sauvegarde à la fois le binaire et l'archive comme artefacts de pipeline.",[12,1170,1171],{},[65,1172],{"alt":1173,"src":1174},"Registre de paquets","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756314541/uqnejcipnge3r1dngotm.png",[95,1176,1178],{"id":1177},"publication-vers-le-registre-de-conteneurs-gitlab","Publication vers le registre de conteneurs GitLab",[12,1180,1181],{},"Le bloc de code ci-dessous montre le processus de création de Dockerfiles et de publication d'images Docker vers le registre de conteneurs de GitLab avec un ajout de tags et une authentification appropriés.",[119,1183,1185],{"className":121,"code":1184,"language":123,"meta":124,"style":124},"# Package application as Docker image\npackage:docker:\n  image: docker:24.0                                     # Use Docker image for building containers\n  stage: package                                         # Execute during package stage\n  services:\n    - docker:24.0-dind                                   # Docker-in-Docker service for building images\n  before_script:\n    # Login to GitLab Container Registry\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n  script:\n    - docker build -t $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG .  # Build Docker image with commit SHA tag\n    - docker tag $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG $DOCKER_IMAGE_NAME:latest  # Also tag as latest\n    - docker push $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG  # Push tagged image to registry\n    - docker push $DOCKER_IMAGE_NAME:latest             # Push latest image to registry\n",[77,1186,1187,1192,1199,1211,1221,1228,1238,1244,1249,1256,1262,1272,1282,1292],{"__ignoreMap":124},[128,1188,1189],{"class":130,"line":131},[128,1190,1191],{"class":134},"# Package application as Docker image\n",[128,1193,1194,1197],{"class":130,"line":138},[128,1195,1196],{"class":141},"package:docker",[128,1198,146],{"class":145},[128,1200,1201,1203,1205,1208],{"class":130,"line":149},[128,1202,220],{"class":141},[128,1204,155],{"class":145},[128,1206,1207],{"class":158},"docker:24.0",[128,1209,1210],{"class":134},"                                     # Use Docker image for building containers\n",[128,1212,1213,1215,1217,1219],{"class":130,"line":165},[128,1214,288],{"class":141},[128,1216,155],{"class":145},[128,1218,1038],{"class":158},[128,1220,1041],{"class":134},[128,1222,1223,1226],{"class":130,"line":173},[128,1224,1225],{"class":141},"  services",[128,1227,146],{"class":145},[128,1229,1230,1232,1235],{"class":130,"line":185},[128,1231,176],{"class":145},[128,1233,1234],{"class":158},"docker:24.0-dind",[128,1236,1237],{"class":134},"                                   # Docker-in-Docker service for building images\n",[128,1239,1240,1242],{"class":130,"line":196},[128,1241,234],{"class":141},[128,1243,146],{"class":145},[128,1245,1246],{"class":130,"line":203},[128,1247,1248],{"class":134},"    # Login to GitLab Container Registry\n",[128,1250,1251,1253],{"class":130,"line":209},[128,1252,176],{"class":145},[128,1254,1255],{"class":158},"docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n",[128,1257,1258,1260],{"class":130,"line":217},[128,1259,302],{"class":141},[128,1261,146],{"class":145},[128,1263,1264,1266,1269],{"class":130,"line":231},[128,1265,176],{"class":145},[128,1267,1268],{"class":158},"docker build -t $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG .",[128,1270,1271],{"class":134},"  # Build Docker image with commit SHA tag\n",[128,1273,1274,1276,1279],{"class":130,"line":239},[128,1275,176],{"class":145},[128,1277,1278],{"class":158},"docker tag $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG $DOCKER_IMAGE_NAME:latest",[128,1280,1281],{"class":134},"  # Also tag as latest\n",[128,1283,1284,1286,1289],{"class":130,"line":245},[128,1285,176],{"class":145},[128,1287,1288],{"class":158},"docker push $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",[128,1290,1291],{"class":134},"  # Push tagged image to registry\n",[128,1293,1294,1296,1299],{"class":130,"line":253},[128,1295,176],{"class":145},[128,1297,1298],{"class":158},"docker push $DOCKER_IMAGE_NAME:latest",[128,1300,1301],{"class":134},"             # Push latest image to registry\n",[12,1303,1304,1305,1307],{},"Cette configuration GitLab CI définit un job d'empaquetage Docker ",[77,1306,1196],{}," qui crée une image Docker de l'application de calculateur de prêt hypothécaire, ajoute les tags « commit SHA » et « latest », puis pousse les deux versions avec un tag vers le registre de conteneurs de GitLab.",[12,1309,1310],{},[65,1311],{"alt":1312,"src":1313},"Registre de conteneurs","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756314537/nlodhvdnpqccf0cryfqu.png",[34,1315,1317],{"id":1316},"scanning-de-sécurité","Scanning de sécurité",[12,1319,1320],{},"Le scanning de sécurité GitLab fournit une protection complète qui va au-delà des garanties de sécurité mémoire intégrées de Rust. Bien que Rust prévienne de nombreuses vulnérabilités de sécurité courantes au moment de la compilation, les applications ont encore besoin de protection contre les vulnérabilités des dépendances, les blocs de code non sécurisés et les problèmes de sécurité logiques.",[12,1322,1323,1324,1329],{},"Les tests statiques de sécurité des applications ",[19,1325,1328],{"href":1326,"rel":1327},"https://docs.gitlab.com/user/application_security/sast/",[],"SAST"," de la plateforme s'intègrent parfaitement avec la chaîne d'outils de Rust et fournissent une analyse de sécurité automatisée dans le pipeline CI/CD. Cette approche proactive détecte les problèmes de sécurité avant qu'ils n'arrivent en production afin de répondre à la fois aux exigences de conformité et aux pratiques de développement sécurisé.",[12,1331,1332],{},"Les fonctionnalités de sécurité complètes de GitLab, y compris les tests SAST, l'analyse des dépendances et la détection des secrets peuvent facilement être implémentées via des modèles, comme illustré ci-dessous.",[12,1334,1335,1337,1338,117],{},[105,1336,107],{},"  une configuration supplémentaire est requise pour ",[19,1339,1342],{"href":1340,"rel":1341},"https://docs.gitlab.com/user/application_security/sast/#scan-a-rust-application",[],"activer les tests SAST pour Rust",[119,1344,1346],{"className":121,"code":1345,"language":123,"meta":124,"style":124},"# Include GitLab's security scanning templates for DevSecOps\ninclude:\n  - template: Jobs/SAST.gitlab-ci.yml                    # Static Application Security Testing\n  - template: Jobs/Dependency-Scanning.latest.gitlab-ci.yml  # Scan dependencies for vulnerabilities\n  - template: Jobs/Container-Scanning.gitlab-ci.yml      # Scan Docker containers for vulnerabilities\n  - template: Jobs/SAST-IaC.gitlab-ci.yml               # Infrastructure as Code security scanning\n  - template: Jobs/Secret-Detection.gitlab-ci.yml        # Detect secrets in source code\n",[77,1347,1348,1353,1360,1376,1390,1404,1418],{"__ignoreMap":124},[128,1349,1350],{"class":130,"line":131},[128,1351,1352],{"class":134},"# Include GitLab's security scanning templates for DevSecOps\n",[128,1354,1355,1358],{"class":130,"line":138},[128,1356,1357],{"class":141},"include",[128,1359,146],{"class":145},[128,1361,1362,1365,1368,1370,1373],{"class":130,"line":149},[128,1363,1364],{"class":145},"  - ",[128,1366,1367],{"class":141},"template",[128,1369,155],{"class":145},[128,1371,1372],{"class":158},"Jobs/SAST.gitlab-ci.yml",[128,1374,1375],{"class":134},"                    # Static Application Security Testing\n",[128,1377,1378,1380,1382,1384,1387],{"class":130,"line":165},[128,1379,1364],{"class":145},[128,1381,1367],{"class":141},[128,1383,155],{"class":145},[128,1385,1386],{"class":158},"Jobs/Dependency-Scanning.latest.gitlab-ci.yml",[128,1388,1389],{"class":134},"  # Scan dependencies for vulnerabilities\n",[128,1391,1392,1394,1396,1398,1401],{"class":130,"line":173},[128,1393,1364],{"class":145},[128,1395,1367],{"class":141},[128,1397,155],{"class":145},[128,1399,1400],{"class":158},"Jobs/Container-Scanning.gitlab-ci.yml",[128,1402,1403],{"class":134},"      # Scan Docker containers for vulnerabilities\n",[128,1405,1406,1408,1410,1412,1415],{"class":130,"line":185},[128,1407,1364],{"class":145},[128,1409,1367],{"class":141},[128,1411,155],{"class":145},[128,1413,1414],{"class":158},"Jobs/SAST-IaC.gitlab-ci.yml",[128,1416,1417],{"class":134},"               # Infrastructure as Code security scanning\n",[128,1419,1420,1422,1424,1426,1429],{"class":130,"line":196},[128,1421,1364],{"class":145},[128,1423,1367],{"class":141},[128,1425,155],{"class":145},[128,1427,1428],{"class":158},"Jobs/Secret-Detection.gitlab-ci.yml",[128,1430,1431],{"class":134},"        # Detect secrets in source code\n",[12,1433,1434],{},"Les scanners de sécurité peuvent être configurés de manière similaire à n'importe quel job sur GitLab :",[119,1436,1438],{"className":121,"code":1437,"language":123,"meta":124,"style":124},"# Configure Semgrep SAST scanning for Rust files\nsemgrep-sast:\n  rules:\n    - if: $CI_COMMIT_BRANCH                              # Run on any branch\n      exists:\n        - \"**/*.rs\"                                      # Only if Rust files exist\n  variables:\n    SAST_EXCLUDED_PATHS: \".cargo/**\"                     # Exclude Cargo cache from scanning\n\n# Scan Docker container for security vulnerabilities\ncontainer_scanning:\n  stage: container-security                              # Execute during container-security stage\n  variables:\n    CS_IMAGE: $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG      # Image to scan\n    CS_DOCKERFILE_PATH: Dockerfile                       # Path to Dockerfile for context\n  needs:\n    - package:docker                                     # Depends on Docker image being built\n",[77,1439,1440,1445,1452,1459,1474,1481,1492,1498,1511,1515,1520,1527,1539,1545,1558,1571,1577],{"__ignoreMap":124},[128,1441,1442],{"class":130,"line":131},[128,1443,1444],{"class":134},"# Configure Semgrep SAST scanning for Rust files\n",[128,1446,1447,1450],{"class":130,"line":138},[128,1448,1449],{"class":141},"semgrep-sast",[128,1451,146],{"class":145},[128,1453,1454,1457],{"class":130,"line":149},[128,1455,1456],{"class":141},"  rules",[128,1458,146],{"class":145},[128,1460,1461,1463,1466,1468,1471],{"class":130,"line":165},[128,1462,176],{"class":145},[128,1464,1465],{"class":141},"if",[128,1467,155],{"class":145},[128,1469,1470],{"class":158},"$CI_COMMIT_BRANCH",[128,1472,1473],{"class":134},"                              # Run on any branch\n",[128,1475,1476,1479],{"class":130,"line":173},[128,1477,1478],{"class":141},"      exists",[128,1480,146],{"class":145},[128,1482,1483,1486,1489],{"class":130,"line":185},[128,1484,1485],{"class":145},"        - ",[128,1487,1488],{"class":158},"\"**/*.rs\"",[128,1490,1491],{"class":134},"                                      # Only if Rust files exist\n",[128,1493,1494,1496],{"class":130,"line":196},[128,1495,363],{"class":141},[128,1497,146],{"class":145},[128,1499,1500,1503,1505,1508],{"class":130,"line":203},[128,1501,1502],{"class":141},"    SAST_EXCLUDED_PATHS",[128,1504,155],{"class":145},[128,1506,1507],{"class":158},"\".cargo/**\"",[128,1509,1510],{"class":134},"                     # Exclude Cargo cache from scanning\n",[128,1512,1513],{"class":130,"line":209},[128,1514,200],{"emptyLinePlaceholder":199},[128,1516,1517],{"class":130,"line":217},[128,1518,1519],{"class":134},"# Scan Docker container for security vulnerabilities\n",[128,1521,1522,1525],{"class":130,"line":231},[128,1523,1524],{"class":141},"container_scanning",[128,1526,146],{"class":145},[128,1528,1529,1531,1533,1536],{"class":130,"line":239},[128,1530,288],{"class":141},[128,1532,155],{"class":145},[128,1534,1535],{"class":158},"container-security",[128,1537,1538],{"class":134},"                              # Execute during container-security stage\n",[128,1540,1541,1543],{"class":130,"line":245},[128,1542,363],{"class":141},[128,1544,146],{"class":145},[128,1546,1547,1550,1552,1555],{"class":130,"line":253},[128,1548,1549],{"class":141},"    CS_IMAGE",[128,1551,155],{"class":145},[128,1553,1554],{"class":158},"$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",[128,1556,1557],{"class":134},"      # Image to scan\n",[128,1559,1560,1563,1565,1568],{"class":130,"line":258},[128,1561,1562],{"class":141},"    CS_DOCKERFILE_PATH",[128,1564,155],{"class":145},[128,1566,1567],{"class":158},"Dockerfile",[128,1569,1570],{"class":134},"                       # Path to Dockerfile for context\n",[128,1572,1573,1575],{"class":130,"line":264},[128,1574,777],{"class":141},[128,1576,146],{"class":145},[128,1578,1579,1581,1583],{"class":130,"line":272},[128,1580,176],{"class":145},[128,1582,1196],{"class":158},[128,1584,1585],{"class":134},"                                     # Depends on Docker image being built\n",[12,1587,1588],{},"Lorsque des vulnérabilités sont détectées dans une merge request (MR), vous pouvez toutes les afficher et utiliser les informations fournies pour les résoudre ou les rejeter.",[12,1590,1591],{},[65,1592],{"alt":1593,"src":1594},"Affichage des vulnérabilités dans la MR","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756314544/gcicke3ltvbcv57mr8zr.png",[12,1596,1597,1598,1603,1604,117],{},"Vous pouvez également ajouter des ",[19,1599,1602],{"href":1600,"rel":1601},"https://docs.gitlab.com/user/application_security/policies/",[],"stratégies de sécurité"," pour exiger une approbation avant que du code vulnérable puisse être fusionné, ou pour forcer l'exécution des scanners indépendamment de ce qui se trouve dans le ",[77,1605,79],{},[12,1607,1608],{},[65,1609],{"alt":1610,"src":1611},"Politique d'approbation des merge requests","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756314538/c95nwocol03lonrr6r4n.png",[12,1613,1614,1615,1620],{},"Vous pouvez trier toutes les vulnérabilités trouvées dans votre branche par défaut au moyen du ",[19,1616,1619],{"href":1617,"rel":1618},"https://docs.gitlab.com/user/application_security/vulnerability_report/",[],"rapport de vulnérabilités"," :",[12,1622,1623],{},[65,1624],{"alt":1625,"src":1626},"Rapport de vulnérabilités","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756314544/b0nctigbv1ddpzizkp9x.png",[34,1628,1630],{"id":1629},"documentation-avec-gitlab-pages","Documentation avec GitLab Pages",[12,1632,1633,1638],{},[19,1634,1637],{"href":1635,"rel":1636},"https://docs.gitlab.com/user/project/pages/",[],"GitLab Pages"," fournit une excellente plateforme pour héberger la documentation Rust, car il s'intègre parfaitement avec la génération de documentation intégrée de Cargo. Ce workflow puissant génère et déploie la documentation API, les guides de projet et les exemples automatiquement à chaque modification de code.",[12,1640,1641,1642,1645],{},"La combinaison de ",[77,1643,1644],{},"cargo doc"," et GitLab Pages permet aux équipes de maintenir une documentation à jour sans intervention manuelle afin que la documentation soit synchronisée avec les modifications de code. Cette fonctionnalité est particulièrement utile pour les projets Rust où une documentation complète est essentielle pour comprendre les API complexes et les contrats de sécurité.",[95,1647,1649],{"id":1648},"déploiement-automatisé-de-la-documentation","Déploiement automatisé de la documentation",[12,1651,1652,1653,1655],{},"Le code ci-dessous montre la configuration CI/CD nécessaire pour générer et déployer automatiquement la documentation Rust au moyen de ",[77,1654,1644],{}," et GitLab Pages.",[119,1657,1659],{"className":121,"code":1658,"language":123,"meta":124,"style":124},"# Generate and publish documentation using GitLab Pages\nbuild-documentation:\n  extends: .rust-template                                # Use Rust template configuration\n  stage: build                                           # Execute during build stage\n  variables:\n    GIT_SUBMODULE_STRATEGY: recursive                    # Clone submodules recursively if needed\n  pages: true                                            # Enable GitLab Pages deployment\n  script:\n    - cargo doc --no-deps                                # Generate documentation without dependencies\n    - mv target/doc public                               # Move docs to public directory for Pages\n  artifacts:\n    paths:\n      - public                                           # GitLab Pages serves from public directory\n  rules:\n    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH     # Only run on default branch (main/master)\n  environment:\n    name: documentation                                  # Environment name for tracking\n    url: $CI_PAGES_URL/mortgage_calculator/index.html   # Documentation URL\n  allow_failure: true                                    # Allow documentation build to fail\n",[77,1660,1661,1666,1673,1683,1693,1699,1712,1724,1730,1740,1750,1756,1762,1772,1778,1792,1799,1812,1825],{"__ignoreMap":124},[128,1662,1663],{"class":130,"line":131},[128,1664,1665],{"class":134},"# Generate and publish documentation using GitLab Pages\n",[128,1667,1668,1671],{"class":130,"line":138},[128,1669,1670],{"class":141},"build-documentation",[128,1672,146],{"class":145},[128,1674,1675,1677,1679,1681],{"class":130,"line":149},[128,1676,275],{"class":141},[128,1678,155],{"class":145},[128,1680,212],{"class":158},[128,1682,690],{"class":134},[128,1684,1685,1687,1689,1691],{"class":130,"line":165},[128,1686,288],{"class":141},[128,1688,155],{"class":145},[128,1690,293],{"class":158},[128,1692,296],{"class":134},[128,1694,1695,1697],{"class":130,"line":173},[128,1696,363],{"class":141},[128,1698,146],{"class":145},[128,1700,1701,1704,1706,1709],{"class":130,"line":185},[128,1702,1703],{"class":141},"    GIT_SUBMODULE_STRATEGY",[128,1705,155],{"class":145},[128,1707,1708],{"class":158},"recursive",[128,1710,1711],{"class":134},"                    # Clone submodules recursively if needed\n",[128,1713,1714,1717,1719,1721],{"class":130,"line":196},[128,1715,1716],{"class":141},"  pages",[128,1718,155],{"class":145},[128,1720,530],{"class":432},[128,1722,1723],{"class":134},"                                            # Enable GitLab Pages deployment\n",[128,1725,1726,1728],{"class":130,"line":203},[128,1727,302],{"class":141},[128,1729,146],{"class":145},[128,1731,1732,1734,1737],{"class":130,"line":209},[128,1733,176],{"class":145},[128,1735,1736],{"class":158},"cargo doc --no-deps",[128,1738,1739],{"class":134},"                                # Generate documentation without dependencies\n",[128,1741,1742,1744,1747],{"class":130,"line":217},[128,1743,176],{"class":145},[128,1745,1746],{"class":158},"mv target/doc public",[128,1748,1749],{"class":134},"                               # Move docs to public directory for Pages\n",[128,1751,1752,1754],{"class":130,"line":231},[128,1753,385],{"class":141},[128,1755,146],{"class":145},[128,1757,1758,1760],{"class":130,"line":239},[128,1759,393],{"class":141},[128,1761,146],{"class":145},[128,1763,1764,1766,1769],{"class":130,"line":245},[128,1765,401],{"class":145},[128,1767,1768],{"class":158},"public",[128,1770,1771],{"class":134},"                                           # GitLab Pages serves from public directory\n",[128,1773,1774,1776],{"class":130,"line":253},[128,1775,1456],{"class":141},[128,1777,146],{"class":145},[128,1779,1780,1782,1784,1786,1789],{"class":130,"line":258},[128,1781,176],{"class":145},[128,1783,1465],{"class":141},[128,1785,155],{"class":145},[128,1787,1788],{"class":158},"$CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH",[128,1790,1791],{"class":134},"     # Only run on default branch (main/master)\n",[128,1793,1794,1797],{"class":130,"line":264},[128,1795,1796],{"class":141},"  environment",[128,1798,146],{"class":145},[128,1800,1801,1804,1806,1809],{"class":130,"line":272},[128,1802,1803],{"class":141},"    name",[128,1805,155],{"class":145},[128,1807,1808],{"class":158},"documentation",[128,1810,1811],{"class":134},"                                  # Environment name for tracking\n",[128,1813,1814,1817,1819,1822],{"class":130,"line":285},[128,1815,1816],{"class":141},"    url",[128,1818,155],{"class":145},[128,1820,1821],{"class":158},"$CI_PAGES_URL/mortgage_calculator/index.html",[128,1823,1824],{"class":134},"   # Documentation URL\n",[128,1826,1827,1829,1831,1833],{"class":130,"line":299},[128,1828,427],{"class":141},[128,1830,155],{"class":145},[128,1832,530],{"class":432},[128,1834,1835],{"class":134},"                                    # Allow documentation build to fail\n",[12,1837,1838,1839,1844],{},"Une fois le job terminé, vous pouvez consulter la documentation déployée en accédant à l'",[19,1840,1843],{"href":1841,"rel":1842},"https://docs.gitlab.com/ci/environments/",[],"environnement GitLab"," où il a été déployé.",[12,1846,1847],{},[65,1848],{"alt":1849,"src":1850},"Environnement Pages","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756314541/aofa6wwjugeyeshuwg9r.png",[12,1852,1853,1854,1620],{},"De cette manière, vous pouvez gérer plusieurs versions de la documentation dans différents environnements. La documentation sera déployée de manière cohérente avec les données de sortie de ",[77,1855,1644],{},[12,1857,1858],{},[65,1859],{"alt":1860,"src":1861},"Compilation de GitLab Pages","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756314541/go0tmljjzoxq5bujsdbv.png",[34,1863,1865],{"id":1864},"déploiement-dans-tous-les-environnements","Déploiement dans tous les environnements",[12,1867,1868],{},"L'une des plus grandes forces de GitLab est son approche indépendante de l'infrastructure pour le déploiement. Que votre organisation fonctionne sur des serveurs traditionnels sur site, sur des plateformes cloud modernes, sur des environnements hybrides ou sur une infrastructure edge computing, le système CI/CD de GitLab peut déployer des applications Rust de manière harmonieuse dans n'importe quel environnement cible.",[12,1870,1871],{},"La flexibilité de déploiement de GitLab découle de son approche axée sur les conteneurs et de son écosystème d'intégration étendu. La plateforme prend en charge le déploiement sur presque toutes les infrastructures capables d'exécuter des conteneurs, des machines virtuelles ou des applications sur serveur physique dédié. Cette polyvalence est particulièrement utile pour les applications Rust, qui doivent souvent fonctionner dans des environnements allant des systèmes embarqués avec des ressources limitées aux clusters cloud haute performance.",[95,1873,1875],{"id":1874},"déploiement-dans-kubernetes","Déploiement dans Kubernetes",[12,1877,1878,1879,1885],{},"GitLab simplifie les déploiements dans ",[19,1880,1884],{"href":1881,"rel":1882,"title":1883},"https://about.gitlab.com/fr-fr/blog/kubernetes-the-container-orchestration-solution/",[],"Qu'est-ce que Kubernetes ?","Kubernetes"," avec une intégration de cluster intégrée et des images Docker préconfigurées qui incluent des outils essentiels comme Helm et kubectl. Les équipes de développement n'ont alors plus besoin de configurer des environnements de déploiement complexes.",[119,1887,1889],{"className":121,"code":1888,"language":123,"meta":124,"style":124},"# Deploy application to Kubernetes cluster\ndeploy:kubernetes:\n  stage: deploy                                          # Execute during deploy stage\n  image: registry.gitlab.com/gitlab-org/cluster-integration/helm-install-image:helm-3.10.0-kube-1.24.6-alpine-3.15  # Image with Helm and kubectl\n  variables:\n    HELM_HOST: \"localhost:44134\"                         # Helm host configuration\n    HELM_DEPLOY_NAME: mortgage-calc-$CI_COMMIT_REF_NAME  # Deployment name based on branch\n    HELM_DEPLOY_NAMESPACE: calc-app                      # Kubernetes namespace for deployment\n    KUBE_CONTEXT: $CI_PROJECT_PATH:rust-mortgage-calculator  # Kubernetes context to use\n  script:\n    - kubectl config use-context $KUBE_CONTEXT          # Set the kubectl context\n    # Deploy using Helm with custom values and Docker image\n    - helm upgrade --install $HELM_DEPLOY_NAME chart -f chart/values.yaml\n      --namespace $HELM_DEPLOY_NAMESPACE\n      --create-namespace\n      --set image=$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG\n      --set calc.name=$HELM_DEPLOY_NAME\n  needs:\n    - package:docker                                     # Depends on Docker image being available\n",[77,1890,1891,1896,1903,1915,1927,1933,1946,1959,1972,1985,1991,2001,2006,2013,2018,2023,2028,2033,2039],{"__ignoreMap":124},[128,1892,1893],{"class":130,"line":131},[128,1894,1895],{"class":134},"# Deploy application to Kubernetes cluster\n",[128,1897,1898,1901],{"class":130,"line":138},[128,1899,1900],{"class":141},"deploy:kubernetes",[128,1902,146],{"class":145},[128,1904,1905,1907,1909,1912],{"class":130,"line":149},[128,1906,288],{"class":141},[128,1908,155],{"class":145},[128,1910,1911],{"class":158},"deploy",[128,1913,1914],{"class":134},"                                          # Execute during deploy stage\n",[128,1916,1917,1919,1921,1924],{"class":130,"line":165},[128,1918,220],{"class":141},[128,1920,155],{"class":145},[128,1922,1923],{"class":158},"registry.gitlab.com/gitlab-org/cluster-integration/helm-install-image:helm-3.10.0-kube-1.24.6-alpine-3.15",[128,1925,1926],{"class":134},"  # Image with Helm and kubectl\n",[128,1928,1929,1931],{"class":130,"line":173},[128,1930,363],{"class":141},[128,1932,146],{"class":145},[128,1934,1935,1938,1940,1943],{"class":130,"line":185},[128,1936,1937],{"class":141},"    HELM_HOST",[128,1939,155],{"class":145},[128,1941,1942],{"class":158},"\"localhost:44134\"",[128,1944,1945],{"class":134},"                         # Helm host configuration\n",[128,1947,1948,1951,1953,1956],{"class":130,"line":196},[128,1949,1950],{"class":141},"    HELM_DEPLOY_NAME",[128,1952,155],{"class":145},[128,1954,1955],{"class":158},"mortgage-calc-$CI_COMMIT_REF_NAME",[128,1957,1958],{"class":134},"  # Deployment name based on branch\n",[128,1960,1961,1964,1966,1969],{"class":130,"line":203},[128,1962,1963],{"class":141},"    HELM_DEPLOY_NAMESPACE",[128,1965,155],{"class":145},[128,1967,1968],{"class":158},"calc-app",[128,1970,1971],{"class":134},"                      # Kubernetes namespace for deployment\n",[128,1973,1974,1977,1979,1982],{"class":130,"line":209},[128,1975,1976],{"class":141},"    KUBE_CONTEXT",[128,1978,155],{"class":145},[128,1980,1981],{"class":158},"$CI_PROJECT_PATH:rust-mortgage-calculator",[128,1983,1984],{"class":134},"  # Kubernetes context to use\n",[128,1986,1987,1989],{"class":130,"line":217},[128,1988,302],{"class":141},[128,1990,146],{"class":145},[128,1992,1993,1995,1998],{"class":130,"line":231},[128,1994,176],{"class":145},[128,1996,1997],{"class":158},"kubectl config use-context $KUBE_CONTEXT",[128,1999,2000],{"class":134},"          # Set the kubectl context\n",[128,2002,2003],{"class":130,"line":239},[128,2004,2005],{"class":134},"    # Deploy using Helm with custom values and Docker image\n",[128,2007,2008,2010],{"class":130,"line":245},[128,2009,176],{"class":145},[128,2011,2012],{"class":158},"helm upgrade --install $HELM_DEPLOY_NAME chart -f chart/values.yaml\n",[128,2014,2015],{"class":130,"line":253},[128,2016,2017],{"class":158},"      --namespace $HELM_DEPLOY_NAMESPACE\n",[128,2019,2020],{"class":130,"line":258},[128,2021,2022],{"class":158},"      --create-namespace\n",[128,2024,2025],{"class":130,"line":264},[128,2026,2027],{"class":158},"      --set image=$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG\n",[128,2029,2030],{"class":130,"line":272},[128,2031,2032],{"class":158},"      --set calc.name=$HELM_DEPLOY_NAME\n",[128,2034,2035,2037],{"class":130,"line":285},[128,2036,777],{"class":141},[128,2038,146],{"class":145},[128,2040,2041,2043,2045],{"class":130,"line":299},[128,2042,176],{"class":145},[128,2044,1196],{"class":158},[128,2046,2047],{"class":134},"                                     # Depends on Docker image being available\n",[12,2049,2050,2051,2053],{},"Cette configuration GitLab CI définit un job de déploiement ",[77,2052,1900],{}," qui utilise Helm pour déployer l'application de calculateur de prêt hypothécaire sur un cluster Kubernetes, avec la création ou la mise à niveau du déploiement dans un espace de nommage dédié avec l'image Docker construite dans l'étape d'empaquetage précédente.",[12,2055,2056],{},[65,2057],{"alt":2058,"src":2059},"Données de sortie Kubernetes","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756314538/bgmbh4qyfxcnnlqvsitc.png",[34,2061,2063],{"id":2062},"fonctionnalités-dia-de-gitlab-duo","Fonctionnalités d'IA de GitLab Duo",[12,2065,2066,2067,2072,2073,2078],{},"Les fonctionnalités d'IA de ",[19,2068,2071],{"href":2069,"rel":2070},"https://about.gitlab.com/fr-fr/gitlab-duo-agent-platform/",[],"GitLab Duo"," offrent des avantages significatifs pour le développement Rust grâce à des suggestions de code intelligentes et des explications spécifiquement adaptées à la syntaxe et aux modèles uniques du langage. Rust est l'un des ",[19,2074,2077],{"href":2075,"rel":2076},"https://docs.gitlab.com/user/project/repository/code_suggestions/supported_extensions/#supported-languages-by-ide",[],"langages directement pris en charge"," de la plateforme GitLab pour chaque IDE et garantit une complétion et une génération de code de haute qualité qui comprend le modèle de propriété de Rust, les principes de sécurité mémoire et les modèles idiomatiques.",[95,2080,2082],{"id":2081},"suggestions-de-code-de-gitlab-duo","Suggestions de code de GitLab Duo",[12,2084,2085],{},"La capacité de GitLab Duo à fournir des suggestions de code en contexte pendant l'écriture aide les équipes de développement à naviguer plus efficacement dans la syntaxe parfois complexe de Rust, à réduire la courbe d'apprentissage pour les nouveaux venus et à accélérer la productivité des développeurs expérimentés.",[12,2087,2088],{},[65,2089],{"alt":2090,"src":2091},"Suggestions de code","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756314538/uvy6hmzvyd0mnqeic9tq.png",[95,2093,2095],{"id":2094},"gitlab-duo-chat","GitLab Duo Chat",[12,2097,2098,2102],{},[19,2099,2095],{"href":2100,"rel":2101},"https://about.gitlab.com/fr-fr/blog/gitlab-duo-chat-gets-agentic-ai-makeover/",[]," complète les suggestions de code : il offre une assistance conversationnelle pour expliquer les sections de code Rust, déboguer les erreurs du compilateur et fournir des conseils sur les meilleures pratiques. Cette aide est particulièrement précieuse dans le développement Rust où les messages d'erreur du compilateur, bien qu'utiles, peuvent parfois surcharger les équipes de développement habituées à d'autres langages.",[12,2104,2105],{},"L'IA peut aider à interpréter les messages d'erreur détaillés de Rust et suggérer des corrections afin d'accélérer le processus de développement en réduisant le temps passé à déchiffrer les problèmes de compilation.",[12,2107,2108],{},[65,2109],{"alt":2095,"src":2110},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1756314537/depxztu1h89bez3ylwk3.png",[12,2112,2113,2114,2119],{},"GitLab Duo Chat peut également être utilisé directement depuis le rapport de vulnérabilités pour fournir des explications sur un élément détecté. La fonctionnalité d'",[19,2115,2118],{"href":2116,"rel":2117},"https://about.gitlab.com/fr-fr/blog/automate-remediation-with-ready-to-merge-ai-code-fixes/",[],"explication des vulnérabilités"," de GitLab Duo représente une avancée significative qui renforce la sécurité des applications pour les équipes de développement. Plutôt que de simplement signaler des problèmes potentiels avec des codes d'erreur peu clairs ou du jargon technique, l'IA décompose la nature de chaque vulnérabilité, son impact potentiel et les étapes de remédiation en termes que les développeurs de tous niveaux peuvent rapidement comprendre.",[12,2121,2122],{},"Cette démocratisation des connaissances en sécurité accélère le processus de remédiation, réduit les allers-retours entre les équipes de sécurité et de développement et aide les organisations à livrer du code plus sécurisé plus rapidement :",[12,2124,2125],{},[65,2126],{"alt":2127,"src":2128},"Explication de vulnérabilité 1","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756405091/rrcenbfazhhulmrp99yx.png",[12,2130,2131],{},[65,2132],{"alt":2133,"src":2134},"Explication de vulnérabilité 2","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756405094/b3o4lkexyn9lp41ib8ye.png",[12,2136,2137],{},[65,2138],{"alt":2139,"src":2140},"Explication de vulnérabilité 3","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756405095/y56wq8j5tg10t4dgbgfq.png",[12,2142,2143],{},[65,2144],{"alt":2145,"src":2146},"Explication de vulnérabilité 4","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756405090/mpc1mst4ydijpqdtlljm.png",[12,2148,2149,2150,2155,2156,2159],{},"Avec GitLab Duo, vous avez également accès à ",[19,2151,2154],{"href":2152,"rel":2153},"https://docs.gitlab.com/user/gitlab_duo_chat/agentic_chat/",[],"GitLab Duo Agentic Chat",", un assistant de développement intelligent pour les applications Rust, qui offre une aide contextuelle tout au long du cycle de développement. Les équipes de développement peuvent tirer parti de son interface conversationnelle pour générer des extraits de code Rust et générer automatiquement des structures de code pour de nouveaux projets Rust avec des configurations ",[77,2157,2158],{},"Cargo.toml"," adaptées, entre autres.",[95,2161,2163],{"id":2162},"résolution-des-vulnérabilités-avec-gitlab-duo","Résolution des vulnérabilités avec GitLab Duo",[12,2165,2166,2167,2172],{},"La fonctionnalité de ",[19,2168,2171],{"href":2169,"rel":2170},"https://docs.gitlab.com/user/application_security/vulnerabilities/#vulnerability-resolution",[],"résolution des vulnérabilités"," de GitLab Duo utilise l'IA pour générer automatiquement des corrections de code spécifiques pour les problèmes de sécurité détectés qui réduisent le temps de remédiation de plusieurs heures à quelques minutes. L'IA analyse les coding patterns vulnérables et propose des correctifs précis adaptés au contexte, au langage de programmation et aux dépendances du projet tout en maintenant la fonctionnalité du code et le style.",[12,2174,2175],{},"Cette automatisation est particulièrement efficace pour les vulnérabilités courantes comme l'injection SQL et le cross-site scripting, car elle permet aux équipes de développement de maintenir leur vélocité tout en améliorant significativement leur posture de sécurité sans perturber le workflow de développement.",[12,2177,2178],{},[65,2179],{"alt":2180,"src":2181},"Exemple de remédiation de GitLab Duo 1","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756405090/blpwclp68igekkecbyna.png",[12,2183,2184],{},[65,2185],{"alt":2186,"src":2187},"Exemple de remédiation de GitLab Duo 2","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756405090/avvncsspwyirtk14jdbe.png",[95,2189,2191],{"id":2190},"revue-de-code-de-gitlab-duo","Revue de code de GitLab Duo",[12,2193,2194,2195,2200],{},"La ",[19,2196,2199],{"href":2197,"rel":2198},"https://docs.gitlab.com/user/project/merge_requests/duo_in_merge_requests/#have-gitlab-duo-review-your-code",[],"revue de code alimentée par l'IA"," de GitLab Duo améliore le processus de développement grâce à des commentaires intelligents et automatisés dans les merge requests avant toute intervention de réviseurs humains. L'IA analyse les modifications de code pour détecter les bogues potentiels, les vulnérabilités de sécurité, les problèmes de performance et l'adhérence aux normes de codage. De plus, elle fournit des suggestions contextuelles et des explications qui aident les équipes à détecter les problèmes tôt.",[12,2202,2203],{},"En renforçant les revues humaines traditionnelles avec des informations d'IA cohérentes et immédiates, cette fonctionnalité réduit la charge sur les développeurs seniors, accélère le cycle de revue et garantit que les vérifications de qualité de base sont appliquées de manière cohérente à toutes les contributions de code. La qualité du code est ainsi améliorée, et les réviseurs humains peuvent se concentrer sur l'architecture et la logique métier de plus haut niveau.",[12,2205,2206],{},[65,2207],{"alt":2208,"src":2209},"Revue de code de GitLab Duo 1","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756405090/hewxrp2f22mf2fe4daaa.png",[12,2211,2212],{},[65,2213],{"alt":2214,"src":2215},"Revue de code de GitLab Duo 2","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756405091/qbw1gi0l4ngysnyjwoy8.png",[12,2217,2218,2219,117],{},"Ce ne sont là que quelques-unes des fonctionnalités IA qui peuvent être utilisées pour vous permettre de livrer des logiciels Rust plus sécurisés plus rapidement que jamais. Pour en savoir plus sur toutes les fonctionnalités d'IA de GitLab, consultez la ",[19,2220,2222],{"href":2069,"rel":2221},[],"page de solution GitLab Duo",[34,2224,2226],{"id":2225},"rust-lavantage-de-gitlab","Rust : l'avantage de GitLab",[12,2228,2229],{},"GitLab fournit une plateforme de développement complète en synergie avec l'approche globale de Rust :",[12,2231,2232],{},[105,2233,2234],{},"Workflow intégré :",[632,2236,2237,2243,2249,2255],{},[635,2238,2239,2242],{},[105,2240,2241],{},"Plateforme unique :"," code, CI/CD, sécurité et déploiement en un seul endroit",[635,2244,2245,2248],{},[105,2246,2247],{},"Optimisation pour Rust :"," compilations basées sur Docker parfaites pour la chaîne d'outils Rust",[635,2250,2251,2254],{},[105,2252,2253],{},"Sécurité d'abord :"," analyse de sécurité intégrée",[635,2256,2257,2260],{},[105,2258,2259],{},"Niveau entreprise :"," infrastructure évolutive pour les grandes équipes",[12,2262,2263],{},[105,2264,2265],{},"Avantages de performance :",[632,2267,2268,2274,2280],{},[635,2269,2270,2273],{},[105,2271,2272],{},"Mise en cache efficace :"," accélération des temps de compilation plus longs de Rust",[635,2275,2276,2279],{},[105,2277,2278],{},"Compilations parallèles :"," optimisation de l'efficacité de GitLab Runner",[635,2281,2282,2285],{},[105,2283,2284],{},"Gestion des artefacts :"," distribution de binaires rationalisée",[12,2287,2288],{},[105,2289,2290],{},"Expérience développeur :",[632,2292,2293,2299,2305,2311],{},[635,2294,2295,2298],{},[105,2296,2297],{},"Outils familiers :"," outils Rust standard (Cargo, Clippy, rustfmt)",[635,2300,2301,2304],{},[105,2302,2303],{},"Retour visuel :"," tableaux de bord et rapports complets",[635,2306,2307,2310],{},[105,2308,2309],{},"Automatisation :"," réduction des coûts de déploiement et de test manuels",[635,2312,2313,2316],{},[105,2314,2315],{},"IA GitLab Duo :"," livraison de logiciels plus sécurisés plus rapidement avec l'IA tout au long du cycle du développement logiciel",[12,2318,2319],{},"Les capacités de la plateforme GitLab complètent parfaitement les avantages de Rust pour créer un écosystème où la sécurité, la performance et la productivité des développeurs convergent. Les applications Rust sur GitLab représentent la pointe du développement logiciel et sont alimentées par une plateforme qui comprend et améliore l'expérience de développement Rust.",[12,2321,2322,2323,117],{},"Pour en savoir plus sur les avantages de GitLab, inscrivez-vous pour un ",[19,2324,2327],{"href":2325,"rel":2326},"https://about.gitlab.com/fr-fr/free-trial/",[],"essai gratuit de GitLab Ultimate avec Duo Enterprise",[2329,2330,2331],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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 pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}",{"title":124,"searchDepth":138,"depth":138,"links":2333},[2334,2335,2339,2343,2344,2347,2350,2356],{"id":36,"depth":138,"text":37},{"id":89,"depth":138,"text":90,"children":2336},[2337,2338],{"id":97,"depth":149,"text":98},{"id":655,"depth":149,"text":656},{"id":962,"depth":138,"text":963,"children":2340},[2341,2342],{"id":993,"depth":149,"text":994},{"id":1177,"depth":149,"text":1178},{"id":1316,"depth":138,"text":1317},{"id":1629,"depth":138,"text":1630,"children":2345},[2346],{"id":1648,"depth":149,"text":1649},{"id":1864,"depth":138,"text":1865,"children":2348},[2349],{"id":1874,"depth":149,"text":1875},{"id":2062,"depth":138,"text":2063,"children":2351},[2352,2353,2354,2355],{"id":2081,"depth":149,"text":2082},{"id":2094,"depth":149,"text":2095},{"id":2162,"depth":149,"text":2163},{"id":2190,"depth":149,"text":2191},{"id":2225,"depth":138,"text":2226},"engineering","2025-11-06","Découvrez comment GitLab prend en charge le développement en Rust grâce à ses capacités CI/CD, ses analyses de sécurité, ses intégrations dédiées et ses fonctionnalités d'IA.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1756314674/tct6zf6evw0xgddd2vo3.png",{},"/fr-fr/blog/secure-rust-development-with-gitlab",{"config":2366,"title":5,"description":2359},{"noIndex":2367,"title":5,"description":2368},false,"Découvrez comment GitLab prend en charge le développement en Rust avec fonctionnalités CI/CD, analyses de sécurité, intégrations dédiées et fonctionnalités IA.","secure-rust-development-with-gitlab","fr-fr/blog/secure-rust-development-with-gitlab",[2372,2373,2374],"community","open source","tutorial","BlogPost","ItTXAMWYV0g86d-TyNZcQh6Yv6t4eU2E-Apu6W-6QBE",{"logo":2378,"freeTrial":2383,"sales":2388,"login":2393,"items":2398,"search":2725,"minimal":2761,"duo":2780,"switchNav":2789,"pricingDeployment":2800},{"config":2379},{"href":2380,"dataGaName":2381,"dataGaLocation":2382},"/fr-fr/","gitlab logo","header",{"text":2384,"config":2385},"Commencer un essai gratuit",{"href":2386,"dataGaName":2387,"dataGaLocation":2382},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":2389,"config":2390},"Demander une démo",{"href":2391,"dataGaName":2392,"dataGaLocation":2382},"/fr-fr/sales/?contact-topic=request-demo","sales",{"text":2394,"config":2395},"Connexion",{"href":2396,"dataGaName":2397,"dataGaLocation":2382},"https://gitlab.com/users/sign_in/","sign in",[2399,2428,2529,2534,2647,2703],{"text":2400,"config":2401,"menu":2403},"Plateforme",{"dataNavLevelOne":2402},"platform",{"type":2404,"columns":2405},"cards",[2406,2412,2420],{"title":2400,"description":2407,"link":2408},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":2409,"config":2410},"Explorer notre plateforme",{"href":2411,"dataGaName":2402,"dataGaLocation":2382},"/fr-fr/platform/",{"title":2413,"description":2414,"link":2415},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":2416,"config":2417},"Découvrir GitLab Duo",{"href":2418,"dataGaName":2419,"dataGaLocation":2382},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":2421,"description":2422,"link":2423},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":2424,"config":2425},"En savoir plus",{"href":2426,"dataGaName":2427,"dataGaLocation":2382},"/fr-fr/why-gitlab/","why gitlab",{"text":2429,"left":199,"config":2430,"menu":2432},"Produit",{"dataNavLevelOne":2431},"solutions",{"type":2433,"link":2434,"columns":2438,"feature":2508},"lists",{"text":2435,"config":2436},"Voir toutes les solutions",{"href":2437,"dataGaName":2431,"dataGaLocation":2382},"/fr-fr/solutions/",[2439,2463,2486],{"title":2440,"description":2441,"link":2442,"items":2447},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":2443},{"icon":2444,"href":2445,"dataGaName":2446,"dataGaLocation":2382},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[2448,2451,2454,2459],{"text":24,"config":2449},{"href":2450,"dataGaLocation":2382,"dataGaName":24},"/fr-fr/solutions/continuous-integration/",{"text":2413,"config":2452},{"href":2418,"dataGaLocation":2382,"dataGaName":2453},"gitlab duo agent platform - product menu",{"text":2455,"config":2456},"Gestion du code source",{"href":2457,"dataGaLocation":2382,"dataGaName":2458},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":2460,"config":2461},"Livraison de logiciels automatisée",{"href":2445,"dataGaLocation":2382,"dataGaName":2462},"Automated software delivery",{"title":2464,"description":2465,"link":2466,"items":2471},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":2467},{"href":2468,"dataGaName":2469,"dataGaLocation":2382,"icon":2470},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[2472,2476,2481],{"text":2473,"config":2474},"Tests de sécurité des applications",{"href":2468,"dataGaName":2475,"dataGaLocation":2382},"Application security testing",{"text":2477,"config":2478},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":2479,"dataGaLocation":2382,"dataGaName":2480},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":2482,"config":2483},"Conformité logicielle",{"href":2484,"dataGaName":2485,"dataGaLocation":2382},"/fr-fr/solutions/software-compliance/","software compliance",{"title":2487,"link":2488,"items":2493},"Mesures",{"config":2489},{"icon":2490,"href":2491,"dataGaName":2492,"dataGaLocation":2382},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[2494,2498,2503],{"text":2495,"config":2496},"Visibilité et mesures",{"href":2491,"dataGaLocation":2382,"dataGaName":2497},"Visibility and Measurement",{"text":2499,"config":2500},"Gestion de la chaîne de valeur",{"href":2501,"dataGaLocation":2382,"dataGaName":2502},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":2504,"config":2505},"Analyses et informations",{"href":2506,"dataGaLocation":2382,"dataGaName":2507},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":2509,"type":2433,"items":2510},"GitLab",[2511,2517,2523],{"text":2512,"config":2513},"Entreprises",{"icon":2514,"href":2515,"dataGaLocation":2382,"dataGaName":2516},"Building","/fr-fr/enterprise/","enterprise",{"text":2518,"config":2519},"Pour les PME",{"icon":2520,"href":2521,"dataGaLocation":2382,"dataGaName":2522},"Work","/fr-fr/small-business/","small business",{"text":2524,"config":2525},"Pour le secteur public",{"icon":2526,"href":2527,"dataGaLocation":2382,"dataGaName":2528},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":2530,"config":2531},"Tarifs",{"href":2532,"dataGaName":2533,"dataGaLocation":2382,"dataNavLevelOne":2533},"/fr-fr/pricing/","pricing",{"text":2535,"config":2536,"menu":2538},"Ressources",{"dataNavLevelOne":2537},"resources",{"type":2433,"link":2539,"columns":2543,"feature":2636},{"text":2540,"config":2541},"Afficher toutes les ressources",{"href":2542,"dataGaName":2537,"dataGaLocation":2382},"/fr-fr/resources/",[2544,2577,2604],{"title":2545,"items":2546},"Premiers pas",[2547,2552,2557,2562,2567,2572],{"text":2548,"config":2549},"Installation",{"href":2550,"dataGaName":2551,"dataGaLocation":2382},"/fr-fr/install/","install",{"text":2553,"config":2554},"Guides de démarrage",{"href":2555,"dataGaName":2556,"dataGaLocation":2382},"/fr-fr/get-started/","quick setup checklists",{"text":2558,"config":2559},"Apprentissage",{"href":2560,"dataGaLocation":2382,"dataGaName":2561},"https://university.gitlab.com/","learn",{"text":2563,"config":2564},"Documentation",{"href":2565,"dataGaName":2566,"dataGaLocation":2382},"https://docs.gitlab.com/","product documentation",{"text":2568,"config":2569},"Vidéos sur les bonnes pratiques",{"href":2570,"dataGaName":2571,"dataGaLocation":2382},"/fr-fr/getting-started-videos/","best practice videos",{"text":2573,"config":2574},"Intégrations",{"href":2575,"dataGaName":2576,"dataGaLocation":2382},"/fr-fr/integrations/","integrations",{"title":2578,"items":2579},"Découvrir",[2580,2585,2590,2595,2599],{"text":2581,"config":2582},"Témoignages clients",{"href":2583,"dataGaName":2584,"dataGaLocation":2382},"/fr-fr/customers/","customer success stories",{"text":2586,"config":2587},"Blog",{"href":2588,"dataGaName":2589,"dataGaLocation":2382},"/fr-fr/blog/","blog",{"text":2591,"config":2592},"Demo Hub",{"href":2593,"dataGaName":2594,"dataGaLocation":2382},"/fr-fr/demo-hub/","demo hub",{"text":2596,"config":2597},"The Source",{"href":2598,"dataGaName":2589,"dataGaLocation":2382},"/fr-fr/the-source/",{"text":2600,"config":2601},"Travail à distance",{"href":2602,"dataGaName":2603,"dataGaLocation":2382},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":2605,"items":2606},"Connecter",[2607,2612,2617,2621,2626,2631],{"text":2608,"config":2609},"Services GitLab",{"href":2610,"dataGaName":2611,"dataGaLocation":2382},"/fr-fr/services/","services",{"text":2613,"config":2614},"Contribuer",{"href":2615,"dataGaName":2616,"dataGaLocation":2382},"https://contributors.gitlab.com","contribute",{"text":2618,"config":2619},"Communauté",{"href":2620,"dataGaName":2372,"dataGaLocation":2382},"/community/",{"text":2622,"config":2623},"Forum",{"href":2624,"dataGaName":2625,"dataGaLocation":2382},"https://forum.gitlab.com/","forum",{"text":2627,"config":2628},"Événements",{"href":2629,"dataGaName":2630,"dataGaLocation":2382},"/events/","events",{"text":2632,"config":2633},"Partenaires",{"href":2634,"dataGaName":2635,"dataGaLocation":2382},"/fr-fr/partners/","partners",{"config":2637,"title":2640,"text":2641,"link":2642},{"background":2638,"textColor":2639},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Nouveautés de GitLab","Découvrez les dernières fonctionnalités et améliorations.",{"text":2643,"config":2644},"Lire les articles les plus récents",{"href":2645,"dataGaName":2646,"dataGaLocation":2382},"/fr-fr/whats-new/","whats new",{"text":2648,"config":2649,"menu":2651},"Société",{"dataNavLevelOne":2650},"company",{"type":2433,"columns":2652},[2653],{"items":2654},[2655,2660,2666,2668,2673,2678,2683,2688,2693,2698],{"text":2656,"config":2657},"À propos",{"href":2658,"dataGaName":2659,"dataGaLocation":2382},"/fr-fr/company/","about",{"text":2661,"config":2662,"footerGa":2665},"Carrières",{"href":2663,"dataGaName":2664,"dataGaLocation":2382},"/jobs/","jobs",{"dataGaName":2664},{"text":2627,"config":2667},{"href":2629,"dataGaName":2630,"dataGaLocation":2382},{"text":2669,"config":2670},"Leadership",{"href":2671,"dataGaName":2672,"dataGaLocation":2382},"/company/team/e-group/","leadership",{"text":2674,"config":2675},"Manuel",{"href":2676,"dataGaName":2677,"dataGaLocation":2382},"https://handbook.gitlab.com/","handbook",{"text":2679,"config":2680},"Relations avec les investisseurs",{"href":2681,"dataGaName":2682,"dataGaLocation":2382},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":2684,"config":2685},"Trust Center",{"href":2686,"dataGaName":2687,"dataGaLocation":2382},"/fr-fr/security/","trust center",{"text":2689,"config":2690},"Centre pour la transparence de l'IA",{"href":2691,"dataGaName":2692,"dataGaLocation":2382},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":2694,"config":2695},"Newsletter",{"href":2696,"dataGaName":2697,"dataGaLocation":2382},"/company/contact/#contact-forms","newsletter",{"text":2699,"config":2700},"Presse",{"href":2701,"dataGaName":2702,"dataGaLocation":2382},"/press/","press",{"text":2704,"config":2705,"menu":2706},"Nous contacter",{"dataNavLevelOne":2650},{"type":2433,"columns":2707},[2708],{"items":2709},[2710,2715,2720],{"text":2711,"config":2712},"Contacter l'équipe commerciale",{"href":2713,"dataGaName":2714,"dataGaLocation":2382},"/fr-fr/sales/","talk to sales",{"text":2716,"config":2717},"Assistance GitLab",{"href":2718,"dataGaName":2719,"dataGaLocation":2382},"https://support.gitlab.com/hc/en-us","support portal",{"text":2721,"config":2722},"Portail clients GitLab",{"href":2723,"dataGaName":2724,"dataGaLocation":2382},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":2726,"login":2727,"suggestions":2734},"Fermer",{"text":2728,"link":2729},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":2730,"config":2731},"GitLab.com",{"href":2396,"dataGaName":2732,"dataGaLocation":2733},"search login","search",{"text":2735,"default":2736},"Suggestions",[2737,2740,2745,2747,2752,2757],{"text":2413,"config":2738},{"href":2418,"dataGaName":2739,"dataGaLocation":2733},"GitLab Duo Agent Platform",{"text":2741,"config":2742},"Suggestions de code (IA)",{"href":2743,"dataGaName":2744,"dataGaLocation":2733},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":24,"config":2746},{"href":2450,"dataGaName":24,"dataGaLocation":2733},{"text":2748,"config":2749},"GitLab sur AWS",{"href":2750,"dataGaName":2751,"dataGaLocation":2733},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":2753,"config":2754},"GitLab sur Google Cloud",{"href":2755,"dataGaName":2756,"dataGaLocation":2733},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":2758,"config":2759},"Pourquoi utiliser GitLab ?",{"href":2426,"dataGaName":2760,"dataGaLocation":2733},"Why GitLab?",{"freeTrial":2762,"mobileIcon":2767,"desktopIcon":2772,"secondaryButton":2775},{"text":2763,"config":2764},"Commencer votre essai gratuit",{"href":2765,"dataGaName":2387,"dataGaLocation":2766},"https://gitlab.com/-/trials/new/","nav",{"altText":2768,"config":2769},"Icône GitLab",{"src":2770,"dataGaName":2771,"dataGaLocation":2766},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":2768,"config":2773},{"src":2774,"dataGaName":2771,"dataGaLocation":2766},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":2776,"config":2777},"Commencer",{"href":2778,"dataGaName":2779,"dataGaLocation":2766},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":2781,"mobileIcon":2785,"desktopIcon":2787},{"text":2782,"config":2783},"En savoir plus sur GitLab Duo",{"href":2418,"dataGaName":2784,"dataGaLocation":2766},"gitlab duo",{"altText":2768,"config":2786},{"src":2770,"dataGaName":2771,"dataGaLocation":2766},{"altText":2768,"config":2788},{"src":2774,"dataGaName":2771,"dataGaLocation":2766},{"button":2790,"mobileIcon":2795,"desktopIcon":2797},{"text":2791,"config":2792},"/switch",{"href":2793,"dataGaName":2794,"dataGaLocation":2766},"#contact","switch",{"altText":2768,"config":2796},{"src":2770,"dataGaName":2771,"dataGaLocation":2766},{"altText":2768,"config":2798},{"src":2799,"dataGaName":2771,"dataGaLocation":2766},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":2801,"mobileIcon":2806,"desktopIcon":2808},{"text":2802,"config":2803},"Retour aux tarifs",{"href":2532,"dataGaName":2804,"dataGaLocation":2766,"icon":2805},"back to pricing","GoBack",{"altText":2768,"config":2807},{"src":2770,"dataGaName":2771,"dataGaLocation":2766},{"altText":2768,"config":2809},{"src":2774,"dataGaName":2771,"dataGaLocation":2766},{"title":2811,"button":2812,"config":2816},"GitLab Orbit est arrivé : la couche de contexte pour les agents d'IA.",{"text":2424,"config":2813},{"href":2814,"dataGaName":2815,"dataGaLocation":2382},"/fr-fr/gitlab-orbit/","orbit",{"layout":2817,"disabled":2367},"release",{"data":2819},{"text":2820,"source":2821,"edit":2827,"contribute":2832,"config":2836,"items":2841,"minimal":3049},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":2822,"config":2823},"Afficher le code source de la page",{"href":2824,"dataGaName":2825,"dataGaLocation":2826},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":2828,"config":2829},"Modifier cette page",{"href":2830,"dataGaName":2831,"dataGaLocation":2826},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":2613,"config":2833},{"href":2834,"dataGaName":2835,"dataGaLocation":2826},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":2837,"facebook":2838,"youtube":2839,"linkedin":2840},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2842,2888,2941,2984,3016],{"title":2530,"links":2843,"subMenu":2858},[2844,2848,2853],{"text":2845,"config":2846},"Voir les forfaits",{"href":2532,"dataGaName":2847,"dataGaLocation":2826},"view plans",{"text":2849,"config":2850},"GitLab Premium",{"href":2851,"dataGaName":2852,"dataGaLocation":2826},"/fr-fr/pricing/premium/","why premium",{"text":2854,"config":2855},"GitLab Ultimate",{"href":2856,"dataGaName":2857,"dataGaLocation":2826},"/fr-fr/pricing/ultimate/","why ultimate",[2859],{"title":2704,"links":2860},[2861,2863,2865,2868,2873,2878,2883],{"text":2711,"config":2862},{"href":2713,"dataGaName":2392,"dataGaLocation":2826},{"text":2716,"config":2864},{"href":2718,"dataGaName":2719,"dataGaLocation":2826},{"text":2866,"config":2867},"Portail clients",{"href":2723,"dataGaName":2724,"dataGaLocation":2826},{"text":2869,"config":2870},"Statut",{"href":2871,"dataGaName":2872,"dataGaLocation":2826},"https://status.gitlab.com/","status",{"text":2874,"config":2875},"Conditions d'utilisation",{"href":2876,"dataGaName":2877,"dataGaLocation":2826},"/terms/","terms of use",{"text":2879,"config":2880},"Politique de confidentialité",{"href":2881,"dataGaName":2882,"dataGaLocation":2826},"/fr-fr/privacy/","privacy statement",{"text":2884,"config":2885},"Gestion des cookies",{"dataGaName":2886,"dataGaLocation":2826,"id":2887,"isOneTrustButton":199},"cookie preferences","ot-sdk-btn",{"title":2429,"links":2889,"subMenu":2898},[2890,2894],{"text":2891,"config":2892},"Plateforme DevSecOps",{"href":2411,"dataGaName":2893,"dataGaLocation":2826},"devsecops platform",{"text":2895,"config":2896},"Développement assisté par l'IA",{"href":2418,"dataGaName":2897,"dataGaLocation":2826},"ai-assisted development",[2899],{"title":2900,"links":2901},"Thèmes",[2902,2906,2911,2916,2921,2926,2931,2936],{"text":24,"config":2903},{"href":2904,"dataGaName":2905,"dataGaLocation":2826},"/fr-fr/topics/ci-cd/","cicd",{"text":2907,"config":2908},"GitOps",{"href":2909,"dataGaName":2910,"dataGaLocation":2826},"/fr-fr/topics/gitops/","gitops",{"text":2912,"config":2913},"DevOps",{"href":2914,"dataGaName":2915,"dataGaLocation":2826},"/fr-fr/topics/devops/","devops",{"text":2917,"config":2918},"Contrôle de version",{"href":2919,"dataGaName":2920,"dataGaLocation":2826},"/fr-fr/topics/version-control/","version control",{"text":2922,"config":2923},"DevSecOps",{"href":2924,"dataGaName":2925,"dataGaLocation":2826},"/fr-fr/topics/devsecops/","devsecops",{"text":2927,"config":2928},"Cloud-native",{"href":2929,"dataGaName":2930,"dataGaLocation":2826},"/fr-fr/topics/cloud-native/","cloud native",{"text":2932,"config":2933},"IA pour la programmation",{"href":2934,"dataGaName":2935,"dataGaLocation":2826},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":2937,"config":2938},"IA agentique",{"href":2939,"dataGaName":2940,"dataGaLocation":2826},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":2942,"links":2943},"Solutions",[2944,2947,2949,2954,2957,2960,2963,2966,2968,2971,2974,2979],{"text":2473,"config":2945},{"href":2468,"dataGaName":2946,"dataGaLocation":2826},"Application Security Testing",{"text":2460,"config":2948},{"href":2445,"dataGaName":2446,"dataGaLocation":2826},{"text":2950,"config":2951},"Développement Agile",{"href":2952,"dataGaName":2953,"dataGaLocation":2826},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":2455,"config":2955},{"href":2457,"dataGaName":2956,"dataGaLocation":2826},"source code management",{"text":24,"config":2958},{"href":2450,"dataGaName":2959,"dataGaLocation":2826},"continuous integration & delivery",{"text":2499,"config":2961},{"href":2501,"dataGaName":2962,"dataGaLocation":2826},"value stream management",{"text":2907,"config":2964},{"href":2965,"dataGaName":2910,"dataGaLocation":2826},"/fr-fr/solutions/gitops/",{"text":2512,"config":2967},{"href":2515,"dataGaName":2516,"dataGaLocation":2826},{"text":2969,"config":2970},"PME",{"href":2521,"dataGaName":2522,"dataGaLocation":2826},{"text":2972,"config":2973},"Secteur public",{"href":2527,"dataGaName":2528,"dataGaLocation":2826},{"text":2975,"config":2976},"Éducation",{"href":2977,"dataGaName":2978,"dataGaLocation":2826},"/fr-fr/solutions/education/","education",{"text":2980,"config":2981},"Services financiers",{"href":2982,"dataGaName":2983,"dataGaLocation":2826},"/fr-fr/solutions/finance/","financial services",{"title":2535,"links":2985},[2986,2988,2990,2992,2995,2997,3000,3002,3004,3006,3008,3010,3012,3014],{"text":2548,"config":2987},{"href":2550,"dataGaName":2551,"dataGaLocation":2826},{"text":2553,"config":2989},{"href":2555,"dataGaName":2556,"dataGaLocation":2826},{"text":2558,"config":2991},{"href":2560,"dataGaName":2561,"dataGaLocation":2826},{"text":2563,"config":2993},{"href":2565,"dataGaName":2994,"dataGaLocation":2826},"docs",{"text":2586,"config":2996},{"href":2588,"dataGaName":2589,"dataGaLocation":2826},{"text":2998,"config":2999},"Nouveautés",{"href":2645,"dataGaName":2646,"dataGaLocation":2826},{"text":2581,"config":3001},{"href":2583,"dataGaName":2584,"dataGaLocation":2826},{"text":2600,"config":3003},{"href":2602,"dataGaName":2603,"dataGaLocation":2826},{"text":2608,"config":3005},{"href":2610,"dataGaName":2611,"dataGaLocation":2826},{"text":2613,"config":3007},{"href":2615,"dataGaName":2616,"dataGaLocation":2826},{"text":2618,"config":3009},{"href":2620,"dataGaName":2372,"dataGaLocation":2826},{"text":2622,"config":3011},{"href":2624,"dataGaName":2625,"dataGaLocation":2826},{"text":2627,"config":3013},{"href":2629,"dataGaName":2630,"dataGaLocation":2826},{"text":2632,"config":3015},{"href":2634,"dataGaName":2635,"dataGaLocation":2826},{"title":2648,"links":3017},[3018,3020,3022,3024,3026,3028,3033,3038,3040,3042,3044],{"text":2656,"config":3019},{"href":2658,"dataGaName":2650,"dataGaLocation":2826},{"text":2661,"config":3021},{"href":2663,"dataGaName":2664,"dataGaLocation":2826},{"text":2669,"config":3023},{"href":2671,"dataGaName":2672,"dataGaLocation":2826},{"text":2674,"config":3025},{"href":2676,"dataGaName":2677,"dataGaLocation":2826},{"text":2679,"config":3027},{"href":2681,"dataGaName":2682,"dataGaLocation":2826},{"text":3029,"config":3030},"Développement durable",{"href":3031,"dataGaName":3032,"dataGaLocation":2826},"/sustainability/","Sustainability",{"text":3034,"config":3035},"Diversité, inclusion et appartenance (DIB)",{"href":3036,"dataGaName":3037,"dataGaLocation":2826},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":2684,"config":3039},{"href":2686,"dataGaName":2687,"dataGaLocation":2826},{"text":2694,"config":3041},{"href":2696,"dataGaName":2697,"dataGaLocation":2826},{"text":2699,"config":3043},{"href":2701,"dataGaName":2702,"dataGaLocation":2826},{"text":3045,"config":3046},"Déclaration de transparence sur l'esclavage moderne",{"href":3047,"dataGaName":3048,"dataGaLocation":2826},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":3050},[3051,3053,3055],{"text":2874,"config":3052},{"href":2876,"dataGaName":2877,"dataGaLocation":2826},{"text":2884,"config":3054},{"dataGaName":2886,"dataGaLocation":2826,"id":2887,"isOneTrustButton":199},{"text":2879,"config":3056},{"href":2881,"dataGaName":2882,"dataGaLocation":2826},[3058],{"id":3059,"title":7,"body":2361,"config":3060,"content":3062,"description":2361,"extension":3066,"meta":3067,"navigation":199,"path":3068,"seo":3069,"stem":3070,"__hash__":3071},"blogAuthors/en-us/blog/authors/fernando-diaz.yml",{"template":3061},"BlogAuthor",{"name":7,"config":3063},{"headshot":3064,"ctfId":3065},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659556/Blog/Author%20Headshots/fern_diaz.png","fjdiaz","yml",{},"/en-us/blog/authors/fernando-diaz",{},"en-us/blog/authors/fernando-diaz","lxRJIOydP4_yzYZvsPcuQevP9AYAKREF7i8QmmdnOWc",[3073,3081,3089],{"title":3074,"description":3075,"heroImage":3076,"category":2357,"date":3077,"authors":3078,"slug":3080,"externalUrl":2361},"Green DevOps : l'importance de mesurer le bilan carbone de vos pipelines CI/CD","Les pipelines CI/CD ont un bilan carbone caché. Découvrez pourquoi il est crucial de le mesurer et comment vous lancer avec Eco CI et Carmen dans GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-22",[3079],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":3082,"description":3083,"heroImage":3084,"category":2357,"date":3085,"authors":3086,"slug":3088,"externalUrl":2361},"Comment mettre en place l'observabilité CI/CD à grande échelle","Ce guide pratique consacré à l'analyse des pipelines GitLab aide les utilisateurs de GitLab Self-Managed à obtenir des indicateurs opérationnels exploitables grâce à Prometheus et Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-05-18",[3087],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"title":3090,"description":3091,"heroImage":3092,"category":2357,"date":3093,"authors":3094,"slug":3096,"externalUrl":2361},"5 modèles de pipeline GitLab pour résoudre vos enjeux d'ingénierie","Découvrez comment faire évoluer votre approche CI/CD avec des modèles composables pour les monorepos, les microservices, les environnements et la gouvernance.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1772721753/frfsm1qfscwrmsyzj1qn.png","2026-05-06",[3095],"Omid Khan","5-ways-gitlab-pipeline-logic-solves-real-engineering-problems",{"promotions":3098},[3099,3113,3125,3137],{"id":3100,"categories":3101,"header":3103,"text":3104,"button":3105,"image":3110},"ai-modernization",[3102],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":3106,"config":3107},"Obtenez votre score de maturité IA",{"href":3108,"dataGaName":3109,"dataGaLocation":2589},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":3111},{"src":3112},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":3114,"categories":3115,"header":3117,"text":3104,"button":3118,"image":3122},"devops-modernization",[3116,2925],"product","Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":3119,"config":3120},"Obtenez votre score de maturité DevOps",{"href":3121,"dataGaName":3109,"dataGaLocation":2589},"/fr-fr/assessments/devops-modernization-assessment/",{"config":3123},{"src":3124},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":3126,"categories":3127,"header":3129,"text":3104,"button":3130,"image":3134},"security-modernization",[3128],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":3131,"config":3132},"Obtenez votre score de maturité en matière de sécurité",{"href":3133,"dataGaName":3109,"dataGaLocation":2589},"/fr-fr/assessments/security-modernization-assessment/",{"config":3135},{"src":3136},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":3138,"paths":3139,"header":3142,"text":3143,"button":3144,"image":3149},"github-azure-migration",[3140,3141],"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":3145,"config":3146},"Découvrez les différences entre GitLab et GitHub",{"href":3147,"dataGaName":3148,"dataGaLocation":2589},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":3150},{"src":3124},{"header":3152,"blurb":3153,"button":3154,"secondaryButton":3158},"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":2384,"config":3155},{"href":3156,"dataGaName":2387,"dataGaLocation":3157},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":2711,"config":3159},{"href":2713,"dataGaName":2392,"dataGaLocation":3157},1786803786252]