[{"data":1,"prerenderedAt":1165},["ShallowReactive",2],{"/blog/elasticsearch-update":3,"navigation-en-us":379,"banner-en-us":806,"footer-en-us":816,"blog-post-authors-en-us-Nick Thomas":1061,"blog-related-posts-en-us-elasticsearch-update":1075,"blog-promotions-en-us":1101,"next-steps-en-us":1155},{"id":4,"title":5,"authors":6,"body":8,"category":357,"date":358,"description":359,"extension":360,"externalUrl":361,"faq":361,"featured":362,"heroImage":363,"meta":364,"navigation":365,"path":366,"seo":367,"slug":371,"stem":372,"tags":373,"template":377,"updatedDate":361,"__hash__":378},"blogPosts/en-us/blog/elasticsearch-update.md","Update: The challenge of enabling Elasticsearch on GitLab.com",[7],"Nick Thomas",{"type":9,"value":10,"toc":345},"minimark",[11,38,43,58,65,79,88,92,107,153,156,159,203,206,210,213,221,236,245,249,261,270,275,284,292,296,310,331],[12,13,14,15,20,21,26,27,31,32,37],"p",{},"Back in March, Mario shared some of the ",[16,17,19],"a",{"href":18},"/blog/enabling-global-search-elasticsearch-gitlab-com/","lessons we'd learned from our last attempt to enable\nElasticsearch"," on GitLab.com, an integration that would unlock both ",[16,22,25],{"href":23,"rel":24},"https://docs.gitlab.com/user/search/advanced_search/",[],"Advanced Global Search","\nand ",[16,28,30],{"href":23,"rel":29},[],"Advanced Syntax Search",". Since then, we've been working hard to address problems with the integration and prepare for ",[16,33,36],{"href":34,"rel":35},"https://gitlab.com/groups/gitlab-org/-/epics/853",[],"another attempt",".",[39,40,42],"h2",{"id":41},"selective-indexing","Selective indexing",[12,44,45,46,51,52,57],{},"At the heart of our dilemma was a classic \"chicken and egg\" problem. We needed\nto gather more information about ",[16,47,50],{"href":48,"rel":49},"https://docs.gitlab.com/integration/advanced_search/elasticsearch/",[],"Elasticsearch"," to make improvements to the total\nindex size, but without an active deployment, that information was very hard to\ngather. Customer feedback and small-scale testing in development environments\nall help, but ",[16,53,56],{"href":54,"rel":55},"https://handbook.gitlab.com/handbook/values/#dogfooding",[],"dogfooding","\nthe integration is the best way to get the information we require.",[12,59,60,61,37],{},"To resolve this, we prioritized changes to enable Elasticsearch integration on\nGitLab.com. Since the index size was a hard problem, this meant some kind of\nselective indexing was necessary, so we've added\n",[16,62,64],{"href":48,"rel":63},[],"per-project and per-group controls",[12,66,67,68,72,73,78],{},"On Jun. 24, 2019, we enabled the integration for the ",[69,70,71],"code",{},"gitlab-org"," group on\nGitLab.com. Now, any searches at the group or project level will make use of the\nElasticsearch index, and the advanced features the integration unlocks will be available.\nWe figured, why not ",[16,74,77],{"href":75,"rel":76},"https://gitlab.com/search?search=gitlab-org+%28gitaly+%7C+ee%29&group_id=9970",[],"give it a try","?",[12,80,81,82,87],{},"The total index size for this group – which includes about 500 projects – is around 2.2\nmillion documents and 15GB of data, which is really easy to manage from the point of view of\nElasticsearch administration. The indexing operation itself didn't ",[16,83,86],{"href":84,"rel":85},"https://gitlab.com/gitlab-com/gl-infra/production/issues/800",[],"go as smoothly as we hoped",", however!",[39,89,91],{"id":90},"bug-fixes","Bug fixes",[12,93,94,95,100,101,106],{},"Another advantage to having selective Elasticsearch indexing enabled on GitLab.com\nis that our engineers need confidence that the feature is performant,\nthat it won't threaten the overall stability of GitLab.com, and that it is\nsubstantially bug-free. So we went through a ",[16,96,99],{"href":97,"rel":98},"https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/64",[],"Production Readiness Review","\nbefore enabling it. The review uncovered a number of pre-existing bugs and new regressions, which have all been fixed in the\n",[16,102,105],{"href":103,"rel":104},"https://docs.gitlab.com/releases/",[],"12.0 release",". Some of the bugs included:",[108,109,110,118,125,132,139,146],"ul",{},[111,112,113],"li",{},[16,114,117],{"href":115,"rel":116},"https://gitlab.com/gitlab-org/gitlab-ee/issues/11795",[],"Elasticsearch was sometimes used for searches, even when disabled",[111,119,120],{},[16,121,124],{"href":122,"rel":123},"https://gitlab.com/gitlab-org/gitlab-ee/issues/11595",[],"Performance regression indexing database content",[111,126,127],{},[16,128,131],{"href":129,"rel":130},"https://gitlab.com/gitlab-org/gitlab-ee/issues/12091",[],"Regression searching for some projects at group level",[111,133,134],{},[16,135,138],{"href":136,"rel":137},"https://gitlab.com/gitlab-org/gitlab-ee/issues/12254",[],"Regression visiting page 2 of search results",[111,140,141],{},[16,142,145],{"href":143,"rel":144},"https://gitlab.com/gitlab-org/gitlab-ee/issues/11269",[],"Wiki indexing still relied on a shared filesystem",[111,147,148],{},[16,149,152],{"href":150,"rel":151},"https://gitlab.com/gitlab-org/gitlab-ee/issues/10548",[],"Searching snippets with Elasticsearch enabled still queries the database, not Elasticsearch",[12,154,155],{},"We still can't claim to be bug-free, of course, but the picture is a lot rosier than if we'd attempted to roll out this feature without first using it ourselves.",[12,157,158],{},"We'd tested the new indexing code on our staging environment, but this was last\nrefreshed more than a year ago, and was significantly smaller than the group on\nGitLab.com, containing around 150 projects. As a result, some bugs and\nscalability issues were uncovered for the first time in production. We're\naddressing them with high priority in the 12.1 and 12.2 releases. The scaling issues include:",[108,160,161,168,175,182,189,196],{},[111,162,163],{},[16,164,167],{"href":165,"rel":166},"https://gitlab.com/gitlab-org/gitlab-ee/issues/12362",[],"Project imports unconditionally enqueue an ElasticCommitIndexerWorker",[111,169,170],{},[16,171,174],{"href":172,"rel":173},"https://gitlab.com/gitlab-org/gitlab-ee/issues/12375",[],"Allow maximum bulk request size to be configured",[111,176,177],{},[16,178,181],{"href":179,"rel":180},"https://gitlab.com/gitlab-org/gitlab-ee/issues/12372",[],"Intelligently retry bulk-insert failures when indexing",[111,183,184],{},[16,185,188],{"href":186,"rel":187},"https://gitlab.com/gitlab-org/gitlab-ee/issues/12402",[],"Note bulk indexing often fails due to statement timeout",[111,190,191],{},[16,192,195],{"href":193,"rel":194},"https://gitlab.com/gitlab-org/gitlab-ee/issues/12111",[],"Cannot index large snippets",[111,197,198],{},[16,199,202],{"href":200,"rel":201},"https://gitlab.com/gitlab-org/gitlab-ee/issues/12114",[],"Removing documents from the index can fail with a conflict error",[12,204,205],{},"Once these issues are addressed, indexing at scale should be quick, easy, and\nreliable. Indexing at scale is invaluable from the point of view of an engineer trying out\nchanges to reduce total index size.",[39,207,209],{"id":208},"administration","Administration",[12,211,212],{},"Another area for improvement is administering the indexing process\nitself. Although GitLab automatically creates, updates, and removes documents\nfrom the index when changes are made, backfilling existing data required manual\nintervention, running a set of complicated (and slow) rake tasks to get the\npre-existing data into the Elasticsearch index. Unless these instructions were\nfollowed correctly, search results would be incomplete. There was also no way\nto configure a number of important parameters for the indexes created by GitLab.",[12,214,215,216,220],{},"When using the selective indexing feature, GitLab now automatically enqueues\n\"backfill\" tasks for groups and projects as they are added, and removes the\nrelevant records from the index when they are supposed to be removed. We've also made it possible to\n",[16,217,219],{"href":48,"rel":218},[],"configure the number of shards and replicas","\nfor the Elasticsearch index directly in the admin panel, so when GitLab creates\nthe index for you, there's no need to manually change the parameters afterwards.",[12,222,223,224,230,231,37],{},"Personal snippets are the one type of document that won't be respected in the\nselective-indexing case. To ensure they show up in search results, you'll still\nneed to run the ",[16,225,227],{"href":48,"rel":226},[],[69,228,229],{},"gitlab:elastic:index_snippets"," rake task ",[16,232,235],{"href":233,"rel":234},"https://gitlab.com/gitlab-org/gitlab-ee/issues/12333",[],"for now",[12,237,238,239,244],{},"There are also improvements if you're not using selective indexing – the admin\narea now has a \"Start indexing\" button. Right now, this only makes sense if\nstarting from an empty index, and doesn't index personal snippets either, but\nwe're hopeful we can ",[16,240,243],{"href":241,"rel":242},"https://gitlab.com/gitlab-org/gitlab-ee/issues/11206",[],"remove the rake tasks entirely","\nin the future.",[39,246,248],{"id":247},"what-next","What next?",[12,250,251,252,254,255,260],{},"We're really happy to have Elasticsearch enabled for the ",[69,253,71],{}," group, but\nthe eventual goal is to have it ",[16,256,259],{"href":257,"rel":258},"https://gitlab.com/groups/gitlab-org/-/epics/153",[],"enabled on all of GitLab.com",".\nWe'll be rolling it out to more groups in the future.",[12,262,263,264,269],{},"To get there, we'll need to continue to improve the\n",[16,265,268],{"href":266,"rel":267},"https://gitlab.com/groups/gitlab-org/-/epics/428",[],"administration experience"," using Elasticsearch.\nFor instance, it's still difficult to see the indexing status of a group or\nproject at a glance, a function that would be really useful for our support team to answer\nqueries like \"Why isn't this search term returning the expected results?\"",[271,272,274],"h3",{"id":273},"managing-the-elasticsearch-schema-is-also-a-challenge","Managing the Elasticsearch schema is also a challenge",[12,276,277,278,283],{},"Currently, we take the easy route of reindexing everything if we need to change some aspect of the\nschema, which doesn't scale well as the index gets larger. ",[16,279,282],{"href":280,"rel":281},"https://gitlab.com/gitlab-org/gitlab-ee/issues/328",[],"Some\nwork on this is ongoing",",\nand the eventual goal is for GitLab to automatically manage changes to the\nElasticsearch index in the same way it does for the database.",[12,285,286,291],{},[16,287,290],{"href":288,"rel":289},"https://gitlab.com/groups/gitlab-org/-/epics/429",[],"Reducing the index size"," is\nstill a huge priority, and we hope to make progress on this now that we\nhave an Elasticsearch deployment to iterate against.",[271,293,295],{"id":294},"wed-also-like-to-improve-the-quality-of-search-results","We'd also like to improve the quality of search results",[12,297,298,299,304,305,37],{},"For example, we have\nreports of code search ",[16,300,303],{"href":301,"rel":302},"https://gitlab.com/gitlab-org/gitlab-ee/issues/10693",[],"failing to find certain identifiers"," and we'd like to use the Elasticsearch index in more contexts, such as for\n",[16,306,309],{"href":307,"rel":308},"https://gitlab.com/gitlab-org/gitlab-ee/issues/12082",[],"filtered search",[12,311,312,313,318,319,324,325,330],{},"The Elasticsearch integration is progressing. Finally, responsibility for the Elasticsearch integration has been passed from\nthe ",[16,314,317],{"href":315,"rel":316},"https://handbook.gitlab.com/handbook/product/categories/#plan-stage",[],"Plan stage","\nto the ",[16,320,323],{"href":321,"rel":322},"https://handbook.gitlab.com/handbook/product/categories/#editor-group",[],"Editor group of the Create stage",".\nI hope you'll join Mario and me in wishing Kai,\nDarva, and the rest of the team the best of luck in tackling the remaining challenges for Elasticsearch. An up-to-date overview of their plans can always be found on\nthe ",[16,326,329],{"href":327,"rel":328},"https://docs.gitlab.com/user/search/",[],"search strategy"," page.",[12,332,333,334,339,340],{},"Photo by ",[16,335,338],{"href":336,"rel":337},"https://unsplash.com/photos/vc9u77c0LO4",[],"Benjamin Elliott"," on ",[16,341,344],{"href":342,"rel":343},"https://unsplash.com/",[],"Unsplash",{"title":346,"searchDepth":347,"depth":347,"links":348},"",2,[349,350,351,352],{"id":41,"depth":347,"text":42},{"id":90,"depth":347,"text":91},{"id":208,"depth":347,"text":209},{"id":247,"depth":347,"text":248,"children":353},[354,356],{"id":273,"depth":355,"text":274},3,{"id":294,"depth":355,"text":295},"engineering","2019-07-16","How we got started with enabling Elasticsearch on the largest GitLab instance, GitLab.com.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749666832/Blog/Hero%20Images/enable-global-search-elasticsearch.jpg",{},true,"/en-us/blog/elasticsearch-update",{"title":5,"description":359,"ogTitle":5,"ogDescription":359,"noIndex":362,"ogImage":363,"ogUrl":368,"ogSiteName":369,"ogType":370,"canonicalUrls":368},"https://about.gitlab.com/blog/elasticsearch-update","https://about.gitlab.com","article","elasticsearch-update","en-us/blog/elasticsearch-update",[374,375,376],"features","integrations","inside GitLab","BlogPost","jIE_Xii8hp9QN7nE9gKPFnFDPV2ImJ-nGVE31fDJ3f4",{"logo":380,"freeTrial":385,"sales":390,"login":395,"items":400,"search":726,"minimal":757,"duo":776,"switchNav":785,"pricingDeployment":796},{"config":381},{"href":382,"dataGaName":383,"dataGaLocation":384},"/","gitlab logo","header",{"text":386,"config":387},"Get free trial",{"href":388,"dataGaName":389,"dataGaLocation":384},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":391,"config":392},"Request a demo",{"href":393,"dataGaName":394,"dataGaLocation":384},"/sales/?contact-topic=request-demo","sales",{"text":396,"config":397},"Sign in",{"href":398,"dataGaName":399,"dataGaLocation":384},"https://gitlab.com/users/sign_in/","sign in",[401,430,530,535,648,704],{"text":402,"config":403,"menu":405},"Platform",{"dataNavLevelOne":404},"platform",{"type":406,"columns":407},"cards",[408,414,422],{"title":402,"description":409,"link":410},"The intelligent orchestration platform for DevSecOps",{"text":411,"config":412},"Explore our Platform",{"href":413,"dataGaName":404,"dataGaLocation":384},"/platform/",{"title":415,"description":416,"link":417},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":418,"config":419},"Meet GitLab Duo",{"href":420,"dataGaName":421,"dataGaLocation":384},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":423,"description":424,"link":425},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":426,"config":427},"Learn more",{"href":428,"dataGaName":429,"dataGaLocation":384},"/why-gitlab/","why gitlab",{"text":431,"left":365,"config":432,"menu":434},"Product",{"dataNavLevelOne":433},"solutions",{"type":435,"link":436,"columns":440,"feature":509},"lists",{"text":437,"config":438},"View all Solutions",{"href":439,"dataGaName":433,"dataGaLocation":384},"/solutions/",[441,465,488],{"title":442,"description":443,"link":444,"items":449},"Automation","CI/CD and automation to accelerate deployment",{"config":445},{"icon":446,"href":447,"dataGaName":448,"dataGaLocation":384},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[450,454,457,461],{"text":451,"config":452},"CI/CD",{"href":453,"dataGaLocation":384,"dataGaName":451},"/solutions/continuous-integration/",{"text":415,"config":455},{"href":420,"dataGaLocation":384,"dataGaName":456},"gitlab duo agent platform - product menu",{"text":458,"config":459},"Source Code Management",{"href":460,"dataGaLocation":384,"dataGaName":458},"/solutions/source-code-management/",{"text":462,"config":463},"Automated Software Delivery",{"href":447,"dataGaLocation":384,"dataGaName":464},"Automated software delivery",{"title":466,"description":467,"link":468,"items":473},"Security","Deliver code faster without compromising security",{"config":469},{"href":470,"dataGaName":471,"dataGaLocation":384,"icon":472},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[474,478,483],{"text":475,"config":476},"Application Security Testing",{"href":470,"dataGaName":477,"dataGaLocation":384},"Application security testing",{"text":479,"config":480},"Software Supply Chain Security",{"href":481,"dataGaLocation":384,"dataGaName":482},"/solutions/supply-chain/","Software supply chain security",{"text":484,"config":485},"Software Compliance",{"href":486,"dataGaName":487,"dataGaLocation":384},"/solutions/software-compliance/","software compliance",{"title":489,"link":490,"items":495},"Measurement",{"config":491},{"icon":492,"href":493,"dataGaName":494,"dataGaLocation":384},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[496,500,504],{"text":497,"config":498},"Visibility & Measurement",{"href":493,"dataGaLocation":384,"dataGaName":499},"Visibility and Measurement",{"text":501,"config":502},"Value Stream Management",{"href":503,"dataGaLocation":384,"dataGaName":501},"/solutions/value-stream-management/",{"text":505,"config":506},"Analytics & Insights",{"href":507,"dataGaLocation":384,"dataGaName":508},"/solutions/analytics-and-insights/","Analytics and insights",{"title":510,"type":435,"items":511},"GitLab for",[512,518,524],{"text":513,"config":514},"Enterprise",{"icon":515,"href":516,"dataGaLocation":384,"dataGaName":517},"Building","/enterprise/","enterprise",{"text":519,"config":520},"Small Business",{"icon":521,"href":522,"dataGaLocation":384,"dataGaName":523},"Work","/small-business/","small business",{"text":525,"config":526},"Public Sector",{"icon":527,"href":528,"dataGaLocation":384,"dataGaName":529},"Organization","/solutions/public-sector/","public sector",{"text":531,"config":532},"Pricing",{"href":533,"dataGaName":534,"dataGaLocation":384,"dataNavLevelOne":534},"/pricing/","pricing",{"text":536,"config":537,"menu":539},"Resources",{"dataNavLevelOne":538},"resources",{"type":435,"link":540,"columns":544,"feature":637},{"text":541,"config":542},"View all resources",{"href":543,"dataGaName":538,"dataGaLocation":384},"/resources/",[545,577,604],{"title":546,"items":547},"Getting started",[548,553,558,563,568,573],{"text":549,"config":550},"Install",{"href":551,"dataGaName":552,"dataGaLocation":384},"/install/","install",{"text":554,"config":555},"Quick start guides",{"href":556,"dataGaName":557,"dataGaLocation":384},"/get-started/","quick setup checklists",{"text":559,"config":560},"Learn",{"href":561,"dataGaLocation":384,"dataGaName":562},"https://university.gitlab.com/","learn",{"text":564,"config":565},"Product documentation",{"href":566,"dataGaName":567,"dataGaLocation":384},"https://docs.gitlab.com/","product documentation",{"text":569,"config":570},"Best practice videos",{"href":571,"dataGaName":572,"dataGaLocation":384},"/getting-started-videos/","best practice videos",{"text":574,"config":575},"Integrations",{"href":576,"dataGaName":375,"dataGaLocation":384},"/integrations/",{"title":578,"items":579},"Discover",[580,585,590,595,599],{"text":581,"config":582},"Customer success stories",{"href":583,"dataGaName":584,"dataGaLocation":384},"/customers/","customer success stories",{"text":586,"config":587},"Blog",{"href":588,"dataGaName":589,"dataGaLocation":384},"/blog/","blog",{"text":591,"config":592},"Demo Hub",{"href":593,"dataGaName":594,"dataGaLocation":384},"/demo-hub/","demo hub",{"text":596,"config":597},"The Source",{"href":598,"dataGaName":589,"dataGaLocation":384},"/the-source/",{"text":600,"config":601},"Remote",{"href":602,"dataGaName":603,"dataGaLocation":384},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":605,"items":606},"Connect",[607,612,617,622,627,632],{"text":608,"config":609},"GitLab Services",{"href":610,"dataGaName":611,"dataGaLocation":384},"/services/","services",{"text":613,"config":614},"Contribute",{"href":615,"dataGaName":616,"dataGaLocation":384},"https://contributors.gitlab.com","contribute",{"text":618,"config":619},"Community",{"href":620,"dataGaName":621,"dataGaLocation":384},"/community/","community",{"text":623,"config":624},"Forum",{"href":625,"dataGaName":626,"dataGaLocation":384},"https://forum.gitlab.com/","forum",{"text":628,"config":629},"Events",{"href":630,"dataGaName":631,"dataGaLocation":384},"/events/","events",{"text":633,"config":634},"Partners",{"href":635,"dataGaName":636,"dataGaLocation":384},"/partners/","partners",{"config":638,"title":641,"text":642,"link":643},{"background":639,"textColor":640},"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":644,"config":645},"Read the latest",{"href":646,"dataGaName":647,"dataGaLocation":384},"/whats-new/","whats new",{"text":649,"config":650,"menu":652},"Company",{"dataNavLevelOne":651},"company",{"type":435,"columns":653},[654],{"items":655},[656,661,667,669,674,679,684,689,694,699],{"text":657,"config":658},"About",{"href":659,"dataGaName":660,"dataGaLocation":384},"/company/","about",{"text":662,"config":663,"footerGa":666},"Jobs",{"href":664,"dataGaName":665,"dataGaLocation":384},"/jobs/","jobs",{"dataGaName":665},{"text":628,"config":668},{"href":630,"dataGaName":631,"dataGaLocation":384},{"text":670,"config":671},"Leadership",{"href":672,"dataGaName":673,"dataGaLocation":384},"/company/team/e-group/","leadership",{"text":675,"config":676},"Handbook",{"href":677,"dataGaName":678,"dataGaLocation":384},"https://handbook.gitlab.com/","handbook",{"text":680,"config":681},"Investor relations",{"href":682,"dataGaName":683,"dataGaLocation":384},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":685,"config":686},"Trust Center",{"href":687,"dataGaName":688,"dataGaLocation":384},"/security/","trust center",{"text":690,"config":691},"AI Transparency Center",{"href":692,"dataGaName":693,"dataGaLocation":384},"/ai-transparency-center/","ai transparency center",{"text":695,"config":696},"Newsletter",{"href":697,"dataGaName":698,"dataGaLocation":384},"/company/contact/#contact-forms","newsletter",{"text":700,"config":701},"Press",{"href":702,"dataGaName":703,"dataGaLocation":384},"/press/","press",{"text":705,"config":706,"menu":707},"Contact us",{"dataNavLevelOne":651},{"type":435,"columns":708},[709],{"items":710},[711,716,721],{"text":712,"config":713},"Talk to sales",{"href":714,"dataGaName":715,"dataGaLocation":384},"/sales/","talk to sales",{"text":717,"config":718},"Support portal",{"href":719,"dataGaName":720,"dataGaLocation":384},"https://support.gitlab.com/hc/en-us","support portal",{"text":722,"config":723},"Customer portal",{"href":724,"dataGaName":725,"dataGaLocation":384},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":727,"login":728,"suggestions":735},"Close",{"text":729,"link":730},"To search repositories and projects, login to",{"text":731,"config":732},"gitlab.com",{"href":398,"dataGaName":733,"dataGaLocation":734},"search login","search",{"text":736,"default":737},"Suggestions",[738,740,744,746,750,754],{"text":415,"config":739},{"href":420,"dataGaName":415,"dataGaLocation":734},{"text":741,"config":742},"Code Suggestions (AI)",{"href":743,"dataGaName":741,"dataGaLocation":734},"/solutions/code-suggestions/",{"text":451,"config":745},{"href":453,"dataGaName":451,"dataGaLocation":734},{"text":747,"config":748},"GitLab on AWS",{"href":749,"dataGaName":747,"dataGaLocation":734},"/partners/technology-partners/aws/",{"text":751,"config":752},"GitLab on Google Cloud",{"href":753,"dataGaName":751,"dataGaLocation":734},"/partners/technology-partners/google-cloud-platform/",{"text":755,"config":756},"Why GitLab?",{"href":428,"dataGaName":755,"dataGaLocation":734},{"freeTrial":758,"mobileIcon":763,"desktopIcon":768,"secondaryButton":771},{"text":759,"config":760},"Start free trial",{"href":761,"dataGaName":389,"dataGaLocation":762},"https://gitlab.com/-/trials/new/","nav",{"altText":764,"config":765},"Gitlab Icon",{"src":766,"dataGaName":767,"dataGaLocation":762},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":764,"config":769},{"src":770,"dataGaName":767,"dataGaLocation":762},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":772,"config":773},"Get Started",{"href":774,"dataGaName":775,"dataGaLocation":762},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":777,"mobileIcon":781,"desktopIcon":783},{"text":778,"config":779},"Learn more about GitLab Duo",{"href":420,"dataGaName":780,"dataGaLocation":762},"gitlab duo",{"altText":764,"config":782},{"src":766,"dataGaName":767,"dataGaLocation":762},{"altText":764,"config":784},{"src":770,"dataGaName":767,"dataGaLocation":762},{"button":786,"mobileIcon":791,"desktopIcon":793},{"text":787,"config":788},"/switch",{"href":789,"dataGaName":790,"dataGaLocation":762},"#contact","switch",{"altText":764,"config":792},{"src":766,"dataGaName":767,"dataGaLocation":762},{"altText":764,"config":794},{"src":795,"dataGaName":767,"dataGaLocation":762},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":797,"mobileIcon":802,"desktopIcon":804},{"text":798,"config":799},"Back to pricing",{"href":533,"dataGaName":800,"dataGaLocation":762,"icon":801},"back to pricing","GoBack",{"altText":764,"config":803},{"src":766,"dataGaName":767,"dataGaLocation":762},{"altText":764,"config":805},{"src":770,"dataGaName":767,"dataGaLocation":762},{"title":807,"titleMobile":808,"button":809,"config":814},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":426,"config":810},{"href":811,"dataGaName":812,"dataGaLocation":813},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":815,"disabled":362},"release",{"data":817},{"text":818,"source":819,"edit":825,"contribute":830,"config":835,"items":840,"minimal":1050},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":820,"config":821},"View page source",{"href":822,"dataGaName":823,"dataGaLocation":824},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":826,"config":827},"Edit this page",{"href":828,"dataGaName":829,"dataGaLocation":824},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":831,"config":832},"Please contribute",{"href":833,"dataGaName":834,"dataGaLocation":824},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":836,"facebook":837,"youtube":838,"linkedin":839},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[841,888,942,986,1018],{"title":531,"links":842,"subMenu":857},[843,847,852],{"text":844,"config":845},"View plans",{"href":533,"dataGaName":846,"dataGaLocation":824},"view plans",{"text":848,"config":849},"Why Premium?",{"href":850,"dataGaName":851,"dataGaLocation":824},"/pricing/premium/","why premium",{"text":853,"config":854},"Why Ultimate?",{"href":855,"dataGaName":856,"dataGaLocation":824},"/pricing/ultimate/","why ultimate",[858],{"title":859,"links":860},"Contact Us",[861,864,866,868,873,878,883],{"text":862,"config":863},"Contact sales",{"href":714,"dataGaName":394,"dataGaLocation":824},{"text":717,"config":865},{"href":719,"dataGaName":720,"dataGaLocation":824},{"text":722,"config":867},{"href":724,"dataGaName":725,"dataGaLocation":824},{"text":869,"config":870},"Status",{"href":871,"dataGaName":872,"dataGaLocation":824},"https://status.gitlab.com/","status",{"text":874,"config":875},"Terms of use",{"href":876,"dataGaName":877,"dataGaLocation":824},"/terms/","terms of use",{"text":879,"config":880},"Privacy statement",{"href":881,"dataGaName":882,"dataGaLocation":824},"/privacy/","privacy statement",{"text":884,"config":885},"Cookie preferences",{"dataGaName":886,"dataGaLocation":824,"id":887,"isOneTrustButton":365},"cookie preferences","ot-sdk-btn",{"title":431,"links":889,"subMenu":898},[890,894],{"text":891,"config":892},"DevSecOps platform",{"href":413,"dataGaName":893,"dataGaLocation":824},"devsecops platform",{"text":895,"config":896},"AI-Assisted Development",{"href":420,"dataGaName":897,"dataGaLocation":824},"ai-assisted development",[899],{"title":900,"links":901},"Topics",[902,907,912,917,922,927,932,937],{"text":903,"config":904},"CICD",{"href":905,"dataGaName":906,"dataGaLocation":824},"/topics/ci-cd/","cicd",{"text":908,"config":909},"GitOps",{"href":910,"dataGaName":911,"dataGaLocation":824},"/topics/gitops/","gitops",{"text":913,"config":914},"DevOps",{"href":915,"dataGaName":916,"dataGaLocation":824},"/topics/devops/","devops",{"text":918,"config":919},"Version Control",{"href":920,"dataGaName":921,"dataGaLocation":824},"/topics/version-control/","version control",{"text":923,"config":924},"DevSecOps",{"href":925,"dataGaName":926,"dataGaLocation":824},"/topics/devsecops/","devsecops",{"text":928,"config":929},"Cloud Native",{"href":930,"dataGaName":931,"dataGaLocation":824},"/topics/cloud-native/","cloud native",{"text":933,"config":934},"AI for Coding",{"href":935,"dataGaName":936,"dataGaLocation":824},"/topics/devops/ai-for-coding/","ai for coding",{"text":938,"config":939},"Agentic AI",{"href":940,"dataGaName":941,"dataGaLocation":824},"/topics/agentic-ai/","agentic ai",{"title":943,"links":944},"Solutions",[945,947,949,954,958,961,965,968,970,973,976,981],{"text":475,"config":946},{"href":470,"dataGaName":475,"dataGaLocation":824},{"text":464,"config":948},{"href":447,"dataGaName":448,"dataGaLocation":824},{"text":950,"config":951},"Agile development",{"href":952,"dataGaName":953,"dataGaLocation":824},"/solutions/agile-delivery/","agile delivery",{"text":955,"config":956},"SCM",{"href":460,"dataGaName":957,"dataGaLocation":824},"source code management",{"text":903,"config":959},{"href":453,"dataGaName":960,"dataGaLocation":824},"continuous integration & delivery",{"text":962,"config":963},"Value stream management",{"href":503,"dataGaName":964,"dataGaLocation":824},"value stream management",{"text":908,"config":966},{"href":967,"dataGaName":911,"dataGaLocation":824},"/solutions/gitops/",{"text":513,"config":969},{"href":516,"dataGaName":517,"dataGaLocation":824},{"text":971,"config":972},"Small business",{"href":522,"dataGaName":523,"dataGaLocation":824},{"text":974,"config":975},"Public sector",{"href":528,"dataGaName":529,"dataGaLocation":824},{"text":977,"config":978},"Education",{"href":979,"dataGaName":980,"dataGaLocation":824},"/solutions/education/","education",{"text":982,"config":983},"Financial services",{"href":984,"dataGaName":985,"dataGaLocation":824},"/solutions/finance/","financial services",{"title":536,"links":987},[988,990,992,994,997,999,1002,1004,1006,1008,1010,1012,1014,1016],{"text":549,"config":989},{"href":551,"dataGaName":552,"dataGaLocation":824},{"text":554,"config":991},{"href":556,"dataGaName":557,"dataGaLocation":824},{"text":559,"config":993},{"href":561,"dataGaName":562,"dataGaLocation":824},{"text":564,"config":995},{"href":566,"dataGaName":996,"dataGaLocation":824},"docs",{"text":586,"config":998},{"href":588,"dataGaName":589,"dataGaLocation":824},{"text":1000,"config":1001},"What's new",{"href":646,"dataGaName":647,"dataGaLocation":824},{"text":581,"config":1003},{"href":583,"dataGaName":584,"dataGaLocation":824},{"text":600,"config":1005},{"href":602,"dataGaName":603,"dataGaLocation":824},{"text":608,"config":1007},{"href":610,"dataGaName":611,"dataGaLocation":824},{"text":613,"config":1009},{"href":615,"dataGaName":616,"dataGaLocation":824},{"text":618,"config":1011},{"href":620,"dataGaName":621,"dataGaLocation":824},{"text":623,"config":1013},{"href":625,"dataGaName":626,"dataGaLocation":824},{"text":628,"config":1015},{"href":630,"dataGaName":631,"dataGaLocation":824},{"text":633,"config":1017},{"href":635,"dataGaName":636,"dataGaLocation":824},{"title":649,"links":1019},[1020,1022,1024,1026,1028,1030,1034,1039,1041,1043,1045],{"text":657,"config":1021},{"href":659,"dataGaName":651,"dataGaLocation":824},{"text":662,"config":1023},{"href":664,"dataGaName":665,"dataGaLocation":824},{"text":670,"config":1025},{"href":672,"dataGaName":673,"dataGaLocation":824},{"text":675,"config":1027},{"href":677,"dataGaName":678,"dataGaLocation":824},{"text":680,"config":1029},{"href":682,"dataGaName":683,"dataGaLocation":824},{"text":1031,"config":1032},"Sustainability",{"href":1033,"dataGaName":1031,"dataGaLocation":824},"/sustainability/",{"text":1035,"config":1036},"Diversity, inclusion and belonging (DIB)",{"href":1037,"dataGaName":1038,"dataGaLocation":824},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":685,"config":1040},{"href":687,"dataGaName":688,"dataGaLocation":824},{"text":695,"config":1042},{"href":697,"dataGaName":698,"dataGaLocation":824},{"text":700,"config":1044},{"href":702,"dataGaName":703,"dataGaLocation":824},{"text":1046,"config":1047},"Modern Slavery Transparency Statement",{"href":1048,"dataGaName":1049,"dataGaLocation":824},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1051},[1052,1055,1058],{"text":1053,"config":1054},"Terms",{"href":876,"dataGaName":877,"dataGaLocation":824},{"text":1056,"config":1057},"Cookies",{"dataGaName":886,"dataGaLocation":824,"id":887,"isOneTrustButton":365},{"text":1059,"config":1060},"Privacy",{"href":881,"dataGaName":882,"dataGaLocation":824},[1062],{"id":1063,"title":7,"body":361,"config":1064,"content":1066,"description":361,"extension":1069,"meta":1070,"navigation":365,"path":1071,"seo":1072,"stem":1073,"__hash__":1074},"blogAuthors/en-us/blog/authors/nick-thomas.yml",{"template":1065},"BlogAuthor",{"name":7,"config":1067},{"headshot":346,"ctfId":1068},"nickthomas","yml",{},"/en-us/blog/authors/nick-thomas",{},"en-us/blog/authors/nick-thomas","mWA2flVfR29E2MGT9J5qLbM0RXKZCi1uSL_EbSijgTc",[1076,1085,1093],{"title":1077,"description":1078,"heroImage":1079,"category":357,"date":1080,"authors":1081,"slug":1084,"externalUrl":361},"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",[1082,1083],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1086,"description":1087,"heroImage":1088,"category":357,"date":1089,"authors":1090,"slug":1092,"externalUrl":361},"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",[1091],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1094,"description":1095,"heroImage":1096,"category":357,"date":1097,"authors":1098,"slug":1100,"externalUrl":361},"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",[1099],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1102},[1103,1117,1129,1141],{"id":1104,"categories":1105,"header":1107,"text":1108,"button":1109,"image":1114},"ai-modernization",[1106],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1110,"config":1111},"Get your AI maturity score",{"href":1112,"dataGaName":1113,"dataGaLocation":589},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1115},{"src":1116},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1118,"categories":1119,"header":1121,"text":1108,"button":1122,"image":1126},"devops-modernization",[1120,926],"product","Are you just managing tools or shipping innovation?",{"text":1123,"config":1124},"Get your DevOps maturity score",{"href":1125,"dataGaName":1113,"dataGaLocation":589},"/assessments/devops-modernization-assessment/",{"config":1127},{"src":1128},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1130,"categories":1131,"header":1133,"text":1108,"button":1134,"image":1138},"security-modernization",[1132],"security","Are you trading speed for security?",{"text":1135,"config":1136},"Get your security maturity score",{"href":1137,"dataGaName":1113,"dataGaLocation":589},"/assessments/security-modernization-assessment/",{"config":1139},{"src":1140},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1142,"paths":1143,"header":1146,"text":1147,"button":1148,"image":1153},"github-azure-migration",[1144,1145],"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":1149,"config":1150},"See how GitLab compares to GitHub",{"href":1151,"dataGaName":1152,"dataGaLocation":589},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1154},{"src":1128},{"header":1156,"blurb":1157,"button":1158,"secondaryButton":1163},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1159,"config":1160},"Get your free trial",{"href":1161,"dataGaName":389,"dataGaLocation":1162},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":862,"config":1164},{"href":714,"dataGaName":394,"dataGaLocation":1162},1786803748800]