[{"data":1,"prerenderedAt":1321},["ShallowReactive",2],{"/blog/categories/engineering/page/13":3,"navigation-en-us":20,"banner-en-us":448,"footer-en-us":458,"engineering-category-page-total-items-en-us":703,"engineering-category-page-featured-en-us":704,"engineering-category-page-13-en-us":1257},{"id":4,"title":5,"body":6,"category":6,"config":7,"content":11,"description":6,"extension":12,"meta":13,"navigation":14,"path":15,"seo":16,"slug":6,"stem":18,"testContent":6,"type":6,"__hash__":19},"blogCategories/en-us/blog/categories/engineering.yml","Engineering",null,{"template":8,"slug":9,"hide":10},"BlogCategory","engineering",false,{"name":5},"yml",{},true,"/en-us/blog/categories/engineering",{"title":5,"description":17},"Browse articles related to Engineering on the GitLab Blog","en-us/blog/categories/engineering","8bG3OWoOqnd0RUuGte8_Pd1CHzJY7KSrgk1_B9fzJ8M",{"logo":21,"freeTrial":26,"sales":31,"login":36,"items":41,"search":368,"minimal":399,"duo":418,"switchNav":427,"pricingDeployment":438},{"config":22},{"href":23,"dataGaName":24,"dataGaLocation":25},"/","gitlab logo","header",{"text":27,"config":28},"Get free trial",{"href":29,"dataGaName":30,"dataGaLocation":25},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":32,"config":33},"Request a demo",{"href":34,"dataGaName":35,"dataGaLocation":25},"/sales/?contact-topic=request-demo","sales",{"text":37,"config":38},"Sign in",{"href":39,"dataGaName":40,"dataGaLocation":25},"https://gitlab.com/users/sign_in/","sign in",[42,71,171,176,290,346],{"text":43,"config":44,"menu":46},"Platform",{"dataNavLevelOne":45},"platform",{"type":47,"columns":48},"cards",[49,55,63],{"title":43,"description":50,"link":51},"The intelligent orchestration platform for DevSecOps",{"text":52,"config":53},"Explore our Platform",{"href":54,"dataGaName":45,"dataGaLocation":25},"/platform/",{"title":56,"description":57,"link":58},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":59,"config":60},"Meet GitLab Duo",{"href":61,"dataGaName":62,"dataGaLocation":25},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":64,"description":65,"link":66},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":67,"config":68},"Learn more",{"href":69,"dataGaName":70,"dataGaLocation":25},"/why-gitlab/","why gitlab",{"text":72,"left":14,"config":73,"menu":75},"Product",{"dataNavLevelOne":74},"solutions",{"type":76,"link":77,"columns":81,"feature":150},"lists",{"text":78,"config":79},"View all Solutions",{"href":80,"dataGaName":74,"dataGaLocation":25},"/solutions/",[82,106,129],{"title":83,"description":84,"link":85,"items":90},"Automation","CI/CD and automation to accelerate deployment",{"config":86},{"icon":87,"href":88,"dataGaName":89,"dataGaLocation":25},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[91,95,98,102],{"text":92,"config":93},"CI/CD",{"href":94,"dataGaLocation":25,"dataGaName":92},"/solutions/continuous-integration/",{"text":56,"config":96},{"href":61,"dataGaLocation":25,"dataGaName":97},"gitlab duo agent platform - product menu",{"text":99,"config":100},"Source Code Management",{"href":101,"dataGaLocation":25,"dataGaName":99},"/solutions/source-code-management/",{"text":103,"config":104},"Automated Software Delivery",{"href":88,"dataGaLocation":25,"dataGaName":105},"Automated software delivery",{"title":107,"description":108,"link":109,"items":114},"Security","Deliver code faster without compromising security",{"config":110},{"href":111,"dataGaName":112,"dataGaLocation":25,"icon":113},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[115,119,124],{"text":116,"config":117},"Application Security Testing",{"href":111,"dataGaName":118,"dataGaLocation":25},"Application security testing",{"text":120,"config":121},"Software Supply Chain Security",{"href":122,"dataGaLocation":25,"dataGaName":123},"/solutions/supply-chain/","Software supply chain security",{"text":125,"config":126},"Software Compliance",{"href":127,"dataGaName":128,"dataGaLocation":25},"/solutions/software-compliance/","software compliance",{"title":130,"link":131,"items":136},"Measurement",{"config":132},{"icon":133,"href":134,"dataGaName":135,"dataGaLocation":25},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[137,141,145],{"text":138,"config":139},"Visibility & Measurement",{"href":134,"dataGaLocation":25,"dataGaName":140},"Visibility and Measurement",{"text":142,"config":143},"Value Stream Management",{"href":144,"dataGaLocation":25,"dataGaName":142},"/solutions/value-stream-management/",{"text":146,"config":147},"Analytics & Insights",{"href":148,"dataGaLocation":25,"dataGaName":149},"/solutions/analytics-and-insights/","Analytics and insights",{"title":151,"type":76,"items":152},"GitLab for",[153,159,165],{"text":154,"config":155},"Enterprise",{"icon":156,"href":157,"dataGaLocation":25,"dataGaName":158},"Building","/enterprise/","enterprise",{"text":160,"config":161},"Small Business",{"icon":162,"href":163,"dataGaLocation":25,"dataGaName":164},"Work","/small-business/","small business",{"text":166,"config":167},"Public Sector",{"icon":168,"href":169,"dataGaLocation":25,"dataGaName":170},"Organization","/solutions/public-sector/","public sector",{"text":172,"config":173},"Pricing",{"href":174,"dataGaName":175,"dataGaLocation":25,"dataNavLevelOne":175},"/pricing/","pricing",{"text":177,"config":178,"menu":180},"Resources",{"dataNavLevelOne":179},"resources",{"type":76,"link":181,"columns":185,"feature":279},{"text":182,"config":183},"View all resources",{"href":184,"dataGaName":179,"dataGaLocation":25},"/resources/",[186,219,246],{"title":187,"items":188},"Getting started",[189,194,199,204,209,214],{"text":190,"config":191},"Install",{"href":192,"dataGaName":193,"dataGaLocation":25},"/install/","install",{"text":195,"config":196},"Quick start guides",{"href":197,"dataGaName":198,"dataGaLocation":25},"/get-started/","quick setup checklists",{"text":200,"config":201},"Learn",{"href":202,"dataGaLocation":25,"dataGaName":203},"https://university.gitlab.com/","learn",{"text":205,"config":206},"Product documentation",{"href":207,"dataGaName":208,"dataGaLocation":25},"https://docs.gitlab.com/","product documentation",{"text":210,"config":211},"Best practice videos",{"href":212,"dataGaName":213,"dataGaLocation":25},"/getting-started-videos/","best practice videos",{"text":215,"config":216},"Integrations",{"href":217,"dataGaName":218,"dataGaLocation":25},"/integrations/","integrations",{"title":220,"items":221},"Discover",[222,227,232,237,241],{"text":223,"config":224},"Customer success stories",{"href":225,"dataGaName":226,"dataGaLocation":25},"/customers/","customer success stories",{"text":228,"config":229},"Blog",{"href":230,"dataGaName":231,"dataGaLocation":25},"/blog/","blog",{"text":233,"config":234},"Demo Hub",{"href":235,"dataGaName":236,"dataGaLocation":25},"/demo-hub/","demo hub",{"text":238,"config":239},"The Source",{"href":240,"dataGaName":231,"dataGaLocation":25},"/the-source/",{"text":242,"config":243},"Remote",{"href":244,"dataGaName":245,"dataGaLocation":25},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":247,"items":248},"Connect",[249,254,259,264,269,274],{"text":250,"config":251},"GitLab Services",{"href":252,"dataGaName":253,"dataGaLocation":25},"/services/","services",{"text":255,"config":256},"Contribute",{"href":257,"dataGaName":258,"dataGaLocation":25},"https://contributors.gitlab.com","contribute",{"text":260,"config":261},"Community",{"href":262,"dataGaName":263,"dataGaLocation":25},"/community/","community",{"text":265,"config":266},"Forum",{"href":267,"dataGaName":268,"dataGaLocation":25},"https://forum.gitlab.com/","forum",{"text":270,"config":271},"Events",{"href":272,"dataGaName":273,"dataGaLocation":25},"/events/","events",{"text":275,"config":276},"Partners",{"href":277,"dataGaName":278,"dataGaLocation":25},"/partners/","partners",{"config":280,"title":283,"text":284,"link":285},{"background":281,"textColor":282},"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":286,"config":287},"Read the latest",{"href":288,"dataGaName":289,"dataGaLocation":25},"/whats-new/","whats new",{"text":291,"config":292,"menu":294},"Company",{"dataNavLevelOne":293},"company",{"type":76,"columns":295},[296],{"items":297},[298,303,309,311,316,321,326,331,336,341],{"text":299,"config":300},"About",{"href":301,"dataGaName":302,"dataGaLocation":25},"/company/","about",{"text":304,"config":305,"footerGa":308},"Jobs",{"href":306,"dataGaName":307,"dataGaLocation":25},"/jobs/","jobs",{"dataGaName":307},{"text":270,"config":310},{"href":272,"dataGaName":273,"dataGaLocation":25},{"text":312,"config":313},"Leadership",{"href":314,"dataGaName":315,"dataGaLocation":25},"/company/team/e-group/","leadership",{"text":317,"config":318},"Handbook",{"href":319,"dataGaName":320,"dataGaLocation":25},"https://handbook.gitlab.com/","handbook",{"text":322,"config":323},"Investor relations",{"href":324,"dataGaName":325,"dataGaLocation":25},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":327,"config":328},"Trust Center",{"href":329,"dataGaName":330,"dataGaLocation":25},"/security/","trust center",{"text":332,"config":333},"AI Transparency Center",{"href":334,"dataGaName":335,"dataGaLocation":25},"/ai-transparency-center/","ai transparency center",{"text":337,"config":338},"Newsletter",{"href":339,"dataGaName":340,"dataGaLocation":25},"/company/contact/#contact-forms","newsletter",{"text":342,"config":343},"Press",{"href":344,"dataGaName":345,"dataGaLocation":25},"/press/","press",{"text":347,"config":348,"menu":349},"Contact us",{"dataNavLevelOne":293},{"type":76,"columns":350},[351],{"items":352},[353,358,363],{"text":354,"config":355},"Talk to sales",{"href":356,"dataGaName":357,"dataGaLocation":25},"/sales/","talk to sales",{"text":359,"config":360},"Support portal",{"href":361,"dataGaName":362,"dataGaLocation":25},"https://support.gitlab.com/hc/en-us","support portal",{"text":364,"config":365},"Customer portal",{"href":366,"dataGaName":367,"dataGaLocation":25},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":369,"login":370,"suggestions":377},"Close",{"text":371,"link":372},"To search repositories and projects, login to",{"text":373,"config":374},"gitlab.com",{"href":39,"dataGaName":375,"dataGaLocation":376},"search login","search",{"text":378,"default":379},"Suggestions",[380,382,386,388,392,396],{"text":56,"config":381},{"href":61,"dataGaName":56,"dataGaLocation":376},{"text":383,"config":384},"Code Suggestions (AI)",{"href":385,"dataGaName":383,"dataGaLocation":376},"/solutions/code-suggestions/",{"text":92,"config":387},{"href":94,"dataGaName":92,"dataGaLocation":376},{"text":389,"config":390},"GitLab on AWS",{"href":391,"dataGaName":389,"dataGaLocation":376},"/partners/technology-partners/aws/",{"text":393,"config":394},"GitLab on Google Cloud",{"href":395,"dataGaName":393,"dataGaLocation":376},"/partners/technology-partners/google-cloud-platform/",{"text":397,"config":398},"Why GitLab?",{"href":69,"dataGaName":397,"dataGaLocation":376},{"freeTrial":400,"mobileIcon":405,"desktopIcon":410,"secondaryButton":413},{"text":401,"config":402},"Start free trial",{"href":403,"dataGaName":30,"dataGaLocation":404},"https://gitlab.com/-/trials/new/","nav",{"altText":406,"config":407},"Gitlab Icon",{"src":408,"dataGaName":409,"dataGaLocation":404},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":406,"config":411},{"src":412,"dataGaName":409,"dataGaLocation":404},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":414,"config":415},"Get Started",{"href":416,"dataGaName":417,"dataGaLocation":404},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":419,"mobileIcon":423,"desktopIcon":425},{"text":420,"config":421},"Learn more about GitLab Duo",{"href":61,"dataGaName":422,"dataGaLocation":404},"gitlab duo",{"altText":406,"config":424},{"src":408,"dataGaName":409,"dataGaLocation":404},{"altText":406,"config":426},{"src":412,"dataGaName":409,"dataGaLocation":404},{"button":428,"mobileIcon":433,"desktopIcon":435},{"text":429,"config":430},"/switch",{"href":431,"dataGaName":432,"dataGaLocation":404},"#contact","switch",{"altText":406,"config":434},{"src":408,"dataGaName":409,"dataGaLocation":404},{"altText":406,"config":436},{"src":437,"dataGaName":409,"dataGaLocation":404},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":439,"mobileIcon":444,"desktopIcon":446},{"text":440,"config":441},"Back to pricing",{"href":174,"dataGaName":442,"dataGaLocation":404,"icon":443},"back to pricing","GoBack",{"altText":406,"config":445},{"src":408,"dataGaName":409,"dataGaLocation":404},{"altText":406,"config":447},{"src":412,"dataGaName":409,"dataGaLocation":404},{"title":449,"titleMobile":450,"button":451,"config":456},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":67,"config":452},{"href":453,"dataGaName":454,"dataGaLocation":455},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":457,"disabled":10},"release",{"data":459},{"text":460,"source":461,"edit":467,"contribute":472,"config":477,"items":482,"minimal":692},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":462,"config":463},"View page source",{"href":464,"dataGaName":465,"dataGaLocation":466},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":468,"config":469},"Edit this page",{"href":470,"dataGaName":471,"dataGaLocation":466},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":473,"config":474},"Please contribute",{"href":475,"dataGaName":476,"dataGaLocation":466},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":478,"facebook":479,"youtube":480,"linkedin":481},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[483,530,584,628,660],{"title":172,"links":484,"subMenu":499},[485,489,494],{"text":486,"config":487},"View plans",{"href":174,"dataGaName":488,"dataGaLocation":466},"view plans",{"text":490,"config":491},"Why Premium?",{"href":492,"dataGaName":493,"dataGaLocation":466},"/pricing/premium/","why premium",{"text":495,"config":496},"Why Ultimate?",{"href":497,"dataGaName":498,"dataGaLocation":466},"/pricing/ultimate/","why ultimate",[500],{"title":501,"links":502},"Contact Us",[503,506,508,510,515,520,525],{"text":504,"config":505},"Contact sales",{"href":356,"dataGaName":35,"dataGaLocation":466},{"text":359,"config":507},{"href":361,"dataGaName":362,"dataGaLocation":466},{"text":364,"config":509},{"href":366,"dataGaName":367,"dataGaLocation":466},{"text":511,"config":512},"Status",{"href":513,"dataGaName":514,"dataGaLocation":466},"https://status.gitlab.com/","status",{"text":516,"config":517},"Terms of use",{"href":518,"dataGaName":519,"dataGaLocation":466},"/terms/","terms of use",{"text":521,"config":522},"Privacy statement",{"href":523,"dataGaName":524,"dataGaLocation":466},"/privacy/","privacy statement",{"text":526,"config":527},"Cookie preferences",{"dataGaName":528,"dataGaLocation":466,"id":529,"isOneTrustButton":14},"cookie preferences","ot-sdk-btn",{"title":72,"links":531,"subMenu":540},[532,536],{"text":533,"config":534},"DevSecOps platform",{"href":54,"dataGaName":535,"dataGaLocation":466},"devsecops platform",{"text":537,"config":538},"AI-Assisted Development",{"href":61,"dataGaName":539,"dataGaLocation":466},"ai-assisted development",[541],{"title":542,"links":543},"Topics",[544,549,554,559,564,569,574,579],{"text":545,"config":546},"CICD",{"href":547,"dataGaName":548,"dataGaLocation":466},"/topics/ci-cd/","cicd",{"text":550,"config":551},"GitOps",{"href":552,"dataGaName":553,"dataGaLocation":466},"/topics/gitops/","gitops",{"text":555,"config":556},"DevOps",{"href":557,"dataGaName":558,"dataGaLocation":466},"/topics/devops/","devops",{"text":560,"config":561},"Version Control",{"href":562,"dataGaName":563,"dataGaLocation":466},"/topics/version-control/","version control",{"text":565,"config":566},"DevSecOps",{"href":567,"dataGaName":568,"dataGaLocation":466},"/topics/devsecops/","devsecops",{"text":570,"config":571},"Cloud Native",{"href":572,"dataGaName":573,"dataGaLocation":466},"/topics/cloud-native/","cloud native",{"text":575,"config":576},"AI for Coding",{"href":577,"dataGaName":578,"dataGaLocation":466},"/topics/devops/ai-for-coding/","ai for coding",{"text":580,"config":581},"Agentic AI",{"href":582,"dataGaName":583,"dataGaLocation":466},"/topics/agentic-ai/","agentic ai",{"title":585,"links":586},"Solutions",[587,589,591,596,600,603,607,610,612,615,618,623],{"text":116,"config":588},{"href":111,"dataGaName":116,"dataGaLocation":466},{"text":105,"config":590},{"href":88,"dataGaName":89,"dataGaLocation":466},{"text":592,"config":593},"Agile development",{"href":594,"dataGaName":595,"dataGaLocation":466},"/solutions/agile-delivery/","agile delivery",{"text":597,"config":598},"SCM",{"href":101,"dataGaName":599,"dataGaLocation":466},"source code management",{"text":545,"config":601},{"href":94,"dataGaName":602,"dataGaLocation":466},"continuous integration & delivery",{"text":604,"config":605},"Value stream management",{"href":144,"dataGaName":606,"dataGaLocation":466},"value stream management",{"text":550,"config":608},{"href":609,"dataGaName":553,"dataGaLocation":466},"/solutions/gitops/",{"text":154,"config":611},{"href":157,"dataGaName":158,"dataGaLocation":466},{"text":613,"config":614},"Small business",{"href":163,"dataGaName":164,"dataGaLocation":466},{"text":616,"config":617},"Public sector",{"href":169,"dataGaName":170,"dataGaLocation":466},{"text":619,"config":620},"Education",{"href":621,"dataGaName":622,"dataGaLocation":466},"/solutions/education/","education",{"text":624,"config":625},"Financial services",{"href":626,"dataGaName":627,"dataGaLocation":466},"/solutions/finance/","financial services",{"title":177,"links":629},[630,632,634,636,639,641,644,646,648,650,652,654,656,658],{"text":190,"config":631},{"href":192,"dataGaName":193,"dataGaLocation":466},{"text":195,"config":633},{"href":197,"dataGaName":198,"dataGaLocation":466},{"text":200,"config":635},{"href":202,"dataGaName":203,"dataGaLocation":466},{"text":205,"config":637},{"href":207,"dataGaName":638,"dataGaLocation":466},"docs",{"text":228,"config":640},{"href":230,"dataGaName":231,"dataGaLocation":466},{"text":642,"config":643},"What's new",{"href":288,"dataGaName":289,"dataGaLocation":466},{"text":223,"config":645},{"href":225,"dataGaName":226,"dataGaLocation":466},{"text":242,"config":647},{"href":244,"dataGaName":245,"dataGaLocation":466},{"text":250,"config":649},{"href":252,"dataGaName":253,"dataGaLocation":466},{"text":255,"config":651},{"href":257,"dataGaName":258,"dataGaLocation":466},{"text":260,"config":653},{"href":262,"dataGaName":263,"dataGaLocation":466},{"text":265,"config":655},{"href":267,"dataGaName":268,"dataGaLocation":466},{"text":270,"config":657},{"href":272,"dataGaName":273,"dataGaLocation":466},{"text":275,"config":659},{"href":277,"dataGaName":278,"dataGaLocation":466},{"title":291,"links":661},[662,664,666,668,670,672,676,681,683,685,687],{"text":299,"config":663},{"href":301,"dataGaName":293,"dataGaLocation":466},{"text":304,"config":665},{"href":306,"dataGaName":307,"dataGaLocation":466},{"text":312,"config":667},{"href":314,"dataGaName":315,"dataGaLocation":466},{"text":317,"config":669},{"href":319,"dataGaName":320,"dataGaLocation":466},{"text":322,"config":671},{"href":324,"dataGaName":325,"dataGaLocation":466},{"text":673,"config":674},"Sustainability",{"href":675,"dataGaName":673,"dataGaLocation":466},"/sustainability/",{"text":677,"config":678},"Diversity, inclusion and belonging (DIB)",{"href":679,"dataGaName":680,"dataGaLocation":466},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":327,"config":682},{"href":329,"dataGaName":330,"dataGaLocation":466},{"text":337,"config":684},{"href":339,"dataGaName":340,"dataGaLocation":466},{"text":342,"config":686},{"href":344,"dataGaName":345,"dataGaLocation":466},{"text":688,"config":689},"Modern Slavery Transparency Statement",{"href":690,"dataGaName":691,"dataGaLocation":466},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":693},[694,697,700],{"text":695,"config":696},"Terms",{"href":518,"dataGaName":519,"dataGaLocation":466},{"text":698,"config":699},"Cookies",{"dataGaName":528,"dataGaLocation":466,"id":529,"isOneTrustButton":14},{"text":701,"config":702},"Privacy",{"href":523,"dataGaName":524,"dataGaLocation":466},480,{"id":705,"title":706,"authors":707,"body":710,"category":9,"date":1242,"description":1243,"extension":1244,"externalUrl":6,"faq":6,"featured":14,"heroImage":1245,"meta":1246,"navigation":14,"path":1247,"seo":1248,"slug":1250,"stem":1251,"tags":1252,"template":1255,"updatedDate":6,"__hash__":1256},"blogPosts/en-us/blog/confidential-ai-for-gitlab-self-hosted.md","Confidential AI for GitLab Self-Hosted",[708,709],"Mathias Ewald","Martin Paloncy, Edgeless Systems",{"type":711,"value":712,"toc":1230},"minimark",[713,717,727,732,740,743,747,750,753,756,760,763,857,860,863,866,869,873,885,893,900,903,906,909,928,936,939,943,946,960,1108,1110,1119,1123,1126,1132,1138,1144,1150,1154,1176,1180,1188,1192,1226],[714,715,716],"p",{},"Your developers want AI coding agents. Your source code is regulated IP that can't be sent to a third-party AI service, and your compliance team has said so in writing. The usual escape hatch, standing up your own GPU cluster and running the models yourself, means buying scarce hardware, hiring a team to operate it, and still trailing the frontier models by months. So you do nothing, and your teams fall behind the ones that adopted AI a year ago.",[714,718,719,720,726],{},"GitLab Duo Self-Hosted can now use ",[721,722,725],"a",{"href":723,"rel":724},"https://www.privatemode.ai/",[],"Privatemode AI"," as its model provider. Privatemode runs state-of-the-art models inside confidential-computing hardware, so prompts, source code, and completions stay encrypted end-to-end, including during inference. You point GitLab Duo's AI Gateway at the Privatemode proxy, and your developers get the same Duo features they'd get from any model, with one difference that matters to a regulated organization: The code never leaves an encrypted boundary, and no third party can read it.",[728,729,731],"h2",{"id":730},"the-productivity-most-regulated-teams-cant-touch","The productivity most regulated teams can't touch",[714,733,734,735,739],{},"AI coding assistance has moved well past autocomplete. ",[721,736,56],{"href":737,"rel":738},"https://about.gitlab.com/gitlab-duo-agent-platform/",[]," runs multi-step work: It reviews merge requests, refactors across files, generates and runs tests, drives agentic flows as CI jobs, and much more. That is a real shift in how teams ship, and it compounds. The teams using it review faster and spend less time on boilerplate.",[714,741,742],{},"The catch is that every one of those features sends your prompts and your source code to a model provider. For a team working on proprietary code, regulated software, or sensitive IP, that single fact is disqualifying.",[728,744,746],{"id":745},"why-regulated-organizations-self-host","Why regulated organizations self-host",[714,748,749],{},"For these organizations, source code is core intellectual property, and where it gets processed is a contractual, sectoral, and regulatory question, not a convenience one. A bank's trading algorithms, a medical-device vendor's firmware, a defense contractor's control software: Sending that intellectual property to an external AI service can breach IP protections, data-processing agreements, and sector rules in one step.",[714,751,752],{},"The pressure comes from several directions at once. NIS2 and Digital Operational Resilience Act (DORA) raise the bar on operational resilience and third-party risk across critical infrastructure and financial services. GDPR governs how personal data in code and logs is processed. Sector regimes such as BaFin supervision in German finance, BSI C5 as a procurement baseline, and healthcare data rules add their own constraints. And many European organizations treat data sovereignty as a first-order requirement regardless of any single regulation.",[714,754,755],{},"The segments feeling this most are financial services, healthcare and pharma, defense, the public sector, and critical infrastructure. GitLab Self-Hosted exists precisely so this code never has to leave a trusted perimeter. Adding AI to the workflow shouldn't quietly undo that.",[728,757,759],{"id":758},"why-ai-makes-self-hosting-hard","Why AI makes self-hosting hard",[714,761,762],{},"A self-hosted team that wants AI coding assistance has three conventional options, and each one has costs the regulated buyer can't easily pay.",[764,765,766,784],"table",{},[767,768,769],"thead",{},[770,771,772,775,778,781],"tr",{},[773,774],"th",{},[773,776,777],{},"Public AI SaaS",[773,779,780],{},"VPC / private-cloud AI",[773,782,783],{},"Run your own LLM stack",[785,786,787,802,816,830,844],"tbody",{},[770,788,789,793,796,799],{},[790,791,792],"td",{},"Source code leaves your perimeter",[790,794,795],{},"Yes",[790,797,798],{},"Yes (to the operator)",[790,800,801],{},"No",[770,803,804,807,810,813],{},[790,805,806],{},"Guarantee type",[790,808,809],{},"Contractual (terms of service)",[790,811,812],{},"Contractual (operator + cloud)",[790,814,815],{},"Self-enforced",[770,817,818,821,824,827],{},[790,819,820],{},"Sees your plaintext",[790,822,823],{},"The provider",[790,825,826],{},"The operator and cloud provider",[790,828,829],{},"Only you",[770,831,832,835,838,841],{},[790,833,834],{},"Infrastructure burden",[790,836,837],{},"None",[790,839,840],{},"Low",[790,842,843],{},"High: GPUs, model ops, updates",[770,845,846,849,851,854],{},[790,847,848],{},"Keeps pace with frontier models",[790,850,795],{},[790,852,853],{},"Usually",[790,855,856],{},"Rarely, you lag the frontier",[858,859],"br",{},[714,861,862],{},"The comparison table shows that public AI SaaS and VPC options expose code and rely on contractual guarantees, while running your own stack keeps code private but carries heavy GPU and model-operations burden.",[714,864,865],{},"The honest summary: Public SaaS is off the table because the code leaves the building. A VPC-isolated or private-cloud service reduces exposure but still hands plaintext to the operator and the underlying cloud provider. At the same time, a contract is a promise, but not a cryptographic guarantee. Running your own models keeps the code private but is expensive to buy, expensive to staff, and structurally behind the best available models. Faced with that, most regulated organizations adopt AI narrowly or not at all.",[714,867,868],{},"The question becomes: How do you give developers modern AI coding agents without source code leaving the perimeter, and without operating an LLM stack yourself? Answering it takes a different kind of guarantee than a contract can provide, one enforced by hardware.",[728,870,872],{"id":871},"confidential-computing-the-architectural-answer","Confidential computing: The architectural answer",[714,874,875,876,880,881,884],{},"Confidential computing keeps data encrypted ",[877,878,879],"em",{},"in memory",", while it's being processed, using a hardware-based trusted execution environment (TEE), an isolated region of a CPU or GPU that even the operating system, the hypervisor, and the machine's operator cannot read into. The relevant hardware here is AMD SEV or Intel TDX on the CPU side, paired with NVIDIA Confidential Computing on the GPU. Data is encrypted in transit and at rest with AES-256, and it's only ever decrypted ",[877,882,883],{},"inside"," the TEE.",[714,886,887,888,892],{},"The piece that turns this from a promise into a guarantee is ",[889,890,891],"strong",{},"remote attestation",". Before a client sends any data, it asks the TEE to prove what it is: The hardware produces signed, cryptographic evidence of exactly what code is running inside the enclave. The client verifies that evidence against known-good values, and only then establishes the encrypted channel and sends its request. Verify first, send second.",[714,894,895],{},[896,897],"img",{"alt":898,"src":899},"Data-flow diagram","https://res.cloudinary.com/about-gitlab-com/image/upload/v1786033561/tjh50p5pliyu1oyftdtn.png",[714,901,902],{},"The data-flow diagram shows prompts encrypted at the client, transmitted as ciphertext, and decrypted only inside a hardware TEE that neither the service operator nor the cloud provider can read.",[714,904,905],{},"The security property that follows is the whole point: Neither the AI service operator nor the underlying cloud provider can see your prompts, your completions, or your context. Not because they promise not to look, but because the hardware won't let them.",[728,907,725],{"id":908},"privatemode-ai",[714,910,911,915,916,921,922,927],{},[721,912,725],{"href":913,"rel":914},"https://docs.privatemode.ai/",[]," is built by ",[721,917,920],{"href":918,"rel":919},"https://edgeless.systems/",[],"Edgeless Systems",", a Germany-based specialist in confidential-computing software. ",[721,923,926],{"href":924,"rel":925},"https://images.nvidia.com/aem-dam/Solutions/Data-Center/confidential-computing/hpc-solution-brief-edgeless-systems-3427281.pdf?ncid=no-ncid",[],"According to NVIDIA",", Privatemode is the \"first gen AI framework that keeps prompts encrypted at all times.\"",[714,929,930,931,935],{},"For the developer, the mechanics are invisible. Privatemode exposes an OpenAI-compatible API, and a client-side proxy handles attestation and encryption transparently, so tools and SDKs that speak the standard ",[932,933,934],"code",{},"/v1"," API work unchanged. The current flagship model for coding is Kimi K2.6 with 256K context, with others like Kimi K3 and GLM coming soon.",[714,937,938],{},"This isn't a lab experiment. Privatemode is already in production with organizations that have exactly the constraints described above. Capgemini uses it for regulated-industry clients, including confidential coding. The German Federal Employment Agency runs it in the public sector. And banks, insurers, and defense organizations use it where source code and data cannot leave a trusted boundary. Its cryptography is post-quantum-safe, which also defends against \"harvest now, decrypt later\" attacks. An adversary capturing today's ciphertext in the hope of decrypting it with tomorrow's hardware gets nothing usable.",[728,940,942],{"id":941},"how-the-integration-works","How the integration works",[714,944,945],{},"GitLab Duo Self-Hosted lets you serve Duo's AI features from a model you control instead of a GitLab-managed gateway. Privatemode slots in as that model.",[714,947,948,949,952,953,956,957,959],{},"The path is straightforward. GitLab Duo talks to a self-hosted ",[889,950,951],{},"AI Gateway",", which forwards inference to any OpenAI-compatible endpoint. The Privatemode proxy ",[877,954,955],{},"is"," that endpoint: It exposes a standard ",[932,958,934],{}," API and handles encryption and attestation against the Privatemode service. When a request comes through, the proxy encrypts it before it leaves your network, verifies the remote TEE through attestation, and only then forwards it. Decryption happens exclusively inside the confidential-computing environment. Inside Duo, across Code Suggestions, Chat, Code Review, and agentic flows, the developer experience is unchanged.",[961,962,967],"pre",{"className":963,"code":964,"language":965,"meta":966,"style":966},"language-mermaid shiki shiki-themes github-light","sequenceDiagram\n    autonumber\n    actor Dev as Developer /\u003Cbr>Duo Agent Platform\n    participant GW as Self-hosted GitLab\u003Cbr>AI Gateway\n    participant Proxy as Privatemode\u003Cbr>Proxy\n    participant TEE as Remote TEE\u003Cbr>(CPU + GPU)\n\n    Dev->>GW: Inference request (Code\u003Cbr>Suggestions, Chat,\u003Cbr>Code Review, flows)\n    GW->>Proxy: Forward request\u003Cbr>to OpenAI-compatible\u003Cbr>endpoint\n\n    rect rgb(255, 244, 214)\n        Note over Proxy,TEE: Attestation before any code is sent\n        Proxy->>TEE: Request attestation evidence\n        TEE-->>Proxy: Signed evidence of enclave code\n        Proxy->>Proxy: Verify evidence against known-good values\n        Proxy->>TEE: Establish encrypted channel (AES-256, post-quantum-safe)\n    end\n\n    Proxy->>TEE: Forward encrypted request\n    Note over TEE: Decryption + inference\u003Cbr>happen only inside the enclave\n    TEE-->>Proxy: Encrypted response\n    Proxy-->>GW: Encrypted response\n    GW-->>Dev: Completion (developer\u003Cbr>experience unchanged)\n","mermaid","",[932,968,969,978,984,990,996,1002,1008,1014,1020,1026,1031,1037,1043,1049,1055,1061,1067,1073,1078,1084,1090,1096,1102],{"__ignoreMap":966},[970,971,974],"span",{"class":972,"line":973},"line",1,[970,975,977],{"class":976},"sgsFI","sequenceDiagram\n",[970,979,981],{"class":972,"line":980},2,[970,982,983],{"class":976},"    autonumber\n",[970,985,987],{"class":972,"line":986},3,[970,988,989],{"class":976},"    actor Dev as Developer /\u003Cbr>Duo Agent Platform\n",[970,991,993],{"class":972,"line":992},4,[970,994,995],{"class":976},"    participant GW as Self-hosted GitLab\u003Cbr>AI Gateway\n",[970,997,999],{"class":972,"line":998},5,[970,1000,1001],{"class":976},"    participant Proxy as Privatemode\u003Cbr>Proxy\n",[970,1003,1005],{"class":972,"line":1004},6,[970,1006,1007],{"class":976},"    participant TEE as Remote TEE\u003Cbr>(CPU + GPU)\n",[970,1009,1011],{"class":972,"line":1010},7,[970,1012,1013],{"emptyLinePlaceholder":14},"\n",[970,1015,1017],{"class":972,"line":1016},8,[970,1018,1019],{"class":976},"    Dev->>GW: Inference request (Code\u003Cbr>Suggestions, Chat,\u003Cbr>Code Review, flows)\n",[970,1021,1023],{"class":972,"line":1022},9,[970,1024,1025],{"class":976},"    GW->>Proxy: Forward request\u003Cbr>to OpenAI-compatible\u003Cbr>endpoint\n",[970,1027,1029],{"class":972,"line":1028},10,[970,1030,1013],{"emptyLinePlaceholder":14},[970,1032,1034],{"class":972,"line":1033},11,[970,1035,1036],{"class":976},"    rect rgb(255, 244, 214)\n",[970,1038,1040],{"class":972,"line":1039},12,[970,1041,1042],{"class":976},"        Note over Proxy,TEE: Attestation before any code is sent\n",[970,1044,1046],{"class":972,"line":1045},13,[970,1047,1048],{"class":976},"        Proxy->>TEE: Request attestation evidence\n",[970,1050,1052],{"class":972,"line":1051},14,[970,1053,1054],{"class":976},"        TEE-->>Proxy: Signed evidence of enclave code\n",[970,1056,1058],{"class":972,"line":1057},15,[970,1059,1060],{"class":976},"        Proxy->>Proxy: Verify evidence against known-good values\n",[970,1062,1064],{"class":972,"line":1063},16,[970,1065,1066],{"class":976},"        Proxy->>TEE: Establish encrypted channel (AES-256, post-quantum-safe)\n",[970,1068,1070],{"class":972,"line":1069},17,[970,1071,1072],{"class":976},"    end\n",[970,1074,1076],{"class":972,"line":1075},18,[970,1077,1013],{"emptyLinePlaceholder":14},[970,1079,1081],{"class":972,"line":1080},19,[970,1082,1083],{"class":976},"    Proxy->>TEE: Forward encrypted request\n",[970,1085,1087],{"class":972,"line":1086},20,[970,1088,1089],{"class":976},"    Note over TEE: Decryption + inference\u003Cbr>happen only inside the enclave\n",[970,1091,1093],{"class":972,"line":1092},21,[970,1094,1095],{"class":976},"    TEE-->>Proxy: Encrypted response\n",[970,1097,1099],{"class":972,"line":1098},22,[970,1100,1101],{"class":976},"    Proxy-->>GW: Encrypted response\n",[970,1103,1105],{"class":972,"line":1104},23,[970,1106,1107],{"class":976},"    GW-->>Dev: Completion (developer\u003Cbr>experience unchanged)\n",[858,1109],{},[714,1111,1112,1113,1118],{},"In the sequence diagram, a GitLab Duo request flows through the self-hosted AI Gateway to the Privatemode proxy, which attests the remote enclave and establishes an encrypted channel before forwarding the request for inference inside the trusted execution environment.\nYou run the AI Gateway and the proxy yourself, and the setup is deployment-agnostic (Linux package, Docker, or Kubernetes). The steps are documented and version-specific, so rather than reproduce them here, see ",[721,1114,1117],{"href":1115,"rel":1116},"https://www.privatemode.ai/coding-tool/gitlab-duo",[],"Privatemode's GitLab Duo integration guide",".",[728,1120,1122],{"id":1121},"the-tradeoffs","The tradeoffs",[714,1124,1125],{},"No architecture is free, and a technical reader deserves the costs stated plainly.",[714,1127,1128,1131],{},[889,1129,1130],{},"You operate the gateway and the proxy."," This is real infrastructure work: deploying the AI Gateway at a proper hostname, matching its image version to your GitLab release on every upgrade, configuring JWT keys and certificates, and keeping the proxy reachable. It is ordinary infrastructure operation, though, not GPU procurement and not model operations. That distinction is the point. The alternative that keeps code private, running your own LLM stack, means buying scarce GPUs and staffing a team to run and update models while lagging the frontier. Privatemode is a hosted SaaS that carries the model operations for you, and the burden you keep is a proxy and a gateway.",[714,1133,1134,1137],{},[889,1135,1136],{},"Generic OpenAI-compatible models are still maturing"," in GitLab Duo Self-Hosted. Today, they run as a beta feature, so support for model-specific issues isn't yet guaranteed. It's on the roadmap to harden, but if you need a fully supported configuration now, factor that timeline into your rollout.",[714,1139,1140,1143],{},[889,1141,1142],{},"Attestation and encryption add some overhead."," The extra roundtrip and cryptographic work cost time per request. In our testing, this hasn't been a practical problem, but the integration guide does recommend raising the AI Gateway timeout for slower self-hosted backends, so it's worth measuring against your own latency budget.",[714,1145,1146,1149],{},[889,1147,1148],{},"You still trust something, but something bounded."," The guarantee rests on the hardware TEE and the attestation chain being sound. That's a smaller, more inspectable trust assumption than \"trust the operator not to look,\" and you can verify the attestation evidence yourself, but it isn't zero. Confidential computing narrows trust to the silicon. It doesn't eliminate it.",[728,1151,1153],{"id":1152},"what-this-means-in-practice","What this means in practice",[1155,1156,1157,1164,1170],"ul",{},[1158,1159,1160,1163],"li",{},[889,1161,1162],{},"For regulated organizations:"," a path to modern AI coding agents that fits existing IP- and data-protection policy, because the code stays inside a hardware-encrypted boundary, and without buying GPUs or standing up model operations.",[1158,1165,1166,1169],{},[889,1167,1168],{},"For developers:"," the same GitLab Duo experience, the same or better models, and no new tooling. Because model selection lives on the instance, in-editor Chat and Code Suggestions through the GitLab Workflow extension inherit the same confidential setup.",[1158,1171,1172,1175],{},[889,1173,1174],{},"For compliance and security teams:"," the architecture aligns with the direction of BSI C5:2026 toward confidential computing and remote attestation, and it gives you concrete technical evidence, namely data encrypted in use and attested execution, to bring to NIS2, DORA, and GDPR conversations. It doesn't make you compliant on its own, because compliance is organizational and ongoing. It removes the \"our code would leave the perimeter\" objection that blocks AI adoption in the first place.",[728,1177,1179],{"id":1178},"get-started-with-privatemode","Get started with Privatemode",[714,1181,1182,1183,1118],{},"Privatemode as a GitLab Duo self-hosted model provider requires GitLab Self-Managed, Premium, or Ultimate, Version 17.9 or later, with the GitLab Duo Enterprise add-on. Agentic flows additionally need the GitLab Duo Agent Platform (generally available on Version 18.8+). Usage consumes GitLab credits under the bring-your-own-model rules and multipliers described in the ",[721,1184,1187],{"href":1185,"rel":1186},"https://docs.gitlab.com/subscriptions/gitlab_credits/",[],"GitLab credits documentation",[728,1189,1191],{"id":1190},"read-more","Read more",[1155,1193,1194,1200,1206,1213,1220],{},[1158,1195,1196],{},[721,1197,1199],{"href":913,"rel":1198},[],"Privatemode documentation",[1158,1201,1202],{},[721,1203,1205],{"href":1115,"rel":1204},[],"GitLab Duo integration guide",[1158,1207,1208],{},[721,1209,1212],{"href":1210,"rel":1211},"https://docs.privatemode.ai/guides/coding-assistants/",[],"Coding assistants guide",[1158,1214,1215],{},[721,1216,1219],{"href":1217,"rel":1218},"https://www.privatemode.ai/case-studies/capgemini-case-study",[],"Capgemini case study",[1158,1221,1222],{},[721,1223,1225],{"href":924,"rel":1224},[],"NVIDIA solution brief",[1227,1228,1229],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":966,"searchDepth":980,"depth":980,"links":1231},[1232,1233,1234,1235,1236,1237,1238,1239,1240,1241],{"id":730,"depth":980,"text":731},{"id":745,"depth":980,"text":746},{"id":758,"depth":980,"text":759},{"id":871,"depth":980,"text":872},{"id":908,"depth":980,"text":725},{"id":941,"depth":980,"text":942},{"id":1121,"depth":980,"text":1122},{"id":1152,"depth":980,"text":1153},{"id":1178,"depth":980,"text":1179},{"id":1190,"depth":980,"text":1191},"2026-08-06","Give developers AI coding agents in GitLab Duo without source code leaving a hardware-encrypted boundary — no GPUs needed.","md","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png",{},"/en-us/blog/confidential-ai-for-gitlab-self-hosted",{"config":1249,"title":706,"description":1243},{"noIndex":10},"confidential-ai-for-gitlab-self-hosted","en-us/blog/confidential-ai-for-gitlab-self-hosted",[1253,1254],"AI","product","BlogPost","yG_aGvnFfFBv-WszliOSzP8sDT6l0Sybv4pmn4GvnJM",[1258,1265,1273,1280,1287,1294,1301,1308,1313],{"title":1259,"heroImage":1260,"category":9,"description":1261,"authors":1262,"slug":1264,"externalUrl":6},"Decomposing the GitLab backend database, Part 1: Designing and planning","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663397/Blog/Hero%20Images/logoforblogpost.jpg","A technical summary of the yearlong project to decompose GitLab's Postgres database. This first part focuses on the initial designing and planning of the project.",[1263],"Dylan Griffith","path-to-decomposing-gitlab-database-part1",{"title":1266,"heroImage":1267,"category":9,"description":1268,"authors":1269,"slug":1272,"externalUrl":6},"How to provision dynamic review environments using merge requests and Argo CD","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749681920/Blog/Hero%20Images/kubernetes.png","Here's how to use the Argo CD ApplicationSet to provision a ‘ReviewOps’ environment based on merge request changes.",[1270,1271],"Joe Randazzo","Madou Coulibaly","how-to-provision-reviewops",{"title":1274,"heroImage":1275,"category":9,"description":1276,"authors":1277,"slug":1279,"externalUrl":6},"How to quickly (and successfully) onboard engineers","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749670635/Blog/Hero%20Images/kubernetesterms.jpg","It's a tough hiring market today. Here's how GitLab gets engineers onboard fast and sets them up for success.",[1278],"David O'Regan","quickly-onboarding-engineers-successfully",{"title":1281,"heroImage":1282,"category":9,"description":1283,"authors":1284,"slug":1286,"externalUrl":6},"How to access GitLab on a private network with Tailscale","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679348/Blog/Hero%20Images/locks.jpg","If issues around a private network were preventing a permanent GitLab installation, Brendan O'Leary has the solution with Tailscale.",[1285],"Brendan O'Leary","how-to-access-gitlab-on-a-private-network-with-tailscale",{"title":1288,"heroImage":1289,"category":9,"description":1290,"authors":1291,"slug":1293,"externalUrl":6},"How we improved on-call life by reducing pager noise","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682368/Blog/Hero%20Images/cover.png","Too many pages? Here's how we tackled on-call SRE quality of life by grouping alerts by service and only paging on downstream services.",[1292],"Steve Azzopardi","reducing-pager-fatigue-and-improving-on-call-life",{"title":1295,"heroImage":1296,"category":9,"description":1297,"authors":1298,"slug":1300,"externalUrl":6},"5 Tips for managing monorepos in GitLab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749667591/Blog/Hero%20Images/code-review-blog.jpg","Learn the benefits of operating a monolothic repository and how to get the most out of this structure.",[1299],"Sarah Waldner","tips-for-managing-monorepos-in-gitlab",{"title":1302,"heroImage":1303,"category":9,"description":1304,"authors":1305,"slug":1307,"externalUrl":6},"How to migrate Atlassian's Bamboo server's CI/CD infrastructure to GitLab CI, part two","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679081/Blog/Hero%20Images/jenkins-migration.jpg","A real-world look at how a migrated CI/CD infrastructure will work in GitLab CI.",[1306],"Ivan Lychev","how-to-migrate-atlassians-bamboo-servers-ci-cd-infrastructure-to-gitlab-ci-part-two",{"title":1309,"heroImage":1260,"category":9,"description":1310,"authors":1311,"slug":1312,"externalUrl":6},"How to migrate Atlassian Bamboo Server's CI/CD infrastructure to GitLab CI, part one","Theoretical reasoning and practical proposal on migrating an existing CI/CD infrastructure of some multi-component application from Bamboo Server to GitLab CI",[1306],"migration-from-atlassian-bamboo-server-to-gitlab-ci",{"title":1314,"heroImage":1315,"category":9,"description":1316,"authors":1317,"slug":1320,"externalUrl":6},"An SA story about hyperscaling GitLab Runner workloads using Kubernetes","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749669897/Blog/Hero%20Images/kaleidico-26MJGnCM0Wc-unsplash.jpg","It is important to have the complete picture of scaled effects in view when designing automation.",[1318,1319],"Darwin Sanoy","Brian Wald","a-story-of-runner-scaling",1786803763018]