[{"data":1,"prerenderedAt":731},["ShallowReactive",2],{"/en-us/blog/geo-is-available-on-staging-for-gitlab-com/":3,"navigation-en-us":37,"banner-en-us":466,"footer-en-us":483,"Fabian Zimmer-Douglas Alexandre":693,"next-steps-en-us":716},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":27,"_id":30,"_type":31,"title":32,"_source":33,"_file":34,"_stem":35,"_extension":36},"/en-us/blog/geo-is-available-on-staging-for-gitlab-com","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"Why we enabled Geo on the staging environment for GitLab.com","Geo is GitLab's solution for distributed teams and now we can validate and test it at scale.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749669656/Blog/Hero%20Images/donald-giannatti-4qk3nQI3WHY-unsplash-small.jpg","https://about.gitlab.com/blog/geo-is-available-on-staging-for-gitlab-com","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"Why we enabled Geo on the staging environment for GitLab.com\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Fabian Zimmer\"},{\"@type\":\"Person\",\"name\":\"Douglas Alexandre\"}],\n        \"datePublished\": \"2020-04-16\",\n      }",{"title":9,"description":10,"authors":17,"heroImage":11,"date":20,"body":21,"category":22,"tags":23},[18,19],"Fabian Zimmer","Douglas Alexandre","2020-04-16","We're testing Geo at scale on GitLab.com – our largest installation of\nGitLab – because we believe the best way to guarantee that Geo works as\nexpected is to [use it\nourselves](/handbook/product/product-processes/#dogfood-everything).\n\n\nGeo is GitLab's [solution for distributed teams](https://docs.gitlab.com/ee/administration/geo/index.html). We want\nteams all over the world to have a great user experience - independent of\nhow far away users are from their primary GitLab installation. To accomplish\nthis goal, read-only Geo nodes can be created across the world in close\ngeographical proximity to your teams. These Geo nodes replicate important\ndata, such as projects or LFS files, from the primary GitLab instance and\nthereby make the data available to users. Geo can also be used as part of a\ndisaster recovery strategy because it adds data redundancy. Geo nodes follow\nthe primary installation closely and allow customers to failover to this\nnode in case the primary node becomes unavailable.\n\n\nMany of GitLab's customers use Geo on self-managed installations that serve\nhundreds to thousands of users. Geo is a critical component of GitLab\ninstallations and our customers expect Geo to work at any scale. We are\ntesting Geo at scale on our GitLab.com installation because if it works for\nus, chances are it will work for our worldwide group of users too.\n\n\nIn this blog post, we'll explain why and how we chose to enable GitLab Geo\non our pre-production environment (from now on referred to as \"staging\"),\nthe challenges we encountered, some of the immediate benefits to our\ncustomers, and what will be next.\n\n\n## Why do we need to use Geo at GitLab?\n\nIn order to build the best product possible, we believe it is imperative to\n[use GitLab\nourselves](/handbook/product/product-processes/#dogfood-everything). Many of\nour Geo customers have thousands of users actively using GitLab and a major\nchallenge for the team was to test and validate new Geo functionality at\nscale. Enabling Geo on the GitLab.com staging environment makes this task a\nlot easier.\n\n\nWe also used Geo to [migrate GitLab.com from Microsoft Azure to Google Cloud\nin 2018](/blog/moving-to-gcp/), which allowed us to improve the product by\nidentifying bottlenecks. In the last two years, GitLab has grown\ndramatically and in order to push Geo forward, we need to enable it (again).\n\n\n### Test Geo at scale\n\nWhen the team decides to add new functionalities to Geo, for example\n[package repository\nreplication](https://gitlab.com/groups/gitlab-org/-/epics/2346), we had to\nensure that the feature's performance is as expected. Having Geo available\non staging allows us to deploy these changes behind a feature flag first and\nevaluate the performance before shipping the feature to customers. This is\nespecially relevant to some of Geo's PostgreSQL database queries. On a small\ntest deployment, things may look fine, but at scale these queries can time\nout, resulting in replication issues.\n\n\nWe also deploy code to our staging environment twice a week, which means\nthat any regressions surface before a new packaged release.\n\n\n### Prove that Geo can be deployed as part of our production infrastructure\n\nA large amount of automation is required to run GitLab.com with millions of\nusers, and our SRE team is constantly improving how we run GitLab.com. The\nfirst step bringing Geo into our production environment is to deploy Geo as\na part of our staging environment. Without the right monitoring, runbooks,\nand processes in place, it would not be possible to move Geo into production\nwhere it could be used to enable geo-replication and/or as part of our\ndisaster recovery strategy.\n\n\n## Setting up Geo on staging\n\n\nSetting up Geo on staging had some unique challenges, you can get a detailed\noverview in our [Geo on staging\ndocumentation](/handbook/engineering/development/enablement/systems/geo/staging.html).\n\n\nIn order to deploy Geo, we opted for a minimally viable approach that is\nsufficient for a first iteration. Geo is currently deployed as a single\nall-in-one box, not yet as a [Geo high-availability\nconfiguration](https://docs.gitlab.com/ee/administration/geo/replication/multiple_servers.html).\nGeo deploys happen automatically via Chef, similar to any other part of the\ninfrastructure.\n\n\n![Geo staging\nDiagram](https://about.gitlab.com/images/blogimages/geo-on-staging/geo_staging_diagram.png){:\n.shadow.medium.center}\n\n\nWe currently replicate only a subset of data using [Geo's selective\nsynchronization\nfeature](https://docs.gitlab.com/ee/administration/geo/replication/configuration.html#selective-synchronization),\nwhich also allows us to dogfood this feature. Selective synchronization uses\na number of complex database queries and this helps us validate those at\nscale. We chose to replicate the `gitlab-org` group, which contains mostly\nof GitLab's projects (including\n[GitLab](https://gitlab.com/gitlab-org/gitlab) itself).\n\n\nWe also needed to configure Geo to use the same logical [Gitaly\nshards](https://docs.gitlab.com/ee/administration/repository_storage_paths.html)\non the secondary compared to the primary node. We'll [improve our Geo\ndocumentation](https://gitlab.com/gitlab-org/gitlab/-/issues/213840) to\nensure it is clear when this is required.\n\n\nA logical Gitaly shard is an entry in the GitLab configuration file that\npoints to a path on the file system and a Gitaly address:\n\n\n```\n\n\"git_data_dirs\": {\n  \"default\": {\n    \"path\": \"/var/opt/gitlab/git-data-file01\",\n    \"gitaly_address\": \"unix:/var/opt/gitlab/gitaly/gitaly.socket\"\n  }\n}\n\n```\n\n\nIn the example above, we have only one logical shard identified by the key\n`default`, but we could have as many as needed.\n\nEvery project on GitLab is associated with a logical Gitaly shard, which\nmeans that we know where all relevant data (repositories, uploads, etc.) is\nstored. A project `example` that is associated with the logical Gitaly shard\n`default`, would therefore be stored at `/var/opt/gitlab/git-data-file01`\nand the Gitaly server would be available at\n`/var/opt/gitlab/git-data-file01`.\n\n\nThis information is stored in the PostgreSQL database and in order for Geo\nto replicate projects successfully we needed to create the same Gitaly shard\nlayout. On the Geo secondary node, we are using only one physical shard to\nstore the data for all projects. To allow it to replicate any project from\nthe primary node, we had to point all the logical Gitaly shards to the same\nphysical shard on the secondary node.\n\n\nGeo on staging is configured to use [cascading streaming\nreplication](https://www.postgresql.org/docs/current/warm-standby.html#CASCADING-REPLICATION),\nwhich allows one standby node in the staging [Patroni\ncluster](https://github.com/zalando/patroni) to act as relay and stream\nwrite-ahead logs (WAL) to the Geo secondary. This setup also has the\nadvantage that Geo can't put an additional load onto the primary database\nnode and we are also not using physical replication slots to further reduce\nthe load. [Patroni will likely be supported in Omnibus\npackages](https://gitlab.com/groups/gitlab-org/-/epics/2588) and we will\nreview these settings to allow our customers to benefit from this setup.\n\n\nPostgreSQL will automatically fall back on its `restore_command` to pull\narchived WAL segments using [wal-e](https://github.com/wal-e/wal-e), if it\ncannot retrieve the segment by streaming replication. This can happen after\na failover, or if the replication target has deleted the relevant segment if\nGeo is lagging behind it.\n\n\nIn the future, we will use this to experiment with [high-availability\nconfigurations of PostgreSQL on a secondary Geo\nnode](https://gitlab.com/groups/gitlab-org/-/epics/2536).\n\n\n## What we learned and how we can improve\n\n\nWe opened [23 issues before successfully rolling out Geo on our staging\nenvironment](https://gitlab.com/groups/gitlab-org/-/epics/1908) - this is\ntoo many. We know that installing and configuring Geo in complex\nenvironments is time-consuming and error-prone, and is an area where we can\nimprove. The current process for a self-managed installation requires [more\nthan 70 individual\nsteps](https://gitlab.com/gitlab-org/gitlab-design/issues/731) - this is too\nmuch. [Geo should be simple to\ninstall](https://gitlab.com/groups/gitlab-org/-/epics/1465) and we aim to\nreduce the number of steps to below 10. Using Geo ourselves really\nunderscored the importance of improvements in this area.\n\n\n### Some Geo PostgreSQL queries don't perform well\n\n\nGeo uses PostgreSQL Foreign Data Wrappers (FDW) to perform some\ncross-database queries between the secondary replica and the tracking\ndatabase. FDW queries are quite elegant but have lead to some issues in the\npast. Specifically, staging is still running PostgreSQL 9.6, and Geo\nbenefits from some FDW improvements available only in PostgreSQL 10 and\nlater, such as join push-down and aggregate push-down.\n\n\nWhile enabling Geo on staging, some FDW queries timed out during the\nbackfill phase. Until staging is being upgraded to a newer version of\nPostgreSQL, increasing the statement timeout to 20 minutes on the Geo\nsecondary node was sufficient to allow us to proceed with the backfill.\n\n\nAs a direct consequence of enabling GitLab on staging, we are working to\n[improve Geo scalability by simplifying backfill\noperations](https://gitlab.com/groups/gitlab-org/-/epics/2851), eliminating\nthese cross-database queries, and removing the FDW requirement. We also plan\nto [upgrade to PostgreSQL 11 in GitLab\n13.0](https://gitlab.com/groups/gitlab-org/-/epics/2414).\n\n\n### Bug fixes\n\nWe've also discovered and fixed a number of bugs in the process, such as\n[failing to synchronize uploads with missing mount\npoints](https://gitlab.com/gitlab-org/gitlab/-/issues/209752), [invalid\nActiveRecord\noperations](https://gitlab.com/gitlab-org/gitlab/-/issues/210589), and\n[excessively re-synchronizing files in some\nsituations](https://gitlab.com/gitlab-org/gitlab/-/issues/207808).\n\n\n## What's next?\n\nWe are already providing value to our customers by enabling Geo on staging\nbecause the Geo team can test and validate Geo at scale at lot easier. Next\nup is enabling [automatic runs of our end-to-end test on\nstaging](https://gitlab.com/gitlab-org/quality/team-tasks/issues/385), which\nwould reduce the manual testing burden even further. There are also some\nother improvements, such as [enabling high-availability configurations of\nPostgreSQL using Patroni on Geo\nnodes](https://gitlab.com/groups/gitlab-org/-/epics/2536) that we would like\nto test on staging.\n\n\nEven though enabling Geo on staging is already very useful, it is just a\nstep forward to rolling out Geo on GitLab.com in production. We are\ncurrently evaluating the business case for enabling Geo on GitLab.com as\npart of our disaster recovery strategy and for geo replication.\n\n\nCover image by [Donald Giannatti](https://unsplash.com/photos/4qk3nQI3WHY)\non [Unsplash](https://www.unsplash.com)\n\n{: .note}\n","engineering",[24,25,26],"features","inside GitLab","google",{"slug":28,"featured":6,"template":29},"geo-is-available-on-staging-for-gitlab-com","BlogPost","content:en-us:blog:geo-is-available-on-staging-for-gitlab-com.yml","yaml","Geo Is Available On Staging For Gitlab Com","content","en-us/blog/geo-is-available-on-staging-for-gitlab-com.yml","en-us/blog/geo-is-available-on-staging-for-gitlab-com","yml",{"_path":38,"_dir":39,"_draft":6,"_partial":6,"_locale":7,"data":40,"_id":462,"_type":31,"title":463,"_source":33,"_file":464,"_stem":465,"_extension":36},"/shared/en-us/main-navigation","en-us",{"logo":41,"freeTrial":46,"sales":51,"login":56,"items":61,"search":393,"minimal":424,"duo":443,"pricingDeployment":452},{"config":42},{"href":43,"dataGaName":44,"dataGaLocation":45},"/","gitlab logo","header",{"text":47,"config":48},"Get free trial",{"href":49,"dataGaName":50,"dataGaLocation":45},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":52,"config":53},"Talk to sales",{"href":54,"dataGaName":55,"dataGaLocation":45},"/sales/","sales",{"text":57,"config":58},"Sign in",{"href":59,"dataGaName":60,"dataGaLocation":45},"https://gitlab.com/users/sign_in/","sign in",[62,106,204,209,314,374],{"text":63,"config":64,"cards":66,"footer":89},"Platform",{"dataNavLevelOne":65},"platform",[67,73,81],{"title":63,"description":68,"link":69},"The most comprehensive AI-powered DevSecOps Platform",{"text":70,"config":71},"Explore our Platform",{"href":72,"dataGaName":65,"dataGaLocation":45},"/platform/",{"title":74,"description":75,"link":76},"GitLab Duo (AI)","Build software faster with AI at every stage of development",{"text":77,"config":78},"Meet GitLab Duo",{"href":79,"dataGaName":80,"dataGaLocation":45},"/gitlab-duo/","gitlab duo ai",{"title":82,"description":83,"link":84},"Why GitLab","10 reasons why Enterprises choose GitLab",{"text":85,"config":86},"Learn more",{"href":87,"dataGaName":88,"dataGaLocation":45},"/why-gitlab/","why gitlab",{"title":90,"items":91},"Get started with",[92,97,102],{"text":93,"config":94},"Platform Engineering",{"href":95,"dataGaName":96,"dataGaLocation":45},"/solutions/platform-engineering/","platform engineering",{"text":98,"config":99},"Developer Experience",{"href":100,"dataGaName":101,"dataGaLocation":45},"/developer-experience/","Developer experience",{"text":103,"config":104},"MLOps",{"href":105,"dataGaName":103,"dataGaLocation":45},"/topics/devops/the-role-of-ai-in-devops/",{"text":107,"left":108,"config":109,"link":111,"lists":115,"footer":186},"Product",true,{"dataNavLevelOne":110},"solutions",{"text":112,"config":113},"View all Solutions",{"href":114,"dataGaName":110,"dataGaLocation":45},"/solutions/",[116,141,165],{"title":117,"description":118,"link":119,"items":124},"Automation","CI/CD and automation to accelerate deployment",{"config":120},{"icon":121,"href":122,"dataGaName":123,"dataGaLocation":45},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[125,129,133,137],{"text":126,"config":127},"CI/CD",{"href":128,"dataGaLocation":45,"dataGaName":126},"/solutions/continuous-integration/",{"text":130,"config":131},"AI-Assisted Development",{"href":79,"dataGaLocation":45,"dataGaName":132},"AI assisted development",{"text":134,"config":135},"Source Code Management",{"href":136,"dataGaLocation":45,"dataGaName":134},"/solutions/source-code-management/",{"text":138,"config":139},"Automated Software Delivery",{"href":122,"dataGaLocation":45,"dataGaName":140},"Automated software delivery",{"title":142,"description":143,"link":144,"items":149},"Security","Deliver code faster without compromising security",{"config":145},{"href":146,"dataGaName":147,"dataGaLocation":45,"icon":148},"/solutions/security-compliance/","security and compliance","ShieldCheckLight",[150,155,160],{"text":151,"config":152},"Application Security Testing",{"href":153,"dataGaName":154,"dataGaLocation":45},"/solutions/application-security-testing/","Application security testing",{"text":156,"config":157},"Software Supply Chain Security",{"href":158,"dataGaLocation":45,"dataGaName":159},"/solutions/supply-chain/","Software supply chain security",{"text":161,"config":162},"Software Compliance",{"href":163,"dataGaName":164,"dataGaLocation":45},"/solutions/software-compliance/","software compliance",{"title":166,"link":167,"items":172},"Measurement",{"config":168},{"icon":169,"href":170,"dataGaName":171,"dataGaLocation":45},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[173,177,181],{"text":174,"config":175},"Visibility & Measurement",{"href":170,"dataGaLocation":45,"dataGaName":176},"Visibility and Measurement",{"text":178,"config":179},"Value Stream Management",{"href":180,"dataGaLocation":45,"dataGaName":178},"/solutions/value-stream-management/",{"text":182,"config":183},"Analytics & Insights",{"href":184,"dataGaLocation":45,"dataGaName":185},"/solutions/analytics-and-insights/","Analytics and insights",{"title":187,"items":188},"GitLab for",[189,194,199],{"text":190,"config":191},"Enterprise",{"href":192,"dataGaLocation":45,"dataGaName":193},"/enterprise/","enterprise",{"text":195,"config":196},"Small Business",{"href":197,"dataGaLocation":45,"dataGaName":198},"/small-business/","small business",{"text":200,"config":201},"Public Sector",{"href":202,"dataGaLocation":45,"dataGaName":203},"/solutions/public-sector/","public sector",{"text":205,"config":206},"Pricing",{"href":207,"dataGaName":208,"dataGaLocation":45,"dataNavLevelOne":208},"/pricing/","pricing",{"text":210,"config":211,"link":213,"lists":217,"feature":301},"Resources",{"dataNavLevelOne":212},"resources",{"text":214,"config":215},"View all resources",{"href":216,"dataGaName":212,"dataGaLocation":45},"/resources/",[218,251,273],{"title":219,"items":220},"Getting started",[221,226,231,236,241,246],{"text":222,"config":223},"Install",{"href":224,"dataGaName":225,"dataGaLocation":45},"/install/","install",{"text":227,"config":228},"Quick start guides",{"href":229,"dataGaName":230,"dataGaLocation":45},"/get-started/","quick setup checklists",{"text":232,"config":233},"Learn",{"href":234,"dataGaLocation":45,"dataGaName":235},"https://university.gitlab.com/","learn",{"text":237,"config":238},"Product documentation",{"href":239,"dataGaName":240,"dataGaLocation":45},"https://docs.gitlab.com/","product documentation",{"text":242,"config":243},"Best practice videos",{"href":244,"dataGaName":245,"dataGaLocation":45},"/getting-started-videos/","best practice videos",{"text":247,"config":248},"Integrations",{"href":249,"dataGaName":250,"dataGaLocation":45},"/integrations/","integrations",{"title":252,"items":253},"Discover",[254,259,263,268],{"text":255,"config":256},"Customer success stories",{"href":257,"dataGaName":258,"dataGaLocation":45},"/customers/","customer success stories",{"text":260,"config":261},"Blog",{"href":262,"dataGaName":5,"dataGaLocation":45},"/blog/",{"text":264,"config":265},"Remote",{"href":266,"dataGaName":267,"dataGaLocation":45},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":269,"config":270},"TeamOps",{"href":271,"dataGaName":272,"dataGaLocation":45},"/teamops/","teamops",{"title":274,"items":275},"Connect",[276,281,286,291,296],{"text":277,"config":278},"GitLab Services",{"href":279,"dataGaName":280,"dataGaLocation":45},"/services/","services",{"text":282,"config":283},"Community",{"href":284,"dataGaName":285,"dataGaLocation":45},"/community/","community",{"text":287,"config":288},"Forum",{"href":289,"dataGaName":290,"dataGaLocation":45},"https://forum.gitlab.com/","forum",{"text":292,"config":293},"Events",{"href":294,"dataGaName":295,"dataGaLocation":45},"/events/","events",{"text":297,"config":298},"Partners",{"href":299,"dataGaName":300,"dataGaLocation":45},"/partners/","partners",{"backgroundColor":302,"textColor":303,"text":304,"image":305,"link":309},"#2f2a6b","#fff","Insights for the future of software development",{"altText":306,"config":307},"the source promo card",{"src":308},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":310,"config":311},"Read the latest",{"href":312,"dataGaName":313,"dataGaLocation":45},"/the-source/","the source",{"text":315,"config":316,"lists":318},"Company",{"dataNavLevelOne":317},"company",[319],{"items":320},[321,326,332,334,339,344,349,354,359,364,369],{"text":322,"config":323},"About",{"href":324,"dataGaName":325,"dataGaLocation":45},"/company/","about",{"text":327,"config":328,"footerGa":331},"Jobs",{"href":329,"dataGaName":330,"dataGaLocation":45},"/jobs/","jobs",{"dataGaName":330},{"text":292,"config":333},{"href":294,"dataGaName":295,"dataGaLocation":45},{"text":335,"config":336},"Leadership",{"href":337,"dataGaName":338,"dataGaLocation":45},"/company/team/e-group/","leadership",{"text":340,"config":341},"Team",{"href":342,"dataGaName":343,"dataGaLocation":45},"/company/team/","team",{"text":345,"config":346},"Handbook",{"href":347,"dataGaName":348,"dataGaLocation":45},"https://handbook.gitlab.com/","handbook",{"text":350,"config":351},"Investor relations",{"href":352,"dataGaName":353,"dataGaLocation":45},"https://ir.gitlab.com/","investor relations",{"text":355,"config":356},"Trust Center",{"href":357,"dataGaName":358,"dataGaLocation":45},"/security/","trust center",{"text":360,"config":361},"AI Transparency Center",{"href":362,"dataGaName":363,"dataGaLocation":45},"/ai-transparency-center/","ai transparency center",{"text":365,"config":366},"Newsletter",{"href":367,"dataGaName":368,"dataGaLocation":45},"/company/contact/","newsletter",{"text":370,"config":371},"Press",{"href":372,"dataGaName":373,"dataGaLocation":45},"/press/","press",{"text":375,"config":376,"lists":377},"Contact us",{"dataNavLevelOne":317},[378],{"items":379},[380,383,388],{"text":52,"config":381},{"href":54,"dataGaName":382,"dataGaLocation":45},"talk to sales",{"text":384,"config":385},"Get help",{"href":386,"dataGaName":387,"dataGaLocation":45},"/support/","get help",{"text":389,"config":390},"Customer portal",{"href":391,"dataGaName":392,"dataGaLocation":45},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":394,"login":395,"suggestions":402},"Close",{"text":396,"link":397},"To search repositories and projects, login to",{"text":398,"config":399},"gitlab.com",{"href":59,"dataGaName":400,"dataGaLocation":401},"search login","search",{"text":403,"default":404},"Suggestions",[405,407,411,413,417,421],{"text":74,"config":406},{"href":79,"dataGaName":74,"dataGaLocation":401},{"text":408,"config":409},"Code Suggestions (AI)",{"href":410,"dataGaName":408,"dataGaLocation":401},"/solutions/code-suggestions/",{"text":126,"config":412},{"href":128,"dataGaName":126,"dataGaLocation":401},{"text":414,"config":415},"GitLab on AWS",{"href":416,"dataGaName":414,"dataGaLocation":401},"/partners/technology-partners/aws/",{"text":418,"config":419},"GitLab on Google Cloud",{"href":420,"dataGaName":418,"dataGaLocation":401},"/partners/technology-partners/google-cloud-platform/",{"text":422,"config":423},"Why GitLab?",{"href":87,"dataGaName":422,"dataGaLocation":401},{"freeTrial":425,"mobileIcon":430,"desktopIcon":435,"secondaryButton":438},{"text":426,"config":427},"Start free trial",{"href":428,"dataGaName":50,"dataGaLocation":429},"https://gitlab.com/-/trials/new/","nav",{"altText":431,"config":432},"Gitlab Icon",{"src":433,"dataGaName":434,"dataGaLocation":429},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":431,"config":436},{"src":437,"dataGaName":434,"dataGaLocation":429},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":439,"config":440},"Get Started",{"href":441,"dataGaName":442,"dataGaLocation":429},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/compare/gitlab-vs-github/","get started",{"freeTrial":444,"mobileIcon":448,"desktopIcon":450},{"text":445,"config":446},"Learn more about GitLab Duo",{"href":79,"dataGaName":447,"dataGaLocation":429},"gitlab duo",{"altText":431,"config":449},{"src":433,"dataGaName":434,"dataGaLocation":429},{"altText":431,"config":451},{"src":437,"dataGaName":434,"dataGaLocation":429},{"freeTrial":453,"mobileIcon":458,"desktopIcon":460},{"text":454,"config":455},"Back to pricing",{"href":207,"dataGaName":456,"dataGaLocation":429,"icon":457},"back to pricing","GoBack",{"altText":431,"config":459},{"src":433,"dataGaName":434,"dataGaLocation":429},{"altText":431,"config":461},{"src":437,"dataGaName":434,"dataGaLocation":429},"content:shared:en-us:main-navigation.yml","Main Navigation","shared/en-us/main-navigation.yml","shared/en-us/main-navigation",{"_path":467,"_dir":39,"_draft":6,"_partial":6,"_locale":7,"title":468,"button":469,"image":474,"config":478,"_id":480,"_type":31,"_source":33,"_file":481,"_stem":482,"_extension":36},"/shared/en-us/banner","is now in public beta!",{"text":470,"config":471},"Try the Beta",{"href":472,"dataGaName":473,"dataGaLocation":45},"/gitlab-duo/agent-platform/","duo banner",{"altText":475,"config":476},"GitLab Duo Agent Platform",{"src":477},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1753720689/somrf9zaunk0xlt7ne4x.svg",{"layout":479},"release","content:shared:en-us:banner.yml","shared/en-us/banner.yml","shared/en-us/banner",{"_path":484,"_dir":39,"_draft":6,"_partial":6,"_locale":7,"data":485,"_id":689,"_type":31,"title":690,"_source":33,"_file":691,"_stem":692,"_extension":36},"/shared/en-us/main-footer",{"text":486,"source":487,"edit":493,"contribute":498,"config":503,"items":508,"minimal":681},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":488,"config":489},"View page source",{"href":490,"dataGaName":491,"dataGaLocation":492},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":494,"config":495},"Edit this page",{"href":496,"dataGaName":497,"dataGaLocation":492},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":499,"config":500},"Please contribute",{"href":501,"dataGaName":502,"dataGaLocation":492},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":504,"facebook":505,"youtube":506,"linkedin":507},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[509,532,588,617,651],{"title":63,"links":510,"subMenu":515},[511],{"text":512,"config":513},"DevSecOps platform",{"href":72,"dataGaName":514,"dataGaLocation":492},"devsecops platform",[516],{"title":205,"links":517},[518,522,527],{"text":519,"config":520},"View plans",{"href":207,"dataGaName":521,"dataGaLocation":492},"view plans",{"text":523,"config":524},"Why Premium?",{"href":525,"dataGaName":526,"dataGaLocation":492},"/pricing/premium/","why premium",{"text":528,"config":529},"Why Ultimate?",{"href":530,"dataGaName":531,"dataGaLocation":492},"/pricing/ultimate/","why ultimate",{"title":533,"links":534},"Solutions",[535,540,542,544,549,554,558,561,565,570,572,575,578,583],{"text":536,"config":537},"Digital transformation",{"href":538,"dataGaName":539,"dataGaLocation":492},"/topics/digital-transformation/","digital transformation",{"text":151,"config":541},{"href":153,"dataGaName":151,"dataGaLocation":492},{"text":140,"config":543},{"href":122,"dataGaName":123,"dataGaLocation":492},{"text":545,"config":546},"Agile development",{"href":547,"dataGaName":548,"dataGaLocation":492},"/solutions/agile-delivery/","agile delivery",{"text":550,"config":551},"Cloud transformation",{"href":552,"dataGaName":553,"dataGaLocation":492},"/topics/cloud-native/","cloud transformation",{"text":555,"config":556},"SCM",{"href":136,"dataGaName":557,"dataGaLocation":492},"source code management",{"text":126,"config":559},{"href":128,"dataGaName":560,"dataGaLocation":492},"continuous integration & delivery",{"text":562,"config":563},"Value stream management",{"href":180,"dataGaName":564,"dataGaLocation":492},"value stream management",{"text":566,"config":567},"GitOps",{"href":568,"dataGaName":569,"dataGaLocation":492},"/solutions/gitops/","gitops",{"text":190,"config":571},{"href":192,"dataGaName":193,"dataGaLocation":492},{"text":573,"config":574},"Small business",{"href":197,"dataGaName":198,"dataGaLocation":492},{"text":576,"config":577},"Public sector",{"href":202,"dataGaName":203,"dataGaLocation":492},{"text":579,"config":580},"Education",{"href":581,"dataGaName":582,"dataGaLocation":492},"/solutions/education/","education",{"text":584,"config":585},"Financial services",{"href":586,"dataGaName":587,"dataGaLocation":492},"/solutions/finance/","financial services",{"title":210,"links":589},[590,592,594,596,599,601,603,605,607,609,611,613,615],{"text":222,"config":591},{"href":224,"dataGaName":225,"dataGaLocation":492},{"text":227,"config":593},{"href":229,"dataGaName":230,"dataGaLocation":492},{"text":232,"config":595},{"href":234,"dataGaName":235,"dataGaLocation":492},{"text":237,"config":597},{"href":239,"dataGaName":598,"dataGaLocation":492},"docs",{"text":260,"config":600},{"href":262,"dataGaName":5,"dataGaLocation":492},{"text":255,"config":602},{"href":257,"dataGaName":258,"dataGaLocation":492},{"text":264,"config":604},{"href":266,"dataGaName":267,"dataGaLocation":492},{"text":277,"config":606},{"href":279,"dataGaName":280,"dataGaLocation":492},{"text":269,"config":608},{"href":271,"dataGaName":272,"dataGaLocation":492},{"text":282,"config":610},{"href":284,"dataGaName":285,"dataGaLocation":492},{"text":287,"config":612},{"href":289,"dataGaName":290,"dataGaLocation":492},{"text":292,"config":614},{"href":294,"dataGaName":295,"dataGaLocation":492},{"text":297,"config":616},{"href":299,"dataGaName":300,"dataGaLocation":492},{"title":315,"links":618},[619,621,623,625,627,629,631,635,640,642,644,646],{"text":322,"config":620},{"href":324,"dataGaName":317,"dataGaLocation":492},{"text":327,"config":622},{"href":329,"dataGaName":330,"dataGaLocation":492},{"text":335,"config":624},{"href":337,"dataGaName":338,"dataGaLocation":492},{"text":340,"config":626},{"href":342,"dataGaName":343,"dataGaLocation":492},{"text":345,"config":628},{"href":347,"dataGaName":348,"dataGaLocation":492},{"text":350,"config":630},{"href":352,"dataGaName":353,"dataGaLocation":492},{"text":632,"config":633},"Sustainability",{"href":634,"dataGaName":632,"dataGaLocation":492},"/sustainability/",{"text":636,"config":637},"Diversity, inclusion and belonging (DIB)",{"href":638,"dataGaName":639,"dataGaLocation":492},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":355,"config":641},{"href":357,"dataGaName":358,"dataGaLocation":492},{"text":365,"config":643},{"href":367,"dataGaName":368,"dataGaLocation":492},{"text":370,"config":645},{"href":372,"dataGaName":373,"dataGaLocation":492},{"text":647,"config":648},"Modern Slavery Transparency Statement",{"href":649,"dataGaName":650,"dataGaLocation":492},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":652,"links":653},"Contact Us",[654,657,659,661,666,671,676],{"text":655,"config":656},"Contact an expert",{"href":54,"dataGaName":55,"dataGaLocation":492},{"text":384,"config":658},{"href":386,"dataGaName":387,"dataGaLocation":492},{"text":389,"config":660},{"href":391,"dataGaName":392,"dataGaLocation":492},{"text":662,"config":663},"Status",{"href":664,"dataGaName":665,"dataGaLocation":492},"https://status.gitlab.com/","status",{"text":667,"config":668},"Terms of use",{"href":669,"dataGaName":670,"dataGaLocation":492},"/terms/","terms of use",{"text":672,"config":673},"Privacy statement",{"href":674,"dataGaName":675,"dataGaLocation":492},"/privacy/","privacy statement",{"text":677,"config":678},"Cookie preferences",{"dataGaName":679,"dataGaLocation":492,"id":680,"isOneTrustButton":108},"cookie preferences","ot-sdk-btn",{"items":682},[683,685,687],{"text":667,"config":684},{"href":669,"dataGaName":670,"dataGaLocation":492},{"text":672,"config":686},{"href":674,"dataGaName":675,"dataGaLocation":492},{"text":677,"config":688},{"dataGaName":679,"dataGaLocation":492,"id":680,"isOneTrustButton":108},"content:shared:en-us:main-footer.yml","Main Footer","shared/en-us/main-footer.yml","shared/en-us/main-footer",[694,706],{"_path":695,"_dir":696,"_draft":6,"_partial":6,"_locale":7,"content":697,"config":701,"_id":703,"_type":31,"title":18,"_source":33,"_file":704,"_stem":705,"_extension":36},"/en-us/blog/authors/fabian-zimmer","authors",{"name":18,"config":698},{"headshot":699,"ctfId":700},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750713473/q6awwqbxtg0a4x9gtmhs.png","3TK88UogcX5lx83kWMVuvI",{"template":702},"BlogAuthor","content:en-us:blog:authors:fabian-zimmer.yml","en-us/blog/authors/fabian-zimmer.yml","en-us/blog/authors/fabian-zimmer",{"_path":707,"_dir":696,"_draft":6,"_partial":6,"_locale":7,"content":708,"config":712,"_id":713,"_type":31,"title":19,"_source":33,"_file":714,"_stem":715,"_extension":36},"/en-us/blog/authors/douglas-alexandre",{"name":19,"config":709},{"headshot":710,"ctfId":711},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Douglas-Alexandre",{"template":702},"content:en-us:blog:authors:douglas-alexandre.yml","en-us/blog/authors/douglas-alexandre.yml","en-us/blog/authors/douglas-alexandre",{"_path":717,"_dir":39,"_draft":6,"_partial":6,"_locale":7,"header":718,"eyebrow":719,"blurb":720,"button":721,"secondaryButton":725,"_id":727,"_type":31,"title":728,"_source":33,"_file":729,"_stem":730,"_extension":36},"/shared/en-us/next-steps","Start shipping better software faster","50%+ of the Fortune 100 trust GitLab","See what your team can do with the intelligent\n\n\nDevSecOps platform.\n",{"text":47,"config":722},{"href":723,"dataGaName":50,"dataGaLocation":724},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":52,"config":726},{"href":54,"dataGaName":55,"dataGaLocation":724},"content:shared:en-us:next-steps.yml","Next Steps","shared/en-us/next-steps.yml","shared/en-us/next-steps",1758326252832]