[{"data":1,"prerenderedAt":1009},["ShallowReactive",2],{"/blog/the-road-to-gitaly-1-0":3,"navigation-en-us":221,"banner-en-us":649,"footer-en-us":659,"blog-post-authors-en-us-Zeger-Jan van de Weg":904,"blog-related-posts-en-us-the-road-to-gitaly-1-0":919,"blog-promotions-en-us":945,"next-steps-en-us":999},{"id":4,"title":5,"authors":6,"body":8,"category":198,"date":199,"description":200,"extension":201,"externalUrl":202,"faq":202,"featured":203,"heroImage":204,"meta":205,"navigation":206,"path":207,"seo":208,"slug":213,"stem":214,"tags":215,"template":219,"updatedDate":202,"__hash__":220},"blogPosts/en-us/blog/the-road-to-gitaly-1-0.md","The road to Gitaly v1.0 (aka, why GitLab doesn't require NFS for storing Git data anymore)",[7],"Zeger-Jan van de Weg",{"type":9,"value":10,"toc":189},"minimark",[11,28,33,36,40,64,68,76,89,107,122,136,145,149,152,155,159,168,180],[12,13,14,15,21,22,27],"p",{},"In the early days of ",[16,17,20],"a",{"href":18,"rel":19},"https://gitlab.com",[],"GitLab.com",", most of the application,\nincluding Rails worker processes, Sidekiq background processes, and Git storage,\nall ran on a single server. A single server is easy to deploy to and maintain.\nThe same structure is what most smaller GitLab instances still use for their\nself-managed ",[16,23,26],{"href":24,"rel":25},"https://docs.gitlab.com/omnibus/",[],"Omnibus"," installation. Scaling\nis done vertically, meaning; adding more RAM, CPU, and disk space.",[29,30,32],"h2",{"id":31},"moving-from-vertical-to-horizontal-scaling","Moving from vertical to horizontal scaling",[12,34,35],{},"Soon we ran out of options to continue scaling the system vertically, and we had\nto move to scaling horizontally by adding new servers. To have the repositories\navailable on all the nodes, NFS (Network File System) was used to mount these to each application\nserver and background workers. NFS is a well-known technology for sharing file\nsystems across a network. For each server, each storage node needed to be\nmounted. The advantage: GitLab.com could keep adding more servers and scale. However NFS\nhad multiple disadvantages too: the visibility is decreased to what type of file\nsystem operation is performed. Even worse, one NFS storage node's outage impacted\nthe whole site, and took the whole site down. On the other hand, Git operations\ncan be quite CPU/IOPS intensive too, so we began a balancing act between adding more nodes,\nand thus reducing reliability, versus scaling nodes vertically.",[29,37,39],{"id":38},"considering-nfs-alternatives","Considering NFS alternatives",[12,41,42,43,48,49,53,54,58,59,63],{},"Over two years ago, we started to look for alternatives. One of the first ideas\nwas to remove the dependency on NFS with ",[16,44,47],{"href":45,"rel":46},"https://ceph.com/",[],"Ceph",".\nCeph is a distributed file system that was meant to replace NFS in an\narchitecture like ours. Like NFS, this would solve our scaling problem on the\nsystem level, meaning that little to no changes would be required to GitLab as\nan application. However, running a Ceph cluster in the cloud didn't have the\nperformance characteristics that were required. Briefly we flirted with the idea\nof ",[16,50,52],{"href":51},"/blog/why-choose-bare-metal/","moving away from the cloud",", but this would have had major implications\nfor our own infrastructure team, and given that many of our customers ",[55,56,57],"em",{},"do"," run in\nthe cloud, ",[16,60,62],{"href":61},"/blog/why-we-are-not-leaving-the-cloud/","we decided to stay in the cloud",".",[29,65,67],{"id":66},"introducing-gitaly","Introducing Gitaly",[12,69,70,71,63],{},"So it was clear that the application needed to be redesigned, and a new service\nwould be introduced to handle all Git requests. We named it\n",[16,72,75],{"href":73,"rel":74},"https://gitlab.com/gitlab-org/gitaly",[],"Gitaly",[12,77,78,83],{},[79,80],"img",{"alt":81,"src":82},"Gitaly Architecture Diagram","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782404870/site/Content%20Images/gitaly_arch.png",[55,84,85],{},[86,87,88],"small",{},"The planned architecture at the project start",[12,90,91,92,97,98,103,104,63],{},"As the diagram shows, the new Git server would have a number of distinct clients.\nTo make sure the protocol for the server and its clients is well defined,\n",[16,93,96],{"href":94,"rel":95},"https://developers.google.com/protocol-buffers/",[],"Protocol Buffers"," was used. The client calls are handled by\nleveraging ",[16,99,102],{"href":100,"rel":101},"https://grpc.io/",[],"gRPC",". Combined, they allowed us to iteratively add RPCs and\nmove away from NFS, in favor of an HTTP boundary. With the technologies chosen,\nthe migration started. The ultimate goal: v1.0, meaning no disk access was\nrequired to the Git storage nodes for ",[16,105,20],{"href":18,"rel":106},[],[12,108,109,110,115,116,121],{},"Shipping such an architectural change should not influence the performance, nor\nthe stability of the self-managed installations of GitLab, so for each RPC a ",[16,111,114],{"href":112,"rel":113},"https://docs.gitlab.com/development/feature_flags/",[],"feature\nflag"," gated the use of it. When the RPC had gone through a series of tests on both\ncorrectness and performance impact, the gate was removed. To determine stability we used\n",[16,117,120],{"href":118,"rel":119},"https://docs.gitlab.com/administration/monitoring/prometheus/",[],"Prometheus"," for monitoring and the ELK stack for sifting through massive numbers of structured log messages.",[12,123,124,125,129,130,135],{},"The server was written in Go, while the application is a large Rails monolith.\nRails had a great amount of code that was still very valuable. This code got\nextracted to the ",[126,127,128],"code",{},"lib/gitlab/git"," directory, allowing easier vendoring. The idea\nwas to start a sidecar next to the Go server, reusing the old code. About once a week the\ncode would be re-vendored. This allowed Ruby developers on other teams to\nwrite code once, and ship it. Bonus points could be earned if ",[16,131,134],{"href":132,"rel":133},"https://gitlab.com/gitlab-org/gitaly/blob/232c26309a8e9bef61262ccd04a8f0ba75e13d73/doc/beginners_guide.md#gitaly-ruby-boilerplate",[],"the boilerplate code","\nwas written to call the same function in Ruby!",[12,137,138,139,144],{},"The new service wasn't all sunshine and rainbows though, at times it felt like\nthe improved visibility was hurting our ability to ship. For example, it became\nclear that the illusion of an attached disk created\n",[16,140,143],{"href":141,"rel":142},"https://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations",[],"N + 1 problems",". And even though this is a well-known problem\nin Ruby on Rails, the tools to combat it are all tailored toward using it with\nActiveRecord, Rails' ORM.",[29,146,148],{"id":147},"nearing-v10","Nearing v1.0",[12,150,151],{},"With each RPC introduced, v1.0 was getting closer and closer. But how could we be\nsure everything was migrated before unmounting all NFS mount points? A trip\nswitch got introduced, guarding the details required to get to the full path of each\nrepository. Without this data there was no way to execute any Git operation\nthrough NFS. Luckily, the trip switch never went off, so now it was clear NFS\nwasn't being used. The next step was unmounting on our staging environment! Again, this was very\nuneventful. Leaving the volumes unmounted for a full week, and not seeing any\nindication of unexpected errors, the logical next step was our production instance.",[12,153,154],{},"Days later we started rolling out these changes to production: first the\nbackground workers were unmounted, than we moved onto higher impact services. At\nthe end of the day, all drives were unmounted without customer impact.",[29,156,158],{"id":157},"whats-next","What's next?",[12,160,161,162,167],{},"So, where is this v1.0 tag? We didn't tag it, and I don't think we will. v1.0 is\na state for our Git infrastructure, and a goal for the team, rather than the code base.\nThat being said, the next mental goal is allowing all customers to run without NFS.\nAt the time of writing, some features like administrative tasks, aren't using Gitaly just\nyet. These are slated for ",[16,163,166],{"href":164,"rel":165},"https://gitlab.com/groups/gitlab-org/-/epics/288",[],"v1.1",", and our next objective.",[12,169,170,171,175,176,63],{},"Want to know more about our Gitaly journey? Read about ",[16,172,174],{"href":173},"/blog/high-availability-git-storage-with-praefect/","how we're making your Git data highly available with Praefect"," and ",[16,177,179],{"href":178},"/blog/how-a-fix-in-go-19-sped-up-our-gitaly-service-by-30x/","how a fix in Go 1.9 sped up our Gitaly service by 30x",[12,181,182,183,188],{},"Photo by ",[16,184,187],{"href":185,"rel":186},"https://unsplash.com/photos/8Sjcc4vExpg",[],"Jason Hafso"," on Unsplash",{"title":190,"searchDepth":191,"depth":191,"links":192},"",2,[193,194,195,196,197],{"id":31,"depth":191,"text":32},{"id":38,"depth":191,"text":39},{"id":66,"depth":191,"text":67},{"id":147,"depth":191,"text":148},{"id":157,"depth":191,"text":158},"engineering","2018-09-12","How we went from vertical to horizontal scaling without depending on NFS by creating our own Git RPC service.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749670092/Blog/Hero%20Images/road-to-gitaly.jpg",{},true,"/en-us/blog/the-road-to-gitaly-1-0",{"title":209,"description":200,"ogTitle":209,"ogDescription":200,"noIndex":203,"ogImage":204,"ogUrl":210,"ogSiteName":211,"ogType":212,"canonicalUrls":210},"GitLab no longer requires NFS: The road to Gitaly v1.0","https://about.gitlab.com/blog/the-road-to-gitaly-1-0","https://about.gitlab.com","article","the-road-to-gitaly-1-0","en-us/blog/the-road-to-gitaly-1-0",[216,217,218],"inside GitLab","git","performance","BlogPost","xHQ-DQdTwxKObCOKdRyinJcqeWl3G1k8Gu3qCcEN1go",{"logo":222,"freeTrial":227,"sales":232,"login":237,"items":242,"search":569,"minimal":600,"duo":619,"switchNav":628,"pricingDeployment":639},{"config":223},{"href":224,"dataGaName":225,"dataGaLocation":226},"/","gitlab logo","header",{"text":228,"config":229},"Get free trial",{"href":230,"dataGaName":231,"dataGaLocation":226},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":233,"config":234},"Request a demo",{"href":235,"dataGaName":236,"dataGaLocation":226},"/sales/?contact-topic=request-demo","sales",{"text":238,"config":239},"Sign in",{"href":240,"dataGaName":241,"dataGaLocation":226},"https://gitlab.com/users/sign_in/","sign in",[243,272,372,377,491,547],{"text":244,"config":245,"menu":247},"Platform",{"dataNavLevelOne":246},"platform",{"type":248,"columns":249},"cards",[250,256,264],{"title":244,"description":251,"link":252},"The intelligent orchestration platform for DevSecOps",{"text":253,"config":254},"Explore our Platform",{"href":255,"dataGaName":246,"dataGaLocation":226},"/platform/",{"title":257,"description":258,"link":259},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":260,"config":261},"Meet GitLab Duo",{"href":262,"dataGaName":263,"dataGaLocation":226},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":265,"description":266,"link":267},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":268,"config":269},"Learn more",{"href":270,"dataGaName":271,"dataGaLocation":226},"/why-gitlab/","why gitlab",{"text":273,"left":206,"config":274,"menu":276},"Product",{"dataNavLevelOne":275},"solutions",{"type":277,"link":278,"columns":282,"feature":351},"lists",{"text":279,"config":280},"View all Solutions",{"href":281,"dataGaName":275,"dataGaLocation":226},"/solutions/",[283,307,330],{"title":284,"description":285,"link":286,"items":291},"Automation","CI/CD and automation to accelerate deployment",{"config":287},{"icon":288,"href":289,"dataGaName":290,"dataGaLocation":226},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[292,296,299,303],{"text":293,"config":294},"CI/CD",{"href":295,"dataGaLocation":226,"dataGaName":293},"/solutions/continuous-integration/",{"text":257,"config":297},{"href":262,"dataGaLocation":226,"dataGaName":298},"gitlab duo agent platform - product menu",{"text":300,"config":301},"Source Code Management",{"href":302,"dataGaLocation":226,"dataGaName":300},"/solutions/source-code-management/",{"text":304,"config":305},"Automated Software Delivery",{"href":289,"dataGaLocation":226,"dataGaName":306},"Automated software delivery",{"title":308,"description":309,"link":310,"items":315},"Security","Deliver code faster without compromising security",{"config":311},{"href":312,"dataGaName":313,"dataGaLocation":226,"icon":314},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[316,320,325],{"text":317,"config":318},"Application Security Testing",{"href":312,"dataGaName":319,"dataGaLocation":226},"Application security testing",{"text":321,"config":322},"Software Supply Chain Security",{"href":323,"dataGaLocation":226,"dataGaName":324},"/solutions/supply-chain/","Software supply chain security",{"text":326,"config":327},"Software Compliance",{"href":328,"dataGaName":329,"dataGaLocation":226},"/solutions/software-compliance/","software compliance",{"title":331,"link":332,"items":337},"Measurement",{"config":333},{"icon":334,"href":335,"dataGaName":336,"dataGaLocation":226},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[338,342,346],{"text":339,"config":340},"Visibility & Measurement",{"href":335,"dataGaLocation":226,"dataGaName":341},"Visibility and Measurement",{"text":343,"config":344},"Value Stream Management",{"href":345,"dataGaLocation":226,"dataGaName":343},"/solutions/value-stream-management/",{"text":347,"config":348},"Analytics & Insights",{"href":349,"dataGaLocation":226,"dataGaName":350},"/solutions/analytics-and-insights/","Analytics and insights",{"title":352,"type":277,"items":353},"GitLab for",[354,360,366],{"text":355,"config":356},"Enterprise",{"icon":357,"href":358,"dataGaLocation":226,"dataGaName":359},"Building","/enterprise/","enterprise",{"text":361,"config":362},"Small Business",{"icon":363,"href":364,"dataGaLocation":226,"dataGaName":365},"Work","/small-business/","small business",{"text":367,"config":368},"Public Sector",{"icon":369,"href":370,"dataGaLocation":226,"dataGaName":371},"Organization","/solutions/public-sector/","public sector",{"text":373,"config":374},"Pricing",{"href":375,"dataGaName":376,"dataGaLocation":226,"dataNavLevelOne":376},"/pricing/","pricing",{"text":378,"config":379,"menu":381},"Resources",{"dataNavLevelOne":380},"resources",{"type":277,"link":382,"columns":386,"feature":480},{"text":383,"config":384},"View all resources",{"href":385,"dataGaName":380,"dataGaLocation":226},"/resources/",[387,420,447],{"title":388,"items":389},"Getting started",[390,395,400,405,410,415],{"text":391,"config":392},"Install",{"href":393,"dataGaName":394,"dataGaLocation":226},"/install/","install",{"text":396,"config":397},"Quick start guides",{"href":398,"dataGaName":399,"dataGaLocation":226},"/get-started/","quick setup checklists",{"text":401,"config":402},"Learn",{"href":403,"dataGaLocation":226,"dataGaName":404},"https://university.gitlab.com/","learn",{"text":406,"config":407},"Product documentation",{"href":408,"dataGaName":409,"dataGaLocation":226},"https://docs.gitlab.com/","product documentation",{"text":411,"config":412},"Best practice videos",{"href":413,"dataGaName":414,"dataGaLocation":226},"/getting-started-videos/","best practice videos",{"text":416,"config":417},"Integrations",{"href":418,"dataGaName":419,"dataGaLocation":226},"/integrations/","integrations",{"title":421,"items":422},"Discover",[423,428,433,438,442],{"text":424,"config":425},"Customer success stories",{"href":426,"dataGaName":427,"dataGaLocation":226},"/customers/","customer success stories",{"text":429,"config":430},"Blog",{"href":431,"dataGaName":432,"dataGaLocation":226},"/blog/","blog",{"text":434,"config":435},"Demo Hub",{"href":436,"dataGaName":437,"dataGaLocation":226},"/demo-hub/","demo hub",{"text":439,"config":440},"The Source",{"href":441,"dataGaName":432,"dataGaLocation":226},"/the-source/",{"text":443,"config":444},"Remote",{"href":445,"dataGaName":446,"dataGaLocation":226},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":448,"items":449},"Connect",[450,455,460,465,470,475],{"text":451,"config":452},"GitLab Services",{"href":453,"dataGaName":454,"dataGaLocation":226},"/services/","services",{"text":456,"config":457},"Contribute",{"href":458,"dataGaName":459,"dataGaLocation":226},"https://contributors.gitlab.com","contribute",{"text":461,"config":462},"Community",{"href":463,"dataGaName":464,"dataGaLocation":226},"/community/","community",{"text":466,"config":467},"Forum",{"href":468,"dataGaName":469,"dataGaLocation":226},"https://forum.gitlab.com/","forum",{"text":471,"config":472},"Events",{"href":473,"dataGaName":474,"dataGaLocation":226},"/events/","events",{"text":476,"config":477},"Partners",{"href":478,"dataGaName":479,"dataGaLocation":226},"/partners/","partners",{"config":481,"title":484,"text":485,"link":486},{"background":482,"textColor":483},"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":487,"config":488},"Read the latest",{"href":489,"dataGaName":490,"dataGaLocation":226},"/whats-new/","whats new",{"text":492,"config":493,"menu":495},"Company",{"dataNavLevelOne":494},"company",{"type":277,"columns":496},[497],{"items":498},[499,504,510,512,517,522,527,532,537,542],{"text":500,"config":501},"About",{"href":502,"dataGaName":503,"dataGaLocation":226},"/company/","about",{"text":505,"config":506,"footerGa":509},"Jobs",{"href":507,"dataGaName":508,"dataGaLocation":226},"/jobs/","jobs",{"dataGaName":508},{"text":471,"config":511},{"href":473,"dataGaName":474,"dataGaLocation":226},{"text":513,"config":514},"Leadership",{"href":515,"dataGaName":516,"dataGaLocation":226},"/company/team/e-group/","leadership",{"text":518,"config":519},"Handbook",{"href":520,"dataGaName":521,"dataGaLocation":226},"https://handbook.gitlab.com/","handbook",{"text":523,"config":524},"Investor relations",{"href":525,"dataGaName":526,"dataGaLocation":226},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":528,"config":529},"Trust Center",{"href":530,"dataGaName":531,"dataGaLocation":226},"/security/","trust center",{"text":533,"config":534},"AI Transparency Center",{"href":535,"dataGaName":536,"dataGaLocation":226},"/ai-transparency-center/","ai transparency center",{"text":538,"config":539},"Newsletter",{"href":540,"dataGaName":541,"dataGaLocation":226},"/company/contact/#contact-forms","newsletter",{"text":543,"config":544},"Press",{"href":545,"dataGaName":546,"dataGaLocation":226},"/press/","press",{"text":548,"config":549,"menu":550},"Contact us",{"dataNavLevelOne":494},{"type":277,"columns":551},[552],{"items":553},[554,559,564],{"text":555,"config":556},"Talk to sales",{"href":557,"dataGaName":558,"dataGaLocation":226},"/sales/","talk to sales",{"text":560,"config":561},"Support portal",{"href":562,"dataGaName":563,"dataGaLocation":226},"https://support.gitlab.com/hc/en-us","support portal",{"text":565,"config":566},"Customer portal",{"href":567,"dataGaName":568,"dataGaLocation":226},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":570,"login":571,"suggestions":578},"Close",{"text":572,"link":573},"To search repositories and projects, login to",{"text":574,"config":575},"gitlab.com",{"href":240,"dataGaName":576,"dataGaLocation":577},"search login","search",{"text":579,"default":580},"Suggestions",[581,583,587,589,593,597],{"text":257,"config":582},{"href":262,"dataGaName":257,"dataGaLocation":577},{"text":584,"config":585},"Code Suggestions (AI)",{"href":586,"dataGaName":584,"dataGaLocation":577},"/solutions/code-suggestions/",{"text":293,"config":588},{"href":295,"dataGaName":293,"dataGaLocation":577},{"text":590,"config":591},"GitLab on AWS",{"href":592,"dataGaName":590,"dataGaLocation":577},"/partners/technology-partners/aws/",{"text":594,"config":595},"GitLab on Google Cloud",{"href":596,"dataGaName":594,"dataGaLocation":577},"/partners/technology-partners/google-cloud-platform/",{"text":598,"config":599},"Why GitLab?",{"href":270,"dataGaName":598,"dataGaLocation":577},{"freeTrial":601,"mobileIcon":606,"desktopIcon":611,"secondaryButton":614},{"text":602,"config":603},"Start free trial",{"href":604,"dataGaName":231,"dataGaLocation":605},"https://gitlab.com/-/trials/new/","nav",{"altText":607,"config":608},"Gitlab Icon",{"src":609,"dataGaName":610,"dataGaLocation":605},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":607,"config":612},{"src":613,"dataGaName":610,"dataGaLocation":605},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":615,"config":616},"Get Started",{"href":617,"dataGaName":618,"dataGaLocation":605},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":620,"mobileIcon":624,"desktopIcon":626},{"text":621,"config":622},"Learn more about GitLab Duo",{"href":262,"dataGaName":623,"dataGaLocation":605},"gitlab duo",{"altText":607,"config":625},{"src":609,"dataGaName":610,"dataGaLocation":605},{"altText":607,"config":627},{"src":613,"dataGaName":610,"dataGaLocation":605},{"button":629,"mobileIcon":634,"desktopIcon":636},{"text":630,"config":631},"/switch",{"href":632,"dataGaName":633,"dataGaLocation":605},"#contact","switch",{"altText":607,"config":635},{"src":609,"dataGaName":610,"dataGaLocation":605},{"altText":607,"config":637},{"src":638,"dataGaName":610,"dataGaLocation":605},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":640,"mobileIcon":645,"desktopIcon":647},{"text":641,"config":642},"Back to pricing",{"href":375,"dataGaName":643,"dataGaLocation":605,"icon":644},"back to pricing","GoBack",{"altText":607,"config":646},{"src":609,"dataGaName":610,"dataGaLocation":605},{"altText":607,"config":648},{"src":613,"dataGaName":610,"dataGaLocation":605},{"title":650,"titleMobile":651,"button":652,"config":657},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":268,"config":653},{"href":654,"dataGaName":655,"dataGaLocation":656},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":658,"disabled":203},"release",{"data":660},{"text":661,"source":662,"edit":668,"contribute":673,"config":678,"items":683,"minimal":893},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":663,"config":664},"View page source",{"href":665,"dataGaName":666,"dataGaLocation":667},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":669,"config":670},"Edit this page",{"href":671,"dataGaName":672,"dataGaLocation":667},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":674,"config":675},"Please contribute",{"href":676,"dataGaName":677,"dataGaLocation":667},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":679,"facebook":680,"youtube":681,"linkedin":682},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[684,731,785,829,861],{"title":373,"links":685,"subMenu":700},[686,690,695],{"text":687,"config":688},"View plans",{"href":375,"dataGaName":689,"dataGaLocation":667},"view plans",{"text":691,"config":692},"Why Premium?",{"href":693,"dataGaName":694,"dataGaLocation":667},"/pricing/premium/","why premium",{"text":696,"config":697},"Why Ultimate?",{"href":698,"dataGaName":699,"dataGaLocation":667},"/pricing/ultimate/","why ultimate",[701],{"title":702,"links":703},"Contact Us",[704,707,709,711,716,721,726],{"text":705,"config":706},"Contact sales",{"href":557,"dataGaName":236,"dataGaLocation":667},{"text":560,"config":708},{"href":562,"dataGaName":563,"dataGaLocation":667},{"text":565,"config":710},{"href":567,"dataGaName":568,"dataGaLocation":667},{"text":712,"config":713},"Status",{"href":714,"dataGaName":715,"dataGaLocation":667},"https://status.gitlab.com/","status",{"text":717,"config":718},"Terms of use",{"href":719,"dataGaName":720,"dataGaLocation":667},"/terms/","terms of use",{"text":722,"config":723},"Privacy statement",{"href":724,"dataGaName":725,"dataGaLocation":667},"/privacy/","privacy statement",{"text":727,"config":728},"Cookie preferences",{"dataGaName":729,"dataGaLocation":667,"id":730,"isOneTrustButton":206},"cookie preferences","ot-sdk-btn",{"title":273,"links":732,"subMenu":741},[733,737],{"text":734,"config":735},"DevSecOps platform",{"href":255,"dataGaName":736,"dataGaLocation":667},"devsecops platform",{"text":738,"config":739},"AI-Assisted Development",{"href":262,"dataGaName":740,"dataGaLocation":667},"ai-assisted development",[742],{"title":743,"links":744},"Topics",[745,750,755,760,765,770,775,780],{"text":746,"config":747},"CICD",{"href":748,"dataGaName":749,"dataGaLocation":667},"/topics/ci-cd/","cicd",{"text":751,"config":752},"GitOps",{"href":753,"dataGaName":754,"dataGaLocation":667},"/topics/gitops/","gitops",{"text":756,"config":757},"DevOps",{"href":758,"dataGaName":759,"dataGaLocation":667},"/topics/devops/","devops",{"text":761,"config":762},"Version Control",{"href":763,"dataGaName":764,"dataGaLocation":667},"/topics/version-control/","version control",{"text":766,"config":767},"DevSecOps",{"href":768,"dataGaName":769,"dataGaLocation":667},"/topics/devsecops/","devsecops",{"text":771,"config":772},"Cloud Native",{"href":773,"dataGaName":774,"dataGaLocation":667},"/topics/cloud-native/","cloud native",{"text":776,"config":777},"AI for Coding",{"href":778,"dataGaName":779,"dataGaLocation":667},"/topics/devops/ai-for-coding/","ai for coding",{"text":781,"config":782},"Agentic AI",{"href":783,"dataGaName":784,"dataGaLocation":667},"/topics/agentic-ai/","agentic ai",{"title":786,"links":787},"Solutions",[788,790,792,797,801,804,808,811,813,816,819,824],{"text":317,"config":789},{"href":312,"dataGaName":317,"dataGaLocation":667},{"text":306,"config":791},{"href":289,"dataGaName":290,"dataGaLocation":667},{"text":793,"config":794},"Agile development",{"href":795,"dataGaName":796,"dataGaLocation":667},"/solutions/agile-delivery/","agile delivery",{"text":798,"config":799},"SCM",{"href":302,"dataGaName":800,"dataGaLocation":667},"source code management",{"text":746,"config":802},{"href":295,"dataGaName":803,"dataGaLocation":667},"continuous integration & delivery",{"text":805,"config":806},"Value stream management",{"href":345,"dataGaName":807,"dataGaLocation":667},"value stream management",{"text":751,"config":809},{"href":810,"dataGaName":754,"dataGaLocation":667},"/solutions/gitops/",{"text":355,"config":812},{"href":358,"dataGaName":359,"dataGaLocation":667},{"text":814,"config":815},"Small business",{"href":364,"dataGaName":365,"dataGaLocation":667},{"text":817,"config":818},"Public sector",{"href":370,"dataGaName":371,"dataGaLocation":667},{"text":820,"config":821},"Education",{"href":822,"dataGaName":823,"dataGaLocation":667},"/solutions/education/","education",{"text":825,"config":826},"Financial services",{"href":827,"dataGaName":828,"dataGaLocation":667},"/solutions/finance/","financial services",{"title":378,"links":830},[831,833,835,837,840,842,845,847,849,851,853,855,857,859],{"text":391,"config":832},{"href":393,"dataGaName":394,"dataGaLocation":667},{"text":396,"config":834},{"href":398,"dataGaName":399,"dataGaLocation":667},{"text":401,"config":836},{"href":403,"dataGaName":404,"dataGaLocation":667},{"text":406,"config":838},{"href":408,"dataGaName":839,"dataGaLocation":667},"docs",{"text":429,"config":841},{"href":431,"dataGaName":432,"dataGaLocation":667},{"text":843,"config":844},"What's new",{"href":489,"dataGaName":490,"dataGaLocation":667},{"text":424,"config":846},{"href":426,"dataGaName":427,"dataGaLocation":667},{"text":443,"config":848},{"href":445,"dataGaName":446,"dataGaLocation":667},{"text":451,"config":850},{"href":453,"dataGaName":454,"dataGaLocation":667},{"text":456,"config":852},{"href":458,"dataGaName":459,"dataGaLocation":667},{"text":461,"config":854},{"href":463,"dataGaName":464,"dataGaLocation":667},{"text":466,"config":856},{"href":468,"dataGaName":469,"dataGaLocation":667},{"text":471,"config":858},{"href":473,"dataGaName":474,"dataGaLocation":667},{"text":476,"config":860},{"href":478,"dataGaName":479,"dataGaLocation":667},{"title":492,"links":862},[863,865,867,869,871,873,877,882,884,886,888],{"text":500,"config":864},{"href":502,"dataGaName":494,"dataGaLocation":667},{"text":505,"config":866},{"href":507,"dataGaName":508,"dataGaLocation":667},{"text":513,"config":868},{"href":515,"dataGaName":516,"dataGaLocation":667},{"text":518,"config":870},{"href":520,"dataGaName":521,"dataGaLocation":667},{"text":523,"config":872},{"href":525,"dataGaName":526,"dataGaLocation":667},{"text":874,"config":875},"Sustainability",{"href":876,"dataGaName":874,"dataGaLocation":667},"/sustainability/",{"text":878,"config":879},"Diversity, inclusion and belonging (DIB)",{"href":880,"dataGaName":881,"dataGaLocation":667},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":528,"config":883},{"href":530,"dataGaName":531,"dataGaLocation":667},{"text":538,"config":885},{"href":540,"dataGaName":541,"dataGaLocation":667},{"text":543,"config":887},{"href":545,"dataGaName":546,"dataGaLocation":667},{"text":889,"config":890},"Modern Slavery Transparency Statement",{"href":891,"dataGaName":892,"dataGaLocation":667},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":894},[895,898,901],{"text":896,"config":897},"Terms",{"href":719,"dataGaName":720,"dataGaLocation":667},{"text":899,"config":900},"Cookies",{"dataGaName":729,"dataGaLocation":667,"id":730,"isOneTrustButton":206},{"text":902,"config":903},"Privacy",{"href":724,"dataGaName":725,"dataGaLocation":667},[905],{"id":906,"title":907,"body":202,"config":908,"content":910,"description":202,"extension":913,"meta":914,"navigation":206,"path":915,"seo":916,"stem":917,"__hash__":918},"blogAuthors/en-us/blog/authors/zeger-jan-van-de-weg.yml","Zeger Jan Van De Weg",{"template":909},"BlogAuthor",{"name":7,"config":911},{"headshot":190,"ctfId":912},"zjgitlab","yml",{},"/en-us/blog/authors/zeger-jan-van-de-weg",{},"en-us/blog/authors/zeger-jan-van-de-weg","uTVQwXNnBL0ibdUCEMyi-YCRI3IJbCiLvsRdKDbliM8",[920,929,937],{"title":921,"description":922,"heroImage":923,"category":198,"date":924,"authors":925,"slug":928,"externalUrl":202},"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",[926,927],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":930,"description":931,"heroImage":932,"category":198,"date":933,"authors":934,"slug":936,"externalUrl":202},"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",[935],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":938,"description":939,"heroImage":940,"category":198,"date":941,"authors":942,"slug":944,"externalUrl":202},"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",[943],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":946},[947,961,973,985],{"id":948,"categories":949,"header":951,"text":952,"button":953,"image":958},"ai-modernization",[950],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":954,"config":955},"Get your AI maturity score",{"href":956,"dataGaName":957,"dataGaLocation":432},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":959},{"src":960},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":962,"categories":963,"header":965,"text":952,"button":966,"image":970},"devops-modernization",[964,769],"product","Are you just managing tools or shipping innovation?",{"text":967,"config":968},"Get your DevOps maturity score",{"href":969,"dataGaName":957,"dataGaLocation":432},"/assessments/devops-modernization-assessment/",{"config":971},{"src":972},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":974,"categories":975,"header":977,"text":952,"button":978,"image":982},"security-modernization",[976],"security","Are you trading speed for security?",{"text":979,"config":980},"Get your security maturity score",{"href":981,"dataGaName":957,"dataGaLocation":432},"/assessments/security-modernization-assessment/",{"config":983},{"src":984},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":986,"paths":987,"header":990,"text":991,"button":992,"image":997},"github-azure-migration",[988,989],"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":993,"config":994},"See how GitLab compares to GitHub",{"href":995,"dataGaName":996,"dataGaLocation":432},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":998},{"src":972},{"header":1000,"blurb":1001,"button":1002,"secondaryButton":1007},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1003,"config":1004},"Get your free trial",{"href":1005,"dataGaName":231,"dataGaLocation":1006},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":705,"config":1008},{"href":557,"dataGaName":236,"dataGaLocation":1006},1786803755596]