[{"data":1,"prerenderedAt":767},["ShallowReactive",2],{"/fr-fr/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo":3,"navigation-fr-fr":39,"banner-fr-fr":445,"footer-fr-fr":455,"blog-post-authors-fr-fr-Michael Friedrich":665,"blog-related-posts-fr-fr-refactor-code-into-modern-languages-with-ai-powered-gitlab-duo":679,"assessment-promotions-fr-fr":720,"next-steps-fr-fr":758},{"id":4,"title":5,"authorSlugs":6,"body":8,"categorySlug":9,"config":10,"content":14,"description":8,"extension":26,"isFeatured":12,"meta":27,"navigation":28,"path":29,"publishedDate":20,"seo":30,"stem":34,"tagSlugs":35,"__hash__":38},"blogPosts/fr-fr/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo.yml","Refactor Code Into Modern Languages With Ai Powered Gitlab Duo",[7],"michael-friedrich",null,"ai-ml",{"slug":11,"featured":12,"template":13},"refactor-code-into-modern-languages-with-ai-powered-gitlab-duo",false,"BlogPost",{"title":15,"description":16,"authors":17,"heroImage":19,"date":20,"body":21,"category":9,"tags":22},"Comment réusiner le code dans des langages modernes grâce à GitLab Duo alimenté par l'IA ","Ce tutoriel détaillé à destination des développeurs leur permet d'utiliser l'IA pour moderniser leur code en passant à un nouveau langage de programmation. Il leur offre également l'occasion d'acquérir des connaissances sur les nouvelles fonctionnalités associées à ce langage.",[18],"Michael Friedrich","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662465/Blog/Hero%20Images/GitLab_Duo_Workflow_Unified_Data_Store__1_.png","2024-08-26","S'il vous incombe de moderniser le code base ou le framework en passant à un nouveau langage de programmation, ou si vous avez besoin d'en savoir plus sur les nouvelles fonctionnalités de ce langage, [GitLab Duo](https://about.gitlab.com/gitlab-duo/) alimenté par l'IA peut vous prêter main forte. Apprenez à aborder les défis posés par le réusinage du code en adoptant de bonnes pratiques grâce à des exemples tirés des 20 dernières années de ma carrière de codeur.\nLes prompts et les exemples de cet article sont illustrés dans différents IDE : VS Code et JetBrains (IntelliJ IDEA, PyCharm et CLion), sur lesquels sont installés les [extensions/plugins de GitLab Duo](https://docs.gitlab.com/ee/user/project/repository/code_suggestions/supported_extensions.html). L'environnement de développement utilise GitLab.com, y compris les mises à jour vers le grand modèle de langage (LLM) Claude 3.5 d'Anthropic pour les [suggestions de code](https://docs.gitlab.com/ee/user/gitlab_duo/#code-suggestions) de GitLab Duo et [GitLab Chat](https://docs.gitlab.com/ee/user/gitlab_duo/#gitlab-duo-chat). Pour faire bref : on gagne en puissance et en efficacité.\n\nVous pouvez lire l'article dans son intégralité ou accéder directement à une section spécifique. Le code source et des Challenges, accompagnés d'exercices, sont également fournis à des fins d'auto-apprentissage.\n\n- [Réusiner le code aux normes d'un langage de programmation moderne](#refactor-code-to-modern-programming-language-standards)\n    - [Générer en Java 7 et réusiner en Java 8](#generate-java-7-and-refactor-to-java-8)\n    - [Réusiner pour répondre à différentes normes C++](#refactor-across-c%2B%2B-standards)\n        - [Migration : réusiner de la norme C++03 à C++14](#migration-refactor-c%2B%2B03-into-c%2B%2B14)\n        - [Retour à une version précédente : réusiner de la norme C++23 à C++11](downgrade-refactor-c%2B%2B23-to-c%2B%2B11)\n    - [Expliquer et réusiner en COBOL](#explain-and-refactor-cobol)\n- [Réusiner d'un langage à un autre](#refactor-a-language-into-another-language)\n    - [Réusiner du C en Rust](#refactor-c-to-rust)\n    - [Réusiner du Perl en Python](#refactor-perl-to-python)\n- [Autres exemples pratiques de réusinage](#more-refactoring-hands-on)\n    - [Réusiner du JavaScript](#refactor-javascript)\n    - [Réusiner du Bash en ZSH ou SH](#refactor-bash-to-zsh-or-sh)\n    - [Autres cas d'utilisation et tutoriels](#more-use-cases-and-tutorials)\n- [Principaux points à retenir](#key-take-out)\n\n## Réusiner le code aux normes d'un langage de programmation moderne\n\nLes sections suivantes illustrent comment réusiner le code. Elles fournissent également des explications sur les différences spécifiques au langage de programmation étudié.\n### Générer en Java 7 et réusiner en Java 8\nUn client voulait savoir si GitLab Duo prend en charge Java 7. Lorsque j'ai testé les suggestions de code et les prompts de GitLab Chat pour générer du code en Java 7, j'ai également pensé à des conseils pour effectuer la migration. Claude 3.5 d'Anthropic est capable de comprendre les différences entre divers langages de programmation, tout comme GitLab Duo.\n\nL'exemple suivant illustre un prompt pour générer du code en Java 7 à l'aide des suggestions de code.\n\n```java\n// Generate a new class for a File Manager. Use Java 7 features only.\nimport java.io.*;\nimport java.nio.file.*;\nimport java.util.*;\n\npublic class FileManager {\n    private Path rootDirectory;\n\n    public FileManager(String rootPath) throws IOException {\n        this.rootDirectory = Paths.get(rootPath);\n        if (!Files.exists(rootDirectory)) {\n            Files.createDirectories(rootDirectory);\n        }\n    }\n\n    public void createFile(String fileName, String content) throws IOException {\n        Path filePath = rootDirectory.resolve(fileName);\n        Files.write(filePath, content.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);\n    }\n\n    public String readFile(String fileName) throws IOException {\n        Path filePath = rootDirectory.resolve(fileName);\n        return new String(Files.readAllBytes(filePath));\n    }\n\n    public void deleteFile(String fileName) throws IOException {\n        Path filePath = rootDirectory.resolve(fileName);\n        Files.delete(filePath);\n    }\n\n    public List\u003CString> listFiles() throws IOException {\n        List\u003CString> fileList = new ArrayList\u003C>();\n        try (DirectoryStream\u003CPath> stream = Files.newDirectoryStream(rootDirectory)) {\n            for (Path file : stream) {\n                fileList.add(file.getFileName().toString());\n            }\n        }\n        return fileList;\n    }\n\n    public void copyFile(String sourceFileName, String destinationFileName) throws IOException {\n        Path sourcePath = rootDirectory.resolve(sourceFileName);\n        Path destinationPath = rootDirectory.resolve(destinationFileName);\n        Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);\n    }\n\n    public void moveFile(String sourceFileName, String destinationFileName) throws IOException {\n        Path sourcePath = rootDirectory.resolve(sourceFileName);\n        Path destinationPath = rootDirectory.resolve(destinationFileName);\n        Files.move(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);\n    }\n\n    public long getFileSize(String fileName) throws IOException {\n        Path filePath = rootDirectory.resolve(fileName);\n        return Files.size(filePath);\n    }\n\n    public boolean fileExists(String fileName) {\n        Path filePath = rootDirectory.resolve(fileName);\n        return Files.exists(filePath);\n    }\n}\n```\n\nVous pouvez poursuivre dans votre IDE en suivant ces étapes :\n\n1. Parcourez et comprenez le code généré : sélectionnez le code dans l'éditeur (en bleu sur la capture d'écran), ouvrez GitLab Duo Chat et envoyez la commande slash `/explain` comme prompt.\n\n![Validation du code généré avec la commande slash `/explain` dans GitLab Duo Chat](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/intellij_java7_generate_refactor.png)\n\n2. Réusinez le code Java 7 en Java 8 : sélectionnez le code dans l'éditeur, ouvrez GitLab Chat et envoyez `/refactor using Java 8 features` pour affiner le prompt.\n3. Si vous ne souhaitez pas réusiner le code, créez un nouveau fichier `java8.java` et générez du code spécifique en Java 8 à l'aide des suggestions de code en saisissant le prompt `// Generate a new class for a File Manager. Use Java 8 features only.`.\n4. Continuez à écrire du code en Java 8 dans le même contexte en vous servant des complétions de code alimentées par l'IA.\n\nVous pouvez regarder chaque étape dans le vidéo ci-dessous.\n\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/XKRv6uBkD2I\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line -->\n\nLe code source est disponible dans le [projet Challenge GitLab Duo - Générer et réusiner du code de Java 7 à 8](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-generate-refactor-java-7-to-8).\n\n### Réusiner pour répondre à différentes normes C++\n\nFruit d'une longue histoire, la norme C++ peut désormais être considérée comme stable et mature. En fonction de l'architecture et des plateformes cibles, la norme prise en charge dépend du compilateur sur le système d'exploitation hôte.\n\nAu cours de ma carrière, j'ai dû prendre en charge 25 distributions Linux et Windows différentes dans des projets open source. D'après mon expérience, les compilateurs ne prennent pas en charge les fonctionnalités de langage plus récentes et les normes C++ de la même manière. Nous avons adopté les fonctionnalités C++11 en 2015, et n'avons jamais évoqué une migration vers C++14 ou C++17.\nLe réusinage des fonctions et des algorithmes pour passer à une nouvelle norme C++ aurait nécessité trop d'efforts, et il aurait fallu recevoir de l'aide pour comprendre les différences. À l'époque, nous faisions nos recherches dans des livres, en ligne, sur Stack Overflow et parfois avec des outils d'aide au réusinage du code.\n\nLes assistants alimentés par l'IA et GitLab Duo ont changé la donne : on a maintenant la possibilité de demander aux suggestions de code et à GitLab Chat de fournir du code source dans une norme C++ spécifique. Il est également possible de comparer les différentes sorties.\nL'exemple suivant part d'un prompt pour générer du code source spécifiquement pour la norme C++03. Il implémente un analyseur de configuration simple pour le format de configuration `.ini`.\n\n```c++\n/* Create a config parser which can parse an ini format\nUse C++03 standard only\n */\n\n#include \u003Ciostream>\n#include \u003Cfstream>\n#include \u003Cstring>\n#include \u003Cmap>\n#include \u003Csstream>\n\nclass ConfigParser {\nprivate:\n    std::map\u003Cstd::string, std::map\u003Cstd::string, std::string> > config;\n\npublic:\n    ConfigParser() {}\n\n    bool parse(const std::string& filename) {\n        std::ifstream file(filename.c_str());\n        if (!file.is_open()) {\n            return false;\n        }\n\n        std::string line;\n        std::string currentSection;\n\n        while (std::getline(file, line)) {\n            // Trim whitespace\n            size_t first = line.find_first_not_of(\" \\t\");\n            size_t last = line.find_last_not_of(\" \\t\");\n            if (first == std::string::npos) continue; // Skip empty lines\n            line = line.substr(first, (last - first + 1));\n\n            if (line[0] == '[' && line[line.length() - 1] == ']') {\n                // This is a section\n                currentSection = line.substr(1, line.length() - 2);\n            } else {\n                // This is a key-value pair\n                size_t delimiterPos = line.find('=');\n                if (delimiterPos != std::string::npos) {\n                    std::string key = line.substr(0, delimiterPos);\n                    std::string value = line.substr(delimiterPos + 1);\n                    config[currentSection][key] = value;\n                }\n            }\n        }\n\n        file.close();\n        return true;\n    }\n\n    std::string getValue(const std::string& section, const std::string& key) const {\n        std::map\u003Cstd::string, std::map\u003Cstd::string, std::string> >::const_iterator sectionIt = config.find(section);\n        if (sectionIt != config.end()) {\n            std::map\u003Cstd::string, std::string>::const_iterator keyIt = sectionIt->second.find(key);\n            if (keyIt != sectionIt->second.end()) {\n                return keyIt->second;\n            }\n        }\n        return \"\";\n    }\n\n    void printConfig() const {\n        std::map\u003Cstd::string, std::map\u003Cstd::string, std::string> >::const_iterator sectionIt;\n        for (sectionIt = config.begin(); sectionIt != config.end(); ++sectionIt) {\n            std::cout \u003C\u003C \"[\" \u003C\u003C sectionIt->first \u003C\u003C \"]\" \u003C\u003C std::endl;\n            std::map\u003Cstd::string, std::string>::const_iterator keyIt;\n            for (keyIt = sectionIt->second.begin(); keyIt != sectionIt->second.end(); ++keyIt) {\n                std::cout \u003C\u003C keyIt->first \u003C\u003C \" = \" \u003C\u003C keyIt->second \u003C\u003C std::endl;\n            }\n            std::cout \u003C\u003C std::endl;\n        }\n    }\n};\n\nint main() {\n    ConfigParser parser;\n    if (parser.parse(\"config.ini\")) {\n        std::cout \u003C\u003C \"Config file parsed successfully.\" \u003C\u003C std::endl;\n        parser.printConfig();\n\n        std::cout \u003C\u003C \"Value of 'key1' in 'section1': \" \u003C\u003C parser.getValue(\"section1\", \"key1\") \u003C\u003C std::endl;\n    } else {\n        std::cout \u003C\u003C \"Failed to parse config file.\" \u003C\u003C std::endl;\n    }\n    return 0;\n}\n```\n\nLes mêmes prompts peuvent être utilisés pour l'[explication du code](https://docs.gitlab.com/ee/user/gitlab_duo_chat/examples.html#explain-code-in-the-ide), la [génération de tests](https://docs.gitlab.com/ee/user/gitlab_duo_chat/examples.html#write-tests-in-the-ide), ainsi que le [réusinage du code](https://docs.gitlab.com/ee/user/gitlab_duo_chat/examples.html#refactor-code-in-the-ide): `/explain focus on C++03 features`, `/tests for C++03 features`, `/refactor into C++03`.\nLes normes C++ suivantes ont été testées avec les suggestions de code de GitLab Duo :\n\n- C++03\n- C++11\n- C++14\n- C++17\n- C++20\n- C++23\n\nVous pouvez trouver le code source dans le [projet Challenge - Réusiner l'analyseur de configuration aux normes Cpp](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-cpp-standards-config-parser).\nDe nombreuses combinaisons différentes permettent de réusiner le code source pour passer d'une norme C++ à une autre. Les exemples suivants illustrent la modernisation de code en C++ en cas de mise à niveau de la version, mais testent également un retour à une version précédente dans le cas où des développeurs ambitieux qui souhaitaient utiliser C++20 ont dû revenir à C++11 pour prendre en charge les environnements de leurs entreprises clientes.\n\n#### Migration : réusiner de la norme C++03 à C++14\nL'objectif est de moderniser le code et de comprendre les changements entre C++03 et C++14. Ouvrez le code source [03.cpp](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-cpp-standards-config-parser/-/blob/main/03.cpp?ref_type=heads) dans l'IDE, sélectionnez-le et utilisez le prompt suivant pour GitLab Chat :\n```markdown\n/refactor into C++14 and explain the changes\n```\n\nRéponse potentielle de GitLab Duo Chat :\n```markdown\n…\n\nExplanations of the changes:\n\n1. Default constructor: Changed `ConfigParser() {}` to `ConfigParser() = default;` to use the default constructor.\n2. File opening: Removed `.c_str()` when opening the file, as C++11 and later support `std::string` directly.\n3. Lambda functions: Introduced a lambda function trim to handle string trimming, making the code more readable and reusable.\n4. Auto keyword: Used `auto` for type deduction in various places, improving code readability.\n5. Range-based for loops: In the `printConfig` method, replaced traditional for loops with range-based for loops, which are more concise and less error-prone.\n6. Structured bindings: Used structured bindings in the range-based for loops to directly access key-value pairs.\n7. If statements with initializers: In the `getValue` method, used if statements with initializers to combine the find operation and the check in a single line.\n8. String member functions: Used `front()` and `back()` instead of array-style access for the first and last characters of strings.\n9. Uniform initialization: Used uniform initialization `{}` instead of parentheses `()` for object creation.\n10. Removed `std::endl`: Replaced `std::endl` with `'\\n'` for better performance, as `std::endl` forces a flush of the output buffer.\n\nThese changes make the code more modern, concise, and potentially more efficient while maintaining the same functionality.\n\n```\n\n![Modifications reflétées dans le code](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp03_to_14_01.png)\n\n![Modifications reflétées dans le code 2](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675060/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp03_to_14_02.png)\n\n#### Retour à une version précédente : réusiner de la norme C++23 à C++11\n\nIl peut arriver que des développeurs commencent à implémenter une nouvelle fonctionnalité ou une étude de faisabilité en utilisant une norme C++ moderne, par exemple la norme C++20, mais que les versions réellement prises en charge par les environnements des entreprises clientes nécessitent des compilateurs plus anciens compatibles C++11. Le retour à une version précédente a un coût. Il faut évaluer quelles fonctionnalités du langage sont toujours prises en charge et anticiper les autres inconvénients qui pourraient survenir.\n\nOuvrez le code source [23.cpp](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-cpp-standards-config-parser/-/blob/main/23.cpp?ref_type=heads) dans l'IDE, sélectionnez-le et saisissez le prompt suivant dans GitLab Duo :\n```markdown\n/refactor into C++11, explain the necessary changes and potential problems\n```\n\nRéponse potentielle de GitLab Duo Chat :\n```markdown\nThe main changes required to make this code compatible with C++11 are:\n\n1. Remove the C++23 standard comment, as it's no longer applicable.\n2. Replace `std::string::find_first_not_of` and `std::string::find_last_not_of` with C++11 compatible alternatives in the trim function.\n3. Use `const auto&` instead of `auto` for loop variables to avoid unnecessary copying.\n\nPotential problems in the original code:\n\n1. The original code used C++23 features, which might not be widely supported yet.\n2. The `trim` function used `std::string::find_first_not_of` and `std::string::find_last_not_of`, which are not available in C++11.\n3. The use of `auto` instead of `const auto&` in some loops could lead to unnecessary copying of complex objects.\n\nThese issues have been addressed in the refactored version. The `trim` function now uses `std::find_if_not` with lambda functions to achieve the same result in a C++11 compatible way. The use of `const auto&` ensures that no unnecessary copying occurs when iterating over the config map.\n```\n\n![The `trim` function now uses `std::find_if_not` with lambda functions to achieve the same result in a C++11 compatible way](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp23_to_11_01.png)\n\n![The use of `const auto&` ensures that no unnecessary copying occurs when iterating over the config map](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/duo_refactor_cpp_clion_chat_cpp23_to_11_02.png)\n\n**Pratique asynchrone**: testez d'autres scénarios de réusinage de version.\n\n### Expliquer et réusiner en COBOL\n\nVous pouvez utiliser GitLab Duo pour expliquer le code source, analyser, corriger et réusiner les programmes COBOL. Bien que je n'aie jamais appris ou codé en COBOL, j'ai trouvé ce [cours de programmation COBOL](https://github.com/openmainframeproject/cobol-programming-course) et ses nombreux exemples utiles.\n\nJ'ai ensuite demandé à GitLab Chat comment démarrer avec COBOL, créer un programme COBOL et compiler un programme COBOL sur macOS.\n\n```markdown\nPlease explain what COBOL is and its syntax\n\nPlease create a COBOL program that shows the first steps\n\nTell me more about the COBOL compiler. Which system do I need? Can I do it on my macOS?\n\n```\n\n![Demande adressée à GitLab Duo Chat pour qu'il explique COBOL et sa syntaxe](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/vscode_chat_cobol_generate_example.png)\n\nOuvrez un programme COBOL, sélectionnez le code source, passez à GitLab Duo Chat et envoyez le prompt `/explain` pour expliquer l'objectif et la fonctionnalité.\n\nVous pouvez également affiner les prompts pour obtenir des résumés plus généraux, par exemple :\n\n```markdown\n/explain like I am five\n```\n\n> Conseil : les langages de programmation partagent des algorithmes et des fonctionnalités similaires. GitLab Chat a proposé d'expliquer COBOL en Python. Par conséquent, j'ai ajusté les prompts suivants pour demander une explication en Python.\n\n```markdown\n/explain in a different programming language\n```\n\nVous pouvez également utiliser la commande slash `/refactor` comme prompt dans GitLab Chat pour améliorer la qualité du code, résoudre les problèmes potentiels et essayer de réusiner COBOL en Python.\n\n```markdown\n/refactor fix the environment error\n\n/refactor fix potential problems\n\n/refactor into Python\n```\n\nLa vidéo [GitLab Duo Coffee Chat - Challenge : expliquer et réusiner des programmes COBOL](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-explain-refactor-cobol-program) montre toutes les étapes abordées dans un cas d'utilisation pratique. Elle illustre notamment comment trouver une période manquante :\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/pwlDmLQMMPo\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line -->\n\n## Réusiner d'un langage à un autre\n\nLa modernisation et l'amélioration de la qualité du code nécessitent parfois de changer de langage de programmation. Des prompts de réusinage similaires dans GitLab Duo peuvent accélérer le processus de migration. L'exemple de COBOL avec Python n'est qu'une des nombreuses exigences en vigueur dans les environnements d'entreprise. Examinons d'autres cas d'utilisation.\n\n### Réusiner du C en Rust\n\nAu début de 2024, plusieurs langages de programmation, comme C, ont été accusés de ne pas être à mémoire sécurisée. Les recommandations pour les projets futurs comprennent l'utilisation de [langages à mémoire sécurisée](https://about.gitlab.com/blog/memory-safe-vs-unsafe/) comme Rust. Comment démarrer la migration et quels sont les défis à relever ?\n\nEssayons avec un exemple simple en C. Le code a été généré à l'aide des suggestions de code et devrait contenir les informations de base sur le système d'exploitation, comme le nom, la version et la plateforme. Le code C dispose d'une compatibilité multiplateforme sur Windows, Linux et macOS pour la compilation.\n\n```c\n// Read OS files to identify the platform, name, versions\n// Print them on the terminal\n#include \u003Cstdio.h>\n#include \u003Cstdlib.h>\n#include \u003Cstring.h>\n\n#ifdef _WIN32\n    #include \u003Cwindows.h>\n#elif __APPLE__\n    #include \u003Csys/utsname.h>\n#else\n    #include \u003Csys/utsname.h>\n#endif\n\nvoid get_os_info() {\n    #ifdef _WIN32\n        OSVERSIONINFOEX info;\n        ZeroMemory(&info, sizeof(OSVERSIONINFOEX));\n        info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);\n        GetVersionEx((OSVERSIONINFO*)&info);\n\n        printf(\"Platform: Windows\\n\");\n        printf(\"Version: %d.%d\\n\", info.dwMajorVersion, info.dwMinorVersion);\n        printf(\"Build: %d\\n\", info.dwBuildNumber);\n    #elif __APPLE__\n        struct utsname sys_info;\n        uname(&sys_info);\n\n        printf(\"Platform: macOS\\n\");\n        printf(\"Name: %s\\n\", sys_info.sysname);\n        printf(\"Version: %s\\n\", sys_info.release);\n    #else\n        struct utsname sys_info;\n        uname(&sys_info);\n\n        printf(\"Platform: %s\\n\", sys_info.sysname);\n        printf(\"Name: %s\\n\", sys_info.nodename);\n        printf(\"Version: %s\\n\", sys_info.release);\n    #endif\n}\n\nint main() {\n    get_os_info();\n    return 0;\n}\n```\n\nOuvrez le code source dans [`os.c`](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-c-to-rust/-/blob/897bf57a14bb7be07d842e7f044f93a61456d611/c/os.c) dans JetBrains CLion, par exemple. Sélectionnez le code source et saisissez le prompt `/explain` dans GitLab Chat pour expliquer l'objectif et la fonctionnalité. Entrez ensuite le prompt `/refactor` dans GitLab Chat pour réusiner le code C, puis poursuivez avec : `/refactor into Rust`.\n\nInitialisez un nouveau projet Rust (astuce : demandez à GitLab Duo Chat) et copiez le code source généré dans le fichier `src/main.rs`. Exécutez `cargo build` pour compiler le code.\n\n![Initialisez un nouveau projet Rust et copiez le code source généré dans le fichier `src/main.rs`. Exécution de `cargo build` pour compiler le code.](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/jetbrains_clion_c_rust.png)\n\nVous pouvez voir toutes les étapes dans la vidéo [GitLab Duo Coffee Chat : Challenge - Réusiner du C en Rust](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-c-to-rust). Vous verrez en outre une erreur de compilation qui sera corrigée à l'aide de GitLab Chat et de la commande slash `/refactor`. La session montre également comment améliorer la maintenabilité du nouveau code Rust en renforçant la gestion des erreurs.\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/nf8g2ucqvkI\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line -->\n\n### Réusiner du Perl en Python\nUn script opérationnel tourne sur des serveurs de production. Son auteur a quitté l'entreprise il y a dix ans et personne ne veut y toucher. Ce problème ne concerne peut-être pas qu'un seul script, mais peut-être plusieurs scripts, voire une application entière. Il a été décidé de tout migrer vers Python 3, dans le but de moderniser le code et de comprendre les changements entre Perl et Python.\n\nRécemment, au cours d'un atelier GitLab Duo, un client a demandé s'il était possible d'effectuer une migration directe avec GitLab Duo. En un mot, la réponse est : oui. Pour clarifier : vous pouvez saisir des prompts plus spécifiques dans GitLab Chat pour réusiner le code Perl en Python, comme dans d'autres exemples de cet article.\n\nOuvrez le code source `script.pl` dans l'IDE, sélectionnez-le et ouvrez GitLab Chat.\n\n```perl\n#!/usr/bin/perl\nuse strict;\nuse warnings;\n\nopen my $md_fh, '\u003C', 'file.md' or die \"Could not open file.md: $!\";\n\nmy $l = 0;\nmy $e = 0;\nmy $h = 0;\n\nwhile (my $line = \u003C$md_fh>) {\n  $l++;\n  if ($line =~ /^\\s*$/) {\n    $e++;\n    next;\n  }\n  if ($line =~ /^#+\\s*(.+)/) {\n    print \"$1\\n\";\n    $h++;   }\n}\n\nprint \"\\nS:\\n\"; print \"L: $l\\n\";\nprint \"E: $e\\n\"; print \"H: $h\\n\";\n```\n\nYou can use the following prompts to:\n\n1. `/explain` its purpose, and `/refactor` to improve the code.\n2. `/refactor into Python` pour obtenir un script Python fonctionnel.\n\n![Réusinage en Python](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/pycharm_duo_refactor_perl_python.png)\n\n\n> Astuce : vous pouvez réusiner le code Perl dans d'autres langages cibles. La vidéo [GitLab Duo Coffee Chat : Challenge - Réusiner du Perl en Python](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-perl-python) fournit des exemples avec PHP, Ruby, Rust, Go, Java, VB.NET, C# et d'autres langages.\n> > Si vous souhaitez continuer à utiliser des scripts Perl, vous pouvez configurer [Perl comme langage supplémentaire](https://docs.gitlab.com/ee/user/project/repository/code_suggestions/supported_extensions.html#add-support-for-more-languages) en vous servant des suggestions de code de GitLab Duo. GitLab Chat comprend déjà Perl et peut vous aider si vous utilisez des questions et des prompts de commande slash, comme vous pouvez le voir dans la vidéo ci-dessous.\n\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/03HGhxXg9lw\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line -->\n\n## Autres exemples pratiques de réusinage\n\n### Réusiner du JavaScript\nEddie Jaoude montre dans un exemple pratique comment réusiner du code JavaScript pour améliorer sa qualité ou ajouter des fonctionnalités.\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/mHn8KOzpPNY\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line -->\n\n### Réusiner du Bash en ZSH ou SH\n\nJ'utilise Bash comme shell depuis 20 ans et je suis récemment passé à ZSH sur macOS. À cause de ce changement, mon script ne fonctionnait pas et mon terminal affichait des erreurs inconnues. Les limitations du shell sont un autre cas d'utilisation. Elles justifient également le réusinage : certains systèmes d'exploitation ou distributions Linux/Unix ne fournissent pas Bash, mais uniquement SH, par exemple Alpine.\n\n![Réusinage de scripts shell](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749675059/Blog/Content%20Images/intellj_refactor_shell_scripts.png)\n\nLe [GitLab Duo Coffee Chat : Challenge - Réusiner des scripts shell](https://gitlab.com/gitlab-da/use-cases/ai/ai-workflows/gitlab-duo-challenges/code-challenges/challenge-refactor-shell-scripts) fournit un exemple avec un programme C qui peut suivre les fichiers syslog et un script de compilation écrit en Bash. Tout au long du Challenge, GitLab Chat reçoit des requêtes avec des prompts `/explain` et `/refactor` pour améliorer le code. Il est également possible de réusiner du Bash en SH ou ZSH pour assurer la conformité à POSIX. À la fin de la session, GitLab Chat doit fournir cinq implémentations de scripts shell différentes et expliquer les principaux résumés.\n\n\u003C!-- blank line -->\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/mssqYjlKGzU\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\u003C!-- blank line -->\n\n### Autres cas d'utilisation et tutoriels\n\n- [Documentation : cas d'utilisation de GitLab Duo](https://docs.gitlab.com/ee/user/gitlab_duo/use_cases.html)\n- [Tutoriel : meilleurs conseils pour obtenir des suggestions de code alimentées par l'IA efficaces avec GitLab Duo](https://about.gitlab.com/blog/top-tips-for-efficient-ai-powered-code-suggestions-with-gitlab-duo/)\n- [Tutoriel : 10 bonnes pratiques pour utiliser GitLab Duo Chat alimenté par l'IA](https://about.gitlab.com/blog/10-best-practices-for-using-ai-powered-gitlab-duo-chat/)\n\n## Principaux points à retenir\n1. GitLab Duo fournit une aide efficace pour expliquer et réusiner le code. 2. Il est possible de réusiner le code pour l'adapter aux normes de différents langages et poser des questions de suivi dans GitLab Chat.\n3. Les prompts de suggestion de code peuvent générer des normes spécifiques à des langages de programmation, et la complétion de code respecte le contexte du code actuel.\n4. Le réusinage du code dans de nouveaux langages de programmation contribue aux plans de migration et de modernisation à long terme.\n5. Le code peut être « rétrogradé » à une version précédente lorsque les normes d'un langage sont prises en charge par un ancien système.\n6. GitLab Duo peut expliquer du code complexe et des langages de programmation avec différents exemples de langages de programmation.\n7. La mise à jour vers Claude 3.5 d'Anthropic sur GitLab.com a amélioré une fois de plus la qualité et la rapidité des suggestions de code et de GitLab Chat (il est recommandé de mettre à niveau GitLab Auto-géré vers la version 17.3).\n8. Votre seule limite : votre imagination et les points de friction en production.\n\nApprenez-en plus sur les suggestions de code et les workflows efficaces de GitLab Chat, et commencez à réusiner du code alimenté par l'IA avec GitLab Duo dès aujourd'hui !\n\n> [Commencez votre essai gratuit de GitLab Duo !](https://about.gitlab.com/solutions/gitlab-duo-pro/sales/?type=free-trial&toggle=gitlab-duo-pro_)\n",[23,24,25],"AI/ML","tutorial","DevSecOps","yml",{},true,"/fr-fr/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo",{"title":15,"description":16,"ogTitle":15,"ogDescription":16,"noIndex":12,"ogImage":19,"ogUrl":31,"ogSiteName":32,"ogType":33,"canonicalUrls":31},"https://about.gitlab.com/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo","https://about.gitlab.com","article","fr-fr/blog/refactor-code-into-modern-languages-with-ai-powered-gitlab-duo",[36,24,37],"aiml","devsecops","7xib9bREUtPu9t5Op6ZSRZNVMGPJbE89iCQacvlybsI",{"data":40},{"logo":41,"freeTrial":46,"sales":51,"login":56,"items":61,"search":371,"minimal":406,"duo":425,"pricingDeployment":435},{"config":42},{"href":43,"dataGaName":44,"dataGaLocation":45},"/fr-fr/","gitlab logo","header",{"text":47,"config":48},"Commencer un essai gratuit",{"href":49,"dataGaName":50,"dataGaLocation":45},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":52,"config":53},"Contacter l'équipe commerciale",{"href":54,"dataGaName":55,"dataGaLocation":45},"/fr-fr/sales/","sales",{"text":57,"config":58},"Connexion",{"href":59,"dataGaName":60,"dataGaLocation":45},"https://gitlab.com/users/sign_in/","sign in",[62,89,186,191,292,352],{"text":63,"config":64,"cards":66},"Plateforme",{"dataNavLevelOne":65},"platform",[67,73,81],{"title":63,"description":68,"link":69},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":70,"config":71},"Découvrir notre plateforme",{"href":72,"dataGaName":65,"dataGaLocation":45},"/fr-fr/platform/",{"title":74,"description":75,"link":76},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":77,"config":78},"Découvrir GitLab Duo",{"href":79,"dataGaName":80,"dataGaLocation":45},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":82,"description":83,"link":84},"Choisir GitLab","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":85,"config":86},"En savoir plus",{"href":87,"dataGaName":88,"dataGaLocation":45},"/fr-fr/why-gitlab/","why gitlab",{"text":90,"left":28,"config":91,"link":93,"lists":97,"footer":168},"Produit",{"dataNavLevelOne":92},"solutions",{"text":94,"config":95},"Voir toutes les solutions",{"href":96,"dataGaName":92,"dataGaLocation":45},"/fr-fr/solutions/",[98,123,146],{"title":99,"description":100,"link":101,"items":106},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":102},{"icon":103,"href":104,"dataGaName":105,"dataGaLocation":45},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[107,111,114,119],{"text":108,"config":109},"CI/CD",{"href":110,"dataGaLocation":45,"dataGaName":108},"/fr-fr/solutions/continuous-integration/",{"text":74,"config":112},{"href":79,"dataGaLocation":45,"dataGaName":113},"gitlab duo agent platform - product menu",{"text":115,"config":116},"Gestion du code source",{"href":117,"dataGaLocation":45,"dataGaName":118},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":120,"config":121},"Livraison de logiciels automatisée",{"href":104,"dataGaLocation":45,"dataGaName":122},"Automated software delivery",{"title":124,"description":125,"link":126,"items":131},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":127},{"href":128,"dataGaName":129,"dataGaLocation":45,"icon":130},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[132,136,141],{"text":133,"config":134},"Tests de sécurité des applications",{"href":128,"dataGaName":135,"dataGaLocation":45},"Application security testing",{"text":137,"config":138},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":139,"dataGaLocation":45,"dataGaName":140},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":142,"config":143},"Conformité logicielle",{"href":144,"dataGaName":145,"dataGaLocation":45},"/fr-fr/solutions/software-compliance/","Software Compliance",{"title":147,"link":148,"items":153},"Mesures",{"config":149},{"icon":150,"href":151,"dataGaName":152,"dataGaLocation":45},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[154,158,163],{"text":155,"config":156},"Visibilité et mesures",{"href":151,"dataGaLocation":45,"dataGaName":157},"Visibility and Measurement",{"text":159,"config":160},"Gestion de la chaîne de valeur",{"href":161,"dataGaLocation":45,"dataGaName":162},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":164,"config":165},"Données d'analyse et informations clés",{"href":166,"dataGaLocation":45,"dataGaName":167},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":169,"items":170},"GitLab pour",[171,176,181],{"text":172,"config":173},"Entreprises",{"href":174,"dataGaLocation":45,"dataGaName":175},"/fr-fr/enterprise/","enterprise",{"text":177,"config":178},"PME",{"href":179,"dataGaLocation":45,"dataGaName":180},"/fr-fr/small-business/","small business",{"text":182,"config":183},"Secteur public",{"href":184,"dataGaLocation":45,"dataGaName":185},"/fr-fr/solutions/public-sector/","public sector",{"text":187,"config":188},"Tarifs",{"href":189,"dataGaName":190,"dataGaLocation":45,"dataNavLevelOne":190},"/fr-fr/pricing/","pricing",{"text":192,"config":193,"link":195,"lists":199,"feature":279},"Ressources",{"dataNavLevelOne":194},"resources",{"text":196,"config":197},"Afficher toutes les ressources",{"href":198,"dataGaName":194,"dataGaLocation":45},"/fr-fr/resources/",[200,233,251],{"title":201,"items":202},"Premiers pas",[203,208,213,218,223,228],{"text":204,"config":205},"Installation",{"href":206,"dataGaName":207,"dataGaLocation":45},"/fr-fr/install/","install",{"text":209,"config":210},"Guides de démarrage",{"href":211,"dataGaName":212,"dataGaLocation":45},"/fr-fr/get-started/","quick setup checklists",{"text":214,"config":215},"Apprentissage",{"href":216,"dataGaLocation":45,"dataGaName":217},"https://university.gitlab.com/","learn",{"text":219,"config":220},"Documentation sur le produit",{"href":221,"dataGaName":222,"dataGaLocation":45},"https://docs.gitlab.com/","product documentation",{"text":224,"config":225},"Vidéos sur les bonnes pratiques",{"href":226,"dataGaName":227,"dataGaLocation":45},"/fr-fr/getting-started-videos/","best practice videos",{"text":229,"config":230},"Intégrations",{"href":231,"dataGaName":232,"dataGaLocation":45},"/fr-fr/integrations/","integrations",{"title":234,"items":235},"Découvrir",[236,241,246],{"text":237,"config":238},"Témoignages clients",{"href":239,"dataGaName":240,"dataGaLocation":45},"/fr-fr/customers/","customer success stories",{"text":242,"config":243},"Blog",{"href":244,"dataGaName":245,"dataGaLocation":45},"/fr-fr/blog/","blog",{"text":247,"config":248},"Travail à distance",{"href":249,"dataGaName":250,"dataGaLocation":45},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":252,"items":253},"Connecter",[254,259,264,269,274],{"text":255,"config":256},"Services GitLab",{"href":257,"dataGaName":258,"dataGaLocation":45},"/fr-fr/services/","services",{"text":260,"config":261},"Communauté",{"href":262,"dataGaName":263,"dataGaLocation":45},"/community/","community",{"text":265,"config":266},"Forum",{"href":267,"dataGaName":268,"dataGaLocation":45},"https://forum.gitlab.com/","forum",{"text":270,"config":271},"Événements",{"href":272,"dataGaName":273,"dataGaLocation":45},"/events/","events",{"text":275,"config":276},"Partenaires",{"href":277,"dataGaName":278,"dataGaLocation":45},"/fr-fr/partners/","partners",{"backgroundColor":280,"textColor":281,"text":282,"image":283,"link":287},"#2f2a6b","#fff","L'avenir du développement logiciel. Tendances et perspectives.",{"altText":284,"config":285},"carte promo The Source",{"src":286},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":288,"config":289},"Lire les articles les plus récents",{"href":290,"dataGaName":291,"dataGaLocation":45},"/fr-fr/the-source/","the source",{"text":293,"config":294,"lists":296},"Société",{"dataNavLevelOne":295},"company",[297],{"items":298},[299,304,310,312,317,322,327,332,337,342,347],{"text":300,"config":301},"À propos",{"href":302,"dataGaName":303,"dataGaLocation":45},"/fr-fr/company/","about",{"text":305,"config":306,"footerGa":309},"Carrières",{"href":307,"dataGaName":308,"dataGaLocation":45},"/jobs/","jobs",{"dataGaName":308},{"text":270,"config":311},{"href":272,"dataGaName":273,"dataGaLocation":45},{"text":313,"config":314},"Leadership",{"href":315,"dataGaName":316,"dataGaLocation":45},"/company/team/e-group/","leadership",{"text":318,"config":319},"Équipe",{"href":320,"dataGaName":321,"dataGaLocation":45},"/company/team/","team",{"text":323,"config":324},"Manuel",{"href":325,"dataGaName":326,"dataGaLocation":45},"https://handbook.gitlab.com/","handbook",{"text":328,"config":329},"Relations avec les investisseurs",{"href":330,"dataGaName":331,"dataGaLocation":45},"https://ir.gitlab.com/","investor relations",{"text":333,"config":334},"Centre de confiance",{"href":335,"dataGaName":336,"dataGaLocation":45},"/fr-fr/security/","trust center",{"text":338,"config":339},"Centre pour la transparence de l'IA",{"href":340,"dataGaName":341,"dataGaLocation":45},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":343,"config":344},"Newsletter",{"href":345,"dataGaName":346,"dataGaLocation":45},"/company/contact/#contact-forms","newsletter",{"text":348,"config":349},"Presse",{"href":350,"dataGaName":351,"dataGaLocation":45},"/press/","press",{"text":353,"config":354,"lists":355},"Nous contacter",{"dataNavLevelOne":295},[356],{"items":357},[358,361,366],{"text":52,"config":359},{"href":54,"dataGaName":360,"dataGaLocation":45},"talk to sales",{"text":362,"config":363},"Portail d’assistance",{"href":364,"dataGaName":365,"dataGaLocation":45},"https://support.gitlab.com","support portal",{"text":367,"config":368},"Portail clients GitLab",{"href":369,"dataGaName":370,"dataGaLocation":45},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":372,"login":373,"suggestions":380},"Fermer",{"text":374,"link":375},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":376,"config":377},"gitlab.com",{"href":59,"dataGaName":378,"dataGaLocation":379},"search login","search",{"text":381,"default":382},"Suggestions",[383,385,390,392,397,402],{"text":74,"config":384},{"href":79,"dataGaName":74,"dataGaLocation":379},{"text":386,"config":387},"Suggestions de code (IA)",{"href":388,"dataGaName":389,"dataGaLocation":379},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":108,"config":391},{"href":110,"dataGaName":108,"dataGaLocation":379},{"text":393,"config":394},"GitLab sur AWS",{"href":395,"dataGaName":396,"dataGaLocation":379},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":398,"config":399},"GitLab sur Google Cloud ",{"href":400,"dataGaName":401,"dataGaLocation":379},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":403,"config":404},"Pourquoi utiliser GitLab ?",{"href":87,"dataGaName":405,"dataGaLocation":379},"Why GitLab?",{"freeTrial":407,"mobileIcon":412,"desktopIcon":417,"secondaryButton":420},{"text":408,"config":409},"Commencer votre essai gratuit",{"href":410,"dataGaName":50,"dataGaLocation":411},"https://gitlab.com/-/trials/new/","nav",{"altText":413,"config":414},"Icône GitLab",{"src":415,"dataGaName":416,"dataGaLocation":411},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":413,"config":418},{"src":419,"dataGaName":416,"dataGaLocation":411},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":421,"config":422},"Commencer",{"href":423,"dataGaName":424,"dataGaLocation":411},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/compare/gitlab-vs-github/","get started",{"freeTrial":426,"mobileIcon":431,"desktopIcon":433},{"text":427,"config":428},"En savoir plus sur GitLab Duo",{"href":429,"dataGaName":430,"dataGaLocation":411},"/fr-fr/gitlab-duo/","gitlab duo",{"altText":413,"config":432},{"src":415,"dataGaName":416,"dataGaLocation":411},{"altText":413,"config":434},{"src":419,"dataGaName":416,"dataGaLocation":411},{"freeTrial":436,"mobileIcon":441,"desktopIcon":443},{"text":437,"config":438},"Retour aux tarifs",{"href":189,"dataGaName":439,"dataGaLocation":411,"icon":440},"back to pricing","GoBack",{"altText":413,"config":442},{"src":415,"dataGaName":416,"dataGaLocation":411},{"altText":413,"config":444},{"src":419,"dataGaName":416,"dataGaLocation":411},{"title":446,"button":447,"config":452},"Découvrez comment l'IA agentique transforme la livraison logicielle",{"text":448,"config":449},"Regarder GitLab Transcend maintenant",{"href":450,"dataGaName":451,"dataGaLocation":45},"/fr-fr/events/transcend/virtual/","transcend event",{"layout":453,"icon":454},"release","AiStar",{"data":456},{"text":457,"source":458,"edit":464,"contribute":469,"config":474,"items":479,"minimal":656},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence",{"text":459,"config":460},"Afficher le code source de la page",{"href":461,"dataGaName":462,"dataGaLocation":463},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":465,"config":466},"Modifier cette page",{"href":467,"dataGaName":468,"dataGaLocation":463},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":470,"config":471},"Veuillez contribuer",{"href":472,"dataGaName":473,"dataGaLocation":463},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":475,"facebook":476,"youtube":477,"linkedin":478},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[480,503,557,589,624],{"title":63,"links":481,"subMenu":486},[482],{"text":483,"config":484},"Plateforme DevSecOps",{"href":72,"dataGaName":485,"dataGaLocation":463},"devsecops platform",[487],{"title":187,"links":488},[489,493,498],{"text":490,"config":491},"Voir les forfaits",{"href":189,"dataGaName":492,"dataGaLocation":463},"view plans",{"text":494,"config":495},"Pourquoi choisir GitLab Premium ?",{"href":496,"dataGaName":497,"dataGaLocation":463},"/fr-fr/pricing/premium/","why premium",{"text":499,"config":500},"Pourquoi choisir GitLab Ultimate ?",{"href":501,"dataGaName":502,"dataGaLocation":463},"/fr-fr/pricing/ultimate/","why ultimate",{"title":504,"links":505},"Solutions",[506,511,514,516,521,526,530,533,536,541,543,545,547,552],{"text":507,"config":508},"Transformation digitale",{"href":509,"dataGaName":510,"dataGaLocation":463},"/fr-fr/topics/digital-transformation/","digital transformation",{"text":512,"config":513},"Sécurité et conformité",{"href":128,"dataGaName":135,"dataGaLocation":463},{"text":120,"config":515},{"href":104,"dataGaName":105,"dataGaLocation":463},{"text":517,"config":518},"Développement agile",{"href":519,"dataGaName":520,"dataGaLocation":463},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":522,"config":523},"Transformation cloud",{"href":524,"dataGaName":525,"dataGaLocation":463},"/fr-fr/topics/cloud-native/","cloud transformation",{"text":527,"config":528},"SCM",{"href":117,"dataGaName":529,"dataGaLocation":463},"source code management",{"text":108,"config":531},{"href":110,"dataGaName":532,"dataGaLocation":463},"continuous integration & delivery",{"text":159,"config":534},{"href":161,"dataGaName":535,"dataGaLocation":463},"value stream management",{"text":537,"config":538},"GitOps",{"href":539,"dataGaName":540,"dataGaLocation":463},"/fr-fr/solutions/gitops/","gitops",{"text":172,"config":542},{"href":174,"dataGaName":175,"dataGaLocation":463},{"text":177,"config":544},{"href":179,"dataGaName":180,"dataGaLocation":463},{"text":182,"config":546},{"href":184,"dataGaName":185,"dataGaLocation":463},{"text":548,"config":549},"Formation",{"href":550,"dataGaName":551,"dataGaLocation":463},"/fr-fr/solutions/education/","education",{"text":553,"config":554},"Services financiers",{"href":555,"dataGaName":556,"dataGaLocation":463},"/fr-fr/solutions/finance/","financial services",{"title":192,"links":558},[559,561,564,566,569,571,574,577,579,581,583,585,587],{"text":204,"config":560},{"href":206,"dataGaName":207,"dataGaLocation":463},{"text":562,"config":563},"Guides de démarrage rapide",{"href":211,"dataGaName":212,"dataGaLocation":463},{"text":214,"config":565},{"href":216,"dataGaName":217,"dataGaLocation":463},{"text":219,"config":567},{"href":221,"dataGaName":568,"dataGaLocation":463},"docs",{"text":242,"config":570},{"href":244,"dataGaName":245},{"text":572,"config":573},"Histoires de réussite client",{"href":239,"dataGaLocation":463},{"text":575,"config":576},"Histoires de succès client",{"href":239,"dataGaName":240,"dataGaLocation":463},{"text":247,"config":578},{"href":249,"dataGaName":250,"dataGaLocation":463},{"text":255,"config":580},{"href":257,"dataGaName":258,"dataGaLocation":463},{"text":260,"config":582},{"href":262,"dataGaName":263,"dataGaLocation":463},{"text":265,"config":584},{"href":267,"dataGaName":268,"dataGaLocation":463},{"text":270,"config":586},{"href":272,"dataGaName":273,"dataGaLocation":463},{"text":275,"config":588},{"href":277,"dataGaName":278,"dataGaLocation":463},{"title":293,"links":590},[591,593,596,598,600,602,604,608,613,615,617,619],{"text":300,"config":592},{"href":302,"dataGaName":295,"dataGaLocation":463},{"text":594,"config":595},"Emplois",{"href":307,"dataGaName":308,"dataGaLocation":463},{"text":313,"config":597},{"href":315,"dataGaName":316,"dataGaLocation":463},{"text":318,"config":599},{"href":320,"dataGaName":321,"dataGaLocation":463},{"text":323,"config":601},{"href":325,"dataGaName":326,"dataGaLocation":463},{"text":328,"config":603},{"href":330,"dataGaName":331,"dataGaLocation":463},{"text":605,"config":606},"Sustainability",{"href":607,"dataGaName":605,"dataGaLocation":463},"/sustainability/",{"text":609,"config":610},"Diversité, inclusion et appartenance (DIB)",{"href":611,"dataGaName":612,"dataGaLocation":463},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":333,"config":614},{"href":335,"dataGaName":336,"dataGaLocation":463},{"text":343,"config":616},{"href":345,"dataGaName":346,"dataGaLocation":463},{"text":348,"config":618},{"href":350,"dataGaName":351,"dataGaLocation":463},{"text":620,"config":621},"Déclaration de transparence sur l'esclavage moderne",{"href":622,"dataGaName":623,"dataGaLocation":463},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":353,"links":625},[626,629,634,636,641,646,651],{"text":627,"config":628},"Échanger avec un expert",{"href":54,"dataGaName":55,"dataGaLocation":463},{"text":630,"config":631},"Aide",{"href":632,"dataGaName":633,"dataGaLocation":463},"/support/","get help",{"text":367,"config":635},{"href":369,"dataGaName":370,"dataGaLocation":463},{"text":637,"config":638},"Statut",{"href":639,"dataGaName":640,"dataGaLocation":463},"https://status.gitlab.com/","status",{"text":642,"config":643},"Conditions d'utilisation",{"href":644,"dataGaName":645},"/terms/","terms of use",{"text":647,"config":648},"Déclaration de confidentialité",{"href":649,"dataGaName":650,"dataGaLocation":463},"/fr-fr/privacy/","privacy statement",{"text":652,"config":653},"Préférences en matière de cookies",{"dataGaName":654,"dataGaLocation":463,"id":655,"isOneTrustButton":28},"cookie preferences","ot-sdk-btn",{"items":657},[658,660,663],{"text":642,"config":659},{"href":644,"dataGaName":645,"dataGaLocation":463},{"text":661,"config":662},"Politique de confidentialité",{"href":649,"dataGaName":650,"dataGaLocation":463},{"text":652,"config":664},{"dataGaName":654,"dataGaLocation":463,"id":655,"isOneTrustButton":28},[666],{"id":667,"title":18,"body":8,"config":668,"content":670,"description":8,"extension":26,"meta":674,"navigation":28,"path":675,"seo":676,"stem":677,"__hash__":678},"blogAuthors/en-us/blog/authors/michael-friedrich.yml",{"template":669},"BlogAuthor",{"name":18,"config":671},{"headshot":672,"ctfId":673},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659879/Blog/Author%20Headshots/dnsmichi-headshot.jpg","dnsmichi",{},"/en-us/blog/authors/michael-friedrich",{},"en-us/blog/authors/michael-friedrich","lJ-nfRIhdG49Arfrxdn1Vv4UppwD51BB13S3HwIswt4",[680,692,706],{"content":681,"config":690},{"title":682,"description":683,"authors":684,"date":686,"body":687,"category":9,"tags":688,"heroImage":689},"GitLab Duo Agent Platform : comment réinventer le développement logiciel avec l’IA agentique","Découvrez comment GitLab Duo Agent Platform transforme la collaboration entre équipes de développement et les agents d’IA.\n",[685],"GitLab France Team","2026-02-24","> *Cet article de blog est un résumé de notre webinaire sur la Collaboration entre agents d’IA et développeurs animé par Lucas Rangeard (Solutions Architect) et Chloé Cartron (Senior Solutions Architect). Pour visionner le replay, [cliquez ici](https://learn.gitlab.com/fr-oct-agentic-ai/duo-ai-fr).* \n\nStructurer un besoin client en ticket, diviser un ticket en sous-tâches assignables, et implémenter la fonctionnalité : trois opérations qui, dans un cycle de développement traditionnel, s'enchaînent de manière séquentielle entraînant un goulot d'étranglement bien connu des [équipes DevOps](https://about.gitlab.com/fr-fr/topics/devops/build-a-devops-team/ \"équipes DevOps\").\n\nGrâce à GitLab Duo Agent Platform, ces trois tâches sont exécutées en parallèle, avec une merge request prête à être revue en quelques minutes. \n\nDécouvrez dans cet article les capacités de GitLab Duo Agent Platform conçue pour transformer la collaboration entre équipes de développement et agents intelligents et apprenez comment mettre en place des flows, de la création d’un ticket au développement d’une application à travers trois cas d’usage.\n\n## GitLab Duo Agent Platform : une orchestration agentique native\n\n[GitLab Duo Agent Platform](https://about.gitlab.com/fr-fr/gitlab-duo-agent-platform/ \"GitLab Duo Agent Platform\") représente une évolution majeure dans notre approche du DevSecOps. En disponibilité générale depuis janvier 2026 pour les clients GitLab Premium et GitLab Ultimate (GitLab.com et GitLab Self-Managed), GitLab Duo Agent Platform permet aux équipes de développement de collaborer avec des agents d’IA sur l'ensemble du cycle de développement logiciel ([SDLC](https://about.gitlab.com/fr-fr/blog/what-is-sdlc/ \"Qu'est-ce que le SDLC ?\")).\n\n> 🎯 Essayez [GitLab Duo Agent Platform](https://about.gitlab.com/fr-fr/gitlab-duo-agent-platform/?utm_medium=blog&utm_source=blog&utm_campaign=eg_emea_x_trial_x_fr_blog_fr) dès aujourd'hui !\n\n### L’orchestration agentique au coeur du SDLC\n\nNotre approche repose sur trois piliers interconnectés :\n\n* **Nous conservons ce qui fait notre force** : une plateforme unifiée avec un système de données centralisé et des APIs.\n* **Nous ajoutons une couche d'intelligence agentique** : des agents spécialisés travaillant ensemble et de manière autonome. \n* **Nous créons un graphe de connaissances reliant l'ensemble des données entre elles** : votre code, vos tickets, vos déploiements, vos scans de sécurité. Cette interconnexion permet aux agents de comprendre votre contexte complet et de prendre des décisions éclairées rapidement. \n\n### Des agents spécialisés tout au long du SDLC\n\nGitLab Duo Agent Platform ne vise pas à remplacer les équipes de développement, mais à leur fournir des partenaires capables d'exécuter des tâches en parallèle. \n\nLes utilisateurs ont accès à trois types d’agents différents : les [agents par défaut](https://docs.gitlab.com/user/duo_agent_platform/agents/foundational_agents/) comme [Planner](https://docs.gitlab.com/user/duo_agent_platform/agents/foundational_agents/planner/), [Security Analyst](https://docs.gitlab.com/user/duo_agent_platform/agents/foundational_agents/security_analyst_agent/) et [Data Analyst](https://docs.gitlab.com/user/duo_agent_platform/agents/foundational_agents/data_analyst/) pour les tâches courantes de développement, les [agents personnalisables](https://docs.gitlab.com/user/duo_agent_platform/agents/custom/) pour les workflows spécifiques à votre équipe, ainsi que les [agents externes](https://docs.gitlab.com/user/duo_agent_platform/agents/external/) comme Claude Code ou OpenAI Codex. Pour en savoir plus sur les agents, consultez notre article de blog [GitLab Duo Agent Platform : comprendre les agents](https://about.gitlab.com/fr-fr/blog/understanding-agents-foundational-custom-external/).\n\nCes agents partagent un contexte unifié. Ils peuvent accéder aux tickets, au code source, aux [pipelines CI/CD](https://about.gitlab.com/fr-fr/topics/ci-cd/cicd-pipeline/ \"Qu'est-ce qu'un pipeline CI/CD ?\"), aux merge requests et à l'historique de déploiement, selon les permissions données. \n\n> Chez NatWest, l'intégration des agents d’IA dans le cycle de développement logiciel a permis d'améliorer « la productivité, la vélocité et l'efficacité » des équipes, selon Bal Kang, Engineering Platform Lead. \n\n## Comment l'IA agentique réduit les temps d'attente entre chaque étape ?\n\nDans un cycle de développement traditionnel, les étapes s'enchaînent les unes après les autres. Rédaction des spécifications, découpage en tâches, implémentation, tests, revue de code : chaque phase attend la précédente. Ce modèle séquentiel génère des temps morts et limite la capacité des équipes à traiter plusieurs demandes simultanément.\n\nL'approche agentique change cette dynamique. En déléguant des tâches à des agents autonomes, les équipes de développement peuvent avancer sur plusieurs fronts en parallèle. Pendant qu'un agent implémente une fonctionnalité, un autre structure une nouvelle demande, et un troisième prépare une analyse de sécurité. Le cycle de développement global est raccourci.\n\nL'objectif : permettre aux équipes de développement de déléguer certaines tâches à des agents pendant qu'ils se concentrent sur d'autres tâches à plus forte valeur ajoutée, tout en gardant le contrôle sur les résultats.\n\n## 3 exemples de flows à tester\n\nDécouvrez comment GitLab Duo Agent Platform transforme le quotidien des équipes grâce à ces trois cas d'usage qui peuvent être exécutés simultanément. \n\n### Transformer une idée en ticket structuré\n\nAvec GitLab Duo Agentic Chat, les utilisateurs peuvent générer un ticket complet et personnalisable à partir d'une idée en formulant leur demande en langage naturel à l’aide du modèle IA de leur choix. \n\nCe ticket comprend le titre correspondant au besoin, la user story, les critères d'acceptance, les contraintes techniques, la « definition of done », ainsi que tout autre élément de gestion de projet propre aux équipes : personnes assignées, labels, date de début et date de fin de la tâche, confidentialité du ticket, etc.\n\nL'action proposée est soumise à validation. Une fois approuvé, le ticket apparaît dans le backlog en quelques secondes.\n\n### Diviser un ticket en sous-tâches\n\nUn ticket couvrant plusieurs fonctionnalités peut être divisé automatiquement en sous-tickets distincts. L'agent crée les sous tickets, maintient les références avec le ticket parent, et préserve la cohérence des critères d'acceptance. Ce mécanisme transforme un besoin business global en un ensemble de tâches assignables aux équipes. \n\n### Générer une merge request depuis un ticket\n\nÀ partir d’un ticket décrivant une fonctionnalité à implémenter, l'agent analyse le contexte du projet, comprend l'architecture existante, et génère le code correspondant. Il modifie les fichiers nécessaires, crée une merge request et le pipeline CI/CD se lance automatiquement.\n\nIl est également possible d'assigner GitLab Duo comme relecteur sur une merge request. L'agent analyse les changements, identifie les points d'attention et laisse des commentaires dans la merge request, offrant un premier niveau de revue avant la sollicitation des pairs.\n\n## Une collaboration entre humains et IA\n\nUn aspect distingue GitLab Duo Agent Platform des approches purement automatisées : chaque action proposée par un agent nécessite une validation explicite. L'utilisateur visualise ce que l'agent souhaite exécuter et approuve ou ajuste le travail effectué par l’agent avant d’effectuer une action.\nCette approche répond aux exigences des équipes en matière de gouvernance. L'agent accélère l'exécution, mais les décisions restent sous contrôle humain. Une approche indispensable dans un contexte où la qualité du code et la sécurité ne peuvent être compromises.\n\n## Le catalogue d’IA : un écosystème agentique\n\nAu-delà des agents natifs, GitLab développe un écosystème ouvert : le catalogue d’IA. Ce dernier permet de découvrir, utiliser et partager des agents et des flows développés par GitLab, ainsi que par toute la communauté.\n\nLes options de partage sont flexibles : ouverture à la communauté ou restriction à des usages internes selon les besoins de gouvernance.\n\nCette approche permet d'imaginer un agent expert en migration de bases de données, ou encore un flow d’optimisation de performance tous intégrés nativement dans GitLab. \n\nCes agents et flows s'intègrent à votre interface GitLab et identifient rapidement votre contexte et vos projets.\n\n## Prérequis\n\nPour utiliser GitLab Duo Agent Platform, plusieurs conditions sont requises :\n\n* Disposer de la version 18.8 ou ultérieure de GitLab ou d’un compte GitLab.com.\n* Être abonné à [GitLab Premium](https://about.gitlab.com/fr-fr/pricing/premium/) ou [GitLab Ultimate](https://about.gitlab.com/fr-fr/pricing/ultimate/)\n\nGitLab Duo Agent Platform utilise par défaut les modèles d'IA fournis par GitLab. Une configuration alternative utilisant les modèles des clients est disponible [pour les installations auto hébergées](https://docs.gitlab.com/administration/gitlab_duo_self_hosted/#gitlab-duo-agent-platform). Pour en savoir plus, consultez notre article [IA agentique avec contrôle d'entreprise : GitLab Duo Agent Platform Self-Hosted et BYOM](https://about.gitlab.com/fr-fr/blog/agentic-ai-enterprise-control-self-hosted-duo-agent-platform-and-byom/).\n\n## Perspectives : l'IA agentique au coeur du DevSecOps\n\nGitLab Duo Agent Platform marque une évolution dans l'intégration de l'IA dans le cycle de développement DevSecOps. Il ne s'agit plus uniquement de suggestions de code, mais d'une véritable orchestration agentique où des agents spécialisés prennent en charge des workflows complets.\n\nVous souhaitez en savoir plus sur les flows ? Consultez notre article [Comprendre les flows : workflows multi-agents](https://about.gitlab.com/fr-fr/blog/understanding-flows-multi-agent-workflows/) et découvrez comment utiliser les [flows par défaut](https://docs.gitlab.com/user/duo_agent_platform/flows/foundational_flows/) et les [flows personnalisables](https://docs.gitlab.com/user/duo_agent_platform/flows/custom/).\n\n> 🎯 Essayez [GitLab Duo Agent Platform](https://about.gitlab.com/fr-fr/gitlab-duo-agent-platform/?utm_medium=blog&utm_source=blog&utm_campaign=eg_emea_x_trial_x_fr_blog_fr) dès aujourd'hui !",[23],"https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png",{"featured":12,"template":13,"slug":691},"gitlab-duo-agent-platform-software-development-agentic-ai",{"content":693,"config":704},{"title":694,"description":695,"authors":696,"heroImage":698,"date":699,"body":700,"category":9,"tags":701},"IA agentique avec contrôle d'entreprise : GitLab Duo Agent Platform Self-Hosted et BYOM","Découvrez comment GitLab 18.9 offre aux entreprises des secteurs réglementés une IA agentique gouvernée grâce à GitLab Duo Agent Platform Self-Hosted et à la prise en charge Bring Your Own Model.",[697],"Rebecca Carter","https://res.cloudinary.com/about-gitlab-com/image/upload/v1771438388/t6sts5qw4z8561gtlxiq.png","2026-02-19","Pour les organisations qui opèrent dans des secteurs réglementés, la transition vers l'automatisation alimentée par l'IA s'accompagne de contraintes strictes. La résidence des données, le contrôle des fournisseurs et la gouvernance ne sont pas négociables. De nombreuses organisations ont déjà investi massivement dans leurs propres modèles, avec des processus d'approbation rigoureux qui régissent leur fonctionnement et leur déploiement.\n\nAvec [GitLab 18.9](https://about.gitlab.com/releases/2026/02/19/gitlab-18-9-released/), nous proposons deux fonctionnalités qui comblent une lacune stratégique critique pour ces organisations et transformons [GitLab Duo Agent Platform](https://about.gitlab.com/fr-fr/gitlab-duo-agent-platform/) en un plan de contrôle d'IA prêt à être déployé et gouvernable pour les environnements réglementaires les plus stricts.\n\n## GitLab Duo Agent Platform Self-Hosted pour les licences cloud en ligne\nAvec GitLab Duo Agent Platform, les équipes d'ingénierie créent des flows alimentés par l'IA qui automatisent des séquences de tâches, allant de la refactorisation des services au renforcement des pipelines CI/CD en passant par la hiérarchisation des vulnérabilités. Jusqu'à présent, l'utilisation de GitLab Duo Agent Platform en production avec des modèles auto-hébergés était principalement alignée sur des chemins de licence hors ligne ou complémentaires et n'était pas conçue pour les clients disposant de licences cloud en ligne qui opèrent dans des environnements avec des réglementations strictes.\n\nDésormais en disponibilité générale, [GitLab Duo Agent Platform Self-Hosted pour les licences cloud en ligne](https://docs.gitlab.com/subscriptions/subscription-add-ons/#gitlab-duo-agent-platform-self-hosted) introduit un modèle de facturation basé sur l'usage alimenté par les [GitLab Credits](https://about.gitlab.com/fr-fr/blog/introducing-gitlab-credits/). Cette approche offre la mesure transparente et prévisible dont les entreprises ont besoin pour instaurer la confiance et la refacturation interne.\n* **Résidence et contrôle des données** : vous pouvez désormais exécuter GitLab Duo Agent Platform en production sur des licences cloud en ligne tout en utilisant des modèles hébergés sur votre propre infrastructure ou dans des environnements cloud approuvés. Vous contrôlez ainsi le lieu d'exécution des modèles et la façon dont le trafic d'inférence est acheminé dans vos environnements approuvés.\n* **Transparence des coûts et refacturation** : bénéficiez d'une transparence granulaire des coûts grâce aux GitLab Credits et au décompte par requête, deux éléments essentiels pour une refacturation interne précise et le respect des normes réglementaires en matière de reporting.\n* **Accélération de l'adoption** : supprime un obstacle majeur au déploiement de l'IA agentique dans des secteurs comme les services financiers, les administrations publiques et les infrastructures critiques, où l'acheminement des données via des fournisseurs d'IA externes n'est tout simplement pas envisageable. Avec GitLab 18.9, GitLab Duo Agent Platform devient un environnement de déploiement de premier ordre pour les licences cloud en ligne.\n\n## Bring Your Own Model\nL'auto-hébergement de la couche d'orchestration n'est qu'une partie de la solution. De nombreux clients de secteurs réglementés ont déjà investi massivement dans leurs propres modèles : des LLM adaptés à leur domaine, des déploiements dans une région dédiée ou air-gapped pour la souveraineté des données, et des modèles fermés et internes conçus en fonction d'un profil de risque spécifique.\n\n**Bring Your Own Model (BYOM)** renforce la flexibilité de GitLab Duo Agent Platform. Les administrateurs peuvent connecter des modèles tiers ou auto-hébergés via la [passerelle d'IA (AI-Gateway) de GitLab](https://docs.gitlab.com/administration/gitlab_duo/gateway/), et les clients choisissent et contrôlent le modèle.\n* **Intégration et gouvernance** : les modèles BYOM apparaissent aux côtés des modèles gérés par GitLab dans le plan de contrôle d'IA de GitLab. GitLab Duo Agent Platform peut ainsi les traiter comme des options prêtes à l'emploi pour l'entreprise.\n* **Mappage granulaire** : une fois enregistrés via la passerelle d'IA, les modèles peuvent être mappés à des flows ou des fonctionnalités spécifiques de GitLab Duo Agent Platform. Vous pouvez ainsi exercer un contrôle étroit sur les agents et les flows, ainsi que sur les modèles utilisés. Les administrateurs restent toujours responsables de la validation des modèles, des performances et de l'évaluation des risques. Vous êtes responsable de la compatibilité, des performances et de l'évaluation des risques pour les modèles que vous apportez.\n\nEnsemble, ces fonctionnalités donnent aux responsables d'ingénierie un contrôle complet sur l'IA agentique. Ce plan de contrôle unique et gouverné pour l'IA agentique remplace l'ensemble fragmenté de solutions ponctuelles et d'outils d'IA non gérés sur lesquels de nombreuses organisations s'appuient aujourd'hui. Il s'agit d'une combinaison que les organisations réglementées réclamaient depuis longtemps : la liberté de choisir son modèle accompagnée d'une gouvernance forte, au sein de la même plateforme DevSecOps en laquelle elles ont déjà confiance.\n\n> Vous souhaitez essayer GitLab Duo Agent Platform ? [Contactez-nous ou commencez un essai gratuit dès aujourd'hui](https://about.gitlab.com/fr-fr/gitlab-duo-agent-platform/?utm_medium=blog&utm_source=blog&utm_campaign=eg_emea_x_trial_x_fr_blog_fr).\n\n-----------\n\n_Cet article de blog contient des « déclarations prospectives » au sens de la section 27A du Securities Act de 1933, tel que modifié, et de la section 21E du Securities Exchange Act de 1934. Bien que nous croyions que les attentes reflétées dans ces déclarations sont raisonnables, elles sont soumises à des risques, incertitudes, hypothèses et autres facteurs connus et inconnus qui peuvent entraîner des résultats ou des issues réels sensiblement différents. Des informations supplémentaires sur ces risques et autres facteurs sont incluses sous la rubrique « Facteurs de risque » dans nos dépôts auprès de la SEC. Nous ne nous engageons pas à mettre à jour ou à réviser ces déclarations après la date de cet article de blog, sauf si la loi l'exige._",[23,702,703],"product","features",{"featured":28,"template":13,"slug":705},"agentic-ai-enterprise-control-self-hosted-duo-agent-platform-and-byom",{"content":707,"config":718},{"description":708,"body":709,"title":710,"heroImage":711,"date":712,"authors":713,"category":9,"tags":715},"Ce guide explique comment déployer un agent d'IA basé sur l'Agent Development Kit vers Google Kubernetes Engine à l'aide de la plateforme DevSecOps de GitLab en toute simplicité et sécurité.","Créer des [agents d'IA](https://about.gitlab.com/fr-fr/gitlab-duo/agent-platform/) est passionnant, mais leur déploiement sécurisé en production est parfois compliqué. Dans ce tutoriel, vous découvrirez comment [l'intégration native de GitLab avec Google Cloud](https://cloud.google.com/blog/topics/partners/understand-the-google-cloud-gitlab-integration) facilite le déploiement d'agents d'IA vers Google Kubernetes Engine (GKE), avec scans de sécurité intégrés et sans clés de compte de service.\n\n\n\n## Pourquoi choisir GKE pour déployer vos agents d'IA ?\n\n\n\nGKE offre une orchestration d'entreprise qui s'intègre parfaitement aux pipelines [CI/CD](https://about.gitlab.com/fr-fr/topics/ci-cd/) de GitLab grâce à l'authentification OpenID Connect (OIDC). Votre équipe de développement peut déployer des agents d'IA tout en conservant une visibilité, une conformité et un contrôle complets sur votre infrastructure cloud. Ce guide utilise l'Agent Development Kit ([ADK](https://developers.googleblog.com/en/agent-development-kit-easy-to-build-multi-agent-applications/)) de Google afin de créer l'application, ce qui garantit une intégration fluide lors du déploiement avec GitLab.\n\n\n\nVoici trois avantages clés de cette approche :\n\n\n\n**Contrôle total de l'infrastructure :** vos données, vos règles, votre environnement. Vous conservez un contrôle complet sur l'emplacement d'exécution de vos agents d'IA et de leur configuration.\n\n\n\n **Intégration native avec GitLab :** pas de solution de contournement complexe. Vos pipelines existants fonctionnent immédiatement grâce à l'intégration native de GitLab avec Google Cloud.\n\n\n\n **Mise à l'échelle de niveau production :** GKE gère automatiquement la mise à l'échelle et l'orchestration interne à mesure que vos charges de travail d'IA augmentent.\n\n\n\nAvec GKE, GitLab offre la fiabilité d'entreprise dont vos déploiements d'IA ont besoin sans sacrifier l'expérience développeur que vos équipes attendent.\n\n\n\n## Prérequis\n\n\n\nAvant de commencer, assurez-vous d'avoir activé ces API :\n\n\n\n- API GKE\n\n\n- API Artifact Registry\n\n\n- API Vertex AI\n\n\n\nAssurez-vous également de disposer des éléments suivant :\n\n\n- Un projet GitLab créé\n\n\n- Un cluster GKE provisionné\n\n\n- Un dépôt Artifact Registry créé\n\n\n\n## Le processus de déploiement\n\n\n\n### 1. Configurer IAM et les autorisations sur GitLab\n\n\n\nAccédez à vos intégrations GitLab afin de configurer l'authentification Google Cloud (IAM).\n\n\n\nAccédez à **Paramètres > Intégrations** et configurez l'intégration Google Cloud. Si vous utilisez une intégration au niveau du groupe, notez que les paramètres par défaut sont déjà hérités par les projets. Il vous suffit donc de configurer vos paramètres une fois au niveau du groupe pour que tous les projets en bénéficient et les héritent.\n\n\n\nPour configurer les paramètres, vous devez fournir les éléments suivants :\n\n\n- ID du projet\n\n\n- Numéro du projet \n\n\n- ID du pool d'identités de charge de travail\n\n- ID du fournisseur\n\n\n\nUne fois ces informations renseignées, GitLab fournit un script à exécuter dans Google Cloud Console via Cloud Shell. Le résultat de l'exécution de ce script est un pool de fédération d'identité de charge de travail avec l'identité de service de compte principal nécessaire pour permettre l'accès approprié.\n\n\n### 2. Configurer l'intégration à Artifact Registry\n\n\n\nToujours dans les paramètres d'intégration de GitLab, configurez la gestion des artefacts :\n\n\n\n1. Cliquez sur **Gestion des artefacts**.\n\n\n2. Sélectionnez **Google Artifact Registry**.\n\n\n3. Indiquez les éléments suivants :\n      - ID du projet\n      - Nom du dépôt (créé au préalable)\n      - Emplacement du dépôt\n\nGitLab fournit un autre script à exécuter dans Google Cloud Console.\n\n\n\n**Important :** avant de continuer, ajoutez ces rôles supplémentaires au pool de fédération d'identité de charge de travail :\n\n\n- Utilisateur de compte de service\n\n\n- Développeur Kubernetes\n\n\n- Observateur de cluster Kubernetes\n\n\n\nCes autorisations permettent à GitLab de déployer vers GKE dans les étapes suivantes.\n\n\n\n### 3. Créer le pipeline CI/CD\n\n\n\nVoici maintenant la partie essentielle : la création du [pipeline CI/CD](https://about.gitlab.com/fr-fr/topics/ci-cd/cicd-pipeline/ \"Pipeline CI/CD\") pour le déploiement.\n\n\n\nAccédez à **Compilation > Éditeur de pipeline** et définissez votre pipeline en quatre étapes :\n\n\n\n* **Build :** Docker crée l'image de conteneur.\n\n\n\n* **Test :** GitLab Auto DevOps fournit des scans de sécurité intégrés afin de garantir l'absence de vulnérabilités.\n\n\n\n* **Importation :** utilise le composant CI/CD intégré de GitLab pour effectuer un push vers Google Artifact Registry.\n\n\n\n* **Déploiement :** utilise la configuration [Kubernetes](https://about.gitlab.com/fr-fr/blog/kubernetes-the-container-orchestration-solution/ \"Kubernetes\") pour déployer vers GKE.\n\n\n\nVoici le fichier `.gitlab-ci.yml` complet :\n\n\n    ```yaml\n\n\n\n    default:\n      tags: [ saas-linux-2xlarge-amd64 ]\n\n    stages:\n      - build\n      - test\n      - upload\n      - deploy\n\n    variables:\n      GITLAB_IMAGE: $CI_REGISTRY_IMAGE/main:$CI_COMMIT_SHORT_SHA\n      AR_IMAGE: $GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev/$GOOGLE_ARTIFACT_REGISTRY_PROJECT_ID/$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_NAME/main:$CI_COMMIT_SHORT_SHA\n      GCP_PROJECT_ID: \"your-project-id\"\n      GKE_CLUSTER: \"your-cluster\"\n      GKE_REGION: \"us-central1\"\n      KSA_NAME: \"ai-agent-ksa\"\n\n    build:\n      image: docker:24.0.5\n      stage: build\n      services:\n        - docker:24.0.5-dind\n      before_script:\n        - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n      script:\n        - docker build -t $GITLAB_IMAGE .\n        - docker push $GITLAB_IMAGE\n\n    include:\n      - template: Jobs/Dependency-Scanning.gitlab-ci.yml\n      - template: Jobs/Container-Scanning.gitlab-ci.yml\n      - template: Jobs/Secret-Detection.gitlab-ci.yml\n      - component: gitlab.com/google-gitlab-components/artifact-registry/upload-artifact-registry@main\n        inputs:\n          stage: upload\n          source: $GITLAB_IMAGE\n          target: $AR_IMAGE\n\n    deploy:\n      stage: deploy\n      image: google/cloud-sdk:slim\n      identity: google_cloud\n      before_script:\n        - apt-get update && apt-get install -y kubectl google-cloud-sdk-gke-gcloud-auth-plugin\n        - gcloud container clusters get-credentials $GKE_CLUSTER --region $GKE_REGION --project $GCP_PROJECT_ID\n      script:\n        - |\n          kubectl apply -f - \u003C\u003CEOF\n          apiVersion: apps/v1\n          kind: Deployment\n          metadata:\n            name: ai-agent\n            namespace: default\n          spec:\n            replicas: 2\n            selector:\n              matchLabels:\n                app: ai-agent\n            template:\n              metadata:\n                labels:\n                  app: ai-agent\n              spec:\n                serviceAccountName: $KSA_NAME\n                containers:\n                - name: ai-agent\n                  image: $AR_IMAGE\n                  ports:\n                  - containerPort: 8080\n                  resources:\n                    requests: {cpu: 500m, memory: 1Gi}\n                    limits: {cpu: 2000m, memory: 4Gi}\n                  livenessProbe:\n                    httpGet: {path: /health, port: 8080}\n                    initialDelaySeconds: 60\n                  readinessProbe:\n                    httpGet: {path: /health, port: 8080}\n                    initialDelaySeconds: 30\n          ---\n          apiVersion: v1\n          kind: Service\n          metadata:\n            name: ai-agent-service\n            namespace: default\n          spec:\n            type: LoadBalancer\n            ports:\n            - port: 80\n              targetPort: 8080\n            selector:\n              app: ai-agent\n          ---\n          apiVersion: autoscaling/v2\n          kind: HorizontalPodAutoscaler\n          metadata:\n            name: ai-agent-hpa\n            namespace: default\n          spec:\n            scaleTargetRef:\n              apiVersion: apps/v1\n              kind: Deployment\n              name: ai-agent\n            minReplicas: 2\n            maxReplicas: 10\n            metrics:\n            - type: Resource\n              resource:\n                name: cpu\n                target: {type: Utilization, averageUtilization: 70}\n          EOF\n          \n          kubectl rollout status deployment/ai-agent -n default --timeout=5m\n          EXTERNAL_IP=$(kubectl get service ai-agent-service -n default -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\n          echo \"Deployed at: http://$EXTERNAL_IP\"\n      only:\n        - main\n```\n\n\n#### Configuration essentielle pour GKE\n\n\n\nPour que tout fonctionne, et c'est la raison pour laquelle nous avons besoin de cette configuration supplémentaire pour GKE, nous devons disposer d'un compte de service Kubernetes dans le cluster qui peut fonctionner avec Vertex AI. Ce compte de service doit être autorisé à accéder aux capacités d'IA de Google Cloud.\n\n\n\nSans cela, nous pouvons déployer l'application, mais l'agent d'IA ne fonctionnera pas. Nous devons créer un compte de service Kubernetes capable d'accéder à Vertex AI.\n\n\n\nExécutez cette configuration ponctuelle :\n\n\n\n    ```bash\n\n\n\n    #!/bin/bash\n\n\n\n    PROJECT_ID=\"your-project-id\"\n\n\n\n    GSA_NAME=\"ai-agent-vertex\"\n\n\n\n    GSA_EMAIL=\"${GSA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com\"\n\n\n\n    KSA_NAME=\"ai-agent-ksa\"\n\n\n\n    CLUSTER_NAME=\"your-cluster\"\n\n\n\n    REGION=\"us-central1\"\n\n\n\n\n    # Create GCP Service Account\n\n\n\n    gcloud iam service-accounts create $GSA_NAME \\\n        --display-name=\"AI Agent Vertex AI\" \\\n        --project=$PROJECT_ID\n\n    # Grant Vertex AI permissions\n\n\n\n    gcloud projects add-iam-policy-binding $PROJECT_ID \\\n        --member=\"serviceAccount:${GSA_EMAIL}\" \\\n        --role=\"roles/aiplatform.user\"\n\n    # Get cluster credentials\n\n\n\n    gcloud container clusters get-credentials $CLUSTER_NAME \\\n        --region $REGION --project $PROJECT_ID\n\n    # Create Kubernetes Service Account\n\n\n\n    kubectl create serviceaccount $KSA_NAME -n default\n\n\n\n\n    # Link accounts\n\n\n\n    kubectl annotate serviceaccount $KSA_NAME -n default \\\n        iam.gke.io/gcp-service-account=${GSA_EMAIL}\n\n    gcloud iam service-accounts add-iam-policy-binding ${GSA_EMAIL} \\\n        --role=roles/iam.workloadIdentityUser \\\n        --member=\"serviceAccount:${PROJECT_ID}.svc.id.goog[default/${KSA_NAME}]\" \\\n        --project=$PROJECT_ID\n```\n\n\n### 4. Déployer vers GKE\n\n\n\nUne fois que vous avez terminé, effectuez un push vers le pipeline et le tour est joué.\n\n\n\nLe pipeline vient d'être déployé. Accédez à **CI/CD > Pipelines** pour voir les quatre étapes :\n\n\n- Build\n\n\n- Test (avec tous les scans de sécurité définis)\n\n\n- Importation vers Artifact Registry (réussie)\n\n\n- Déploiement vers Kubernetes dans GKE (réussi)\n\n\n\n## Résumé\n\n\n\nAvec GitLab et Google Cloud, vous êtes en mesure de déployer votre agent d'IA vers GKE en toute simplicité et sécurité en quelques étapes seulement grâce à l'intégration native de GitLab avec Google Cloud.\n\n\nRegardez cette démo :\n\n\n\u003C!-- blank line -->\n\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/mc2pCL5Qjus?si=QoH02lvz5KH5Ku9O\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\n\u003C!-- blank line -->\n\n\n> Utilisez [l'exemple de code complet de ce tutoriel](https://gitlab.com/gitlab-partners-public/google-cloud/demos/gke-ai-agent) pour commencer dès maintenant. Vous n’utilisez pas encore GitLab ? Découvrez la plateforme DevSecOps et profitez d'[un essai gratuit](https://about.gitlab.com/fr-fr/free-trial/). Les startups hébergées sur Google Cloud disposent d'[une offre spéciale pour essayer et utiliser GitLab](https://about.gitlab.com/fr-fr/solutions/startups/google-cloud/).","Déploiement sécurisé d'agents d'IA sur GKE","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1749670563/Blog/Hero%20Images/cloudcomputing.jpg","2026-02-06",[714],"Regnard Raquedan",[23,716,717,24],"google","cloud native",{"featured":12,"template":13,"slug":719},"secure-ai-agent-deployment-to-gke",{"promotions":721},[722,735,746],{"id":723,"categories":724,"header":725,"text":726,"button":727,"image":732},"ai-modernization",[9],"Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":728,"config":729},"Get your AI maturity score",{"href":730,"dataGaName":731,"dataGaLocation":245},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":733},{"src":734},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":736,"categories":737,"header":738,"text":726,"button":739,"image":743},"devops-modernization",[702,37],"Are you just managing tools or shipping innovation?",{"text":740,"config":741},"Get your DevOps maturity score",{"href":742,"dataGaName":731,"dataGaLocation":245},"/assessments/devops-modernization-assessment/",{"config":744},{"src":745},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":747,"categories":748,"header":750,"text":726,"button":751,"image":755},"security-modernization",[749],"security","Are you trading speed for security?",{"text":752,"config":753},"Get your security maturity score",{"href":754,"dataGaName":731,"dataGaLocation":245},"/assessments/security-modernization-assessment/",{"config":756},{"src":757},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"header":759,"blurb":760,"button":761,"secondaryButton":765},"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":47,"config":762},{"href":763,"dataGaName":50,"dataGaLocation":764},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":52,"config":766},{"href":54,"dataGaName":55,"dataGaLocation":764},1772652107893]