[{"data":1,"prerenderedAt":1739},["ShallowReactive",2],{"/blog/continuously-deploying-the-largest-gitlab-instance":3,"navigation-en-us":952,"banner-en-us":1380,"footer-en-us":1390,"blog-post-authors-en-us-John Skarbek":1635,"blog-related-posts-en-us-continuously-deploying-the-largest-gitlab-instance":1650,"blog-promotions-en-us":1676,"next-steps-en-us":1729},{"id":4,"title":5,"authors":6,"body":8,"category":933,"date":934,"description":935,"extension":936,"externalUrl":937,"faq":937,"featured":121,"heroImage":938,"meta":939,"navigation":121,"path":940,"seo":941,"slug":945,"stem":946,"tags":947,"template":950,"updatedDate":937,"__hash__":951},"blogPosts/en-us/blog/continuously-deploying-the-largest-gitlab-instance.md","How we deploy the largest GitLab instance 12 times daily",[7],"John Skarbek",{"type":9,"value":10,"toc":914},"minimark",[11,15,20,23,26,42,46,49,164,168,171,176,179,182,194,197,222,225,229,232,242,245,248,275,369,378,382,385,389,392,404,407,495,500,555,559,562,572,575,578,582,585,599,602,626,630,633,641,667,670,676,696,704,716,722,731,735,738,743,757,762,776,780,783,786,812,815,819,830,841,849,861,864,867,883,887,910],[12,13,14],"p",{},"Every day, GitLab deploys code changes to the world's largest GitLab instance — GitLab.com  — up to 12 times without any downtime. We use GitLab's own CI/CD platform to manage these deployments, which impact millions of developers worldwide. This deployment frequency serves as our primary quality gate and stress test. It also means our customers get access to new features within hours of development rather than waiting weeks or months. When organizations depend on GitLab for their DevOps workflows, they're using a platform that's proven at scale on our own infrastructure. In this article, you'll learn how we built an automated deployment pipeline using core GitLab CI/CD functionality to handle this deployment complexity.",[16,17,19],"h2",{"id":18},"the-business-case-for-deployment-velocity","The business case for deployment velocity",[12,21,22],{},"For GitLab: Our deployment frequency isn't just an engineering metric — it's a business imperative. Rapid deployment cycles mean we can respond to customer feedback within hours, ship security patches immediately, and validate new features in production before scaling them.",[12,24,25],{},"For our customers: Every deployment to GitLab.com validates the deployment practices we recommend to our users. When you use GitLab's deployment features, you're using the same battle-tested approach that handles millions of git operations, CI/CD pipelines, and user interactions daily. You benefit from:",[27,28,29,33,36,39],"ul",{},[30,31,32],"li",{},"Latest features available immediately: New capabilities reach you within hours of completion, not in quarterly release cycles",[30,34,35],{},"Proven reliability at scale: If a feature works on GitLab.com, you can trust it in your environment",[30,37,38],{},"Full value of GitLab: Zero-downtime deployments mean you never lose access to your DevOps platform, even during updates",[30,40,41],{},"Real-world tested practices: Our deployment documentation isn't theory — it's exactly how we run the largest GitLab instance in existence",[16,43,45],{"id":44},"code-flow-architecture","Code flow architecture",[12,47,48],{},"Our deployment pipeline follows a structured progression through multiple stages, each acting as a checkpoint on the journey from code proposal to production deployment.",[50,51,56],"pre",{"className":52,"code":53,"language":54,"meta":55,"style":55},"language-mermaid shiki shiki-themes github-light","  graph TD\n      A[Code Proposed] --> B[Merge Request Created]\n      B --> C[Pipeline Triggered]\n      C --> D[Build & Test]\n      D --> E{Spec/Integration/QA Tests Pass?}\n      E -->|No| F[Feedback Loop]\n      F --> B\n      E -->|Yes| G[Merge to default branch]\n      G -->|Periodically| H[Auto-Deploy Branch]\n\n      subgraph \"Deployment Pipeline\"\n          H --> I[Package Creation]\n          I --> K[Canary Environment]\n          K --> L[QA Validation]\n          L --> M[Main Environment]\n\n      end\n","mermaid","",[57,58,59,68,74,80,86,92,98,104,110,116,123,129,135,141,147,153,158],"code",{"__ignoreMap":55},[60,61,64],"span",{"class":62,"line":63},"line",1,[60,65,67],{"class":66},"sgsFI","  graph TD\n",[60,69,71],{"class":62,"line":70},2,[60,72,73],{"class":66},"      A[Code Proposed] --> B[Merge Request Created]\n",[60,75,77],{"class":62,"line":76},3,[60,78,79],{"class":66},"      B --> C[Pipeline Triggered]\n",[60,81,83],{"class":62,"line":82},4,[60,84,85],{"class":66},"      C --> D[Build & Test]\n",[60,87,89],{"class":62,"line":88},5,[60,90,91],{"class":66},"      D --> E{Spec/Integration/QA Tests Pass?}\n",[60,93,95],{"class":62,"line":94},6,[60,96,97],{"class":66},"      E -->|No| F[Feedback Loop]\n",[60,99,101],{"class":62,"line":100},7,[60,102,103],{"class":66},"      F --> B\n",[60,105,107],{"class":62,"line":106},8,[60,108,109],{"class":66},"      E -->|Yes| G[Merge to default branch]\n",[60,111,113],{"class":62,"line":112},9,[60,114,115],{"class":66},"      G -->|Periodically| H[Auto-Deploy Branch]\n",[60,117,119],{"class":62,"line":118},10,[60,120,122],{"emptyLinePlaceholder":121},true,"\n",[60,124,126],{"class":62,"line":125},11,[60,127,128],{"class":66},"      subgraph \"Deployment Pipeline\"\n",[60,130,132],{"class":62,"line":131},12,[60,133,134],{"class":66},"          H --> I[Package Creation]\n",[60,136,138],{"class":62,"line":137},13,[60,139,140],{"class":66},"          I --> K[Canary Environment]\n",[60,142,144],{"class":62,"line":143},14,[60,145,146],{"class":66},"          K --> L[QA Validation]\n",[60,148,150],{"class":62,"line":149},15,[60,151,152],{"class":66},"          L --> M[Main Environment]\n",[60,154,156],{"class":62,"line":155},16,[60,157,122],{"emptyLinePlaceholder":121},[60,159,161],{"class":62,"line":160},17,[60,162,163],{"class":66},"      end\n",[16,165,167],{"id":166},"deployment-pipeline-makeup","Deployment pipeline makeup",[12,169,170],{},"Our deployment approach uses GitLab's native CI/CD capabilities to orchestrate complex deployments across hybrid infrastructure.\nHere's how we do it.",[172,173,175],"h3",{"id":174},"build","Build",[12,177,178],{},"Building GitLab is a complex topic in and of itself, so I'll go over the details at a high level.",[12,180,181],{},"We build both our Omnibus package and our Cloud Native GitLab (CNG) images. The Omnibus packages deploy to our Gitaly fleet (our Git storage layer), while CNG images run all other components as containerized workloads. Other stateful services like Postgres and Redis have grown so large we have dedicated teams managing them separately. For GitLab.com, those systems are not deployed during our Auto-Deploy procedures.",[12,183,184,185,188,189,193],{},"We have a scheduled pipeline that will regularly look at ",[57,186,187],{},"gitlab-org/gitlab"," and search for the most recent commit on the default branch with a successful (“green”) pipeline. Green pipelines signal that every component of GitLab has passed its comprehensive test suite. We then create an ",[190,191,192],"strong",{},"auto-deploy branch"," from that commit.",[12,195,196],{},"This triggers a sequence of events: primarily, the need to build this package and all components that are a part of our monolith.\nAnother scheduled pipeline selects the latest built package and initiates the deployment pipeline. Procedurally, it looks this simple:",[50,198,200],{"className":52,"code":199,"language":54,"meta":55,"style":55},"  graph LR\n      A[Create branch] --> B[Build]\n      B --> C[Choose Built package]\n      C --> D[Start Deploy Pipeline]\n",[57,201,202,207,212,217],{"__ignoreMap":55},[60,203,204],{"class":62,"line":63},[60,205,206],{"class":66},"  graph LR\n",[60,208,209],{"class":62,"line":70},[60,210,211],{"class":66},"      A[Create branch] --> B[Build]\n",[60,213,214],{"class":62,"line":76},[60,215,216],{"class":66},"      B --> C[Choose Built package]\n",[60,218,219],{"class":62,"line":82},[60,220,221],{"class":66},"      C --> D[Start Deploy Pipeline]\n",[12,223,224],{},"Building takes some time, and since deployments can vary due to various circumstances, we choose the latest build to deploy. We technically build more versions of GitLab for .com than will ever be deployed. This enables us to always have a package lined up ready to go, and this brings us the closest we can be to having a full continuously delivered product for .com.",[172,226,228],{"id":227},"environment-based-validation-and-canary-strategy","Environment-based validation and Canary strategy",[12,230,231],{},"Quality assurance (QA) isn't just an afterthought here — it's baked into every layer from development through deployment. Our QA process leverages automated test suites that include unit tests, integration tests, and end-to-end tests that simulate real user interactions with GitLab's features. But more importantly for our deployment pipeline, our QA process works hand-in-hand with our Canary strategy through environment-based validation.",[12,233,234,235,241],{},"As part of our validation approach, we leverage GitLab's native ",[236,237,240],"a",{"href":238,"rel":239},"https://docs.gitlab.com/user/project/canary_deployments/",[],"Canary deployments",", enabling controlled validation of changes with limited traffic exposure before full production deployment. We send roughly 5% of all traffic through our Canary stage. This approach increases the complexity of database migrations, but successfully navigating Canary deployments ensures we deploy a reliable product seamlessly.",[12,243,244],{},"The Canary deployment features you use in GitLab were refined through managing one of the most complex deployment scenarios in production. When you implement Canary deployments for your applications, you're using patterns proven at massive scale.",[12,246,247],{},"Our deployment process follows a progressive rollout strategy:",[249,250,251,257,263,269],"ol",{},[30,252,253,256],{},[190,254,255],{},"Staging Canary:"," Initial validation environment",[30,258,259,262],{},[190,260,261],{},"Production Canary:"," Limited production traffic",[30,264,265,268],{},[190,266,267],{},"Staging Main:"," Full staging environment deployment",[30,270,271,274],{},[190,272,273],{},"Production Main:"," Full production rollout",[50,276,278],{"className":52,"code":277,"language":54,"meta":55,"style":55},"  graph TD\n      C[Staging Canary Deploy]\n      C --> D[QA Smoke Main Stage Tests]\n      C --> E[QA Smoke Canary Stage Tests]\n      D --> F\n      E --> F{Tests Pass?}\n      F -->|Yes| G[Production Canary Deploy]\n      G --> S[QA Smoke Main Stage Tests]\n      G --> T[QA Smoke Canary Stage Tests]\n      F -->|No| H[Issue Creation]\n      H --> K[Fix & Backport]\n      K --> C\n\n      S --> M[Canary Traffic Monitoring]\n      T --> M[Canary Traffic Monitoring baking period]\n      M --> U[Production Safety Checks]\n      U --> N[Staging Main]\n      N --> V[Production Main]\n",[57,279,280,284,289,294,299,304,309,314,319,324,329,334,339,343,348,353,358,363],{"__ignoreMap":55},[60,281,282],{"class":62,"line":63},[60,283,67],{"class":66},[60,285,286],{"class":62,"line":70},[60,287,288],{"class":66},"      C[Staging Canary Deploy]\n",[60,290,291],{"class":62,"line":76},[60,292,293],{"class":66},"      C --> D[QA Smoke Main Stage Tests]\n",[60,295,296],{"class":62,"line":82},[60,297,298],{"class":66},"      C --> E[QA Smoke Canary Stage Tests]\n",[60,300,301],{"class":62,"line":88},[60,302,303],{"class":66},"      D --> F\n",[60,305,306],{"class":62,"line":94},[60,307,308],{"class":66},"      E --> F{Tests Pass?}\n",[60,310,311],{"class":62,"line":100},[60,312,313],{"class":66},"      F -->|Yes| G[Production Canary Deploy]\n",[60,315,316],{"class":62,"line":106},[60,317,318],{"class":66},"      G --> S[QA Smoke Main Stage Tests]\n",[60,320,321],{"class":62,"line":112},[60,322,323],{"class":66},"      G --> T[QA Smoke Canary Stage Tests]\n",[60,325,326],{"class":62,"line":118},[60,327,328],{"class":66},"      F -->|No| H[Issue Creation]\n",[60,330,331],{"class":62,"line":125},[60,332,333],{"class":66},"      H --> K[Fix & Backport]\n",[60,335,336],{"class":62,"line":131},[60,337,338],{"class":66},"      K --> C\n",[60,340,341],{"class":62,"line":137},[60,342,122],{"emptyLinePlaceholder":121},[60,344,345],{"class":62,"line":143},[60,346,347],{"class":66},"      S --> M[Canary Traffic Monitoring]\n",[60,349,350],{"class":62,"line":149},[60,351,352],{"class":66},"      T --> M[Canary Traffic Monitoring baking period]\n",[60,354,355],{"class":62,"line":155},[60,356,357],{"class":66},"      M --> U[Production Safety Checks]\n",[60,359,360],{"class":62,"line":160},[60,361,362],{"class":66},"      U --> N[Staging Main]\n",[60,364,366],{"class":62,"line":365},18,[60,367,368],{"class":66},"      N --> V[Production Main]\n",[12,370,371,372,377],{},"Our QA validation occurs at multiple checkpoints throughout this progressive deployment process: after each Canary deployment, and again after post-deploy migrations. This multilayered approach ensures that each phase of our deployment strategy has its own safety net. You can learn more about ",[236,373,376],{"href":374,"rel":375},"https://handbook.gitlab.com/handbook/engineering/testing/",[],"GitLab's comprehensive testing approach"," in our handbook.",[16,379,381],{"id":380},"deployment-pipeline","Deployment pipeline",[12,383,384],{},"Here are the challenges we address across our deployment pipeline.",[172,386,388],{"id":387},"technical-architecture-considerations","Technical architecture considerations",[12,390,391],{},"GitLab.com represents real-world deployment complexity at scale. As the largest known GitLab instance, deployments use our official GitLab Helm chart and the official Linux package — the same artifacts our customers use. You can learn more about the GitLab.com architecture in our handbook. This hybrid approach means our deployment pipeline must intelligently handle both containerized services and traditional Linux services in the same deployment cycle.",[12,393,394,397,398,403],{},[190,395,396],{},"Dogfooding at scale:"," We deploy using the same procedures we document for ",[236,399,402],{"href":400,"rel":401},"https://docs.gitlab.com/update/zero_downtime/",[],"zero-downtime upgrades",". If something doesn't work smoothly for us, we don't recommend it to customers. This self-imposed constraint drives continuous improvement in our deployment tooling.",[12,405,406],{},"The following stages are run for all environment and stage upgrades:",[50,408,410],{"className":52,"code":409,"language":54,"meta":55,"style":55},"  graph LR\n      a[prep] --> c[Regular Migrations - Canary stage only]\n      a --> f[Assets - Canary stage only]\n      c --> d[Gitaly]\n      d --> k8s\n\n      subgraph subGraph0[\"VM workloads\"]\n        d[\"Gitaly\"]\n      end\n\n      subgraph subGraph1[\"Kubernetes workloads\"]\n        k8s[\"k8s\"]\n      end\n\n      subgraph fleet[\"fleet\"]\n        subGraph0\n        subGraph1\n      end\n",[57,411,412,416,421,426,431,436,440,445,450,454,458,463,468,472,476,481,486,491],{"__ignoreMap":55},[60,413,414],{"class":62,"line":63},[60,415,206],{"class":66},[60,417,418],{"class":62,"line":70},[60,419,420],{"class":66},"      a[prep] --> c[Regular Migrations - Canary stage only]\n",[60,422,423],{"class":62,"line":76},[60,424,425],{"class":66},"      a --> f[Assets - Canary stage only]\n",[60,427,428],{"class":62,"line":82},[60,429,430],{"class":66},"      c --> d[Gitaly]\n",[60,432,433],{"class":62,"line":88},[60,434,435],{"class":66},"      d --> k8s\n",[60,437,438],{"class":62,"line":94},[60,439,122],{"emptyLinePlaceholder":121},[60,441,442],{"class":62,"line":100},[60,443,444],{"class":66},"      subgraph subGraph0[\"VM workloads\"]\n",[60,446,447],{"class":62,"line":106},[60,448,449],{"class":66},"        d[\"Gitaly\"]\n",[60,451,452],{"class":62,"line":112},[60,453,163],{"class":66},[60,455,456],{"class":62,"line":118},[60,457,122],{"emptyLinePlaceholder":121},[60,459,460],{"class":62,"line":125},[60,461,462],{"class":66},"      subgraph subGraph1[\"Kubernetes workloads\"]\n",[60,464,465],{"class":62,"line":131},[60,466,467],{"class":66},"        k8s[\"k8s\"]\n",[60,469,470],{"class":62,"line":137},[60,471,163],{"class":66},[60,473,474],{"class":62,"line":143},[60,475,122],{"emptyLinePlaceholder":121},[60,477,478],{"class":62,"line":149},[60,479,480],{"class":66},"      subgraph fleet[\"fleet\"]\n",[60,482,483],{"class":62,"line":155},[60,484,485],{"class":66},"        subGraph0\n",[60,487,488],{"class":62,"line":160},[60,489,490],{"class":66},"        subGraph1\n",[60,492,493],{"class":62,"line":365},[60,494,163],{"class":66},[12,496,497],{},[190,498,499],{},"Stage details:",[27,501,502,508,514,520,549],{},[30,503,504,507],{},[190,505,506],{},"Prep:"," Validates deployment readiness and performs pre-deployment checks",[30,509,510,513],{},[190,511,512],{},"Migrations:"," Executes database regular migrations. This only happens during the Canary stage. Because both Canary and Main stages share the same database, these changes are already available when the Main stage deploys, eliminating the need to repeat these tasks.",[30,515,516,519],{},[190,517,518],{},"Assets:"," We leverage a GCS bucket for all static assets. If any new assets are created, we upload these to our bucket such that they are immediately available to our Canary stage. As we leverage WebPack for assets, and properly leverage SHAs in the naming of our assets, we can confidently not worry that we override an older asset. Therefore, old assets continue to be available for older deployments and new assets are imemdiately made available when Canary begins its deploy. This only happens during the Canary stage deployment. Because Canary and Main stages share the same asset storage, these changes are already available when the Main stage deploys.",[30,521,522,525,526,534,535,540,541,548],{},[190,523,524],{},"Gitaly:"," Updates Gitaly Virtual Machine storage layer via our Omnibus Linux package on each Gitaly node. This service is unique as we ",[236,527,530,531],{"href":528,"rel":529},"https://gitlab.com/gitlab-org/gitaly/-/blob/master/doc/git-execution-environments.md",[],"bundle it with ",[57,532,533],{},"git",". Therefore, we need to ensure that this service is capable of atomic upgrades. We leverage a ",[236,536,539],{"href":537,"rel":538},"https://gitlab.com/gitlab-org/gitaly/-/tree/master/cmd/gitaly-wrapper",[],"wrapper around Gitaly",", which enables us to install a newer version of Gitaly and make use of the library ",[236,542,545],{"href":543,"rel":544},"https://github.com/cloudflare/tableflip",[],[57,546,547],{},"tableflip"," to cleanly rotate the running Gitaly, ensuring high availability of this service on each of our instances.",[30,550,551,554],{},[190,552,553],{},"Kubernetes:"," Deploys containerized GitLab components via our Helm chart. Note that we deploy to numerous clusters spread across Zones for redundancy, so these are usually broken into their own stages to minimize harm and sometimes allows us to stop mid-deploy if critical issues are detected.",[172,556,558],{"id":557},"multi-version-compatibility-the-hidden-challenge","Multi-version compatibility: The hidden challenge",[12,560,561],{},"As you read our process, you will notice that there's a period of time where our database schema is ahead of the code that the Main stage knows about. This happens because the Canary stage has already deployed new code and runs regular database migrations, but the Main stage is still running the previous version of the code that doesn't know about these new database changes.",[12,563,564,567,568,571],{},[190,565,566],{},"Real-world example:"," Imagine we're adding a new ",[57,569,570],{},"merge_readiness"," field to merge requests. During deployment, some servers are running code that expects this field. while others don't know it exists yet. If we handle this poorly, we break GitLab.com for millions of users. If we handle it well, nobody notices anything happened.",[12,573,574],{},"This occurs with most other services, as well. For example, if a client sends multiple requests, there's a chance one of them might land in our Canary stage; other requests might be directed to the Main stage. This is not too different from a deploy as it does take a decent amount of time to roll through the few thousand Pods that run our services.",[12,576,577],{},"With a few exceptions, the vast majority of our services will run a slightly newer version of that component in Canary for a period of time. In a sense, these scenarios are all transient states. But they can often persist for several hours or days in a live, production environment. Therefore, we must treat them with the same care as permanent states. During any deployment, we have multiple versions of GitLab running simultaneously and they all need to play nicely together.",[16,579,581],{"id":580},"database-operations","Database operations",[12,583,584],{},"Database migrations present a unique challenge in our Canary deployment model. We need schema changes to support new features while maintaining our ability to roll back if issues arise. Our solution involves careful separation of concerns:",[27,586,587,593],{},[30,588,589,592],{},[190,590,591],{},"Regular migrations:"," Run during the Canary stage, designed to be backward-compatible, consists of only reversible changes",[30,594,595,598],{},[190,596,597],{},"Post-deploy migrations:"," The \"point of no return\" migrations that happen only after multiple successful deployments",[12,600,601],{},"Database changes are handled with precision and extensive validation procedures:",[50,603,605],{"className":52,"code":604,"language":54,"meta":55,"style":55},"  graph LR\n      A[Regular Migrations] --> B[Canary Stage Deploy]\n      B --> C[Main Stage Deploy]\n      C --> D[Post Deploy Migrations]\n\n",[57,606,607,611,616,621],{"__ignoreMap":55},[60,608,609],{"class":62,"line":63},[60,610,206],{"class":66},[60,612,613],{"class":62,"line":70},[60,614,615],{"class":66},"      A[Regular Migrations] --> B[Canary Stage Deploy]\n",[60,617,618],{"class":62,"line":76},[60,619,620],{"class":66},"      B --> C[Main Stage Deploy]\n",[60,622,623],{"class":62,"line":82},[60,624,625],{"class":66},"      C --> D[Post Deploy Migrations]\n",[172,627,629],{"id":628},"post-deploy-migrations","Post-deploy migrations",[12,631,632],{},"GitLab deployments involve many components. Updating GitLab is not atomic, so many components must be backward-compatible.",[12,634,635,636,640],{},"Post-deploy migrations often contain changes that can't be easily rolled back — think data transformations, column drops, or structural changes that would break older code versions. By running them ",[637,638,639],"em",{},"after"," we've gained confidence through multiple successful deployments, we ensure:",[249,642,643,649,655,661],{},[30,644,645,648],{},[190,646,647],{},"The new code is stable"," and we're unlikely to need a rollback",[30,650,651,654],{},[190,652,653],{},"Performance characteristics"," are well understood in production",[30,656,657,660],{},[190,658,659],{},"Any edge cases"," have been discovered and addressed",[30,662,663,666],{},[190,664,665],{},"The blast radius"," is minimized if something does go wrong",[12,668,669],{},"This approach provides the optimal balance: enabling rapid feature deployment through Canary releases while maintaining rollback capabilities until we have high confidence in deployment stability.",[12,671,672,675],{},[190,673,674],{},"The expand-migrate-contract pattern:"," Our database, frontend, and application compatibility changes follow a carefully orchestrated three-phase approach.",[249,677,678,684,690],{},[30,679,680,683],{},[190,681,682],{},"Expand:"," Add new structures (columns, indexes) while keeping old ones functional",[30,685,686,689],{},[190,687,688],{},"Migrate:"," Deploy new application code that uses the new structures",[30,691,692,695],{},[190,693,694],{},"Contract:"," Remove old structures in post-deploy migrations after everything is stable",[12,697,698,700,701,703],{},[190,699,566],{}," When adding a new ",[57,702,570],{}," column to merge requests:",[249,705,706,711],{},[30,707,708,710],{},[190,709,682],{}," Add the new column with a default value; existing code ignores it",[30,712,713,715],{},[190,714,688],{}," Deploy code that reads and writes to the new column while still supporting the old approach",[12,717,718,719,721],{},"3 ",[190,720,694],{}," After several successful deployments, remove the old column in a post-deploy migration",[12,723,724,725,730],{},"All database operations, application code, frontend code, and more, are subject to a set of guidelines that Engineering must adhere to, which can be found in our ",[236,726,729],{"href":727,"rel":728},"https://docs.gitlab.com/development/multi_version_compatibility/",[],"Multi-Version Compatibility documentation",".",[16,732,734],{"id":733},"results-and-impact","Results and impact",[12,736,737],{},"Our deployment infrastructure delivers measurable benefits:",[12,739,740],{},[190,741,742],{},"For GitLab",[27,744,745,748,751,754],{},[30,746,747],{},"Up to 12 deployments daily to GitLab.com",[30,749,750],{},"Zero-downtime deployments serving millions of developers",[30,752,753],{},"Security patches can reach production within hours, not days",[30,755,756],{},"New features validated in production at massive scale before general availability",[12,758,759],{},[190,760,761],{},"For customers",[27,763,764,767,770,773],{},[30,765,766],{},"Proven deployment patterns you can adopt for your own applications",[30,768,769],{},"Features battle-tested on the world's largest GitLab instance before reaching your environment",[30,771,772],{},"Documentation that reflects actual production practices, not theoretical best practices",[30,774,775],{},"Confidence that GitLab's recommended upgrade procedures work at any scale",[16,777,779],{"id":778},"key-takeaways-for-engineering-teams","Key takeaways for engineering teams",[12,781,782],{},"GitLab's deployment pipeline represents a sophisticated system that balances deployment velocity with operational reliability. The progressive deployment model, comprehensive testing integration, and robust rollback capabilities provide a foundation for reliable software delivery at scale.",[12,784,785],{},"For engineering teams implementing similar systems, key considerations include:",[27,787,788,794,800,806],{},[30,789,790,793],{},[190,791,792],{},"Automated testing:"," Comprehensive test coverage throughout the deployment pipeline",[30,795,796,799],{},[190,797,798],{},"Progressive rollout:"," Staged deployments to minimize risk and enable rapid recovery",[30,801,802,805],{},[190,803,804],{},"Monitoring integration:"," Comprehensive observability across all deployment stages",[30,807,808,811],{},[190,809,810],{},"Incident response:"," Rapid detection and resolution capabilities for deployment issues",[12,813,814],{},"GitLab's architecture demonstrates how modern CI/CD systems can manage the complexity of large-scale deployments while maintaining the velocity required for competitive software development.",[16,816,818],{"id":817},"important-note-on-scope","Important note on scope",[12,820,821,822,825,826,829],{},"This article specifically covers the deployment pipeline for services that are part of the ",[190,823,824],{},"GitLab Omnibus package"," and ",[190,827,828],{},"Helm chart"," — essentially the core GitLab monolith and its tightly integrated components.",[12,831,832,833,836,837,840],{},"However, GitLab's infrastructure landscape extends beyond what's described here. Other services, notably our ",[190,834,835],{},"AI services"," and services that might be in a ",[190,838,839],{},"proof of concept state",", follow a different deployment approach using our internal platform called Runway.",[12,842,843,844,730],{},"If you're working with or curious about these other services, you can find more information in the ",[236,845,848],{"href":846,"rel":847},"https://docs.runway.gitlab.com",[],"Runway documentation",[12,850,851,852,855,856,730],{},"Other offerings, such as GitLab Dedicated are deployed more in alignment with what we expect customers to be capable of performing themselves by way of the ",[190,853,854],{},"GitLab Environment Toolkit",". If you'd like to learn more, check out the ",[236,857,860],{"href":858,"rel":859},"https://gitlab.com/gitlab-org/gitlab-environment-toolkit",[],"GitLab Environment Toolkit project",[12,862,863],{},"The deployment strategies, architectural considerations, and pipeline complexities outlined in this article represent the battle-tested approach we use for our core platform — but like any large engineering organization, we have multiple deployment strategies tailored to different service types and maturity levels.",[12,865,866],{},"Further documentation about Auto-Deploy and our procedures can be found at the below links:",[27,868,869,876],{},[30,870,871],{},[236,872,875],{"href":873,"rel":874},"https://handbook.gitlab.com/handbook/engineering/deployments-and-releases/deployments/",[],"Engineering Deployments",[30,877,878],{},[236,879,882],{"href":880,"rel":881},"https://gitlab-org.gitlab.io/release/docs/",[],"Release Procedural Documentation",[16,884,886],{"id":885},"more-resources","More resources",[27,888,889,896,903],{},[30,890,891],{},[236,892,895],{"href":893,"rel":894},"https://about.gitlab.com/blog/how-we-decreased-gitlab-repo-backup-times-from-48-hours-to-41-minutes/",[],"How we decreased GitLab repo backup times from 48 hours to 41 minutes",[30,897,898],{},[236,899,902],{"href":900,"rel":901},"https://about.gitlab.com/blog/how-we-supercharged-gitlab-ci-statuses-with-websockets/",[],"How we supercharged GitLab CI statuses with WebSockets",[30,904,905],{},[236,906,909],{"href":907,"rel":908},"https://about.gitlab.com/blog/how-we-reduced-mr-review-time-with-value-stream-management/",[],"How we reduced MR review time with Value Stream Management",[911,912,913],"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":55,"searchDepth":70,"depth":70,"links":915},[916,917,918,922,926,929,930,931,932],{"id":18,"depth":70,"text":19},{"id":44,"depth":70,"text":45},{"id":166,"depth":70,"text":167,"children":919},[920,921],{"id":174,"depth":76,"text":175},{"id":227,"depth":76,"text":228},{"id":380,"depth":70,"text":381,"children":923},[924,925],{"id":387,"depth":76,"text":388},{"id":557,"depth":76,"text":558},{"id":580,"depth":70,"text":581,"children":927},[928],{"id":628,"depth":76,"text":629},{"id":733,"depth":70,"text":734},{"id":778,"depth":70,"text":779},{"id":817,"depth":70,"text":818},{"id":885,"depth":70,"text":886},"engineering","2025-12-01","Take a deep technical dive into GitLab.com's deployment pipeline, including progressive rollouts, Canary strategies, database migrations, and multiversion compatibility.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1764108112/tyntnsy3xotlmehtnfkb.png",{},"/en-us/blog/continuously-deploying-the-largest-gitlab-instance",{"noIndex":942,"title":943,"description":944},false,"Deploying the world's largest GitLab instance 12 times daily","Take a deep dive into the code-to-production pipeline, including progressive rollouts, Canary strategies, database migrations, and multiversion compatibility.","continuously-deploying-the-largest-gitlab-instance","en-us/blog/continuously-deploying-the-largest-gitlab-instance",[948,949],"product","inside GitLab","BlogPost","QBxAhQPQxRLDusJ8CvjuFABzLTPXRJAv4FVmBVSjcZo",{"logo":953,"freeTrial":958,"sales":963,"login":968,"items":973,"search":1300,"minimal":1331,"duo":1350,"switchNav":1359,"pricingDeployment":1370},{"config":954},{"href":955,"dataGaName":956,"dataGaLocation":957},"/","gitlab logo","header",{"text":959,"config":960},"Get free trial",{"href":961,"dataGaName":962,"dataGaLocation":957},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":964,"config":965},"Request a demo",{"href":966,"dataGaName":967,"dataGaLocation":957},"/sales/?contact-topic=request-demo","sales",{"text":969,"config":970},"Sign in",{"href":971,"dataGaName":972,"dataGaLocation":957},"https://gitlab.com/users/sign_in/","sign in",[974,1003,1103,1108,1222,1278],{"text":975,"config":976,"menu":978},"Platform",{"dataNavLevelOne":977},"platform",{"type":979,"columns":980},"cards",[981,987,995],{"title":975,"description":982,"link":983},"The intelligent orchestration platform for DevSecOps",{"text":984,"config":985},"Explore our Platform",{"href":986,"dataGaName":977,"dataGaLocation":957},"/platform/",{"title":988,"description":989,"link":990},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":991,"config":992},"Meet GitLab Duo",{"href":993,"dataGaName":994,"dataGaLocation":957},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":996,"description":997,"link":998},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":999,"config":1000},"Learn more",{"href":1001,"dataGaName":1002,"dataGaLocation":957},"/why-gitlab/","why gitlab",{"text":1004,"left":121,"config":1005,"menu":1007},"Product",{"dataNavLevelOne":1006},"solutions",{"type":1008,"link":1009,"columns":1013,"feature":1082},"lists",{"text":1010,"config":1011},"View all Solutions",{"href":1012,"dataGaName":1006,"dataGaLocation":957},"/solutions/",[1014,1038,1061],{"title":1015,"description":1016,"link":1017,"items":1022},"Automation","CI/CD and automation to accelerate deployment",{"config":1018},{"icon":1019,"href":1020,"dataGaName":1021,"dataGaLocation":957},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1023,1027,1030,1034],{"text":1024,"config":1025},"CI/CD",{"href":1026,"dataGaLocation":957,"dataGaName":1024},"/solutions/continuous-integration/",{"text":988,"config":1028},{"href":993,"dataGaLocation":957,"dataGaName":1029},"gitlab duo agent platform - product menu",{"text":1031,"config":1032},"Source Code Management",{"href":1033,"dataGaLocation":957,"dataGaName":1031},"/solutions/source-code-management/",{"text":1035,"config":1036},"Automated Software Delivery",{"href":1020,"dataGaLocation":957,"dataGaName":1037},"Automated software delivery",{"title":1039,"description":1040,"link":1041,"items":1046},"Security","Deliver code faster without compromising security",{"config":1042},{"href":1043,"dataGaName":1044,"dataGaLocation":957,"icon":1045},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1047,1051,1056],{"text":1048,"config":1049},"Application Security Testing",{"href":1043,"dataGaName":1050,"dataGaLocation":957},"Application security testing",{"text":1052,"config":1053},"Software Supply Chain Security",{"href":1054,"dataGaLocation":957,"dataGaName":1055},"/solutions/supply-chain/","Software supply chain security",{"text":1057,"config":1058},"Software Compliance",{"href":1059,"dataGaName":1060,"dataGaLocation":957},"/solutions/software-compliance/","software compliance",{"title":1062,"link":1063,"items":1068},"Measurement",{"config":1064},{"icon":1065,"href":1066,"dataGaName":1067,"dataGaLocation":957},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1069,1073,1077],{"text":1070,"config":1071},"Visibility & Measurement",{"href":1066,"dataGaLocation":957,"dataGaName":1072},"Visibility and Measurement",{"text":1074,"config":1075},"Value Stream Management",{"href":1076,"dataGaLocation":957,"dataGaName":1074},"/solutions/value-stream-management/",{"text":1078,"config":1079},"Analytics & Insights",{"href":1080,"dataGaLocation":957,"dataGaName":1081},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1083,"type":1008,"items":1084},"GitLab for",[1085,1091,1097],{"text":1086,"config":1087},"Enterprise",{"icon":1088,"href":1089,"dataGaLocation":957,"dataGaName":1090},"Building","/enterprise/","enterprise",{"text":1092,"config":1093},"Small Business",{"icon":1094,"href":1095,"dataGaLocation":957,"dataGaName":1096},"Work","/small-business/","small business",{"text":1098,"config":1099},"Public Sector",{"icon":1100,"href":1101,"dataGaLocation":957,"dataGaName":1102},"Organization","/solutions/public-sector/","public sector",{"text":1104,"config":1105},"Pricing",{"href":1106,"dataGaName":1107,"dataGaLocation":957,"dataNavLevelOne":1107},"/pricing/","pricing",{"text":1109,"config":1110,"menu":1112},"Resources",{"dataNavLevelOne":1111},"resources",{"type":1008,"link":1113,"columns":1117,"feature":1211},{"text":1114,"config":1115},"View all resources",{"href":1116,"dataGaName":1111,"dataGaLocation":957},"/resources/",[1118,1151,1178],{"title":1119,"items":1120},"Getting started",[1121,1126,1131,1136,1141,1146],{"text":1122,"config":1123},"Install",{"href":1124,"dataGaName":1125,"dataGaLocation":957},"/install/","install",{"text":1127,"config":1128},"Quick start guides",{"href":1129,"dataGaName":1130,"dataGaLocation":957},"/get-started/","quick setup checklists",{"text":1132,"config":1133},"Learn",{"href":1134,"dataGaLocation":957,"dataGaName":1135},"https://university.gitlab.com/","learn",{"text":1137,"config":1138},"Product documentation",{"href":1139,"dataGaName":1140,"dataGaLocation":957},"https://docs.gitlab.com/","product documentation",{"text":1142,"config":1143},"Best practice videos",{"href":1144,"dataGaName":1145,"dataGaLocation":957},"/getting-started-videos/","best practice videos",{"text":1147,"config":1148},"Integrations",{"href":1149,"dataGaName":1150,"dataGaLocation":957},"/integrations/","integrations",{"title":1152,"items":1153},"Discover",[1154,1159,1164,1169,1173],{"text":1155,"config":1156},"Customer success stories",{"href":1157,"dataGaName":1158,"dataGaLocation":957},"/customers/","customer success stories",{"text":1160,"config":1161},"Blog",{"href":1162,"dataGaName":1163,"dataGaLocation":957},"/blog/","blog",{"text":1165,"config":1166},"Demo Hub",{"href":1167,"dataGaName":1168,"dataGaLocation":957},"/demo-hub/","demo hub",{"text":1170,"config":1171},"The Source",{"href":1172,"dataGaName":1163,"dataGaLocation":957},"/the-source/",{"text":1174,"config":1175},"Remote",{"href":1176,"dataGaName":1177,"dataGaLocation":957},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1179,"items":1180},"Connect",[1181,1186,1191,1196,1201,1206],{"text":1182,"config":1183},"GitLab Services",{"href":1184,"dataGaName":1185,"dataGaLocation":957},"/services/","services",{"text":1187,"config":1188},"Contribute",{"href":1189,"dataGaName":1190,"dataGaLocation":957},"https://contributors.gitlab.com","contribute",{"text":1192,"config":1193},"Community",{"href":1194,"dataGaName":1195,"dataGaLocation":957},"/community/","community",{"text":1197,"config":1198},"Forum",{"href":1199,"dataGaName":1200,"dataGaLocation":957},"https://forum.gitlab.com/","forum",{"text":1202,"config":1203},"Events",{"href":1204,"dataGaName":1205,"dataGaLocation":957},"/events/","events",{"text":1207,"config":1208},"Partners",{"href":1209,"dataGaName":1210,"dataGaLocation":957},"/partners/","partners",{"config":1212,"title":1215,"text":1216,"link":1217},{"background":1213,"textColor":1214},"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":1218,"config":1219},"Read the latest",{"href":1220,"dataGaName":1221,"dataGaLocation":957},"/whats-new/","whats new",{"text":1223,"config":1224,"menu":1226},"Company",{"dataNavLevelOne":1225},"company",{"type":1008,"columns":1227},[1228],{"items":1229},[1230,1235,1241,1243,1248,1253,1258,1263,1268,1273],{"text":1231,"config":1232},"About",{"href":1233,"dataGaName":1234,"dataGaLocation":957},"/company/","about",{"text":1236,"config":1237,"footerGa":1240},"Jobs",{"href":1238,"dataGaName":1239,"dataGaLocation":957},"/jobs/","jobs",{"dataGaName":1239},{"text":1202,"config":1242},{"href":1204,"dataGaName":1205,"dataGaLocation":957},{"text":1244,"config":1245},"Leadership",{"href":1246,"dataGaName":1247,"dataGaLocation":957},"/company/team/e-group/","leadership",{"text":1249,"config":1250},"Handbook",{"href":1251,"dataGaName":1252,"dataGaLocation":957},"https://handbook.gitlab.com/","handbook",{"text":1254,"config":1255},"Investor relations",{"href":1256,"dataGaName":1257,"dataGaLocation":957},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1259,"config":1260},"Trust Center",{"href":1261,"dataGaName":1262,"dataGaLocation":957},"/security/","trust center",{"text":1264,"config":1265},"AI Transparency Center",{"href":1266,"dataGaName":1267,"dataGaLocation":957},"/ai-transparency-center/","ai transparency center",{"text":1269,"config":1270},"Newsletter",{"href":1271,"dataGaName":1272,"dataGaLocation":957},"/company/contact/#contact-forms","newsletter",{"text":1274,"config":1275},"Press",{"href":1276,"dataGaName":1277,"dataGaLocation":957},"/press/","press",{"text":1279,"config":1280,"menu":1281},"Contact us",{"dataNavLevelOne":1225},{"type":1008,"columns":1282},[1283],{"items":1284},[1285,1290,1295],{"text":1286,"config":1287},"Talk to sales",{"href":1288,"dataGaName":1289,"dataGaLocation":957},"/sales/","talk to sales",{"text":1291,"config":1292},"Support portal",{"href":1293,"dataGaName":1294,"dataGaLocation":957},"https://support.gitlab.com/hc/en-us","support portal",{"text":1296,"config":1297},"Customer portal",{"href":1298,"dataGaName":1299,"dataGaLocation":957},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1301,"login":1302,"suggestions":1309},"Close",{"text":1303,"link":1304},"To search repositories and projects, login to",{"text":1305,"config":1306},"gitlab.com",{"href":971,"dataGaName":1307,"dataGaLocation":1308},"search login","search",{"text":1310,"default":1311},"Suggestions",[1312,1314,1318,1320,1324,1328],{"text":988,"config":1313},{"href":993,"dataGaName":988,"dataGaLocation":1308},{"text":1315,"config":1316},"Code Suggestions (AI)",{"href":1317,"dataGaName":1315,"dataGaLocation":1308},"/solutions/code-suggestions/",{"text":1024,"config":1319},{"href":1026,"dataGaName":1024,"dataGaLocation":1308},{"text":1321,"config":1322},"GitLab on AWS",{"href":1323,"dataGaName":1321,"dataGaLocation":1308},"/partners/technology-partners/aws/",{"text":1325,"config":1326},"GitLab on Google Cloud",{"href":1327,"dataGaName":1325,"dataGaLocation":1308},"/partners/technology-partners/google-cloud-platform/",{"text":1329,"config":1330},"Why GitLab?",{"href":1001,"dataGaName":1329,"dataGaLocation":1308},{"freeTrial":1332,"mobileIcon":1337,"desktopIcon":1342,"secondaryButton":1345},{"text":1333,"config":1334},"Start free trial",{"href":1335,"dataGaName":962,"dataGaLocation":1336},"https://gitlab.com/-/trials/new/","nav",{"altText":1338,"config":1339},"Gitlab Icon",{"src":1340,"dataGaName":1341,"dataGaLocation":1336},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1338,"config":1343},{"src":1344,"dataGaName":1341,"dataGaLocation":1336},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1346,"config":1347},"Get Started",{"href":1348,"dataGaName":1349,"dataGaLocation":1336},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1351,"mobileIcon":1355,"desktopIcon":1357},{"text":1352,"config":1353},"Learn more about GitLab Duo",{"href":993,"dataGaName":1354,"dataGaLocation":1336},"gitlab duo",{"altText":1338,"config":1356},{"src":1340,"dataGaName":1341,"dataGaLocation":1336},{"altText":1338,"config":1358},{"src":1344,"dataGaName":1341,"dataGaLocation":1336},{"button":1360,"mobileIcon":1365,"desktopIcon":1367},{"text":1361,"config":1362},"/switch",{"href":1363,"dataGaName":1364,"dataGaLocation":1336},"#contact","switch",{"altText":1338,"config":1366},{"src":1340,"dataGaName":1341,"dataGaLocation":1336},{"altText":1338,"config":1368},{"src":1369,"dataGaName":1341,"dataGaLocation":1336},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1371,"mobileIcon":1376,"desktopIcon":1378},{"text":1372,"config":1373},"Back to pricing",{"href":1106,"dataGaName":1374,"dataGaLocation":1336,"icon":1375},"back to pricing","GoBack",{"altText":1338,"config":1377},{"src":1340,"dataGaName":1341,"dataGaLocation":1336},{"altText":1338,"config":1379},{"src":1344,"dataGaName":1341,"dataGaLocation":1336},{"title":1381,"titleMobile":1382,"button":1383,"config":1388},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":999,"config":1384},{"href":1385,"dataGaName":1386,"dataGaLocation":1387},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1389,"disabled":942},"release",{"data":1391},{"text":1392,"source":1393,"edit":1399,"contribute":1404,"config":1409,"items":1414,"minimal":1624},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1394,"config":1395},"View page source",{"href":1396,"dataGaName":1397,"dataGaLocation":1398},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1400,"config":1401},"Edit this page",{"href":1402,"dataGaName":1403,"dataGaLocation":1398},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1405,"config":1406},"Please contribute",{"href":1407,"dataGaName":1408,"dataGaLocation":1398},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1410,"facebook":1411,"youtube":1412,"linkedin":1413},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1415,1462,1516,1560,1592],{"title":1104,"links":1416,"subMenu":1431},[1417,1421,1426],{"text":1418,"config":1419},"View plans",{"href":1106,"dataGaName":1420,"dataGaLocation":1398},"view plans",{"text":1422,"config":1423},"Why Premium?",{"href":1424,"dataGaName":1425,"dataGaLocation":1398},"/pricing/premium/","why premium",{"text":1427,"config":1428},"Why Ultimate?",{"href":1429,"dataGaName":1430,"dataGaLocation":1398},"/pricing/ultimate/","why ultimate",[1432],{"title":1433,"links":1434},"Contact Us",[1435,1438,1440,1442,1447,1452,1457],{"text":1436,"config":1437},"Contact sales",{"href":1288,"dataGaName":967,"dataGaLocation":1398},{"text":1291,"config":1439},{"href":1293,"dataGaName":1294,"dataGaLocation":1398},{"text":1296,"config":1441},{"href":1298,"dataGaName":1299,"dataGaLocation":1398},{"text":1443,"config":1444},"Status",{"href":1445,"dataGaName":1446,"dataGaLocation":1398},"https://status.gitlab.com/","status",{"text":1448,"config":1449},"Terms of use",{"href":1450,"dataGaName":1451,"dataGaLocation":1398},"/terms/","terms of use",{"text":1453,"config":1454},"Privacy statement",{"href":1455,"dataGaName":1456,"dataGaLocation":1398},"/privacy/","privacy statement",{"text":1458,"config":1459},"Cookie preferences",{"dataGaName":1460,"dataGaLocation":1398,"id":1461,"isOneTrustButton":121},"cookie preferences","ot-sdk-btn",{"title":1004,"links":1463,"subMenu":1472},[1464,1468],{"text":1465,"config":1466},"DevSecOps platform",{"href":986,"dataGaName":1467,"dataGaLocation":1398},"devsecops platform",{"text":1469,"config":1470},"AI-Assisted Development",{"href":993,"dataGaName":1471,"dataGaLocation":1398},"ai-assisted development",[1473],{"title":1474,"links":1475},"Topics",[1476,1481,1486,1491,1496,1501,1506,1511],{"text":1477,"config":1478},"CICD",{"href":1479,"dataGaName":1480,"dataGaLocation":1398},"/topics/ci-cd/","cicd",{"text":1482,"config":1483},"GitOps",{"href":1484,"dataGaName":1485,"dataGaLocation":1398},"/topics/gitops/","gitops",{"text":1487,"config":1488},"DevOps",{"href":1489,"dataGaName":1490,"dataGaLocation":1398},"/topics/devops/","devops",{"text":1492,"config":1493},"Version Control",{"href":1494,"dataGaName":1495,"dataGaLocation":1398},"/topics/version-control/","version control",{"text":1497,"config":1498},"DevSecOps",{"href":1499,"dataGaName":1500,"dataGaLocation":1398},"/topics/devsecops/","devsecops",{"text":1502,"config":1503},"Cloud Native",{"href":1504,"dataGaName":1505,"dataGaLocation":1398},"/topics/cloud-native/","cloud native",{"text":1507,"config":1508},"AI for Coding",{"href":1509,"dataGaName":1510,"dataGaLocation":1398},"/topics/devops/ai-for-coding/","ai for coding",{"text":1512,"config":1513},"Agentic AI",{"href":1514,"dataGaName":1515,"dataGaLocation":1398},"/topics/agentic-ai/","agentic ai",{"title":1517,"links":1518},"Solutions",[1519,1521,1523,1528,1532,1535,1539,1542,1544,1547,1550,1555],{"text":1048,"config":1520},{"href":1043,"dataGaName":1048,"dataGaLocation":1398},{"text":1037,"config":1522},{"href":1020,"dataGaName":1021,"dataGaLocation":1398},{"text":1524,"config":1525},"Agile development",{"href":1526,"dataGaName":1527,"dataGaLocation":1398},"/solutions/agile-delivery/","agile delivery",{"text":1529,"config":1530},"SCM",{"href":1033,"dataGaName":1531,"dataGaLocation":1398},"source code management",{"text":1477,"config":1533},{"href":1026,"dataGaName":1534,"dataGaLocation":1398},"continuous integration & delivery",{"text":1536,"config":1537},"Value stream management",{"href":1076,"dataGaName":1538,"dataGaLocation":1398},"value stream management",{"text":1482,"config":1540},{"href":1541,"dataGaName":1485,"dataGaLocation":1398},"/solutions/gitops/",{"text":1086,"config":1543},{"href":1089,"dataGaName":1090,"dataGaLocation":1398},{"text":1545,"config":1546},"Small business",{"href":1095,"dataGaName":1096,"dataGaLocation":1398},{"text":1548,"config":1549},"Public sector",{"href":1101,"dataGaName":1102,"dataGaLocation":1398},{"text":1551,"config":1552},"Education",{"href":1553,"dataGaName":1554,"dataGaLocation":1398},"/solutions/education/","education",{"text":1556,"config":1557},"Financial services",{"href":1558,"dataGaName":1559,"dataGaLocation":1398},"/solutions/finance/","financial services",{"title":1109,"links":1561},[1562,1564,1566,1568,1571,1573,1576,1578,1580,1582,1584,1586,1588,1590],{"text":1122,"config":1563},{"href":1124,"dataGaName":1125,"dataGaLocation":1398},{"text":1127,"config":1565},{"href":1129,"dataGaName":1130,"dataGaLocation":1398},{"text":1132,"config":1567},{"href":1134,"dataGaName":1135,"dataGaLocation":1398},{"text":1137,"config":1569},{"href":1139,"dataGaName":1570,"dataGaLocation":1398},"docs",{"text":1160,"config":1572},{"href":1162,"dataGaName":1163,"dataGaLocation":1398},{"text":1574,"config":1575},"What's new",{"href":1220,"dataGaName":1221,"dataGaLocation":1398},{"text":1155,"config":1577},{"href":1157,"dataGaName":1158,"dataGaLocation":1398},{"text":1174,"config":1579},{"href":1176,"dataGaName":1177,"dataGaLocation":1398},{"text":1182,"config":1581},{"href":1184,"dataGaName":1185,"dataGaLocation":1398},{"text":1187,"config":1583},{"href":1189,"dataGaName":1190,"dataGaLocation":1398},{"text":1192,"config":1585},{"href":1194,"dataGaName":1195,"dataGaLocation":1398},{"text":1197,"config":1587},{"href":1199,"dataGaName":1200,"dataGaLocation":1398},{"text":1202,"config":1589},{"href":1204,"dataGaName":1205,"dataGaLocation":1398},{"text":1207,"config":1591},{"href":1209,"dataGaName":1210,"dataGaLocation":1398},{"title":1223,"links":1593},[1594,1596,1598,1600,1602,1604,1608,1613,1615,1617,1619],{"text":1231,"config":1595},{"href":1233,"dataGaName":1225,"dataGaLocation":1398},{"text":1236,"config":1597},{"href":1238,"dataGaName":1239,"dataGaLocation":1398},{"text":1244,"config":1599},{"href":1246,"dataGaName":1247,"dataGaLocation":1398},{"text":1249,"config":1601},{"href":1251,"dataGaName":1252,"dataGaLocation":1398},{"text":1254,"config":1603},{"href":1256,"dataGaName":1257,"dataGaLocation":1398},{"text":1605,"config":1606},"Sustainability",{"href":1607,"dataGaName":1605,"dataGaLocation":1398},"/sustainability/",{"text":1609,"config":1610},"Diversity, inclusion and belonging (DIB)",{"href":1611,"dataGaName":1612,"dataGaLocation":1398},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1259,"config":1614},{"href":1261,"dataGaName":1262,"dataGaLocation":1398},{"text":1269,"config":1616},{"href":1271,"dataGaName":1272,"dataGaLocation":1398},{"text":1274,"config":1618},{"href":1276,"dataGaName":1277,"dataGaLocation":1398},{"text":1620,"config":1621},"Modern Slavery Transparency Statement",{"href":1622,"dataGaName":1623,"dataGaLocation":1398},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1625},[1626,1629,1632],{"text":1627,"config":1628},"Terms",{"href":1450,"dataGaName":1451,"dataGaLocation":1398},{"text":1630,"config":1631},"Cookies",{"dataGaName":1460,"dataGaLocation":1398,"id":1461,"isOneTrustButton":121},{"text":1633,"config":1634},"Privacy",{"href":1455,"dataGaName":1456,"dataGaLocation":1398},[1636],{"id":1637,"title":7,"body":937,"config":1638,"content":1641,"description":937,"extension":1644,"meta":1645,"navigation":121,"path":1646,"seo":1647,"stem":1648,"__hash__":1649},"blogAuthors/en-us/blog/authors/john-skarbek.yml",{"template":1639,"gitlabHandle":1640},"BlogAuthor","skarbek",{"name":7,"config":1642},{"headshot":1643},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1751303547/nq8dxitzoybran2r7crm.png","yml",{},"/en-us/blog/authors/john-skarbek",{},"en-us/blog/authors/john-skarbek","nCwAkCMUv4nyRXTlh0-D0dgPvTS8mamZO-9zskk_RKQ",[1651,1660,1668],{"title":1652,"description":1653,"heroImage":1654,"category":933,"date":1655,"authors":1656,"slug":1659,"externalUrl":937},"Confidential AI for GitLab Self-Hosted","Give developers AI coding agents in GitLab Duo without source code leaving a hardware-encrypted boundary — no GPUs needed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[1657,1658],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1661,"description":1662,"heroImage":1663,"category":933,"date":1664,"authors":1665,"slug":1667,"externalUrl":937},"Green DevOps: Why carbon measurement belongs in your CI/CD pipeline","CI/CD pipelines have a hidden carbon cost. Here's why measuring it matters, and how you can get started with Eco CI and Carmen in GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[1666],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1669,"description":1670,"heroImage":1671,"category":933,"date":1672,"authors":1673,"slug":1675,"externalUrl":937},"How to build CI/CD observability at scale","This practical guide to GitLab pipeline analytics helps self-managed users gain operational insights using Prometheus and Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[1674],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1677},[1678,1692,1703,1715],{"id":1679,"categories":1680,"header":1682,"text":1683,"button":1684,"image":1689},"ai-modernization",[1681],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1685,"config":1686},"Get your AI maturity score",{"href":1687,"dataGaName":1688,"dataGaLocation":1163},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1690},{"src":1691},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1693,"categories":1694,"header":1695,"text":1683,"button":1696,"image":1700},"devops-modernization",[948,1500],"Are you just managing tools or shipping innovation?",{"text":1697,"config":1698},"Get your DevOps maturity score",{"href":1699,"dataGaName":1688,"dataGaLocation":1163},"/assessments/devops-modernization-assessment/",{"config":1701},{"src":1702},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1704,"categories":1705,"header":1707,"text":1683,"button":1708,"image":1712},"security-modernization",[1706],"security","Are you trading speed for security?",{"text":1709,"config":1710},"Get your security maturity score",{"href":1711,"dataGaName":1688,"dataGaLocation":1163},"/assessments/security-modernization-assessment/",{"config":1713},{"src":1714},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1716,"paths":1717,"header":1720,"text":1721,"button":1722,"image":1727},"github-azure-migration",[1718,1719],"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":1723,"config":1724},"See how GitLab compares to GitHub",{"href":1725,"dataGaName":1726,"dataGaLocation":1163},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1728},{"src":1702},{"header":1730,"blurb":1731,"button":1732,"secondaryButton":1737},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1733,"config":1734},"Get your free trial",{"href":1735,"dataGaName":962,"dataGaLocation":1736},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1436,"config":1738},{"href":1288,"dataGaName":967,"dataGaLocation":1736},1786803746147]