[{"data":1,"prerenderedAt":1084},["ShallowReactive",2],{"/en-us/blog/categories/ai":3,"navigation-en-us":21,"banner-en-us":442,"footer-en-us":451,"ai-category-page-total-items-en-us":693,"ai-category-page-featured-en-us":694,"ai-category-page-8-en-us":1023},{"id":4,"title":5,"body":6,"category":6,"config":7,"content":11,"description":6,"extension":13,"meta":14,"navigation":15,"path":16,"seo":17,"slug":6,"stem":19,"testContent":6,"type":6,"__hash__":20},"blogCategories/en-us/blog/categories/ai.yml","Ai",null,{"template":8,"slug":9,"hide":10},"BlogCategory","ai",false,{"name":12},"AI","yml",{},true,"/en-us/blog/categories/ai",{"title":12,"description":18},"Browse articles related to AI on the GitLab Blog","en-us/blog/categories/ai","_mFb27wDITdukqW8E71tDTq_ZG9tW2x2RtwML1HudjI",{"logo":22,"freeTrial":27,"sales":32,"login":37,"items":42,"search":362,"minimal":393,"duo":412,"switchNav":421,"pricingDeployment":432},{"config":23},{"href":24,"dataGaName":25,"dataGaLocation":26},"/","gitlab logo","header",{"text":28,"config":29},"Get free trial",{"href":30,"dataGaName":31,"dataGaLocation":26},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":33,"config":34},"Talk to sales",{"href":35,"dataGaName":36,"dataGaLocation":26},"/sales/","sales",{"text":38,"config":39},"Sign in",{"href":40,"dataGaName":41,"dataGaLocation":26},"https://gitlab.com/users/sign_in/","sign in",[43,72,172,177,281,342],{"text":44,"config":45,"menu":47},"Platform",{"dataNavLevelOne":46},"platform",{"type":48,"columns":49},"cards",[50,56,64],{"title":44,"description":51,"link":52},"The intelligent orchestration platform for DevSecOps",{"text":53,"config":54},"Explore our Platform",{"href":55,"dataGaName":46,"dataGaLocation":26},"/platform/",{"title":57,"description":58,"link":59},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":60,"config":61},"Meet GitLab Duo",{"href":62,"dataGaName":63,"dataGaLocation":26},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":65,"description":66,"link":67},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":68,"config":69},"Learn more",{"href":70,"dataGaName":71,"dataGaLocation":26},"/why-gitlab/","why gitlab",{"text":73,"left":15,"config":74,"menu":76},"Product",{"dataNavLevelOne":75},"solutions",{"type":77,"link":78,"columns":82,"feature":151},"lists",{"text":79,"config":80},"View all Solutions",{"href":81,"dataGaName":75,"dataGaLocation":26},"/solutions/",[83,107,130],{"title":84,"description":85,"link":86,"items":91},"Automation","CI/CD and automation to accelerate deployment",{"config":87},{"icon":88,"href":89,"dataGaName":90,"dataGaLocation":26},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[92,96,99,103],{"text":93,"config":94},"CI/CD",{"href":95,"dataGaLocation":26,"dataGaName":93},"/solutions/continuous-integration/",{"text":57,"config":97},{"href":62,"dataGaLocation":26,"dataGaName":98},"gitlab duo agent platform - product menu",{"text":100,"config":101},"Source Code Management",{"href":102,"dataGaLocation":26,"dataGaName":100},"/solutions/source-code-management/",{"text":104,"config":105},"Automated Software Delivery",{"href":89,"dataGaLocation":26,"dataGaName":106},"Automated software delivery",{"title":108,"description":109,"link":110,"items":115},"Security","Deliver code faster without compromising security",{"config":111},{"href":112,"dataGaName":113,"dataGaLocation":26,"icon":114},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[116,120,125],{"text":117,"config":118},"Application Security Testing",{"href":112,"dataGaName":119,"dataGaLocation":26},"Application security testing",{"text":121,"config":122},"Software Supply Chain Security",{"href":123,"dataGaLocation":26,"dataGaName":124},"/solutions/supply-chain/","Software supply chain security",{"text":126,"config":127},"Software Compliance",{"href":128,"dataGaName":129,"dataGaLocation":26},"/solutions/software-compliance/","software compliance",{"title":131,"link":132,"items":137},"Measurement",{"config":133},{"icon":134,"href":135,"dataGaName":136,"dataGaLocation":26},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[138,142,146],{"text":139,"config":140},"Visibility & Measurement",{"href":135,"dataGaLocation":26,"dataGaName":141},"Visibility and Measurement",{"text":143,"config":144},"Value Stream Management",{"href":145,"dataGaLocation":26,"dataGaName":143},"/solutions/value-stream-management/",{"text":147,"config":148},"Analytics & Insights",{"href":149,"dataGaLocation":26,"dataGaName":150},"/solutions/analytics-and-insights/","Analytics and insights",{"title":152,"type":77,"items":153},"GitLab for",[154,160,166],{"text":155,"config":156},"Enterprise",{"icon":157,"href":158,"dataGaLocation":26,"dataGaName":159},"Building","/enterprise/","enterprise",{"text":161,"config":162},"Small Business",{"icon":163,"href":164,"dataGaLocation":26,"dataGaName":165},"Work","/small-business/","small business",{"text":167,"config":168},"Public Sector",{"icon":169,"href":170,"dataGaLocation":26,"dataGaName":171},"Organization","/solutions/public-sector/","public sector",{"text":173,"config":174},"Pricing",{"href":175,"dataGaName":176,"dataGaLocation":26,"dataNavLevelOne":176},"/pricing/","pricing",{"text":178,"config":179,"menu":181},"Resources",{"dataNavLevelOne":180},"resources",{"type":77,"link":182,"columns":186,"feature":270},{"text":183,"config":184},"View all resources",{"href":185,"dataGaName":180,"dataGaLocation":26},"/resources/",[187,220,242],{"title":188,"items":189},"Getting started",[190,195,200,205,210,215],{"text":191,"config":192},"Install",{"href":193,"dataGaName":194,"dataGaLocation":26},"/install/","install",{"text":196,"config":197},"Quick start guides",{"href":198,"dataGaName":199,"dataGaLocation":26},"/get-started/","quick setup checklists",{"text":201,"config":202},"Learn",{"href":203,"dataGaLocation":26,"dataGaName":204},"https://university.gitlab.com/","learn",{"text":206,"config":207},"Product documentation",{"href":208,"dataGaName":209,"dataGaLocation":26},"https://docs.gitlab.com/","product documentation",{"text":211,"config":212},"Best practice videos",{"href":213,"dataGaName":214,"dataGaLocation":26},"/getting-started-videos/","best practice videos",{"text":216,"config":217},"Integrations",{"href":218,"dataGaName":219,"dataGaLocation":26},"/integrations/","integrations",{"title":221,"items":222},"Discover",[223,228,233,237],{"text":224,"config":225},"Customer success stories",{"href":226,"dataGaName":227,"dataGaLocation":26},"/customers/","customer success stories",{"text":229,"config":230},"Blog",{"href":231,"dataGaName":232,"dataGaLocation":26},"/blog/","blog",{"text":234,"config":235},"The Source",{"href":236,"dataGaName":232,"dataGaLocation":26},"/the-source/",{"text":238,"config":239},"Remote",{"href":240,"dataGaName":241,"dataGaLocation":26},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":243,"items":244},"Connect",[245,250,255,260,265],{"text":246,"config":247},"GitLab Services",{"href":248,"dataGaName":249,"dataGaLocation":26},"/services/","services",{"text":251,"config":252},"Community",{"href":253,"dataGaName":254,"dataGaLocation":26},"/community/","community",{"text":256,"config":257},"Forum",{"href":258,"dataGaName":259,"dataGaLocation":26},"https://forum.gitlab.com/","forum",{"text":261,"config":262},"Events",{"href":263,"dataGaName":264,"dataGaLocation":26},"/events/","events",{"text":266,"config":267},"Partners",{"href":268,"dataGaName":269,"dataGaLocation":26},"/partners/","partners",{"config":271,"title":274,"text":275,"link":276},{"background":272,"textColor":273},"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":277,"config":278},"Read the latest",{"href":279,"dataGaName":280,"dataGaLocation":26},"/whats-new/","whats new",{"text":282,"config":283,"menu":285},"Company",{"dataNavLevelOne":284},"company",{"type":77,"columns":286},[287],{"items":288},[289,294,300,302,307,312,317,322,327,332,337],{"text":290,"config":291},"About",{"href":292,"dataGaName":293,"dataGaLocation":26},"/company/","about",{"text":295,"config":296,"footerGa":299},"Jobs",{"href":297,"dataGaName":298,"dataGaLocation":26},"/jobs/","jobs",{"dataGaName":298},{"text":261,"config":301},{"href":263,"dataGaName":264,"dataGaLocation":26},{"text":303,"config":304},"Leadership",{"href":305,"dataGaName":306,"dataGaLocation":26},"/company/team/e-group/","leadership",{"text":308,"config":309},"Team",{"href":310,"dataGaName":311,"dataGaLocation":26},"/company/team/","team",{"text":313,"config":314},"Handbook",{"href":315,"dataGaName":316,"dataGaLocation":26},"https://handbook.gitlab.com/","handbook",{"text":318,"config":319},"Investor relations",{"href":320,"dataGaName":321,"dataGaLocation":26},"https://ir.gitlab.com/","investor relations",{"text":323,"config":324},"Trust Center",{"href":325,"dataGaName":326,"dataGaLocation":26},"/security/","trust center",{"text":328,"config":329},"AI Transparency Center",{"href":330,"dataGaName":331,"dataGaLocation":26},"/ai-transparency-center/","ai transparency center",{"text":333,"config":334},"Newsletter",{"href":335,"dataGaName":336,"dataGaLocation":26},"/company/contact/#contact-forms","newsletter",{"text":338,"config":339},"Press",{"href":340,"dataGaName":341,"dataGaLocation":26},"/press/","press",{"text":343,"config":344,"menu":345},"Contact us",{"dataNavLevelOne":284},{"type":77,"columns":346},[347],{"items":348},[349,352,357],{"text":33,"config":350},{"href":35,"dataGaName":351,"dataGaLocation":26},"talk to sales",{"text":353,"config":354},"Support portal",{"href":355,"dataGaName":356,"dataGaLocation":26},"https://support.gitlab.com","support portal",{"text":358,"config":359},"Customer portal",{"href":360,"dataGaName":361,"dataGaLocation":26},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":363,"login":364,"suggestions":371},"Close",{"text":365,"link":366},"To search repositories and projects, login to",{"text":367,"config":368},"gitlab.com",{"href":40,"dataGaName":369,"dataGaLocation":370},"search login","search",{"text":372,"default":373},"Suggestions",[374,376,380,382,386,390],{"text":57,"config":375},{"href":62,"dataGaName":57,"dataGaLocation":370},{"text":377,"config":378},"Code Suggestions (AI)",{"href":379,"dataGaName":377,"dataGaLocation":370},"/solutions/code-suggestions/",{"text":93,"config":381},{"href":95,"dataGaName":93,"dataGaLocation":370},{"text":383,"config":384},"GitLab on AWS",{"href":385,"dataGaName":383,"dataGaLocation":370},"/partners/technology-partners/aws/",{"text":387,"config":388},"GitLab on Google Cloud",{"href":389,"dataGaName":387,"dataGaLocation":370},"/partners/technology-partners/google-cloud-platform/",{"text":391,"config":392},"Why GitLab?",{"href":70,"dataGaName":391,"dataGaLocation":370},{"freeTrial":394,"mobileIcon":399,"desktopIcon":404,"secondaryButton":407},{"text":395,"config":396},"Start free trial",{"href":397,"dataGaName":31,"dataGaLocation":398},"https://gitlab.com/-/trials/new/","nav",{"altText":400,"config":401},"Gitlab Icon",{"src":402,"dataGaName":403,"dataGaLocation":398},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":400,"config":405},{"src":406,"dataGaName":403,"dataGaLocation":398},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":408,"config":409},"Get Started",{"href":410,"dataGaName":411,"dataGaLocation":398},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":413,"mobileIcon":417,"desktopIcon":419},{"text":414,"config":415},"Learn more about GitLab Duo",{"href":62,"dataGaName":416,"dataGaLocation":398},"gitlab duo",{"altText":400,"config":418},{"src":402,"dataGaName":403,"dataGaLocation":398},{"altText":400,"config":420},{"src":406,"dataGaName":403,"dataGaLocation":398},{"button":422,"mobileIcon":427,"desktopIcon":429},{"text":423,"config":424},"/switch",{"href":425,"dataGaName":426,"dataGaLocation":398},"#contact","switch",{"altText":400,"config":428},{"src":402,"dataGaName":403,"dataGaLocation":398},{"altText":400,"config":430},{"src":431,"dataGaName":403,"dataGaLocation":398},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":433,"mobileIcon":438,"desktopIcon":440},{"text":434,"config":435},"Back to pricing",{"href":175,"dataGaName":436,"dataGaLocation":398,"icon":437},"back to pricing","GoBack",{"altText":400,"config":439},{"src":402,"dataGaName":403,"dataGaLocation":398},{"altText":400,"config":441},{"src":406,"dataGaName":403,"dataGaLocation":398},{"title":443,"button":444,"config":449},"See how agentic AI transforms software delivery",{"text":445,"config":446},"Sign up for GitLab Transcend on June 10",{"href":447,"dataGaName":448,"dataGaLocation":26},"/events/transcend/virtual/","transcend event",{"layout":450,"disabled":10},"release",{"data":452},{"text":453,"source":454,"edit":460,"contribute":465,"config":470,"items":475,"minimal":682},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":455,"config":456},"View page source",{"href":457,"dataGaName":458,"dataGaLocation":459},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":461,"config":462},"Edit this page",{"href":463,"dataGaName":464,"dataGaLocation":459},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":466,"config":467},"Please contribute",{"href":468,"dataGaName":469,"dataGaLocation":459},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":471,"facebook":472,"youtube":473,"linkedin":474},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[476,523,577,621,648],{"title":173,"links":477,"subMenu":492},[478,482,487],{"text":479,"config":480},"View plans",{"href":175,"dataGaName":481,"dataGaLocation":459},"view plans",{"text":483,"config":484},"Why Premium?",{"href":485,"dataGaName":486,"dataGaLocation":459},"/pricing/premium/","why premium",{"text":488,"config":489},"Why Ultimate?",{"href":490,"dataGaName":491,"dataGaLocation":459},"/pricing/ultimate/","why ultimate",[493],{"title":494,"links":495},"Contact Us",[496,499,501,503,508,513,518],{"text":497,"config":498},"Contact sales",{"href":35,"dataGaName":36,"dataGaLocation":459},{"text":353,"config":500},{"href":355,"dataGaName":356,"dataGaLocation":459},{"text":358,"config":502},{"href":360,"dataGaName":361,"dataGaLocation":459},{"text":504,"config":505},"Status",{"href":506,"dataGaName":507,"dataGaLocation":459},"https://status.gitlab.com/","status",{"text":509,"config":510},"Terms of use",{"href":511,"dataGaName":512,"dataGaLocation":459},"/terms/","terms of use",{"text":514,"config":515},"Privacy statement",{"href":516,"dataGaName":517,"dataGaLocation":459},"/privacy/","privacy statement",{"text":519,"config":520},"Cookie preferences",{"dataGaName":521,"dataGaLocation":459,"id":522,"isOneTrustButton":15},"cookie preferences","ot-sdk-btn",{"title":73,"links":524,"subMenu":533},[525,529],{"text":526,"config":527},"DevSecOps platform",{"href":55,"dataGaName":528,"dataGaLocation":459},"devsecops platform",{"text":530,"config":531},"AI-Assisted Development",{"href":62,"dataGaName":532,"dataGaLocation":459},"ai-assisted development",[534],{"title":535,"links":536},"Topics",[537,542,547,552,557,562,567,572],{"text":538,"config":539},"CICD",{"href":540,"dataGaName":541,"dataGaLocation":459},"/topics/ci-cd/","cicd",{"text":543,"config":544},"GitOps",{"href":545,"dataGaName":546,"dataGaLocation":459},"/topics/gitops/","gitops",{"text":548,"config":549},"DevOps",{"href":550,"dataGaName":551,"dataGaLocation":459},"/topics/devops/","devops",{"text":553,"config":554},"Version Control",{"href":555,"dataGaName":556,"dataGaLocation":459},"/topics/version-control/","version control",{"text":558,"config":559},"DevSecOps",{"href":560,"dataGaName":561,"dataGaLocation":459},"/topics/devsecops/","devsecops",{"text":563,"config":564},"Cloud Native",{"href":565,"dataGaName":566,"dataGaLocation":459},"/topics/cloud-native/","cloud native",{"text":568,"config":569},"AI for Coding",{"href":570,"dataGaName":571,"dataGaLocation":459},"/topics/devops/ai-for-coding/","ai for coding",{"text":573,"config":574},"Agentic AI",{"href":575,"dataGaName":576,"dataGaLocation":459},"/topics/agentic-ai/","agentic ai",{"title":578,"links":579},"Solutions",[580,582,584,589,593,596,600,603,605,608,611,616],{"text":117,"config":581},{"href":112,"dataGaName":117,"dataGaLocation":459},{"text":106,"config":583},{"href":89,"dataGaName":90,"dataGaLocation":459},{"text":585,"config":586},"Agile development",{"href":587,"dataGaName":588,"dataGaLocation":459},"/solutions/agile-delivery/","agile delivery",{"text":590,"config":591},"SCM",{"href":102,"dataGaName":592,"dataGaLocation":459},"source code management",{"text":538,"config":594},{"href":95,"dataGaName":595,"dataGaLocation":459},"continuous integration & delivery",{"text":597,"config":598},"Value stream management",{"href":145,"dataGaName":599,"dataGaLocation":459},"value stream management",{"text":543,"config":601},{"href":602,"dataGaName":546,"dataGaLocation":459},"/solutions/gitops/",{"text":155,"config":604},{"href":158,"dataGaName":159,"dataGaLocation":459},{"text":606,"config":607},"Small business",{"href":164,"dataGaName":165,"dataGaLocation":459},{"text":609,"config":610},"Public sector",{"href":170,"dataGaName":171,"dataGaLocation":459},{"text":612,"config":613},"Education",{"href":614,"dataGaName":615,"dataGaLocation":459},"/solutions/education/","education",{"text":617,"config":618},"Financial services",{"href":619,"dataGaName":620,"dataGaLocation":459},"/solutions/finance/","financial services",{"title":178,"links":622},[623,625,627,629,632,634,636,638,640,642,644,646],{"text":191,"config":624},{"href":193,"dataGaName":194,"dataGaLocation":459},{"text":196,"config":626},{"href":198,"dataGaName":199,"dataGaLocation":459},{"text":201,"config":628},{"href":203,"dataGaName":204,"dataGaLocation":459},{"text":206,"config":630},{"href":208,"dataGaName":631,"dataGaLocation":459},"docs",{"text":229,"config":633},{"href":231,"dataGaName":232,"dataGaLocation":459},{"text":224,"config":635},{"href":226,"dataGaName":227,"dataGaLocation":459},{"text":238,"config":637},{"href":240,"dataGaName":241,"dataGaLocation":459},{"text":246,"config":639},{"href":248,"dataGaName":249,"dataGaLocation":459},{"text":251,"config":641},{"href":253,"dataGaName":254,"dataGaLocation":459},{"text":256,"config":643},{"href":258,"dataGaName":259,"dataGaLocation":459},{"text":261,"config":645},{"href":263,"dataGaName":264,"dataGaLocation":459},{"text":266,"config":647},{"href":268,"dataGaName":269,"dataGaLocation":459},{"title":282,"links":649},[650,652,654,656,658,660,662,666,671,673,675,677],{"text":290,"config":651},{"href":292,"dataGaName":284,"dataGaLocation":459},{"text":295,"config":653},{"href":297,"dataGaName":298,"dataGaLocation":459},{"text":303,"config":655},{"href":305,"dataGaName":306,"dataGaLocation":459},{"text":308,"config":657},{"href":310,"dataGaName":311,"dataGaLocation":459},{"text":313,"config":659},{"href":315,"dataGaName":316,"dataGaLocation":459},{"text":318,"config":661},{"href":320,"dataGaName":321,"dataGaLocation":459},{"text":663,"config":664},"Sustainability",{"href":665,"dataGaName":663,"dataGaLocation":459},"/sustainability/",{"text":667,"config":668},"Diversity, inclusion and belonging (DIB)",{"href":669,"dataGaName":670,"dataGaLocation":459},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":323,"config":672},{"href":325,"dataGaName":326,"dataGaLocation":459},{"text":333,"config":674},{"href":335,"dataGaName":336,"dataGaLocation":459},{"text":338,"config":676},{"href":340,"dataGaName":341,"dataGaLocation":459},{"text":678,"config":679},"Modern Slavery Transparency Statement",{"href":680,"dataGaName":681,"dataGaLocation":459},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":683},[684,687,690],{"text":685,"config":686},"Terms",{"href":511,"dataGaName":512,"dataGaLocation":459},{"text":688,"config":689},"Cookies",{"dataGaName":521,"dataGaLocation":459,"id":522,"isOneTrustButton":15},{"text":691,"config":692},"Privacy",{"href":516,"dataGaName":517,"dataGaLocation":459},149,{"id":695,"title":696,"authors":697,"body":699,"category":9,"date":1006,"description":1007,"extension":1008,"externalUrl":6,"featured":10,"heroImage":1009,"meta":1010,"navigation":15,"path":1011,"seo":1012,"slug":1015,"stem":1016,"tags":1017,"template":1021,"updatedDate":6,"__hash__":1022},"blogPosts/en-us/blog/automate-deployment-with-duo-agent-platform.md","Automate deployment processes using a custom agent in GitLab Duo Agent Platform",[698],"Cesar Saavedra",{"type":700,"value":701,"toc":991},"minimark",[702,706,713,716,728,731,736,739,744,764,773,776,780,791,794,797,801,808,843,854,858,872,883,903,907,919,922,931,935,948,962,966,969,972,976,979],[703,704,705],"p",{},"Every engineering organization has those tasks: complex, repetitive, and time-consuming, but absolutely critical to get right. Onboarding a new microservice into an established GitOps deployment workflow is a perfect example. It involves generating bespoke manifests, updating delivery pipelines, configuring image automation, and making sure every piece references the right namespaces, ports, and hostnames. If you miss a step, the deployment breaks. Do it manually and you can lose hours, sometimes a whole day, to a setup that follows the same pattern every time.",[703,707,708,709,712],{},"This is an example of the kind of work AI agents were built for. With ",[710,711,57],"a",{"href":62},", you can create a custom agent that understands your specific application, your specific GitOps workflow, and your specific conventions, and then performs that complex onboarding for you. Better still, the agent itself, along with all the artifacts it generates, is versioned, managed, and governed by GitLab, so you get the speed of automation without giving up enterprise control.",[703,714,715],{},"In this tutorial, you'll learn how to build one of these custom agents from scratch, from generating the system prompt to seeing the new microservice running on a Kubernetes cluster. You can follow along with the content below.",[717,718,721,722],"figure",{"className":719},[720],"video_container","\n  ",[723,724],"iframe",{"src":725,"frameBorder":726,"allowFullScreen":727},"https://www.youtube.com/embed/PpfT40mqr4A?si=CcgUwQr090FYCT3-","0","true",[729,730],"br",{},[732,733,735],"h2",{"id":734},"use-case-onboarding-a-microservice-for-tanukibank","Use case: Onboarding a microservice for TanukiBank",[703,737,738],{},"To make this concrete, we'll work with a fictitious bank called TanukiBank. The bank's web application offers checking accounts, savings accounts, home loans, mortgage and auto loan calculators, and a Pay & Transfer page. The Pay & Transfer page has a Quick Transfer panel, with a goal to allow users to transfer money from one account to another. This panel currently is not implemented so nothing happens when clicking the Transfer button because its underlying microservice doesn't exist yet. Our job is to build that microservice and onboard it into TanukiBank's existing GitOps workflow using a custom agent.",[740,741,743],"h3",{"id":742},"the-application-and-the-gitops-process","The application and the GitOps process",[703,745,746,751,752,755,756,759,760,763],{},[710,747,750],{"href":748,"rel":749},"https://gitlab.com/gitlab-da/projects/tanukibank",[],"TanukiBank's code lives in a GitLab group"," with a ",[753,754,249],"code",{}," subgroup that holds each microservice (home mortgage calculator, auto loan calculator, and so on), plus two top-level projects, ",[753,757,758],{},"Tanuki Bank - Delivery"," and ",[753,761,762],{},"Flux Config",", that handle the deployment to a Kubernetes cluster.",[703,765,766,767,769,770,772],{},"The GitOps workflow itself works like this: Every microservice has a pipeline that builds a container image and pushes it to its built-in container registry. The Flux Image Automation Controller, running on the Kubernetes cluster, watches those registries for changes and, when it detects one, updates the corresponding manifest in the ",[753,768,758],{}," project. That triggers a delivery pipeline which builds and signs a new container image and stores it in the delivery project's registry. Finally, the Flux CD Controller keeps the running pods in the Kubernetes cluster in sync with the delivery project’s container registry across each environment. All Flux manifests live in the ",[753,771,762],{}," project.",[703,774,775],{},"This is a clean workflow, but onboarding any new microservice means touching all of those moving parts in exactly the right way. So, creating a custom agent to do the onboarding for us would make our lives much easier!",[740,777,779],{"id":778},"generating-the-system-prompt","Generating the system prompt",[703,781,782,783,790],{},"A custom agent is only as good as its system prompt, so rather than writing one from scratch, we let GitLab Duo do the heavy lifting. From the ",[710,784,786,789],{"href":748,"rel":785},[],[753,787,788],{},"tanukibank"," group",", we open GitLab Agentic Chat and ask it to study the group, its subgroups, and their contents, and then draft a system prompt for an agent that can onboard new microservices. We are basically asking Duo to thoroughly understand and learn about the well-established GitOps workflow of this application. That way, Duo can create a system prompt that captures enough detail to automate the onboarding of a new microservice into this application’s GitOps workflow.",[703,792,793],{},"GitLab Duo ingests the files, reads the manifests and config files, examines the Dockerfiles, maps out dependencies, and then produces a thorough system prompt complete with reporting instructions, rules to follow, and recommended tools to enable. We save this output for the next step.",[703,795,796],{},"Something important to note is that the system prompt generated by GitLab Duo is specific to this application’s GitOps workflow at this moment. If, in the future, the GitOps workflow for this application were to change, then this system prompt would need to be re-generated by rerunning this step.",[740,798,800],{"id":799},"creating-the-custom-agent","Creating the custom agent",[703,802,803,804,807],{},"Next, we create a new blank project called ",[753,805,806],{},"application-agents",". This project will manage our custom agents, including who can administer them and where they can run. Follow these steps:",[809,810,811,823,834,837,840],"ol",{},[812,813,814,815,818,819,822],"li",{},"From ",[753,816,817],{},"AI > Agents",", we select the ",[753,820,821],{},"Managed"," tab.",[812,824,825,826,829,830,833],{},"Click on the ",[753,827,828],{},"New agent"," button to create a new agent named ",[753,831,832],{},"TanukiBank Microservice Onboarder",", give it a short description, and make it public.",[812,835,836],{},"We select the tools recommended by GitLab Duo.",[812,838,839],{},"Paste in the generated system prompt.",[812,841,842],{},"Create the agent.",[703,844,845,846,759,848,850,851,853],{},"Once the agent is created, we enable the agent in both projects that drive the GitOps workflow: ",[753,847,758],{},[753,849,762],{},". Opening the Agentic Chat panel in each and confirming that ",[753,852,832],{}," appears in the agent dropdown verifies the setup.",[740,855,857],{"id":856},"creating-a-new-microservice-with-the-developer-flow","Creating a new microservice with the Developer flow",[703,859,860,861,863,864,867,868,871],{},"Before testing the agent, we need an actual microservice to onboard. So, let’s create a new one. We head to the ",[753,862,249],{}," group, create a new project called ",[753,865,866],{},"intra-account-transfers",", and put the GitLab Duo Agent Platform's ",[753,869,870],{},"Developer"," foundational flow to work.",[703,873,874,875,878,879,882],{},"We open a new issue in the project and in its description, we list a series of specifications for the microservice. We then click the ",[753,876,877],{},"Generate MR with Duo"," button, which launches the Developer flow. The agent reads the spec, implements the microservice, creates a branch and a merge request, and links the MR back to the issue. After verifying the implementation works locally with a quick ",[753,880,881],{},"curl"," command, we merge the MR. The pipeline runs and pushes the new container images to the project's registry.",[703,884,885,886,889,890,892,893,895,896,899,900,902],{},"At this point, the new microservice exists, but the broader GitOps workflow has no idea about it. The ",[753,887,888],{},"manifests/dev"," directory in the ",[753,891,758],{}," project contains nothing for ",[753,894,866],{},", the delivery pipeline doesn't reference it, and the ",[753,897,898],{},"image-update-automation.yaml"," file in the ",[753,901,762],{}," project has no entries for the new microservice.",[740,904,906],{"id":905},"using-the-custom-agent","Using the custom agent",[703,908,909,910,912,913,915,916,918],{},"After enabling our ",[753,911,832],{}," in the newly created ",[753,914,866],{}," project, we go to ",[753,917,758],{},", open the Agentic Chat panel, select our custom agent from the agent dropdown, and ask it to onboard the new service, providing the service name and hostname.",[703,920,921],{},"The agent gets to work. It locates and reads the new microservice's Dockerfile to determine its port, generates the appropriate manifests, and updates the relevant pipelines. Along the way, it asks for approval before creating commits and merge requests, which we grant.",[703,923,924,925,927,928,930],{},"Then the agent opens two MRs, one in ",[753,926,758],{}," and one in ",[753,929,762],{},", and finishes with a summary of everything it did, including links to the MRs, service details, files created and modified, and recommended next steps.",[740,932,934],{"id":933},"the-results","The results",[703,936,937,938,940,941,943,944,947],{},"We review the changes in both MRs, merge the ",[753,939,762],{}," MR first to update the Flux components, then merge the ",[753,942,758],{}," MR. To verify the deployment, we create a new environment in GitLab named ",[753,945,946],{},"intra-account-transfers-dev"," connected to the Kubernetes cluster, select the appropriate namespace and Flux resource, and save.",[703,949,950,951,954,955,957,958,961],{},"The environment view shows the freshly started pods, and a ",[753,952,953],{},"kubectl"," listing in a terminal confirms three new pods are running. A final ",[753,956,881],{}," against the public hostname ",[753,959,960],{},"itransfers2.ocpgitlab.com"," returns the correct response. The microservice is live, and the onboarding that could potentially consume hours of careful manual work took minutes.",[732,963,965],{"id":964},"benefits","Benefits",[703,967,968],{},"Building a custom agent on top of the GitLab Duo Agent Platform delivers value on multiple fronts. It compresses complex, multi-project setup work into minutes, freeing engineers to focus on higher-value problems. It captures organizational knowledge and context, your specific GitOps conventions, naming patterns, and pipeline structures, into a reusable asset that any authorized team member can invoke.",[703,970,971],{},"Because the agent is defined in a managed project, its access, visibility, and scope are controlled the same way you control any other GitLab resource, which keeps platform teams comfortable. And every artifact the agent creates, every manifest, every commit, every MR, lives in GitLab, fully versioned and auditable. You get the speed of AI automation without sacrificing the governance and traceability your enterprise requires.",[732,973,975],{"id":974},"build-a-custom-agent-today","Build a custom agent today",[703,977,978],{},"Onboarding new services into a mature GitOps workflow is a good example of the kind of task that's complex enough to demand careful attention but repetitive enough to be a drain on engineering time. A custom agent built on the GitLab Duo Agent Platform changes that calculus: It understands your application and organizational context, follows your conventions, and produces consistent, reviewable changes, all while remaining versioned, governed, and secure inside GitLab.",[703,980,981,982,985,986,990],{},"You can ",[710,983,984],{"href":62},"try GitLab Duo Agent Platform"," as part of a free trial of GitLab Ultimate today! Or, if you already have access to GitLab Duo Agent Platform, learn more about it with our ",[710,987,989],{"href":988},"/blog/gitlab-duo-agent-platform-complete-getting-started-guide/","Get Started guide",".",{"title":992,"searchDepth":993,"depth":993,"links":994},"",2,[995,1004,1005],{"id":734,"depth":993,"text":735,"children":996},[997,999,1000,1001,1002,1003],{"id":742,"depth":998,"text":743},3,{"id":778,"depth":998,"text":779},{"id":799,"depth":998,"text":800},{"id":856,"depth":998,"text":857},{"id":905,"depth":998,"text":906},{"id":933,"depth":998,"text":934},{"id":964,"depth":993,"text":965},{"id":974,"depth":993,"text":975},"2026-05-07","Custom AI agents automate complex, repetitive GitOps work in minutes, while remaining versioned, governed, and secured within enterprise guardrails.","md","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773856365/gsx2c0vqlswox3ldmq88.jpg",{},"/en-us/blog/automate-deployment-with-duo-agent-platform",{"config":1013,"title":1014,"description":1007},{"noIndex":10},"Automate deployment processes with GitLab Duo Agent Platform","automate-deployment-with-duo-agent-platform","en-us/blog/automate-deployment-with-duo-agent-platform",[12,1018,1019,1020],"product","features","tutorial","BlogPost","6mX81eSF-cvZq8QXp7M9C4PMCnqEHAQrPBD7qSBUlqo",[1024,1032,1039,1044,1051,1057,1063,1070,1077],{"title":1025,"heroImage":1026,"category":9,"description":1027,"authors":1028,"slug":1031,"externalUrl":6},"How GitLab uses prompt guardrails to help protect customers","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663918/Blog/Hero%20Images/aipower.jpg","Learn what prompt guardrails are, how they help mitigate security risks, and what unique considerations GitLab has taken into account when implementing them.",[1029,1030],"David O'Regan","Roger Woo","how-gitlab-uses-prompt-guardrails-to-help-protect-customers",{"title":1033,"heroImage":1034,"category":9,"description":1035,"authors":1036,"slug":1038,"externalUrl":6},"DevSecOps + Agentic AI: Now on GitLab Self-Managed Ultimate on AWS","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659604/Blog/Hero%20Images/Screenshot_2024-11-27_at_4.55.28_PM.png","Start using AI-powered, DevSecOps-enhanced agents in your AWS GitLab Self-Managed Ultimate instance. Enjoy the benefits of GitLab Duo and Amazon Q in your organization.",[1037],"Jackie Porter","devsecops-agentic-ai-now-on-gitlab-self-managed-ultimate-on-aws",{"title":1040,"heroImage":1041,"category":9,"description":1042,"authors":6,"slug":6,"externalUrl":1043},"AI trends for 2025: Agentic AI, self-hosted models, and more","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749665039/Blog/Hero%20Images/display-the-source-article-ai-trends-coming-in-2026-image-0492-1800x945-fy25.png","Discover coming trends in AI for software development, from on-premises model deployments to proactive AI assistants.","https://about.gitlab.com/the-source/ai/ai-trends-for-2025-agentic-ai-self-hosted-models-and-more/",{"title":1045,"heroImage":1046,"category":9,"description":1047,"authors":1048,"slug":1050,"externalUrl":6},"Automating with GitLab Duo, Part 3: Validating testing","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097447/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%284%29_3LZkiDjHLjhqEkvOvBsVKp_1750097447404.png","Discover what test we ran to validate the impact of GitLab Duo on our team’s automated testing – and the results we achieved.",[1049],"Byron Boots","automating-with-gitlab-duo-part-3-validating-testing",{"title":1052,"heroImage":1053,"category":9,"description":1054,"authors":1055,"slug":1056,"externalUrl":6},"Modernizing a simple C++ application to Java with GitLab Duo","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659507/Blog/Hero%20Images/AdobeStock_623844718.jpg","Learn how to refactor code from memory unsafe languages to memory safe languages with the help of GitLab's AI capabilities, saving time and effort on application modernization.",[698],"modernizing-a-simple-c-application-to-java-with-gitlab-duo",{"title":1058,"heroImage":1059,"category":9,"description":1060,"authors":1061,"slug":1062,"externalUrl":6},"Automating with GitLab Duo, Part 2: Complex testing","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","Find out how the GitLab team addressed more complex testing situations using GitLab Duo's AI capabilities, including ensuring that code testing followed standards.",[1049],"automating-with-gitlab-duo-part-2-complex-testing",{"title":1064,"heroImage":1065,"category":9,"description":1066,"authors":1067,"slug":1069,"externalUrl":6},"Streamline DevSecOps engineering workflows with GitLab Duo","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749658912/Blog/Hero%20Images/blog-image-template-1800x945__20_.png","Learn all the ways GitLab Duo's AI capabilities can improve the efficiency of development workflows. Includes in-depth tutorials and demos.",[1068],"Abubakar Siddiq Ango","streamline-devsecops-engineering-workflows-with-gitlab-duo",{"title":1071,"heroImage":1072,"category":9,"description":1073,"authors":1074,"slug":1076,"externalUrl":6},"Quickly resolve broken CI/CD pipelines with AI","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097355/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2811%29_78Dav6FR9EGjhebHWuBVan_1750097355230.png","When your CI/CD pipeline fails, it leads to delays, decreased productivity, and stress. AI-powered Root Cause Analysis makes problem-solving faster and smarter.",[1075],"Itzik Gan Baruch","quickly-resolve-broken-ci-cd-pipelines-with-ai",{"title":1078,"heroImage":1079,"category":9,"description":1080,"authors":1081,"slug":1083,"externalUrl":6},"How to leverage GitLab Duo for enhanced security reporting","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098339/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%285%29_1iy516k40hwBDChKcUJ2zb_1750098339103.png","Learn how GitLab Duo enables efficient, real-world security reporting for development, operations, and security teams.",[1082,1029],"Valentine Mairet","how-to-leverage-gitlab-duo-for-enhanced-security-reporting",1778622499899]