[{"data":1,"prerenderedAt":969},["ShallowReactive",2],{"/blog/automating-with-gitlab-duo-part-2-complex-testing":3,"navigation-en-us":184,"banner-en-us":612,"footer-en-us":622,"blog-post-authors-en-us-Byron Boots":866,"blog-related-posts-en-us-automating-with-gitlab-duo-part-2-complex-testing":881,"blog-promotions-en-us":906,"next-steps-en-us":959},{"id":4,"title":5,"authors":6,"body":8,"category":162,"date":163,"description":164,"extension":165,"externalUrl":166,"faq":166,"featured":167,"heroImage":168,"meta":169,"navigation":170,"path":171,"seo":172,"slug":176,"stem":177,"tags":178,"template":182,"updatedDate":166,"__hash__":183},"blogPosts/en-us/blog/automating-with-gitlab-duo-part-2-complex-testing.md","Automating with GitLab Duo, Part 2: Complex testing",[7],"Byron Boots",{"type":9,"value":10,"toc":149},"minimark",[11,22,27,36,41,44,51,58,64,71,75,78,82,85,89,92,96,99,103,106,140],[12,13,14,15,21],"p",{},"The first part of our three-part series on ",[16,17,20],"a",{"href":18,"rel":19},"https://about.gitlab.com/blog/automating-with-gitlab-duo-part-1-generating-tests/",[],"test generation with GitLab Duo"," focused on how to automate code testing. Now, we will share the lessons we learned while using AI for test generation.",[23,24,26],"h2",{"id":25},"situations-we-encountered-and-how-we-handled-them","Situations we encountered and how we handled them",[12,28,29,30,35],{},"Overall, we were pleased with the results using ",[16,31,34],{"href":32,"rel":33},"https://about.gitlab.com/gitlab-duo-agent-platform/",[],"GitLab Duo"," to generate tests on our code. As is the case with any language generation, some cases required minor adjustments such as fixing import paths or editing contents in datasets. For the more complex cases, we had to remember that AI solutions often lack context. Here's how we handled the more complex testing situations with GitLab Duo.",[37,38,40],"h3",{"id":39},"updating-existing-test-cases","Updating existing test cases",[12,42,43],{},"As is often the case when developing a software product, we encountered instances that required updates to existing tests. Rather than manually making adjustments to a full test suite for a common issue, we took full advantage of the GitLab Duo Chat window in VS Code. For example, to refactor tests, we used the Chat prompt “Please update the provided tests to use unittest rather than pytest” followed by pasting in the tests we wanted GitLab Duo to update.",[12,45,46],{},[47,48],"img",{"alt":49,"src":50},"Automated test generation","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099252/Blog/Content%20Images/Blog/Content%20Images/image5_aHR0cHM6_1750099252303.png",[12,52,53,56],{},[54,55],"br",{},[54,57],{},[12,59,60],{},[47,61],{"alt":62,"src":63},"Chat prompt requesting use of unittest rather than pytest","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099252/Blog/Content%20Images/Blog/Content%20Images/image3_aHR0cHM6_1750099252304.png",[12,65,66,70],{},[67,68,69],"strong",{},"Note:"," We copy-and-pasted GitLab Duo's recommendations into our code.",[37,72,74],{"id":73},"creating-tests-for-legacy-code","Creating tests for legacy code",[12,76,77],{},"Creating tests for legacy code we knew worked was another challenging situation we encountered. In such circumstances, it was valuable to provide error snippets alongside failing tests and ask GitLab Duo to provide new tests. A full copy-and-paste from the terminal window of noted failures and errors to Chat, along with a request to “Please explain and fix this failing test” or similar prompts, yielded a summary of the issues the test was encountering as well as a new test addressing the problem. We did find this sometimes required multiple rounds of refactoring as new test failures were identified. However, the efficiency of GitLab Duo to provide various refactored solutions was fast and a net positive on team and developer efficiency.",[37,79,81],{"id":80},"working-with-complex-or-abstracted-code","Working with complex or abstracted code",[12,83,84],{},"In other instances, the modularization or complexity of our code led to variance in GitLab Duo’s results. For instance, when generating tests, GitLab Duo sometimes generated a series of passing and failing tests caused by differences in testing approach (e.g. usage of Mock and which objects were mocked). We provided GitLab Duo its own example of a passing test and asked it to modify individual tests one at a time to match the style of the passing tests to maintain consistency. We also would provide GitLab Duo a file of functioning tests for a similar object or task so it could mirror the structure.",[37,86,88],{"id":87},"ensuring-generated-code-follows-our-standards","Ensuring generated code follows our standards",[12,90,91],{},"While developing a Python module, GitLab Duo generated many tests using Mock and often they required refactoring, particularly around naming standardization. In such cases, we could leverage GitLab Duo Chat to refactor tests with instructions as to which specific test components to update. Prompting GitLab Duo for these changes was immensely faster than refactoring tests individually, as we had previousy done.",[37,93,95],{"id":94},"addressing-uncovered-test-cases","Addressing uncovered test cases",[12,97,98],{},"GitLab Duo generated tests for additional test cases the team had not previously considered, thus increasing coverage. Luckily, we could use GitLab Duo to quickly and efficiently address these edge cases and expand testing coverage, which is a key value-add for our team to build quickly and ensure a robust product.",[23,100,102],{"id":101},"what-we-learned","What we learned",[12,104,105],{},"Here are few key lessons that have been important to our success with GitLab Duo:",[107,108,109,116,122,128,134],"ul",{},[110,111,112,115],"li",{},[67,113,114],{},"Fast and efficient for rapid development and iteration -"," GitLab Duo’s role in generating automated tests has been a key accelerator in development for our team and allowed us to work faster and with greater confidence in our changes.",[110,117,118,121],{},[67,119,120],{},"Important to use appropriate prompts -"," When using GitLab Duo for our use case, we touched on a key topic for machine learning optimization: prompt engineering. Sometimes we needed to modify our question by just a few keywords to lead to the ideal generated answer.",[110,123,124,127],{},[67,125,126],{},"Need understanding of underlying frameworks and code -"," When it comes to any AI-generated code that makes it into a product, even if only as testing, it’s critical that we understand how the code functions so we can adequately debug as well as request informed changes.",[110,129,130,133],{},[67,131,132],{},"Need understanding of desired end state and standards -"," Similar to following coding standards for formatting and library usage while developing without AI, it’s important to maintain the vision of what the intended outcomes look like and what standards are being adhered to when using AI. GitLab Duo needs the context to understand code standards, so it’s critical for team members using GitLab Duo to provide adequate oversight of its outputs to ensure quality and other expectations are met.",[110,135,136,139],{},[67,137,138],{},"GitLab Duo is not a replacement for all tests -"," While we use GitLab Duo significantly for generating automated tests, it does not replace our other tests and human oversight. Functional tests, integration tests, and more still serve a valuable place in the QA process and overall software development lifecycle.",[12,141,142,143,148],{},"In our next article in this series, we’ll cover ",[16,144,147],{"href":145,"rel":146},"https://about.gitlab.com/blog/automating-with-gitlab-duo-part-3-validating-testing/",[],"a test we ran to validate the impact of GitLab Duo on our team’s automated testing"," and discuss the impressive results we have achieved thus far.",{"title":150,"searchDepth":151,"depth":151,"links":152},"",2,[153,161],{"id":25,"depth":151,"text":26,"children":154},[155,157,158,159,160],{"id":39,"depth":156,"text":40},3,{"id":73,"depth":156,"text":74},{"id":80,"depth":156,"text":81},{"id":87,"depth":156,"text":88},{"id":94,"depth":156,"text":95},{"id":101,"depth":151,"text":102},"ai","2024-12-10","Find out how the GitLab team addressed more complex testing situations using GitLab Duo's AI capabilities, including ensuring that code testing followed standards.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099243/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%284%29_3LZkiDjHLjhqEkvOvBsVKp_1750099243011.png",{},true,"/en-us/blog/automating-with-gitlab-duo-part-2-complex-testing",{"title":5,"description":164,"ogTitle":5,"ogDescription":164,"noIndex":167,"ogImage":168,"ogUrl":173,"ogSiteName":174,"ogType":175,"canonicalUrls":173},"https://about.gitlab.com/blog/automating-with-gitlab-duo-part-2-complex-testing","https://about.gitlab.com","article","automating-with-gitlab-duo-part-2-complex-testing","en-us/blog/automating-with-gitlab-duo-part-2-complex-testing",[179,180,181],"AI","testing","DevSecOps platform","BlogPost","2H31ZkkBrAMYPoXdUISlCKDcEecxROzJVl6tYM6F40g",{"logo":185,"freeTrial":190,"sales":195,"login":200,"items":205,"search":532,"minimal":563,"duo":582,"switchNav":591,"pricingDeployment":602},{"config":186},{"href":187,"dataGaName":188,"dataGaLocation":189},"/","gitlab logo","header",{"text":191,"config":192},"Get free trial",{"href":193,"dataGaName":194,"dataGaLocation":189},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":196,"config":197},"Request a demo",{"href":198,"dataGaName":199,"dataGaLocation":189},"/sales/?contact-topic=request-demo","sales",{"text":201,"config":202},"Sign in",{"href":203,"dataGaName":204,"dataGaLocation":189},"https://gitlab.com/users/sign_in/","sign in",[206,235,335,340,454,510],{"text":207,"config":208,"menu":210},"Platform",{"dataNavLevelOne":209},"platform",{"type":211,"columns":212},"cards",[213,219,227],{"title":207,"description":214,"link":215},"The intelligent orchestration platform for DevSecOps",{"text":216,"config":217},"Explore our Platform",{"href":218,"dataGaName":209,"dataGaLocation":189},"/platform/",{"title":220,"description":221,"link":222},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":223,"config":224},"Meet GitLab Duo",{"href":225,"dataGaName":226,"dataGaLocation":189},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":228,"description":229,"link":230},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":231,"config":232},"Learn more",{"href":233,"dataGaName":234,"dataGaLocation":189},"/why-gitlab/","why gitlab",{"text":236,"left":170,"config":237,"menu":239},"Product",{"dataNavLevelOne":238},"solutions",{"type":240,"link":241,"columns":245,"feature":314},"lists",{"text":242,"config":243},"View all Solutions",{"href":244,"dataGaName":238,"dataGaLocation":189},"/solutions/",[246,270,293],{"title":247,"description":248,"link":249,"items":254},"Automation","CI/CD and automation to accelerate deployment",{"config":250},{"icon":251,"href":252,"dataGaName":253,"dataGaLocation":189},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[255,259,262,266],{"text":256,"config":257},"CI/CD",{"href":258,"dataGaLocation":189,"dataGaName":256},"/solutions/continuous-integration/",{"text":220,"config":260},{"href":225,"dataGaLocation":189,"dataGaName":261},"gitlab duo agent platform - product menu",{"text":263,"config":264},"Source Code Management",{"href":265,"dataGaLocation":189,"dataGaName":263},"/solutions/source-code-management/",{"text":267,"config":268},"Automated Software Delivery",{"href":252,"dataGaLocation":189,"dataGaName":269},"Automated software delivery",{"title":271,"description":272,"link":273,"items":278},"Security","Deliver code faster without compromising security",{"config":274},{"href":275,"dataGaName":276,"dataGaLocation":189,"icon":277},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[279,283,288],{"text":280,"config":281},"Application Security Testing",{"href":275,"dataGaName":282,"dataGaLocation":189},"Application security testing",{"text":284,"config":285},"Software Supply Chain Security",{"href":286,"dataGaLocation":189,"dataGaName":287},"/solutions/supply-chain/","Software supply chain security",{"text":289,"config":290},"Software Compliance",{"href":291,"dataGaName":292,"dataGaLocation":189},"/solutions/software-compliance/","software compliance",{"title":294,"link":295,"items":300},"Measurement",{"config":296},{"icon":297,"href":298,"dataGaName":299,"dataGaLocation":189},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[301,305,309],{"text":302,"config":303},"Visibility & Measurement",{"href":298,"dataGaLocation":189,"dataGaName":304},"Visibility and Measurement",{"text":306,"config":307},"Value Stream Management",{"href":308,"dataGaLocation":189,"dataGaName":306},"/solutions/value-stream-management/",{"text":310,"config":311},"Analytics & Insights",{"href":312,"dataGaLocation":189,"dataGaName":313},"/solutions/analytics-and-insights/","Analytics and insights",{"title":315,"type":240,"items":316},"GitLab for",[317,323,329],{"text":318,"config":319},"Enterprise",{"icon":320,"href":321,"dataGaLocation":189,"dataGaName":322},"Building","/enterprise/","enterprise",{"text":324,"config":325},"Small Business",{"icon":326,"href":327,"dataGaLocation":189,"dataGaName":328},"Work","/small-business/","small business",{"text":330,"config":331},"Public Sector",{"icon":332,"href":333,"dataGaLocation":189,"dataGaName":334},"Organization","/solutions/public-sector/","public sector",{"text":336,"config":337},"Pricing",{"href":338,"dataGaName":339,"dataGaLocation":189,"dataNavLevelOne":339},"/pricing/","pricing",{"text":341,"config":342,"menu":344},"Resources",{"dataNavLevelOne":343},"resources",{"type":240,"link":345,"columns":349,"feature":443},{"text":346,"config":347},"View all resources",{"href":348,"dataGaName":343,"dataGaLocation":189},"/resources/",[350,383,410],{"title":351,"items":352},"Getting started",[353,358,363,368,373,378],{"text":354,"config":355},"Install",{"href":356,"dataGaName":357,"dataGaLocation":189},"/install/","install",{"text":359,"config":360},"Quick start guides",{"href":361,"dataGaName":362,"dataGaLocation":189},"/get-started/","quick setup checklists",{"text":364,"config":365},"Learn",{"href":366,"dataGaLocation":189,"dataGaName":367},"https://university.gitlab.com/","learn",{"text":369,"config":370},"Product documentation",{"href":371,"dataGaName":372,"dataGaLocation":189},"https://docs.gitlab.com/","product documentation",{"text":374,"config":375},"Best practice videos",{"href":376,"dataGaName":377,"dataGaLocation":189},"/getting-started-videos/","best practice videos",{"text":379,"config":380},"Integrations",{"href":381,"dataGaName":382,"dataGaLocation":189},"/integrations/","integrations",{"title":384,"items":385},"Discover",[386,391,396,401,405],{"text":387,"config":388},"Customer success stories",{"href":389,"dataGaName":390,"dataGaLocation":189},"/customers/","customer success stories",{"text":392,"config":393},"Blog",{"href":394,"dataGaName":395,"dataGaLocation":189},"/blog/","blog",{"text":397,"config":398},"Demo Hub",{"href":399,"dataGaName":400,"dataGaLocation":189},"/demo-hub/","demo hub",{"text":402,"config":403},"The Source",{"href":404,"dataGaName":395,"dataGaLocation":189},"/the-source/",{"text":406,"config":407},"Remote",{"href":408,"dataGaName":409,"dataGaLocation":189},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":411,"items":412},"Connect",[413,418,423,428,433,438],{"text":414,"config":415},"GitLab Services",{"href":416,"dataGaName":417,"dataGaLocation":189},"/services/","services",{"text":419,"config":420},"Contribute",{"href":421,"dataGaName":422,"dataGaLocation":189},"https://contributors.gitlab.com","contribute",{"text":424,"config":425},"Community",{"href":426,"dataGaName":427,"dataGaLocation":189},"/community/","community",{"text":429,"config":430},"Forum",{"href":431,"dataGaName":432,"dataGaLocation":189},"https://forum.gitlab.com/","forum",{"text":434,"config":435},"Events",{"href":436,"dataGaName":437,"dataGaLocation":189},"/events/","events",{"text":439,"config":440},"Partners",{"href":441,"dataGaName":442,"dataGaLocation":189},"/partners/","partners",{"config":444,"title":447,"text":448,"link":449},{"background":445,"textColor":446},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":450,"config":451},"Read the latest",{"href":452,"dataGaName":453,"dataGaLocation":189},"/whats-new/","whats new",{"text":455,"config":456,"menu":458},"Company",{"dataNavLevelOne":457},"company",{"type":240,"columns":459},[460],{"items":461},[462,467,473,475,480,485,490,495,500,505],{"text":463,"config":464},"About",{"href":465,"dataGaName":466,"dataGaLocation":189},"/company/","about",{"text":468,"config":469,"footerGa":472},"Jobs",{"href":470,"dataGaName":471,"dataGaLocation":189},"/jobs/","jobs",{"dataGaName":471},{"text":434,"config":474},{"href":436,"dataGaName":437,"dataGaLocation":189},{"text":476,"config":477},"Leadership",{"href":478,"dataGaName":479,"dataGaLocation":189},"/company/team/e-group/","leadership",{"text":481,"config":482},"Handbook",{"href":483,"dataGaName":484,"dataGaLocation":189},"https://handbook.gitlab.com/","handbook",{"text":486,"config":487},"Investor relations",{"href":488,"dataGaName":489,"dataGaLocation":189},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":491,"config":492},"Trust Center",{"href":493,"dataGaName":494,"dataGaLocation":189},"/security/","trust center",{"text":496,"config":497},"AI Transparency Center",{"href":498,"dataGaName":499,"dataGaLocation":189},"/ai-transparency-center/","ai transparency center",{"text":501,"config":502},"Newsletter",{"href":503,"dataGaName":504,"dataGaLocation":189},"/company/contact/#contact-forms","newsletter",{"text":506,"config":507},"Press",{"href":508,"dataGaName":509,"dataGaLocation":189},"/press/","press",{"text":511,"config":512,"menu":513},"Contact us",{"dataNavLevelOne":457},{"type":240,"columns":514},[515],{"items":516},[517,522,527],{"text":518,"config":519},"Talk to sales",{"href":520,"dataGaName":521,"dataGaLocation":189},"/sales/","talk to sales",{"text":523,"config":524},"Support portal",{"href":525,"dataGaName":526,"dataGaLocation":189},"https://support.gitlab.com/hc/en-us","support portal",{"text":528,"config":529},"Customer portal",{"href":530,"dataGaName":531,"dataGaLocation":189},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":533,"login":534,"suggestions":541},"Close",{"text":535,"link":536},"To search repositories and projects, login to",{"text":537,"config":538},"gitlab.com",{"href":203,"dataGaName":539,"dataGaLocation":540},"search login","search",{"text":542,"default":543},"Suggestions",[544,546,550,552,556,560],{"text":220,"config":545},{"href":225,"dataGaName":220,"dataGaLocation":540},{"text":547,"config":548},"Code Suggestions (AI)",{"href":549,"dataGaName":547,"dataGaLocation":540},"/solutions/code-suggestions/",{"text":256,"config":551},{"href":258,"dataGaName":256,"dataGaLocation":540},{"text":553,"config":554},"GitLab on AWS",{"href":555,"dataGaName":553,"dataGaLocation":540},"/partners/technology-partners/aws/",{"text":557,"config":558},"GitLab on Google Cloud",{"href":559,"dataGaName":557,"dataGaLocation":540},"/partners/technology-partners/google-cloud-platform/",{"text":561,"config":562},"Why GitLab?",{"href":233,"dataGaName":561,"dataGaLocation":540},{"freeTrial":564,"mobileIcon":569,"desktopIcon":574,"secondaryButton":577},{"text":565,"config":566},"Start free trial",{"href":567,"dataGaName":194,"dataGaLocation":568},"https://gitlab.com/-/trials/new/","nav",{"altText":570,"config":571},"Gitlab Icon",{"src":572,"dataGaName":573,"dataGaLocation":568},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":570,"config":575},{"src":576,"dataGaName":573,"dataGaLocation":568},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":578,"config":579},"Get Started",{"href":580,"dataGaName":581,"dataGaLocation":568},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":583,"mobileIcon":587,"desktopIcon":589},{"text":584,"config":585},"Learn more about GitLab Duo",{"href":225,"dataGaName":586,"dataGaLocation":568},"gitlab duo",{"altText":570,"config":588},{"src":572,"dataGaName":573,"dataGaLocation":568},{"altText":570,"config":590},{"src":576,"dataGaName":573,"dataGaLocation":568},{"button":592,"mobileIcon":597,"desktopIcon":599},{"text":593,"config":594},"/switch",{"href":595,"dataGaName":596,"dataGaLocation":568},"#contact","switch",{"altText":570,"config":598},{"src":572,"dataGaName":573,"dataGaLocation":568},{"altText":570,"config":600},{"src":601,"dataGaName":573,"dataGaLocation":568},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":603,"mobileIcon":608,"desktopIcon":610},{"text":604,"config":605},"Back to pricing",{"href":338,"dataGaName":606,"dataGaLocation":568,"icon":607},"back to pricing","GoBack",{"altText":570,"config":609},{"src":572,"dataGaName":573,"dataGaLocation":568},{"altText":570,"config":611},{"src":576,"dataGaName":573,"dataGaLocation":568},{"title":613,"titleMobile":614,"button":615,"config":620},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":231,"config":616},{"href":617,"dataGaName":618,"dataGaLocation":619},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":621,"disabled":167},"release",{"data":623},{"text":624,"source":625,"edit":631,"contribute":636,"config":641,"items":646,"minimal":855},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":626,"config":627},"View page source",{"href":628,"dataGaName":629,"dataGaLocation":630},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":632,"config":633},"Edit this page",{"href":634,"dataGaName":635,"dataGaLocation":630},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":637,"config":638},"Please contribute",{"href":639,"dataGaName":640,"dataGaLocation":630},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":642,"facebook":643,"youtube":644,"linkedin":645},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[647,694,747,791,823],{"title":336,"links":648,"subMenu":663},[649,653,658],{"text":650,"config":651},"View plans",{"href":338,"dataGaName":652,"dataGaLocation":630},"view plans",{"text":654,"config":655},"Why Premium?",{"href":656,"dataGaName":657,"dataGaLocation":630},"/pricing/premium/","why premium",{"text":659,"config":660},"Why Ultimate?",{"href":661,"dataGaName":662,"dataGaLocation":630},"/pricing/ultimate/","why ultimate",[664],{"title":665,"links":666},"Contact Us",[667,670,672,674,679,684,689],{"text":668,"config":669},"Contact sales",{"href":520,"dataGaName":199,"dataGaLocation":630},{"text":523,"config":671},{"href":525,"dataGaName":526,"dataGaLocation":630},{"text":528,"config":673},{"href":530,"dataGaName":531,"dataGaLocation":630},{"text":675,"config":676},"Status",{"href":677,"dataGaName":678,"dataGaLocation":630},"https://status.gitlab.com/","status",{"text":680,"config":681},"Terms of use",{"href":682,"dataGaName":683,"dataGaLocation":630},"/terms/","terms of use",{"text":685,"config":686},"Privacy statement",{"href":687,"dataGaName":688,"dataGaLocation":630},"/privacy/","privacy statement",{"text":690,"config":691},"Cookie preferences",{"dataGaName":692,"dataGaLocation":630,"id":693,"isOneTrustButton":170},"cookie preferences","ot-sdk-btn",{"title":236,"links":695,"subMenu":703},[696,699],{"text":181,"config":697},{"href":218,"dataGaName":698,"dataGaLocation":630},"devsecops platform",{"text":700,"config":701},"AI-Assisted Development",{"href":225,"dataGaName":702,"dataGaLocation":630},"ai-assisted development",[704],{"title":705,"links":706},"Topics",[707,712,717,722,727,732,737,742],{"text":708,"config":709},"CICD",{"href":710,"dataGaName":711,"dataGaLocation":630},"/topics/ci-cd/","cicd",{"text":713,"config":714},"GitOps",{"href":715,"dataGaName":716,"dataGaLocation":630},"/topics/gitops/","gitops",{"text":718,"config":719},"DevOps",{"href":720,"dataGaName":721,"dataGaLocation":630},"/topics/devops/","devops",{"text":723,"config":724},"Version Control",{"href":725,"dataGaName":726,"dataGaLocation":630},"/topics/version-control/","version control",{"text":728,"config":729},"DevSecOps",{"href":730,"dataGaName":731,"dataGaLocation":630},"/topics/devsecops/","devsecops",{"text":733,"config":734},"Cloud Native",{"href":735,"dataGaName":736,"dataGaLocation":630},"/topics/cloud-native/","cloud native",{"text":738,"config":739},"AI for Coding",{"href":740,"dataGaName":741,"dataGaLocation":630},"/topics/devops/ai-for-coding/","ai for coding",{"text":743,"config":744},"Agentic AI",{"href":745,"dataGaName":746,"dataGaLocation":630},"/topics/agentic-ai/","agentic ai",{"title":748,"links":749},"Solutions",[750,752,754,759,763,766,770,773,775,778,781,786],{"text":280,"config":751},{"href":275,"dataGaName":280,"dataGaLocation":630},{"text":269,"config":753},{"href":252,"dataGaName":253,"dataGaLocation":630},{"text":755,"config":756},"Agile development",{"href":757,"dataGaName":758,"dataGaLocation":630},"/solutions/agile-delivery/","agile delivery",{"text":760,"config":761},"SCM",{"href":265,"dataGaName":762,"dataGaLocation":630},"source code management",{"text":708,"config":764},{"href":258,"dataGaName":765,"dataGaLocation":630},"continuous integration & delivery",{"text":767,"config":768},"Value stream management",{"href":308,"dataGaName":769,"dataGaLocation":630},"value stream management",{"text":713,"config":771},{"href":772,"dataGaName":716,"dataGaLocation":630},"/solutions/gitops/",{"text":318,"config":774},{"href":321,"dataGaName":322,"dataGaLocation":630},{"text":776,"config":777},"Small business",{"href":327,"dataGaName":328,"dataGaLocation":630},{"text":779,"config":780},"Public sector",{"href":333,"dataGaName":334,"dataGaLocation":630},{"text":782,"config":783},"Education",{"href":784,"dataGaName":785,"dataGaLocation":630},"/solutions/education/","education",{"text":787,"config":788},"Financial services",{"href":789,"dataGaName":790,"dataGaLocation":630},"/solutions/finance/","financial services",{"title":341,"links":792},[793,795,797,799,802,804,807,809,811,813,815,817,819,821],{"text":354,"config":794},{"href":356,"dataGaName":357,"dataGaLocation":630},{"text":359,"config":796},{"href":361,"dataGaName":362,"dataGaLocation":630},{"text":364,"config":798},{"href":366,"dataGaName":367,"dataGaLocation":630},{"text":369,"config":800},{"href":371,"dataGaName":801,"dataGaLocation":630},"docs",{"text":392,"config":803},{"href":394,"dataGaName":395,"dataGaLocation":630},{"text":805,"config":806},"What's new",{"href":452,"dataGaName":453,"dataGaLocation":630},{"text":387,"config":808},{"href":389,"dataGaName":390,"dataGaLocation":630},{"text":406,"config":810},{"href":408,"dataGaName":409,"dataGaLocation":630},{"text":414,"config":812},{"href":416,"dataGaName":417,"dataGaLocation":630},{"text":419,"config":814},{"href":421,"dataGaName":422,"dataGaLocation":630},{"text":424,"config":816},{"href":426,"dataGaName":427,"dataGaLocation":630},{"text":429,"config":818},{"href":431,"dataGaName":432,"dataGaLocation":630},{"text":434,"config":820},{"href":436,"dataGaName":437,"dataGaLocation":630},{"text":439,"config":822},{"href":441,"dataGaName":442,"dataGaLocation":630},{"title":455,"links":824},[825,827,829,831,833,835,839,844,846,848,850],{"text":463,"config":826},{"href":465,"dataGaName":457,"dataGaLocation":630},{"text":468,"config":828},{"href":470,"dataGaName":471,"dataGaLocation":630},{"text":476,"config":830},{"href":478,"dataGaName":479,"dataGaLocation":630},{"text":481,"config":832},{"href":483,"dataGaName":484,"dataGaLocation":630},{"text":486,"config":834},{"href":488,"dataGaName":489,"dataGaLocation":630},{"text":836,"config":837},"Sustainability",{"href":838,"dataGaName":836,"dataGaLocation":630},"/sustainability/",{"text":840,"config":841},"Diversity, inclusion and belonging (DIB)",{"href":842,"dataGaName":843,"dataGaLocation":630},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":491,"config":845},{"href":493,"dataGaName":494,"dataGaLocation":630},{"text":501,"config":847},{"href":503,"dataGaName":504,"dataGaLocation":630},{"text":506,"config":849},{"href":508,"dataGaName":509,"dataGaLocation":630},{"text":851,"config":852},"Modern Slavery Transparency Statement",{"href":853,"dataGaName":854,"dataGaLocation":630},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":856},[857,860,863],{"text":858,"config":859},"Terms",{"href":682,"dataGaName":683,"dataGaLocation":630},{"text":861,"config":862},"Cookies",{"dataGaName":692,"dataGaLocation":630,"id":693,"isOneTrustButton":170},{"text":864,"config":865},"Privacy",{"href":687,"dataGaName":688,"dataGaLocation":630},[867],{"id":868,"title":7,"body":166,"config":869,"content":871,"description":166,"extension":875,"meta":876,"navigation":170,"path":877,"seo":878,"stem":879,"__hash__":880},"blogAuthors/en-us/blog/authors/byron-boots.yml",{"template":870},"BlogAuthor",{"name":7,"config":872},{"headshot":873,"ctfId":874},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662281/Blog/Author%20Headshots/byron_boots_headshot.png","7ezFbRYF2Cu5JTBQXRp7mw","yml",{},"/en-us/blog/authors/byron-boots",{},"en-us/blog/authors/byron-boots","Qu4h1SMW7Bb32A8HZlFYMusWH2fvwt-ZKOKFRiZfm5s",[882,890,898],{"title":883,"description":884,"heroImage":885,"category":162,"date":886,"authors":887,"slug":889,"externalUrl":166},"How I built a demo generator with GitLab Duo Agent Platform","Demos haven't always looked like this. Looking back over my career, here's how they have evolved. Follow the tutorial to build your own demo and agent.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-08-13",[888],"Itzik Gan Baruch","agentic-click-through-demo",{"title":891,"description":892,"heroImage":893,"category":162,"date":894,"authors":895,"slug":897,"externalUrl":166},"How to govern agentic AI, MCPs, and AI code assistants","AI agents can write, push, and deploy without human review at each step. Learn a practical framework for controlling access, permissions, and audit trails.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785337625/ifzlc2hyzaxhzmjgyymh.png","2026-07-31",[896],"Julie Griffin","govern-agentic-ai-mcps-code-assistants",{"title":899,"description":900,"heroImage":901,"category":162,"date":902,"authors":903,"slug":905,"externalUrl":166},"Claude Opus 5 on GitLab: Reasoning built for the hard tasks","Anthropic’s Claude Opus 5 is now available on GitLab Duo Agent Platform, delivering deeper reasoning without sacrificing speed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","2026-07-27",[904],"Brittany Lutz","claude-opus-5-on-gitlab-duo-agent-platform",{"promotions":907},[908,921,933,945],{"id":909,"categories":910,"header":911,"text":912,"button":913,"image":918},"ai-modernization",[162],"Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":914,"config":915},"Get your AI maturity score",{"href":916,"dataGaName":917,"dataGaLocation":395},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":919},{"src":920},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":922,"categories":923,"header":925,"text":912,"button":926,"image":930},"devops-modernization",[924,731],"product","Are you just managing tools or shipping innovation?",{"text":927,"config":928},"Get your DevOps maturity score",{"href":929,"dataGaName":917,"dataGaLocation":395},"/assessments/devops-modernization-assessment/",{"config":931},{"src":932},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":934,"categories":935,"header":937,"text":912,"button":938,"image":942},"security-modernization",[936],"security","Are you trading speed for security?",{"text":939,"config":940},"Get your security maturity score",{"href":941,"dataGaName":917,"dataGaLocation":395},"/assessments/security-modernization-assessment/",{"config":943},{"src":944},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":946,"paths":947,"header":950,"text":951,"button":952,"image":957},"github-azure-migration",[948,949],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":953,"config":954},"See how GitLab compares to GitHub",{"href":955,"dataGaName":956,"dataGaLocation":395},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":958},{"src":932},{"header":960,"blurb":961,"button":962,"secondaryButton":967},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":963,"config":964},"Get your free trial",{"href":965,"dataGaName":194,"dataGaLocation":966},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":668,"config":968},{"href":520,"dataGaName":199,"dataGaLocation":966},1786803747166]