[{"data":1,"prerenderedAt":1038},["ShallowReactive",2],{"/blog/how-we-scale-gitlab-by-having-docker-built-in":3,"navigation-en-us":275,"banner-en-us":706,"footer-en-us":716,"blog-post-authors-en-us-DJ Mountney":977,"blog-related-posts-en-us-how-we-scale-gitlab-by-having-docker-built-in":993,"blog-share-wrapper-en-us":1018,"next-steps-en-us":1028},{"id":4,"title":5,"authors":6,"body":8,"category":241,"date":242,"description":39,"extension":243,"externalUrl":244,"faq":244,"featured":245,"heroImage":246,"meta":247,"navigation":265,"path":266,"seo":267,"slug":271,"stem":272,"tags":244,"template":273,"updatedDate":244,"__hash__":274},"blogPosts/en-us/blog/how-we-scale-gitlab-by-having-docker-built-in.md","How we scale GitLab by having Docker built in",[7],"DJ Mountney",{"type":9,"value":10,"toc":225},"minimark",[11,15,37,40,45,53,60,63,66,70,75,82,90,98,102,117,120,129,133,146,149,156,160,164,173,185,197,201,210,218,222],[12,13,14],"p",{},"Our Docker image is a great way to\nquickly bring up an instance of GitLab. You can use it to try new features, or\nmount the storage volumes and use it for all your GitLab needs.",[12,16,17,18,24,25,30,31,36],{},"It has been over two years since we started thinking about ",[19,20,23],"a",{"href":21,"rel":22},"https://gitlab.com/gitlab-org/omnibus-gitlab/issues/59",[],"Docker and GitLab together",".\nIn those years we have pushed over 100 CE and EE docker images to ",[19,26,29],{"href":27,"rel":28},"https://hub.docker.com/u/gitlab/",[],"Docker Hub",",\nand have built new features like GitLab CI with ",[19,32,35],{"href":33,"rel":34},"https://docs.gitlab.com/ci/docker/using_docker_images/",[],"built-in Docker support",",\nhelping us (and you!) to test and build our applications easier and faster.",[12,38,39],{},"Read on for more details on how we scale GitLab by having Docker built in.",[41,42,44],"h2",{"id":43},"why-docker","Why Docker?",[12,46,47,52],{},[19,48,51],{"href":49,"rel":50},"https://www.docker.com/",[],"Docker"," provides a set of tools for running processes\nin a virtualized container. This satisfies most of the same use-cases as a\nvirtual machine, but re-uses the host system's kernel, making it faster to boot\nup. It uses a layered filesystem which can be re-used among several containers,\nallowing it to take up less space.",[12,54,55,59],{},[19,56,29],{"href":57,"rel":58},"https://hub.docker.com/",[]," provides a central registry of images,\nwhich helps make our GitLab image more discoverable. Docker's popularity has\nresulted in increased development in virtual containers, and now has a large\ncommunity around it to provide support.",[12,61,62],{},"For the GitLab application image, we use Docker because it is the most familiar\ncontainer provider for our users, and is well supported.",[12,64,65],{},"For use within GitLab CI, we chose it because it is easy to manage and its\nlightweight nature makes it easy to scale our CI tasks.",[41,67,69],{"id":68},"docker-built-right-into-gitlab","Docker built right into GitLab",[71,72,74],"h3",{"id":73},"a-gitlab-ci-docker-executor","A GitLab CI Docker executor",[12,76,77,81],{},[19,78,80],{"href":79},"/solutions/continuous-integration/","GitLab CI"," is our continuous integration feature, built right into\nGitLab. It allows us to run several tasks against our code as we develop\nand deploy our applications. These tasks are run by something called a Runner\nwhich processes builds.",[12,83,84,85,89],{},"In 2015 the community created a Runner which supported running tasks using a\nDocker executor. This soon became our ",[19,86,88],{"href":87},"/blog/unofficial-runner-becomes-official/","officially supported Runner",".\nIt runs tasks concurrently, which was a big win.",[12,91,92,93,97],{},"This new Runner was built with Docker support right from the beginning because\nDocker provides an easy way for us to run each task in a fresh clean environment,\nwithout any leftovers from previous builds. It also takes care of downloading and\ninstalling our build dependencies for us. Because of this, using the Docker\nexecutor in GitLab CI is our ",[94,95,96],"em",{},"recommended"," approach for running most tasks.",[71,99,101],{"id":100},"gitlab-ci-autoscaling-with-docker-machine","GitLab CI autoscaling with Docker Machine",[12,103,104,105,110,111,116],{},"The GitLab CI Runners also support autoscaling, which allows us to provision and\nmanage multiple remote Docker hosts. We built autoscaling with the help of ",[19,106,109],{"href":107,"rel":108},"https://docs.docker.com/machine/",[],"Docker Machine",".\nDocker Machine supports a vast number of ",[19,112,115],{"href":113,"rel":114},"https://docs.docker.com/machine/drivers/",[],"virtualization and cloud providers",".",[12,118,119],{},"Because the Runners will autoscale, our infrastructure contains only as many\nbuild instances as necessary. The autoscaling feature promotes heavy\nparallelization of our tests, so they run quickly. The machines we don't\nneed are shut down, so we only need to pay for what we are using.",[12,121,122,123,128],{},"Check out our ",[19,124,127],{"href":125,"rel":126},"https://docs.gitlab.com/releases/#autoscaling-increases-developer-happiness",[],"autoscale runners release blog post","\nfor more information on how we've found autoscaling to increase developer\nhappiness.",[71,130,132],{"id":131},"an-integrated-docker-registry","An integrated Docker Registry",[12,134,135,136,141,142,145],{},"GitLab Container Registry\nis a secure and private registry for Docker images. Built on ",[19,137,140],{"href":138,"rel":139},"https://github.com/docker/distribution",[],"open source software",",\nGitLab Container Registry isn't just a standalone registry; it's ",[94,143,144],{},"completely","\nintegrated with GitLab.",[12,147,148],{},"The registry is the place to store and tag images for later use. Developers may\nwant to maintain their own registry for private, company images, or for\nthrow-away images used only in testing. Using GitLab Container Registry means\nyou don't need to set up and administer yet another service, or use a public\nregistry.",[12,150,122,151,155],{},[19,152,154],{"href":153},"/blog/gitlab-container-registry/","announcement blog post","\nfor more details on how the GitLab Container Registry simplify your development\nand deployment workflows.",[41,157,159],{"id":158},"how-we-continue-to-scale-using-docker","How we continue to scale using Docker",[71,161,163],{"id":162},"scaling-our-tests","Scaling our Tests",[12,165,166,167,172],{},"All of our source branches for GitLab are ",[19,168,171],{"href":169,"rel":170},"https://gitlab.com/gitlab-org/gitlab-ce/pipelines",[],"tested","\nusing GitLab CI. We switched our builds to use the autoscaled Docker executor when\nwe released support for it in GitLab CI back in March.",[12,174,175,176,180,181,184],{},"Before switching to the autoscaled runners, tests were on average waiting for ",[177,178,179],"strong",{},"10\nminutes"," before an executor became available for them to run. Now the tests only\never need to wait a ",[177,182,183],{},"few seconds"," for a new Docker Machine to be brought up.",[12,186,187,188,192,193,196],{},"It is not just our own tests though. We have ",[19,189,191],{"href":190},"/blog/shared-runners/","enabled autoscaling on our Shared Runners\non GitLab.com"," for all\nyour projects on GitLab.com. And you run a lot of builds! On average, we have\nbeen running ",[177,194,195],{},"94"," autoscaled instances. We've seen the number currently running\njump up to a couple hundred at times. It's those peak times when you would have\nbeen waiting several minutes for their builds to start. Now it's only seconds!",[71,198,200],{"id":199},"scaling-our-builds","Scaling our Builds",[12,202,203,204,209],{},"This month we have moved the building of our GitLab Omnibus Packages into Docker\nas well. Previously we were running a single dedicated VM for all 9 of the\nOperating Systems that we build GitLab packages for. Most package builds took\nabout half-an-hour, but because there was only one VM for each OS, doing a\n",[19,205,208],{"href":206,"rel":207},"https://docs.gitlab.com/releases/",[],"security patch across 7 releases","\nwould take a long time.",[12,211,212,213,116],{},"Moving the builds to Docker and turning on auto-scaling allows us to run as many\nbuilds at a time as we need. We are not finished with the move quite yet, our\nDocker builds are currently half the speed of our previous system, taking a full\nhour per build. And flaky build failures often cause us to retry the builds at\nleast once per release. We still need to reintroduce some build caching and\nother improvements to fix these problems, but we expect to be able to quickly and\nconcurrently build our packages when it is all done. Feel free to\n",[19,214,217],{"href":215,"rel":216},"https://gitlab.com/gitlab-org/omnibus-gitlab/issues/1232",[],"track our progress",[41,219,221],{"id":220},"we-docker","We  Docker",[12,223,224],{},"As you can see, providing a GitLab Docker image was just the beginning of our\nDocker obsession. Building Docker directly into GitLab CI, and adding a deeply\nintegrated Docker Registry into GitLab, is helping us to build and test GitLab\nquicker and more often. We hope it's helping you too!",{"title":226,"searchDepth":227,"depth":227,"links":228},"",2,[229,230,236,240],{"id":43,"depth":227,"text":44},{"id":68,"depth":227,"text":69,"children":231},[232,234,235],{"id":73,"depth":233,"text":74},3,{"id":100,"depth":233,"text":101},{"id":131,"depth":233,"text":132},{"id":158,"depth":227,"text":159,"children":237},[238,239],{"id":162,"depth":233,"text":163},{"id":199,"depth":233,"text":200},{"id":220,"depth":227,"text":221},"engineering","2016-06-21","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749684707/Blog/Hero%20Images/scale-GitLab-Docker-built-in-cover.png",{"excerpt":248},{"type":9,"value":249},[250,252,263],[12,251,14],{},[12,253,17,254,24,257,30,260,36],{},[19,255,23],{"href":21,"rel":256},[],[19,258,29],{"href":27,"rel":259},[],[19,261,35],{"href":33,"rel":262},[],[12,264,39],{},true,"/en-us/blog/how-we-scale-gitlab-by-having-docker-built-in",{"title":5,"description":39,"ogTitle":5,"ogDescription":39,"noIndex":245,"ogImage":246,"ogUrl":268,"ogSiteName":269,"ogType":270,"canonicalUrls":268},"https://about.gitlab.com/blog/how-we-scale-gitlab-by-having-docker-built-in","https://about.gitlab.com","article","how-we-scale-gitlab-by-having-docker-built-in","en-us/blog/how-we-scale-gitlab-by-having-docker-built-in","BlogPost","fbPa0QPCVc1xs1nIxJfgStPus3p5O3YbP7_fKEbtgd8",{"logo":276,"freeTrial":281,"sales":286,"login":291,"items":296,"search":626,"minimal":657,"duo":676,"switchNav":685,"pricingDeployment":696},{"config":277},{"href":278,"dataGaName":279,"dataGaLocation":280},"/","gitlab logo","header",{"text":282,"config":283},"Get free trial",{"href":284,"dataGaName":285,"dataGaLocation":280},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":287,"config":288},"Request a demo",{"href":289,"dataGaName":290,"dataGaLocation":280},"/request-a-demo/","sales",{"text":292,"config":293},"Sign in",{"href":294,"dataGaName":295,"dataGaLocation":280},"https://gitlab.com/users/sign_in/","sign in",[297,382,470,475,550,604],{"text":298,"left":265,"config":299,"menu":301},"Platform",{"dataNavLevelOne":300},"platform",{"type":302,"link":303,"columns":307,"feature":371},"lists",{"text":304,"config":305},"Explore the Platform",{"href":306,"dataGaName":300,"dataGaLocation":280},"/platform/",[308,330,353],{"title":309,"items":310},"Execution & Workflows",[311,315,320,325],{"text":312,"config":313},"CI/CD",{"href":79,"dataGaLocation":280,"dataGaName":314},"ci/cd",{"text":316,"config":317},"Source Code Management",{"href":318,"dataGaLocation":280,"dataGaName":319},"/solutions/source-code-management/","source code management",{"text":321,"config":322},"Agile Delivery",{"href":323,"dataGaLocation":280,"dataGaName":324},"/solutions/agile-delivery/","agile delivery",{"text":326,"config":327},"Artifact Management",{"href":328,"dataGaLocation":280,"dataGaName":329},"/artifact-central/","artifact management",{"title":331,"items":332},"Security & Governance",[333,338,343,348],{"text":334,"config":335},"Application Security Testing",{"href":336,"dataGaLocation":280,"dataGaName":337},"/solutions/application-security-testing/","application security testing",{"text":339,"config":340},"Governance & Compliance",{"href":341,"dataGaLocation":280,"dataGaName":342},"/solutions/software-compliance/","governance and compliance",{"text":344,"config":345},"Secrets Management",{"href":346,"dataGaLocation":280,"dataGaName":347},"/gitlab-secrets-manager/","secrets management",{"text":349,"config":350},"Supply Chain Security",{"href":351,"dataGaLocation":280,"dataGaName":352},"/solutions/supply-chain/","supply chain security",{"title":354,"items":355},"Context & AI",[356,361,366],{"text":357,"config":358},"Agentic Orchestration",{"href":359,"dataGaLocation":280,"dataGaName":360},"/gitlab-duo-agent-platform/","agentic orchestration",{"text":362,"config":363},"Context Graph",{"href":364,"dataGaLocation":280,"dataGaName":365},"/gitlab-orbit/","context graph",{"text":367,"config":368},"Visibility & Measurement",{"href":369,"dataGaLocation":280,"dataGaName":370},"/solutions/visibility-measurement/","visibility and measurement",{"config":372,"title":375,"text":376,"link":377},{"background":373,"textColor":374},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1790185102/o7dn32anqcb6z8dgd3as.jpg')","#000","Why GitLab","One platform for speed with control across your software lifecycle.",{"text":378,"config":379},"Learn more",{"href":380,"dataGaName":381,"dataGaLocation":280},"/why-gitlab/","why gitlab",{"text":383,"left":265,"config":384,"menu":386},"Solutions",{"dataNavLevelOne":385},"solutions",{"type":302,"link":387,"columns":391,"feature":461},{"text":388,"config":389},"View all Solutions",{"href":390,"dataGaName":385,"dataGaLocation":280},"/solutions/",[392,410,428],{"title":393,"items":394},"Outcomes",[395,400,405],{"text":396,"config":397},"DevOps Modernization",{"href":398,"dataGaLocation":280,"dataGaName":399},"/assessments/devops-modernization-assessment/","devops modernization",{"text":401,"config":402},"Security Modernization",{"href":403,"dataGaLocation":280,"dataGaName":404},"/assessments/security-modernization-assessment/","security modernization",{"text":406,"config":407},"AI Modernization",{"href":408,"dataGaLocation":280,"dataGaName":409},"/assessments/ai-modernization-assessment/","ai modernization",{"title":411,"items":412},"By size",[413,418,423],{"text":414,"config":415},"Enterprise",{"href":416,"dataGaLocation":280,"dataGaName":417},"/enterprise/","enterprise",{"text":419,"config":420},"Small Business",{"href":421,"dataGaLocation":280,"dataGaName":422},"/small-business/","small business",{"text":424,"config":425},"Startups",{"href":426,"dataGaLocation":280,"dataGaName":427},"/solutions/startups/","startups",{"title":429,"items":430},"Industries",[431,436,441,446,451,456],{"text":432,"config":433},"Financial Services",{"href":434,"dataGaLocation":280,"dataGaName":435},"/solutions/finance/","financial services",{"text":437,"config":438},"Public Sector",{"href":439,"dataGaLocation":280,"dataGaName":440},"/solutions/public-sector/","public sector",{"text":442,"config":443},"Telecommunications",{"href":444,"dataGaLocation":280,"dataGaName":445},"/solutions/telecommunications/","telecommunications",{"text":447,"config":448},"Automotive",{"href":449,"dataGaLocation":280,"dataGaName":450},"/solutions/automotive/","automotive",{"text":452,"config":453},"Education",{"href":454,"dataGaLocation":280,"dataGaName":455},"/solutions/education/","education",{"text":457,"config":458},"Aerospace",{"href":459,"dataGaLocation":280,"dataGaName":460},"/solutions/aerospace/","aerospace",{"config":462,"title":463,"text":464,"link":465},{"background":373,"textColor":374},"GitLab Security Standard","Learn how to harden your software factory and let AI agents earn autonomy, without trading away security.",{"text":466,"config":467},"Explore the standard",{"href":468,"dataGaName":469,"dataGaLocation":280},"/gitlab-security-standard/","gitlab security standard",{"text":471,"config":472},"Pricing",{"href":473,"dataGaName":474,"dataGaLocation":280,"dataNavLevelOne":474},"/pricing/","pricing",{"text":476,"config":477,"menu":479},"Resources",{"dataNavLevelOne":478},"resources",{"type":302,"link":480,"columns":484,"feature":541},{"text":481,"config":482},"View all resources",{"href":483,"dataGaName":478,"dataGaLocation":280},"/resources/",[485,513],{"title":486,"items":487},"Discover",[488,493,498,503,508],{"text":489,"config":490},"Docs",{"href":491,"dataGaName":492,"dataGaLocation":280},"https://docs.gitlab.com/","docs",{"text":494,"config":495},"University",{"href":496,"dataGaName":497,"dataGaLocation":280},"https://university.gitlab.com/","university",{"text":499,"config":500},"Demo Series",{"href":501,"dataGaName":502,"dataGaLocation":280},"/gitlab-technical-demo-series/","demo series",{"text":504,"config":505},"Demo Hub",{"href":506,"dataGaName":507,"dataGaLocation":280},"/demo-hub/","demo hub",{"text":509,"config":510},"Services",{"href":511,"dataGaName":512,"dataGaLocation":280},"/services/","services",{"title":514,"items":515},"Connect",[516,521,526,531,536],{"text":517,"config":518},"Blog",{"href":519,"dataGaName":520,"dataGaLocation":280},"/blog/","blog",{"text":522,"config":523},"Community",{"href":524,"dataGaName":525,"dataGaLocation":280},"/community/","community",{"text":527,"config":528},"Customers",{"href":529,"dataGaName":530,"dataGaLocation":280},"/customers/","customers",{"text":532,"config":533},"Partners",{"href":534,"dataGaName":535,"dataGaLocation":280},"/partners/","partners",{"text":537,"config":538},"Events",{"href":539,"dataGaName":540,"dataGaLocation":280},"/events/","events",{"config":542,"title":543,"text":544,"link":545},{"background":373,"textColor":374},"What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":546,"config":547},"Read the latest",{"href":548,"dataGaName":549,"dataGaLocation":280},"/whats-new/","whats new",{"text":551,"config":552,"menu":554},"Company",{"dataNavLevelOne":553},"company",{"type":302,"columns":555},[556],{"items":557},[558,563,569,574,579,584,589,594,599],{"text":559,"config":560},"About",{"href":561,"dataGaName":562,"dataGaLocation":280},"/company/","about",{"text":564,"config":565,"footerGa":568},"Jobs",{"href":566,"dataGaName":567,"dataGaLocation":280},"/jobs/","jobs",{"dataGaName":567},{"text":570,"config":571},"Press",{"href":572,"dataGaName":573,"dataGaLocation":280},"/press/","press",{"text":575,"config":576},"Handbook",{"href":577,"dataGaName":578,"dataGaLocation":280},"https://handbook.gitlab.com/","handbook",{"text":580,"config":581},"Leadership",{"href":582,"dataGaName":583,"dataGaLocation":280},"/company/team/e-group/","leadership",{"text":585,"config":586},"Investor relations",{"href":587,"dataGaName":588,"dataGaLocation":280},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":590,"config":591},"Trust Center",{"href":592,"dataGaName":593,"dataGaLocation":280},"/security/","trust center",{"text":595,"config":596},"AI Transparency Center",{"href":597,"dataGaName":598,"dataGaLocation":280},"/ai-transparency-center/","ai transparency center",{"text":600,"config":601},"Newsletter",{"href":602,"dataGaName":603,"dataGaLocation":280},"/company/contact/#contact-forms","newsletter",{"text":605,"config":606,"menu":607},"Contact us",{"dataNavLevelOne":553},{"type":302,"columns":608},[609],{"items":610},[611,616,621],{"text":612,"config":613},"Talk to sales",{"href":614,"dataGaName":615,"dataGaLocation":280},"/sales/","talk to sales",{"text":617,"config":618},"Support portal",{"href":619,"dataGaName":620,"dataGaLocation":280},"https://support.gitlab.com/hc/en-us","support portal",{"text":622,"config":623},"Customer portal",{"href":624,"dataGaName":625,"dataGaLocation":280},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":627,"login":628,"suggestions":635},"Close",{"text":629,"link":630},"To search repositories and projects, login to",{"text":631,"config":632},"gitlab.com",{"href":294,"dataGaName":633,"dataGaLocation":634},"search login","search",{"text":636,"default":637},"Suggestions",[638,641,644,646,650,654],{"text":639,"config":640},"GitLab Duo Agent Platform",{"href":359,"dataGaName":639,"dataGaLocation":634},{"text":642,"config":643},"Code Suggestions (AI)",{"href":359,"dataGaName":642,"dataGaLocation":634},{"text":312,"config":645},{"href":79,"dataGaName":312,"dataGaLocation":634},{"text":647,"config":648},"GitLab on AWS",{"href":649,"dataGaName":647,"dataGaLocation":634},"/partners/technology-partners/aws/",{"text":651,"config":652},"GitLab on Google Cloud",{"href":653,"dataGaName":651,"dataGaLocation":634},"/partners/technology-partners/google-cloud-platform/",{"text":655,"config":656},"Why GitLab?",{"href":380,"dataGaName":655,"dataGaLocation":634},{"freeTrial":658,"mobileIcon":663,"desktopIcon":668,"secondaryButton":671},{"text":659,"config":660},"Start free trial",{"href":661,"dataGaName":285,"dataGaLocation":662},"https://gitlab.com/-/trials/new/","nav",{"altText":664,"config":665},"Gitlab Icon",{"src":666,"dataGaName":667,"dataGaLocation":662},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":664,"config":669},{"src":670,"dataGaName":667,"dataGaLocation":662},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":672,"config":673},"Get Started",{"href":674,"dataGaName":675,"dataGaLocation":662},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":677,"mobileIcon":681,"desktopIcon":683},{"text":678,"config":679},"Learn more about GitLab Duo",{"href":359,"dataGaName":680,"dataGaLocation":662},"gitlab duo",{"altText":664,"config":682},{"src":666,"dataGaName":667,"dataGaLocation":662},{"altText":664,"config":684},{"src":670,"dataGaName":667,"dataGaLocation":662},{"button":686,"mobileIcon":691,"desktopIcon":693},{"text":687,"config":688},"/switch",{"href":689,"dataGaName":690,"dataGaLocation":662},"#contact","switch",{"altText":664,"config":692},{"src":666,"dataGaName":667,"dataGaLocation":662},{"altText":664,"config":694},{"src":695,"dataGaName":667,"dataGaLocation":662},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":697,"mobileIcon":702,"desktopIcon":704},{"text":698,"config":699},"Back to pricing",{"href":473,"dataGaName":700,"dataGaLocation":662,"icon":701},"back to pricing","GoBack",{"altText":664,"config":703},{"src":666,"dataGaName":667,"dataGaLocation":662},{"altText":664,"config":705},{"src":670,"dataGaName":667,"dataGaLocation":662},{"title":707,"button":708,"config":714},"Ship at agent speed. Prove every step. Transcend is here.",{"text":709,"config":710},"Watch now",{"href":711,"dataGaName":712,"dataGaLocation":713},"/events/transcend/virtual/#watch-gitlab-transcend","transcend-october-2026-banner","global-banner",{"layout":715,"disabled":245},"release",{"data":717},{"text":718,"source":719,"edit":725,"contribute":730,"config":735,"items":740,"minimal":966},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":720,"config":721},"View page source",{"href":722,"dataGaName":723,"dataGaLocation":724},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":726,"config":727},"Edit this page",{"href":728,"dataGaName":729,"dataGaLocation":724},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":731,"config":732},"Please contribute",{"href":733,"dataGaName":734,"dataGaLocation":724},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":736,"facebook":737,"youtube":738,"linkedin":739},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[741,788,846,893,934],{"title":471,"links":742,"subMenu":757},[743,747,752],{"text":744,"config":745},"View plans",{"href":473,"dataGaName":746,"dataGaLocation":724},"view plans",{"text":748,"config":749},"Why Premium?",{"href":750,"dataGaName":751,"dataGaLocation":724},"/pricing/premium/","why premium",{"text":753,"config":754},"Why Ultimate?",{"href":755,"dataGaName":756,"dataGaLocation":724},"/pricing/ultimate/","why ultimate",[758],{"title":759,"links":760},"Contact Us",[761,764,766,768,773,778,783],{"text":762,"config":763},"Contact sales",{"href":614,"dataGaName":290,"dataGaLocation":724},{"text":617,"config":765},{"href":619,"dataGaName":620,"dataGaLocation":724},{"text":622,"config":767},{"href":624,"dataGaName":625,"dataGaLocation":724},{"text":769,"config":770},"Status",{"href":771,"dataGaName":772,"dataGaLocation":724},"https://status.gitlab.com/","status",{"text":774,"config":775},"Terms of use",{"href":776,"dataGaName":777,"dataGaLocation":724},"/terms/","terms of use",{"text":779,"config":780},"Privacy statement",{"href":781,"dataGaName":782,"dataGaLocation":724},"/privacy/","privacy statement",{"text":784,"config":785},"Cookie preferences",{"dataGaName":786,"dataGaLocation":724,"id":787,"isOneTrustButton":265},"cookie preferences","ot-sdk-btn",{"title":298,"links":789,"subMenu":803},[790,793,795,797,799,801],{"text":791,"config":792},"Explore the platform",{"href":306,"dataGaName":300,"dataGaLocation":724},{"text":357,"config":794},{"href":359,"dataGaName":360,"dataGaLocation":724},{"text":312,"config":796},{"href":79,"dataGaName":314,"dataGaLocation":724},{"text":362,"config":798},{"href":364,"dataGaName":365,"dataGaLocation":724},{"text":344,"config":800},{"href":346,"dataGaName":347,"dataGaLocation":724},{"text":375,"config":802},{"href":380,"dataGaName":381,"dataGaLocation":724},[804],{"title":805,"links":806},"Topics",[807,811,816,821,826,831,836,841],{"text":312,"config":808},{"href":809,"dataGaName":810,"dataGaLocation":724},"/topics/ci-cd/","cicd",{"text":812,"config":813},"GitOps",{"href":814,"dataGaName":815,"dataGaLocation":724},"/topics/gitops/","gitops",{"text":817,"config":818},"DevOps",{"href":819,"dataGaName":820,"dataGaLocation":724},"/topics/devops/","devops",{"text":822,"config":823},"Version Control",{"href":824,"dataGaName":825,"dataGaLocation":724},"/topics/version-control/","version control",{"text":827,"config":828},"DevSecOps",{"href":829,"dataGaName":830,"dataGaLocation":724},"/topics/devsecops/","devsecops",{"text":832,"config":833},"Cloud Native",{"href":834,"dataGaName":835,"dataGaLocation":724},"/topics/cloud-native/","cloud native",{"text":837,"config":838},"AI for Coding",{"href":839,"dataGaName":840,"dataGaLocation":724},"/topics/devops/ai-for-coding/","ai for coding",{"text":842,"config":843},"Agentic AI",{"href":844,"dataGaName":845,"dataGaLocation":724},"/topics/agentic-ai/","agentic ai",{"title":383,"links":847},[848,851,854,857,860,863,865,867,869,871,873,876,878,881,885,889],{"text":849,"config":850},"DevOps modernization",{"href":398,"dataGaName":399,"dataGaLocation":724},{"text":852,"config":853},"Security modernization",{"href":403,"dataGaName":404,"dataGaLocation":724},{"text":855,"config":856},"AI modernization",{"href":408,"dataGaName":409,"dataGaLocation":724},{"text":858,"config":859},"Financial services",{"href":434,"dataGaName":435,"dataGaLocation":724},{"text":861,"config":862},"Public sector",{"href":439,"dataGaName":440,"dataGaLocation":724},{"text":442,"config":864},{"href":444,"dataGaName":445,"dataGaLocation":724},{"text":447,"config":866},{"href":449,"dataGaName":450,"dataGaLocation":724},{"text":452,"config":868},{"href":454,"dataGaName":455,"dataGaLocation":724},{"text":457,"config":870},{"href":459,"dataGaName":460,"dataGaLocation":724},{"text":414,"config":872},{"href":416,"dataGaName":417,"dataGaLocation":724},{"text":874,"config":875},"Small business",{"href":421,"dataGaName":422,"dataGaLocation":724},{"text":424,"config":877},{"href":426,"dataGaName":427,"dataGaLocation":724},{"text":812,"config":879},{"href":880,"dataGaName":815,"dataGaLocation":724},"/solutions/gitops/",{"text":882,"config":883},"Software composition analysis",{"href":351,"dataGaName":884,"dataGaLocation":724},"software composition analysis",{"text":886,"config":887},"Value stream management",{"href":369,"dataGaName":888,"dataGaLocation":724},"value stream management",{"text":890,"config":891},"All solutions",{"href":390,"dataGaName":892,"dataGaLocation":724},"all solutions",{"title":476,"links":894},[895,900,905,907,909,911,913,915,917,919,921,923,925,927,930],{"text":896,"config":897},"Install",{"href":898,"dataGaName":899,"dataGaLocation":724},"/install/","install",{"text":901,"config":902},"Quick start guides",{"href":903,"dataGaName":904,"dataGaLocation":724},"/get-started/","quick setup checklists",{"text":489,"config":906},{"href":491,"dataGaName":492,"dataGaLocation":724},{"text":494,"config":908},{"href":496,"dataGaName":497,"dataGaLocation":724},{"text":499,"config":910},{"href":501,"dataGaName":502,"dataGaLocation":724},{"text":504,"config":912},{"href":506,"dataGaName":507,"dataGaLocation":724},{"text":509,"config":914},{"href":511,"dataGaName":512,"dataGaLocation":724},{"text":517,"config":916},{"href":519,"dataGaName":520,"dataGaLocation":724},{"text":522,"config":918},{"href":524,"dataGaName":525,"dataGaLocation":724},{"text":527,"config":920},{"href":529,"dataGaName":530,"dataGaLocation":724},{"text":532,"config":922},{"href":534,"dataGaName":535,"dataGaLocation":724},{"text":537,"config":924},{"href":539,"dataGaName":540,"dataGaLocation":724},{"text":600,"config":926},{"href":602,"dataGaName":603,"dataGaLocation":724},{"text":928,"config":929},"What's new",{"href":548,"dataGaName":549,"dataGaLocation":724},{"text":931,"config":932},"All resources",{"href":483,"dataGaName":933,"dataGaLocation":724},"all resources",{"title":551,"links":935},[936,938,940,942,944,946,948,950,952,956,961],{"text":559,"config":937},{"href":561,"dataGaName":553,"dataGaLocation":724},{"text":564,"config":939},{"href":566,"dataGaName":567,"dataGaLocation":724},{"text":570,"config":941},{"href":572,"dataGaName":573,"dataGaLocation":724},{"text":575,"config":943},{"href":577,"dataGaName":578,"dataGaLocation":724},{"text":580,"config":945},{"href":582,"dataGaName":583,"dataGaLocation":724},{"text":585,"config":947},{"href":587,"dataGaName":588,"dataGaLocation":724},{"text":590,"config":949},{"href":592,"dataGaName":593,"dataGaLocation":724},{"text":595,"config":951},{"href":597,"dataGaName":598,"dataGaLocation":724},{"text":953,"config":954},"Sustainability",{"href":955,"dataGaName":953,"dataGaLocation":724},"/sustainability/",{"text":957,"config":958},"Diversity, inclusion and belonging (DIB)",{"href":959,"dataGaName":960,"dataGaLocation":724},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":962,"config":963},"Modern Slavery Transparency Statement",{"href":964,"dataGaName":965,"dataGaLocation":724},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":967},[968,971,974],{"text":969,"config":970},"Terms",{"href":776,"dataGaName":777,"dataGaLocation":724},{"text":972,"config":973},"Cookies",{"dataGaName":786,"dataGaLocation":724,"id":787,"isOneTrustButton":265},{"text":975,"config":976},"Privacy",{"href":781,"dataGaName":782,"dataGaLocation":724},[978],{"id":979,"title":980,"body":244,"config":981,"content":983,"description":244,"extension":987,"meta":988,"navigation":265,"path":989,"seo":990,"stem":991,"__hash__":992},"blogAuthors/en-us/blog/authors/dj-mountney.yml","Dj Mountney",{"template":982},"BlogAuthor",{"name":7,"config":984},{"headshot":985,"ctfId":986},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","DJ-Mountney","yml",{},"/en-us/blog/authors/dj-mountney",{},"en-us/blog/authors/dj-mountney","rkUgDxeypPvEvVYFZulwbz9RtoLi7BAOsDdTPI2wmLM",[994,1002,1010],{"title":995,"description":996,"heroImage":997,"category":241,"date":998,"authors":999,"slug":1001,"externalUrl":244},"Two front doors: Module-level access in a Django GRC app","A technical deep-dive on restructuring a Django internal tool to support two distinct GitLab teams: Security Compliance and Internal Audit.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097663/Blog/Hero%20Images/Blog/Hero%20Images/Workflow%201800x945_2gQoQIbY9NvjLFpXtsxtXy_1750097663612.png","2026-10-05",[1000],"Donovan Felton","module-level-access-in-a-django-grc-app",{"title":1003,"description":1004,"heroImage":1005,"category":241,"date":1006,"authors":1007,"slug":1009,"externalUrl":244},"How GitLab reduced code-per-agentic-flow ratio by 45%","Learn how Flow Registry, a component-based framework that compiles YAML configurations into fully functional LangGraph flows, helped improve scalability and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-09-22",[1008],"Mikolaj Wawrzyniak","how-gitlab-reduced-code-per-agentic-flow-ratio",{"title":1011,"description":1012,"heroImage":1013,"category":241,"date":1014,"authors":1015,"slug":1017,"externalUrl":244},"Co-Create: Building GitLab with our users","How GitLab users collaborated with us to build practical product improvements in the first half of 2026.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","2026-09-10",[1016],"Isa Huerga","co-create-h1-2026",{"header":1019,"text":1020,"button":1024,"disclaimer":1027},"Start your free\n\n30-day GitLab trial\n",[1021,1022,1023],"GitLab Duo Agent Platform access","Try our most advanced features","Automate complex tasks with AI",{"text":282,"config":1025},{"href":1026,"dataGaName":285,"dataGaLocation":520},"https://gitlab.com/-/trials/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/blog/","No credit card required.",{"header":1029,"blurb":1030,"button":1031,"secondaryButton":1036},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1032,"config":1033},"Get your free trial",{"href":1034,"dataGaName":285,"dataGaLocation":1035},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":762,"config":1037},{"href":614,"dataGaName":290,"dataGaLocation":1035},1792010351237]