[{"data":1,"prerenderedAt":710},["ShallowReactive",2],{"/en-us/blog/using-gitlab-ci-to-build-gitlab-faster/":3,"navigation-en-us":35,"banner-en-us":454,"footer-en-us":471,"Rémy Coutable":681,"next-steps-en-us":695},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":25,"_id":28,"_type":29,"title":30,"_source":31,"_file":32,"_stem":33,"_extension":34},"/en-us/blog/using-gitlab-ci-to-build-gitlab-faster","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"How we used GitLab CI to build GitLab faster","Here's how we went from a daily manual merge of GitLab Core into GitLab Enterprise to automated merges every three hours.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749665440/Blog/Hero%20Images/automate-ce-ee-merges.jpg","https://about.gitlab.com/blog/using-gitlab-ci-to-build-gitlab-faster","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"How we used GitLab CI to build GitLab faster\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Rémy Coutable\"}],\n        \"datePublished\": \"2018-05-02\",\n      }",{"title":9,"description":10,"authors":17,"heroImage":11,"date":19,"body":20,"category":21,"tags":22},[18],"Rémy Coutable","2018-05-02","GitLab is an [open source project], but also a [commercial project]. For\nhistoric\n\nreasons, we have two Git repositories: [`gitlab-ce`] for GitLab Core and\n\n[`gitlab-ee`] for GitLab Enterprise packages (you can read [our recent blog\npost explaining GitLab self-managed tiers](/blog/gitlab-tiers/)).\n\nWhile we're working on having a [single codebase], we still need to\nregularly\n\nmerge [`gitlab-ce`] into [`gitlab-ee`] since most of the development happens\non\n\nGitLab Core, but we also develop features on top of it for GitLab Starter,\nPremium, and Ultimate.\n\n\n## How we used to merge GitLab CE into GitLab EE\n\n\nUntil December 2017, the merge of [`gitlab-ce`] into [`gitlab-ee`] was\nmanual\n\non a daily basis with basically the following commands ([see the full\ndocumentation]):\n\n\n```shell\n\n# the `origin` remote refers to https://gitlab.com/gitlab-org/gitlab-ee.git\n\n# the `ce` remote refers to https://gitlab.com/gitlab-org/gitlab-ce.git\n\ngit fetch origin master\n\ngit checkout -b ce-to-ee origin/master\n\ngit fetch ce master\n\ngit merge --no-ff ce/master\n\n```\n\n\nAt this point, since we'd merge a day's worth of GitLab Core's new commits,\n\nchances were good we'd see conflicts.\n\nMost of the time, the person responsible for this process would handle the\n\nconflict resolutions, commit them and push the `ce-to-ee` branch to\nGitLab.com.\n\n\nThere were a few problems with this approach:\n\n\n- GitLab's development pace is fast, which means the longer we go without a\n  merge, the more changes there are and thus more opportunities for conflicts\n- If we had many conflicts, it could take a significant amount of time for\nthe\n  developer responsible for the merge\n- The developer performing the merge wasn't always the best person to\nresolve the\n  conflicts\n- Significant time was spent identifying and notifying developers to help\nresolve conflicts\n\n\n## The solution\n\n\nOur plan was to have a single script that would automate the merge, and in\nthe\n\ncase of conflicts, identify the person best suited to resolve each of them.\n\nIt would then create the merge request using the [GitLab API] and a\n\n[GitLab API Ruby wrapper], and post a message in Slack when a new merge\nrequest\n\nwas created or an existing one was still pending.\n\n\nFinally, we'd use GitLab's [pipeline schedules] to run the script every\nthree hours.\n\n\n### Step 1: Write the script\n\n\nWe chose to write the script in our [`release-tools`] project, since it\nalready\n\nhad a strong foundation for working with the relevant Git repositories.\n\n\nThis script was written iteratively as a set of classes over the course of a\nfew\n\nmonths:\n\n\n1. [Add the ability to find/create a merge request][!139]\n\n1. [Move remotes to the `Project` classes and get rid of the `Remotes`\nclass][!168]\n\n1. [Add `head`, `status`, `log`, `fetch`, `checkout_new_branch`, `pull`,\n`push`, and `merge` to `RemoteRepository`][!177]\n\n1. [Introduce a new `CommitAuthor` class][!197]\n\n\nThe last piece of the puzzle was the new [`upstream_merge` Rake task][!219].\n\n\n### Step 2: Create a pair of SSH keys and add the public key to the\n`gitlab-ee` project\n\n\nUnder **Repository Settings > Deploy Keys** of the [`gitlab-ee`] project:\n\n\n![Deploy key in\n`gitlab-ee`](https://about.gitlab.com/images/blogimages/using-gitlab-ci-to-build-gitlab-faster/step2.png){:\n.shadow.center.medium}\n\n\n### Step 3: Create secret variables in the `release-tools` project\n\n\nUnder **CI / CD Settings** of the [`release-tools`] project, create three\nsecret\n\nvariables:\n\n\n- `AUTO_UPSTREAM_MERGE_BOT_SSH_PRIVATE_KEY` for the SSH private key\n\n- `GITLAB_API_PRIVATE_TOKEN` is a personal access token for our\n[`@gitlab-bot`]\n  user\n- `SLACK_UPSTREAM_MERGE_URL` which is the Slack webhook URL we created\n  specifically for this job and used in our [`Slack::UpstreamMergeNotification` class]\n\n![Secret\nvariable](https://about.gitlab.com/images/blogimages/using-gitlab-ci-to-build-gitlab-faster/step3.png){:\n.shadow.center.medium}\n\n\n### Step 4: Add a new CI job that runs the `upstream_merge` Rake task for\npipeline schedules only\n\n\n*This was heavily inspired by [GitBot – automating boring Git operations\nwith CI].*\n\n\nCreate a new `upstream-merge` CI job that:\n\n\n- Adds the SSH private key to the `~/.ssh` folder\n\n- Add `gitlab.com` to the `~/.ssh/known_hosts` file\n\n- Runs `bundle exec rake upstream_merge`\n\n\n![`upstream-merge`\njob](https://about.gitlab.com/images/blogimages/using-gitlab-ci-to-build-gitlab-faster/step4.png){:\n.shadow.center.medium}\n\n\nYou can [check out the task for\nyourself](https://gitlab.com/gitlab-org/release-tools/blob/1cd437823113d4529919c29b177bb2037c19fc3c/.gitlab-ci.yml#L50-64).\n\n\n### Step 5: Create a pipeline schedule that runs every three hours\n\n\nUnder **Schedules** of the [`release-tools`] project:\n\n\n![Pipeline\nschedule](https://about.gitlab.com/images/blogimages/using-gitlab-ci-to-build-gitlab-faster/step5.png){:\n.shadow.center.medium}\n\n\n### Step 6: Let the bot work for us!\n\n\n**The CI job:**\n\n\n![CI\njob](https://about.gitlab.com/images/blogimages/using-gitlab-ci-to-build-gitlab-faster/step6-1.png){:\n.shadow.center.medium}\n\n\n**The Slack messages:**\n\n\n![Slack\nmessages](https://about.gitlab.com/images/blogimages/using-gitlab-ci-to-build-gitlab-faster/step6-2.png){:\n.shadow.center.medium}\n\n\n**The merge request:**\n\n\n![Merge\nrequest](https://about.gitlab.com/images/blogimages/using-gitlab-ci-to-build-gitlab-faster/step6-3.png){:\n.shadow.center.medium}\n\n\n## What are the benefits?\n\n\nSince we started automating this process in December 2017, our dear\n\n[`@gitlab-bot`] created no fewer than [229 automatic merges], and we started\n\nnoticing the benefits immediately:\n\n\n- Automating the merge request creation saved developers time and removed a\nmanual\n\nchore.\n\n- Automatically identifying the developer who introduced a conflict and\nassigning\n\nthem to resolve it spread out the workload and reduced bugs caused by\nimproper\n\nconflict resolution.\n\n- Performing the merge automatically every three hours instead of manually\nonce a\n\nday led to fewer changes at a time and a reduced number of conflicts.\n\n\nThe last, perhaps least visible, but most important benefit, is that we\nreduced\n\ndeveloper frustration and increased happiness by removing a tedious chore.\n\n\n[Photo](https://unsplash.com/photos/w6OniVDCfn0?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)\nby Max Ostrozhinskiy on\n[Unsplash](https://unsplash.com/search/photos/build?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)\n\n{: .note}\n\n\n[open source project]: /community/contribute/\n\n[commercial project]: /pricing/\n\n[`gitlab-ce`]: https://gitlab.com/gitlab-org/gitlab-ce\n\n[`gitlab-ee`]: https://gitlab.com/gitlab-org/gitlab-ee\n\n[single codebase]: https://gitlab.com/gitlab-org/gitlab-ee/issues/2952\n\n[see the full documentation]:\nhttps://gitlab.com/gitlab-org/release/docs/blob/master/general/merge-ce-into-ee.md\n\n[pipeline schedules]: https://docs.gitlab.com/ee/ci/pipelines/schedules.html\n\n[GitLab API]: https://docs.gitlab.com/ee/api/merge_requests.html\n\n[GitLab API Ruby wrapper]: https://rubygems.org/gems/gitlab\n\n[`release-tools`]: https://gitlab.com/gitlab-org/release-tools/\n\n[!139]: https://gitlab.com/gitlab-org/release-tools/merge_requests/139\n\n[!168]: https://gitlab.com/gitlab-org/release-tools/merge_requests/168\n\n[!177]: https://gitlab.com/gitlab-org/release-tools/merge_requests/177\n\n[!197]: https://gitlab.com/gitlab-org/release-tools/merge_requests/197\n\n[!219]: https://gitlab.com/gitlab-org/release-tools/merge_requests/219\n\n[`Slack::UpstreamMergeNotification` class]:\nhttps://gitlab.com/gitlab-org/release-tools/blob/1cd437823113d4529919c29b177bb2037c19fc3c/lib/slack/upstream_merge_notification.rb#L7\n\n[GitBot – automating boring Git operations with CI]:\n/2017/11/02/automating-boring-git-operations-gitlab-ci/\n\n[229 automatic merges]:\nhttps://gitlab.com/gitlab-org/gitlab-ee/merge_requests?scope=all&utf8=%E2%9C%93&state=merged&label_name[]=CE%20upstream&author_username=gitlab-bot\n\n[`@gitlab-bot`]: https://gitlab.com/gitlab-bot\n","engineering",[23,24],"inside GitLab","CI",{"slug":26,"featured":6,"template":27},"using-gitlab-ci-to-build-gitlab-faster","BlogPost","content:en-us:blog:using-gitlab-ci-to-build-gitlab-faster.yml","yaml","Using Gitlab Ci To Build Gitlab Faster","content","en-us/blog/using-gitlab-ci-to-build-gitlab-faster.yml","en-us/blog/using-gitlab-ci-to-build-gitlab-faster","yml",{"_path":36,"_dir":37,"_draft":6,"_partial":6,"_locale":7,"data":38,"_id":450,"_type":29,"title":451,"_source":31,"_file":452,"_stem":453,"_extension":34},"/shared/en-us/main-navigation","en-us",{"logo":39,"freeTrial":44,"sales":49,"login":54,"items":59,"search":391,"minimal":422,"duo":441},{"config":40},{"href":41,"dataGaName":42,"dataGaLocation":43},"/","gitlab logo","header",{"text":45,"config":46},"Get free trial",{"href":47,"dataGaName":48,"dataGaLocation":43},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":50,"config":51},"Talk to sales",{"href":52,"dataGaName":53,"dataGaLocation":43},"/sales/","sales",{"text":55,"config":56},"Sign in",{"href":57,"dataGaName":58,"dataGaLocation":43},"https://gitlab.com/users/sign_in/","sign in",[60,104,202,207,312,372],{"text":61,"config":62,"cards":64,"footer":87},"Platform",{"dataNavLevelOne":63},"platform",[65,71,79],{"title":61,"description":66,"link":67},"The most comprehensive AI-powered DevSecOps Platform",{"text":68,"config":69},"Explore our Platform",{"href":70,"dataGaName":63,"dataGaLocation":43},"/platform/",{"title":72,"description":73,"link":74},"GitLab Duo (AI)","Build software faster with AI at every stage of development",{"text":75,"config":76},"Meet GitLab Duo",{"href":77,"dataGaName":78,"dataGaLocation":43},"/gitlab-duo/","gitlab duo ai",{"title":80,"description":81,"link":82},"Why GitLab","10 reasons why Enterprises choose GitLab",{"text":83,"config":84},"Learn more",{"href":85,"dataGaName":86,"dataGaLocation":43},"/why-gitlab/","why gitlab",{"title":88,"items":89},"Get started with",[90,95,100],{"text":91,"config":92},"Platform Engineering",{"href":93,"dataGaName":94,"dataGaLocation":43},"/solutions/platform-engineering/","platform engineering",{"text":96,"config":97},"Developer Experience",{"href":98,"dataGaName":99,"dataGaLocation":43},"/developer-experience/","Developer experience",{"text":101,"config":102},"MLOps",{"href":103,"dataGaName":101,"dataGaLocation":43},"/topics/devops/the-role-of-ai-in-devops/",{"text":105,"left":106,"config":107,"link":109,"lists":113,"footer":184},"Product",true,{"dataNavLevelOne":108},"solutions",{"text":110,"config":111},"View all Solutions",{"href":112,"dataGaName":108,"dataGaLocation":43},"/solutions/",[114,139,163],{"title":115,"description":116,"link":117,"items":122},"Automation","CI/CD and automation to accelerate deployment",{"config":118},{"icon":119,"href":120,"dataGaName":121,"dataGaLocation":43},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[123,127,131,135],{"text":124,"config":125},"CI/CD",{"href":126,"dataGaLocation":43,"dataGaName":124},"/solutions/continuous-integration/",{"text":128,"config":129},"AI-Assisted Development",{"href":77,"dataGaLocation":43,"dataGaName":130},"AI assisted development",{"text":132,"config":133},"Source Code Management",{"href":134,"dataGaLocation":43,"dataGaName":132},"/solutions/source-code-management/",{"text":136,"config":137},"Automated Software Delivery",{"href":120,"dataGaLocation":43,"dataGaName":138},"Automated software delivery",{"title":140,"description":141,"link":142,"items":147},"Security","Deliver code faster without compromising security",{"config":143},{"href":144,"dataGaName":145,"dataGaLocation":43,"icon":146},"/solutions/security-compliance/","security and compliance","ShieldCheckLight",[148,153,158],{"text":149,"config":150},"Application Security Testing",{"href":151,"dataGaName":152,"dataGaLocation":43},"/solutions/application-security-testing/","Application security testing",{"text":154,"config":155},"Software Supply Chain Security",{"href":156,"dataGaLocation":43,"dataGaName":157},"/solutions/supply-chain/","Software supply chain security",{"text":159,"config":160},"Software Compliance",{"href":161,"dataGaName":162,"dataGaLocation":43},"/solutions/software-compliance/","software compliance",{"title":164,"link":165,"items":170},"Measurement",{"config":166},{"icon":167,"href":168,"dataGaName":169,"dataGaLocation":43},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[171,175,179],{"text":172,"config":173},"Visibility & Measurement",{"href":168,"dataGaLocation":43,"dataGaName":174},"Visibility and Measurement",{"text":176,"config":177},"Value Stream Management",{"href":178,"dataGaLocation":43,"dataGaName":176},"/solutions/value-stream-management/",{"text":180,"config":181},"Analytics & Insights",{"href":182,"dataGaLocation":43,"dataGaName":183},"/solutions/analytics-and-insights/","Analytics and insights",{"title":185,"items":186},"GitLab for",[187,192,197],{"text":188,"config":189},"Enterprise",{"href":190,"dataGaLocation":43,"dataGaName":191},"/enterprise/","enterprise",{"text":193,"config":194},"Small Business",{"href":195,"dataGaLocation":43,"dataGaName":196},"/small-business/","small business",{"text":198,"config":199},"Public Sector",{"href":200,"dataGaLocation":43,"dataGaName":201},"/solutions/public-sector/","public sector",{"text":203,"config":204},"Pricing",{"href":205,"dataGaName":206,"dataGaLocation":43,"dataNavLevelOne":206},"/pricing/","pricing",{"text":208,"config":209,"link":211,"lists":215,"feature":299},"Resources",{"dataNavLevelOne":210},"resources",{"text":212,"config":213},"View all resources",{"href":214,"dataGaName":210,"dataGaLocation":43},"/resources/",[216,249,271],{"title":217,"items":218},"Getting started",[219,224,229,234,239,244],{"text":220,"config":221},"Install",{"href":222,"dataGaName":223,"dataGaLocation":43},"/install/","install",{"text":225,"config":226},"Quick start guides",{"href":227,"dataGaName":228,"dataGaLocation":43},"/get-started/","quick setup checklists",{"text":230,"config":231},"Learn",{"href":232,"dataGaLocation":43,"dataGaName":233},"https://university.gitlab.com/","learn",{"text":235,"config":236},"Product documentation",{"href":237,"dataGaName":238,"dataGaLocation":43},"https://docs.gitlab.com/","product documentation",{"text":240,"config":241},"Best practice videos",{"href":242,"dataGaName":243,"dataGaLocation":43},"/getting-started-videos/","best practice videos",{"text":245,"config":246},"Integrations",{"href":247,"dataGaName":248,"dataGaLocation":43},"/integrations/","integrations",{"title":250,"items":251},"Discover",[252,257,261,266],{"text":253,"config":254},"Customer success stories",{"href":255,"dataGaName":256,"dataGaLocation":43},"/customers/","customer success stories",{"text":258,"config":259},"Blog",{"href":260,"dataGaName":5,"dataGaLocation":43},"/blog/",{"text":262,"config":263},"Remote",{"href":264,"dataGaName":265,"dataGaLocation":43},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":267,"config":268},"TeamOps",{"href":269,"dataGaName":270,"dataGaLocation":43},"/teamops/","teamops",{"title":272,"items":273},"Connect",[274,279,284,289,294],{"text":275,"config":276},"GitLab Services",{"href":277,"dataGaName":278,"dataGaLocation":43},"/services/","services",{"text":280,"config":281},"Community",{"href":282,"dataGaName":283,"dataGaLocation":43},"/community/","community",{"text":285,"config":286},"Forum",{"href":287,"dataGaName":288,"dataGaLocation":43},"https://forum.gitlab.com/","forum",{"text":290,"config":291},"Events",{"href":292,"dataGaName":293,"dataGaLocation":43},"/events/","events",{"text":295,"config":296},"Partners",{"href":297,"dataGaName":298,"dataGaLocation":43},"/partners/","partners",{"backgroundColor":300,"textColor":301,"text":302,"image":303,"link":307},"#2f2a6b","#fff","Insights for the future of software development",{"altText":304,"config":305},"the source promo card",{"src":306},"/images/navigation/the-source-promo-card.svg",{"text":308,"config":309},"Read the latest",{"href":310,"dataGaName":311,"dataGaLocation":43},"/the-source/","the source",{"text":313,"config":314,"lists":316},"Company",{"dataNavLevelOne":315},"company",[317],{"items":318},[319,324,330,332,337,342,347,352,357,362,367],{"text":320,"config":321},"About",{"href":322,"dataGaName":323,"dataGaLocation":43},"/company/","about",{"text":325,"config":326,"footerGa":329},"Jobs",{"href":327,"dataGaName":328,"dataGaLocation":43},"/jobs/","jobs",{"dataGaName":328},{"text":290,"config":331},{"href":292,"dataGaName":293,"dataGaLocation":43},{"text":333,"config":334},"Leadership",{"href":335,"dataGaName":336,"dataGaLocation":43},"/company/team/e-group/","leadership",{"text":338,"config":339},"Team",{"href":340,"dataGaName":341,"dataGaLocation":43},"/company/team/","team",{"text":343,"config":344},"Handbook",{"href":345,"dataGaName":346,"dataGaLocation":43},"https://handbook.gitlab.com/","handbook",{"text":348,"config":349},"Investor relations",{"href":350,"dataGaName":351,"dataGaLocation":43},"https://ir.gitlab.com/","investor relations",{"text":353,"config":354},"Trust Center",{"href":355,"dataGaName":356,"dataGaLocation":43},"/security/","trust center",{"text":358,"config":359},"AI Transparency Center",{"href":360,"dataGaName":361,"dataGaLocation":43},"/ai-transparency-center/","ai transparency center",{"text":363,"config":364},"Newsletter",{"href":365,"dataGaName":366,"dataGaLocation":43},"/company/contact/","newsletter",{"text":368,"config":369},"Press",{"href":370,"dataGaName":371,"dataGaLocation":43},"/press/","press",{"text":373,"config":374,"lists":375},"Contact us",{"dataNavLevelOne":315},[376],{"items":377},[378,381,386],{"text":50,"config":379},{"href":52,"dataGaName":380,"dataGaLocation":43},"talk to sales",{"text":382,"config":383},"Get help",{"href":384,"dataGaName":385,"dataGaLocation":43},"/support/","get help",{"text":387,"config":388},"Customer portal",{"href":389,"dataGaName":390,"dataGaLocation":43},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":392,"login":393,"suggestions":400},"Close",{"text":394,"link":395},"To search repositories and projects, login to",{"text":396,"config":397},"gitlab.com",{"href":57,"dataGaName":398,"dataGaLocation":399},"search login","search",{"text":401,"default":402},"Suggestions",[403,405,409,411,415,419],{"text":72,"config":404},{"href":77,"dataGaName":72,"dataGaLocation":399},{"text":406,"config":407},"Code Suggestions (AI)",{"href":408,"dataGaName":406,"dataGaLocation":399},"/solutions/code-suggestions/",{"text":124,"config":410},{"href":126,"dataGaName":124,"dataGaLocation":399},{"text":412,"config":413},"GitLab on AWS",{"href":414,"dataGaName":412,"dataGaLocation":399},"/partners/technology-partners/aws/",{"text":416,"config":417},"GitLab on Google Cloud",{"href":418,"dataGaName":416,"dataGaLocation":399},"/partners/technology-partners/google-cloud-platform/",{"text":420,"config":421},"Why GitLab?",{"href":85,"dataGaName":420,"dataGaLocation":399},{"freeTrial":423,"mobileIcon":428,"desktopIcon":433,"secondaryButton":436},{"text":424,"config":425},"Start free trial",{"href":426,"dataGaName":48,"dataGaLocation":427},"https://gitlab.com/-/trials/new/","nav",{"altText":429,"config":430},"Gitlab Icon",{"src":431,"dataGaName":432,"dataGaLocation":427},"/images/brand/gitlab-logo-tanuki.svg","gitlab icon",{"altText":429,"config":434},{"src":435,"dataGaName":432,"dataGaLocation":427},"/images/brand/gitlab-logo-type.svg",{"text":437,"config":438},"Get Started",{"href":439,"dataGaName":440,"dataGaLocation":427},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/compare/gitlab-vs-github/","get started",{"freeTrial":442,"mobileIcon":446,"desktopIcon":448},{"text":443,"config":444},"Learn more about GitLab Duo",{"href":77,"dataGaName":445,"dataGaLocation":427},"gitlab duo",{"altText":429,"config":447},{"src":431,"dataGaName":432,"dataGaLocation":427},{"altText":429,"config":449},{"src":435,"dataGaName":432,"dataGaLocation":427},"content:shared:en-us:main-navigation.yml","Main Navigation","shared/en-us/main-navigation.yml","shared/en-us/main-navigation",{"_path":455,"_dir":37,"_draft":6,"_partial":6,"_locale":7,"title":456,"button":457,"image":462,"config":466,"_id":468,"_type":29,"_source":31,"_file":469,"_stem":470,"_extension":34},"/shared/en-us/banner","is now in public beta!",{"text":458,"config":459},"Try the Beta",{"href":460,"dataGaName":461,"dataGaLocation":43},"/gitlab-duo/agent-platform/","duo banner",{"altText":463,"config":464},"GitLab Duo Agent Platform",{"src":465},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1753720689/somrf9zaunk0xlt7ne4x.svg",{"layout":467},"release","content:shared:en-us:banner.yml","shared/en-us/banner.yml","shared/en-us/banner",{"_path":472,"_dir":37,"_draft":6,"_partial":6,"_locale":7,"data":473,"_id":677,"_type":29,"title":678,"_source":31,"_file":679,"_stem":680,"_extension":34},"/shared/en-us/main-footer",{"text":474,"source":475,"edit":481,"contribute":486,"config":491,"items":496,"minimal":669},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":476,"config":477},"View page source",{"href":478,"dataGaName":479,"dataGaLocation":480},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":482,"config":483},"Edit this page",{"href":484,"dataGaName":485,"dataGaLocation":480},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":487,"config":488},"Please contribute",{"href":489,"dataGaName":490,"dataGaLocation":480},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":492,"facebook":493,"youtube":494,"linkedin":495},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[497,520,576,605,639],{"title":61,"links":498,"subMenu":503},[499],{"text":500,"config":501},"DevSecOps platform",{"href":70,"dataGaName":502,"dataGaLocation":480},"devsecops platform",[504],{"title":203,"links":505},[506,510,515],{"text":507,"config":508},"View plans",{"href":205,"dataGaName":509,"dataGaLocation":480},"view plans",{"text":511,"config":512},"Why Premium?",{"href":513,"dataGaName":514,"dataGaLocation":480},"/pricing/premium/","why premium",{"text":516,"config":517},"Why Ultimate?",{"href":518,"dataGaName":519,"dataGaLocation":480},"/pricing/ultimate/","why ultimate",{"title":521,"links":522},"Solutions",[523,528,530,532,537,542,546,549,553,558,560,563,566,571],{"text":524,"config":525},"Digital transformation",{"href":526,"dataGaName":527,"dataGaLocation":480},"/topics/digital-transformation/","digital transformation",{"text":149,"config":529},{"href":151,"dataGaName":149,"dataGaLocation":480},{"text":138,"config":531},{"href":120,"dataGaName":121,"dataGaLocation":480},{"text":533,"config":534},"Agile development",{"href":535,"dataGaName":536,"dataGaLocation":480},"/solutions/agile-delivery/","agile delivery",{"text":538,"config":539},"Cloud transformation",{"href":540,"dataGaName":541,"dataGaLocation":480},"/topics/cloud-native/","cloud transformation",{"text":543,"config":544},"SCM",{"href":134,"dataGaName":545,"dataGaLocation":480},"source code management",{"text":124,"config":547},{"href":126,"dataGaName":548,"dataGaLocation":480},"continuous integration & delivery",{"text":550,"config":551},"Value stream management",{"href":178,"dataGaName":552,"dataGaLocation":480},"value stream management",{"text":554,"config":555},"GitOps",{"href":556,"dataGaName":557,"dataGaLocation":480},"/solutions/gitops/","gitops",{"text":188,"config":559},{"href":190,"dataGaName":191,"dataGaLocation":480},{"text":561,"config":562},"Small business",{"href":195,"dataGaName":196,"dataGaLocation":480},{"text":564,"config":565},"Public sector",{"href":200,"dataGaName":201,"dataGaLocation":480},{"text":567,"config":568},"Education",{"href":569,"dataGaName":570,"dataGaLocation":480},"/solutions/education/","education",{"text":572,"config":573},"Financial services",{"href":574,"dataGaName":575,"dataGaLocation":480},"/solutions/finance/","financial services",{"title":208,"links":577},[578,580,582,584,587,589,591,593,595,597,599,601,603],{"text":220,"config":579},{"href":222,"dataGaName":223,"dataGaLocation":480},{"text":225,"config":581},{"href":227,"dataGaName":228,"dataGaLocation":480},{"text":230,"config":583},{"href":232,"dataGaName":233,"dataGaLocation":480},{"text":235,"config":585},{"href":237,"dataGaName":586,"dataGaLocation":480},"docs",{"text":258,"config":588},{"href":260,"dataGaName":5,"dataGaLocation":480},{"text":253,"config":590},{"href":255,"dataGaName":256,"dataGaLocation":480},{"text":262,"config":592},{"href":264,"dataGaName":265,"dataGaLocation":480},{"text":275,"config":594},{"href":277,"dataGaName":278,"dataGaLocation":480},{"text":267,"config":596},{"href":269,"dataGaName":270,"dataGaLocation":480},{"text":280,"config":598},{"href":282,"dataGaName":283,"dataGaLocation":480},{"text":285,"config":600},{"href":287,"dataGaName":288,"dataGaLocation":480},{"text":290,"config":602},{"href":292,"dataGaName":293,"dataGaLocation":480},{"text":295,"config":604},{"href":297,"dataGaName":298,"dataGaLocation":480},{"title":313,"links":606},[607,609,611,613,615,617,619,623,628,630,632,634],{"text":320,"config":608},{"href":322,"dataGaName":315,"dataGaLocation":480},{"text":325,"config":610},{"href":327,"dataGaName":328,"dataGaLocation":480},{"text":333,"config":612},{"href":335,"dataGaName":336,"dataGaLocation":480},{"text":338,"config":614},{"href":340,"dataGaName":341,"dataGaLocation":480},{"text":343,"config":616},{"href":345,"dataGaName":346,"dataGaLocation":480},{"text":348,"config":618},{"href":350,"dataGaName":351,"dataGaLocation":480},{"text":620,"config":621},"Sustainability",{"href":622,"dataGaName":620,"dataGaLocation":480},"/sustainability/",{"text":624,"config":625},"Diversity, inclusion and belonging (DIB)",{"href":626,"dataGaName":627,"dataGaLocation":480},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":353,"config":629},{"href":355,"dataGaName":356,"dataGaLocation":480},{"text":363,"config":631},{"href":365,"dataGaName":366,"dataGaLocation":480},{"text":368,"config":633},{"href":370,"dataGaName":371,"dataGaLocation":480},{"text":635,"config":636},"Modern Slavery Transparency Statement",{"href":637,"dataGaName":638,"dataGaLocation":480},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":640,"links":641},"Contact Us",[642,645,647,649,654,659,664],{"text":643,"config":644},"Contact an expert",{"href":52,"dataGaName":53,"dataGaLocation":480},{"text":382,"config":646},{"href":384,"dataGaName":385,"dataGaLocation":480},{"text":387,"config":648},{"href":389,"dataGaName":390,"dataGaLocation":480},{"text":650,"config":651},"Status",{"href":652,"dataGaName":653,"dataGaLocation":480},"https://status.gitlab.com/","status",{"text":655,"config":656},"Terms of use",{"href":657,"dataGaName":658,"dataGaLocation":480},"/terms/","terms of use",{"text":660,"config":661},"Privacy statement",{"href":662,"dataGaName":663,"dataGaLocation":480},"/privacy/","privacy statement",{"text":665,"config":666},"Cookie preferences",{"dataGaName":667,"dataGaLocation":480,"id":668,"isOneTrustButton":106},"cookie preferences","ot-sdk-btn",{"items":670},[671,673,675],{"text":655,"config":672},{"href":657,"dataGaName":658,"dataGaLocation":480},{"text":660,"config":674},{"href":662,"dataGaName":663,"dataGaLocation":480},{"text":665,"config":676},{"dataGaName":667,"dataGaLocation":480,"id":668,"isOneTrustButton":106},"content:shared:en-us:main-footer.yml","Main Footer","shared/en-us/main-footer.yml","shared/en-us/main-footer",[682],{"_path":683,"_dir":684,"_draft":6,"_partial":6,"_locale":7,"content":685,"config":689,"_id":691,"_type":29,"title":692,"_source":31,"_file":693,"_stem":694,"_extension":34},"/en-us/blog/authors/rmy-coutable","authors",{"name":18,"config":686},{"headshot":687,"ctfId":688},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749667148/Blog/Author%20Headshots/rymai-headshot.jpg","rymai",{"template":690},"BlogAuthor","content:en-us:blog:authors:rmy-coutable.yml","Rmy Coutable","en-us/blog/authors/rmy-coutable.yml","en-us/blog/authors/rmy-coutable",{"_path":696,"_dir":37,"_draft":6,"_partial":6,"_locale":7,"header":697,"eyebrow":698,"blurb":699,"button":700,"secondaryButton":704,"_id":706,"_type":29,"title":707,"_source":31,"_file":708,"_stem":709,"_extension":34},"/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":45,"config":701},{"href":702,"dataGaName":48,"dataGaLocation":703},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":50,"config":705},{"href":52,"dataGaName":53,"dataGaLocation":703},"content:shared:en-us:next-steps.yml","Next Steps","shared/en-us/next-steps.yml","shared/en-us/next-steps",1756472611464]