[{"data":1,"prerenderedAt":1396},["ShallowReactive",2],{"/blog/structuring-the-gitlab-package-registry-for-enterprise-scale":3,"navigation-en-us":618,"banner-en-us":1045,"footer-en-us":1055,"blog-post-authors-en-us-Tim Rizzi":1299,"blog-related-posts-en-us-structuring-the-gitlab-package-registry-for-enterprise-scale":1314,"blog-promotions-en-us":1333,"next-steps-en-us":1386},{"id":4,"title":5,"authors":6,"body":8,"category":596,"date":597,"description":598,"extension":599,"externalUrl":600,"faq":600,"featured":601,"heroImage":602,"meta":603,"navigation":601,"path":604,"seo":605,"slug":610,"stem":611,"tags":612,"template":616,"updatedDate":600,"__hash__":617},"blogPosts/en-us/blog/structuring-the-gitlab-package-registry-for-enterprise-scale.md","Structuring the GitLab Package Registry for enterprise scale",[7],"Tim Rizzi",{"type":9,"value":10,"toc":580},"minimark",[11,15,20,23,36,39,56,61,64,97,101,104,115,119,122,128,220,225,286,290,293,297,365,369,375,378,382,385,389,396,439,443,446,457,461,505,509,553,557,560,563,576],[12,13,14],"p",{},"As organizations grow, managing internal packages becomes increasingly complex. While traditional package managers, like JFrog Artifactory and Sonatype Nexus, use a centralized repository approach, GitLab takes a different path that aligns with modern development teams' work. In this post, we'll explore how to effectively structure your GitLab Package Registry for enterprise scale, focusing on Maven and npm packages as examples.",[16,17,19],"h2",{"id":18},"understanding-the-gitlab-package-registry-model","Understanding the GitLab Package Registry model",[12,21,22],{},"If you're coming from a traditional package manager, GitLab's approach might initially seem different. Instead of a single centralized repository, GitLab integrates package management directly into your existing project and group structure. This means:",[24,25,26,30,33],"ul",{},[27,28,29],"li",{},"Teams publish packages to specific projects where the code lives",[27,31,32],{},"Teams consume packages from root group registries that aggregate all packages below them",[27,34,35],{},"Access control inherits from your existing GitLab permissions",[12,37,38],{},"This model offers several advantages:",[24,40,41,44,47,50,53],{},[27,42,43],{},"Clear ownership of packages alongside their source code",[27,45,46],{},"Granular access control without additional configuration",[27,48,49],{},"Simplified CI/CD integration",[27,51,52],{},"Natural alignment with team structures",[27,54,55],{},"Single URL for accessing all company packages through root group consumption",[57,58,60],"h3",{"id":59},"the-power-of-root-group-package-registry","The power of root group package registry",[12,62,63],{},"While GitLab supports package consumption at various group levels, using the root group level has emerged as a best practice among our users. Here's why:",[24,65,66,73,79,85,91],{},[27,67,68,72],{},[69,70,71],"strong",{},"Single access point:"," One URL provides access to all private packages across your organization",[27,74,75,78],{},[69,76,77],{},"Consistent package naming:"," Group-level endpoints allow teams to maintain their preferred naming conventions without conflicts",[27,80,81,84],{},[69,82,83],{},"Simplified configuration:"," All developers can use the same configuration to access packages",[27,86,87,90],{},[69,88,89],{},"Secure access management:"," Combines with deploy tokens for easy rotation and access control",[27,92,93,96],{},[69,94,95],{},"Hierarchical organization",": Naturally maps to your organizational structure while maintaining unified access",[16,98,100],{"id":99},"real-world-example-enterprise-structure","Real-world example: Enterprise structure",[12,102,103],{},"Let's look at how this works in practice with a large enterprise:",[105,106,112],"pre",{"className":107,"code":109,"language":110,"meta":111},[108],"language-text","company/ (root group)\n├── retail-division/\n│   ├── shared-libraries/     # Division-specific shared code\n│   └── teams/\n│       ├── checkout/        # Team publishes packages here\n│       └── inventory/       # Team publishes packages here\n├── banking-division/\n│   ├── shared-libraries/    # Division-specific shared code\n│   └── teams/\n│       ├── payments/       # Team publishes packages here\n│       └── fraud/         # Team publishes packages here\n└── shared-platform/        # Enterprise-wide shared code\n    ├── java-commons/      # Shared Java libraries\n    └── ui-components/     # Shared UI components\n\n","text","",[113,114,109],"code",{"__ignoreMap":111},[57,116,118],{"id":117},"publishing-configuration","Publishing configuration",[12,120,121],{},"Teams publish packages to their specific project registries, maintaining clear ownership:",[123,124,125],"ol",{},[27,126,127],{},"Maven example",[105,129,133],{"className":130,"code":131,"language":132,"meta":111,"style":111},"language-xml shiki shiki-themes github-light","\u003C!-- checkout/pom.xml -->\n\u003CdistributionManagement>\n    \u003Crepository>\n        \u003Cid>gitlab-maven\u003C/id>\n        \u003Curl>${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven\u003C/url>\n    \u003C/repository>\n\u003C/distributionManagement>\n","xml",[113,134,135,144,158,169,185,200,210],{"__ignoreMap":111},[136,137,140],"span",{"class":138,"line":139},"line",1,[136,141,143],{"class":142},"sAwPA","\u003C!-- checkout/pom.xml -->\n",[136,145,147,151,155],{"class":138,"line":146},2,[136,148,150],{"class":149},"sgsFI","\u003C",[136,152,154],{"class":153},"shJU0","distributionManagement",[136,156,157],{"class":149},">\n",[136,159,161,164,167],{"class":138,"line":160},3,[136,162,163],{"class":149},"    \u003C",[136,165,166],{"class":153},"repository",[136,168,157],{"class":149},[136,170,172,175,178,181,183],{"class":138,"line":171},4,[136,173,174],{"class":149},"        \u003C",[136,176,177],{"class":153},"id",[136,179,180],{"class":149},">gitlab-maven\u003C/",[136,182,177],{"class":153},[136,184,157],{"class":149},[136,186,188,190,193,196,198],{"class":138,"line":187},5,[136,189,174],{"class":149},[136,191,192],{"class":153},"url",[136,194,195],{"class":149},">${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/maven\u003C/",[136,197,192],{"class":153},[136,199,157],{"class":149},[136,201,203,206,208],{"class":138,"line":202},6,[136,204,205],{"class":149},"    \u003C/",[136,207,166],{"class":153},[136,209,157],{"class":149},[136,211,213,216,218],{"class":138,"line":212},7,[136,214,215],{"class":149},"\u003C/",[136,217,154],{"class":153},[136,219,157],{"class":149},[123,221,222],{"start":146},[27,223,224],{},"npm example",[105,226,230],{"className":227,"code":228,"language":229,"meta":111,"style":111},"language-json shiki shiki-themes github-light","// ui-components/package.json\n{\n  \"name\": \"@company/ui-components\",\n  \"publishConfig\": {\n    \"registry\": \"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/\"\n  }\n}\n","json",[113,231,232,237,242,258,266,276,281],{"__ignoreMap":111},[136,233,234],{"class":138,"line":139},[136,235,236],{"class":142},"// ui-components/package.json\n",[136,238,239],{"class":138,"line":146},[136,240,241],{"class":149},"{\n",[136,243,244,248,251,255],{"class":138,"line":160},[136,245,247],{"class":246},"sYu0t","  \"name\"",[136,249,250],{"class":149},": ",[136,252,254],{"class":253},"sYBdl","\"@company/ui-components\"",[136,256,257],{"class":149},",\n",[136,259,260,263],{"class":138,"line":171},[136,261,262],{"class":246},"  \"publishConfig\"",[136,264,265],{"class":149},": {\n",[136,267,268,271,273],{"class":138,"line":187},[136,269,270],{"class":246},"    \"registry\"",[136,272,250],{"class":149},[136,274,275],{"class":253},"\"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/\"\n",[136,277,278],{"class":138,"line":202},[136,279,280],{"class":149},"  }\n",[136,282,283],{"class":138,"line":212},[136,284,285],{"class":149},"}\n",[57,287,289],{"id":288},"consuming-configuration","Consuming configuration",[12,291,292],{},"The power of root group consumption comes into play here. All teams configure a single endpoint for package access:",[123,294,295],{},[27,296,127],{},[105,298,300],{"className":130,"code":299,"language":132,"meta":111,"style":111},"\u003C!-- Any project's pom.xml -->\n\u003Crepositories>\n    \u003Crepository>\n        \u003Cid>gitlab-maven\u003C/id>\n        \u003Curl>https://gitlab.example.com/api/v4/groups/company/-/packages/maven\u003C/url>\n    \u003C/repository>\n\u003C/repositories>\n",[113,301,302,307,316,324,336,349,357],{"__ignoreMap":111},[136,303,304],{"class":138,"line":139},[136,305,306],{"class":142},"\u003C!-- Any project's pom.xml -->\n",[136,308,309,311,314],{"class":138,"line":146},[136,310,150],{"class":149},[136,312,313],{"class":153},"repositories",[136,315,157],{"class":149},[136,317,318,320,322],{"class":138,"line":160},[136,319,163],{"class":149},[136,321,166],{"class":153},[136,323,157],{"class":149},[136,325,326,328,330,332,334],{"class":138,"line":171},[136,327,174],{"class":149},[136,329,177],{"class":153},[136,331,180],{"class":149},[136,333,177],{"class":153},[136,335,157],{"class":149},[136,337,338,340,342,345,347],{"class":138,"line":187},[136,339,174],{"class":149},[136,341,192],{"class":153},[136,343,344],{"class":149},">https://gitlab.example.com/api/v4/groups/company/-/packages/maven\u003C/",[136,346,192],{"class":153},[136,348,157],{"class":149},[136,350,351,353,355],{"class":138,"line":202},[136,352,205],{"class":149},[136,354,166],{"class":153},[136,356,157],{"class":149},[136,358,359,361,363],{"class":138,"line":212},[136,360,215],{"class":149},[136,362,313],{"class":153},[136,364,157],{"class":149},[123,366,367],{"start":146},[27,368,224],{},[105,370,373],{"className":371,"code":372,"language":110,"meta":111},[108],"# Any project's .npmrc\n@company:registry=https://gitlab.example.com/api/v4/groups/company/-/packages/npm/\n",[113,374,372],{"__ignoreMap":111},[12,376,377],{},"This configuration automatically provides access to all packages across your organization while maintaining the benefits of project-based publishing.",[16,379,381],{"id":380},"authentication-and-access-control","Authentication and access control",[12,383,384],{},"GitLab's model simplifies authentication through deploy tokens and CI/CD integration.",[57,386,388],{"id":387},"for-cicd-pipelines","For CI/CD pipelines",[12,390,391,392,395],{},"GitLab automatically handles authentication in pipelines using ",[113,393,394],{},"CI_JOB_TOKEN",":",[105,397,401],{"className":398,"code":399,"language":400,"meta":111,"style":111},"language-yaml shiki shiki-themes github-light","# .gitlab-ci.yml\npublish:\n  script:\n    - mvn deploy  # or npm publish\n  # CI_JOB_TOKEN provides automatic authentication\n\n","yaml",[113,402,403,408,416,423,434],{"__ignoreMap":111},[136,404,405],{"class":138,"line":139},[136,406,407],{"class":142},"# .gitlab-ci.yml\n",[136,409,410,413],{"class":138,"line":146},[136,411,412],{"class":153},"publish",[136,414,415],{"class":149},":\n",[136,417,418,421],{"class":138,"line":160},[136,419,420],{"class":153},"  script",[136,422,415],{"class":149},[136,424,425,428,431],{"class":138,"line":171},[136,426,427],{"class":149},"    - ",[136,429,430],{"class":253},"mvn deploy",[136,432,433],{"class":142},"  # or npm publish\n",[136,435,436],{"class":138,"line":187},[136,437,438],{"class":142},"  # CI_JOB_TOKEN provides automatic authentication\n",[57,440,442],{"id":441},"for-development","For development",[12,444,445],{},"Use group deploy tokens for package consumption:",[24,447,448,451,454],{},[27,449,450],{},"Create read-only deploy tokens at the root group level",[27,452,453],{},"Rotate tokens periodically for security",[27,455,456],{},"Share a single configuration across all developers",[16,458,460],{"id":459},"benefits-of-root-group-package-registry","Benefits of root group package registry",[123,462,463,477,491],{},[27,464,465,466],{},"Simplified configuration\n",[24,467,468,471,474],{},[27,469,470],{},"One URL for all package access",[27,472,473],{},"Consistent setup across teams",[27,475,476],{},"Easy token rotation",[27,478,479,480],{},"Clear ownership\n",[24,481,482,485,488],{},[27,483,484],{},"Packages stay with their source code",[27,486,487],{},"Teams maintain control over publishing",[27,489,490],{},"Version history tied to project activity",[27,492,493,494],{},"Natural organization\n",[24,495,496,499,502],{},[27,497,498],{},"Matches your company structure",[27,500,501],{},"Supports team autonomy",[27,503,504],{},"Enables cross-team collaboration",[16,506,508],{"id":507},"getting-started","Getting started",[123,510,511,525,539],{},[27,512,513,514],{},"Set up your root group\n",[24,515,516,519,522],{},[27,517,518],{},"Create a clear group structure",[27,520,521],{},"Configure appropriate access controls",[27,523,524],{},"Create group deploy tokens",[27,526,527,528],{},"Configure team projects\n",[24,529,530,533,536],{},[27,531,532],{},"Set up project-level publishing",[27,534,535],{},"Implement CI/CD pipelines",[27,537,538],{},"Document package naming conventions",[27,540,541,542],{},"Standardize consumption\n",[24,543,544,547,550],{},[27,545,546],{},"Configure root group registry access",[27,548,549],{},"Share deploy tokens securely",[27,551,552],{},"Document package discovery process",[16,554,556],{"id":555},"summary","Summary",[12,558,559],{},"GitLab's package registry model, particularly when leveraging root group consumption, offers a powerful solution for enterprise package management. By combining project-based publishing with root group consumption, organizations get the best of both worlds: clear ownership and simplified access. This approach scales naturally with your organization while maintaining security and ease of use.",[12,561,562],{},"Start by implementing this model with a single team or division, and expand as you see the benefits of this integrated approach. Remember that while this post focused on Maven and npm, the same principles apply to all package types supported by GitLab.",[564,565,566],"blockquote",{},[12,567,568,569,575],{},"Get started with package registries today! Sign up for a ",[570,571,574],"a",{"href":572,"rel":573},"https://about.gitlab.com/free-trial/",[],"free trial of GitLab Ultimate",".",[577,578,579],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}",{"title":111,"searchDepth":146,"depth":146,"links":581},[582,585,589,593,594,595],{"id":18,"depth":146,"text":19,"children":583},[584],{"id":59,"depth":160,"text":60},{"id":99,"depth":146,"text":100,"children":586},[587,588],{"id":117,"depth":160,"text":118},{"id":288,"depth":160,"text":289},{"id":380,"depth":146,"text":381,"children":590},[591,592],{"id":387,"depth":160,"text":388},{"id":441,"depth":160,"text":442},{"id":459,"depth":146,"text":460},{"id":507,"depth":146,"text":508},{"id":555,"depth":146,"text":556},"product","2025-02-19","Learn how to leverage GitLab's unique project-based publishing model alongside root-group-level consumption to create a secure, flexible package management strategy.","md",null,true,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662332/Blog/Hero%20Images/blog-image-template-1800x945__23_.png",{},"/en-us/blog/structuring-the-gitlab-package-registry-for-enterprise-scale",{"title":5,"description":598,"ogTitle":5,"ogDescription":598,"noIndex":606,"ogImage":602,"ogUrl":607,"ogSiteName":608,"ogType":609,"canonicalUrls":607},false,"https://about.gitlab.com/blog/structuring-the-gitlab-package-registry-for-enterprise-scale","https://about.gitlab.com","article","structuring-the-gitlab-package-registry-for-enterprise-scale","en-us/blog/structuring-the-gitlab-package-registry-for-enterprise-scale",[613,614,615],"DevSecOps","tutorial","solutions architecture","BlogPost","Xs5tqTaRIST8Or1kp1rJ9XvlF1p1Ipz8mmxhh1a94pI",{"logo":619,"freeTrial":624,"sales":629,"login":634,"items":639,"search":965,"minimal":996,"duo":1015,"switchNav":1024,"pricingDeployment":1035},{"config":620},{"href":621,"dataGaName":622,"dataGaLocation":623},"/","gitlab logo","header",{"text":625,"config":626},"Get free trial",{"href":627,"dataGaName":628,"dataGaLocation":623},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":630,"config":631},"Request a demo",{"href":632,"dataGaName":633,"dataGaLocation":623},"/sales/?contact-topic=request-demo","sales",{"text":635,"config":636},"Sign in",{"href":637,"dataGaName":638,"dataGaLocation":623},"https://gitlab.com/users/sign_in/","sign in",[640,669,769,774,887,943],{"text":641,"config":642,"menu":644},"Platform",{"dataNavLevelOne":643},"platform",{"type":645,"columns":646},"cards",[647,653,661],{"title":641,"description":648,"link":649},"The intelligent orchestration platform for DevSecOps",{"text":650,"config":651},"Explore our Platform",{"href":652,"dataGaName":643,"dataGaLocation":623},"/platform/",{"title":654,"description":655,"link":656},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":657,"config":658},"Meet GitLab Duo",{"href":659,"dataGaName":660,"dataGaLocation":623},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":662,"description":663,"link":664},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":665,"config":666},"Learn more",{"href":667,"dataGaName":668,"dataGaLocation":623},"/why-gitlab/","why gitlab",{"text":670,"left":601,"config":671,"menu":673},"Product",{"dataNavLevelOne":672},"solutions",{"type":674,"link":675,"columns":679,"feature":748},"lists",{"text":676,"config":677},"View all Solutions",{"href":678,"dataGaName":672,"dataGaLocation":623},"/solutions/",[680,704,727],{"title":681,"description":682,"link":683,"items":688},"Automation","CI/CD and automation to accelerate deployment",{"config":684},{"icon":685,"href":686,"dataGaName":687,"dataGaLocation":623},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[689,693,696,700],{"text":690,"config":691},"CI/CD",{"href":692,"dataGaLocation":623,"dataGaName":690},"/solutions/continuous-integration/",{"text":654,"config":694},{"href":659,"dataGaLocation":623,"dataGaName":695},"gitlab duo agent platform - product menu",{"text":697,"config":698},"Source Code Management",{"href":699,"dataGaLocation":623,"dataGaName":697},"/solutions/source-code-management/",{"text":701,"config":702},"Automated Software Delivery",{"href":686,"dataGaLocation":623,"dataGaName":703},"Automated software delivery",{"title":705,"description":706,"link":707,"items":712},"Security","Deliver code faster without compromising security",{"config":708},{"href":709,"dataGaName":710,"dataGaLocation":623,"icon":711},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[713,717,722],{"text":714,"config":715},"Application Security Testing",{"href":709,"dataGaName":716,"dataGaLocation":623},"Application security testing",{"text":718,"config":719},"Software Supply Chain Security",{"href":720,"dataGaLocation":623,"dataGaName":721},"/solutions/supply-chain/","Software supply chain security",{"text":723,"config":724},"Software Compliance",{"href":725,"dataGaName":726,"dataGaLocation":623},"/solutions/software-compliance/","software compliance",{"title":728,"link":729,"items":734},"Measurement",{"config":730},{"icon":731,"href":732,"dataGaName":733,"dataGaLocation":623},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[735,739,743],{"text":736,"config":737},"Visibility & Measurement",{"href":732,"dataGaLocation":623,"dataGaName":738},"Visibility and Measurement",{"text":740,"config":741},"Value Stream Management",{"href":742,"dataGaLocation":623,"dataGaName":740},"/solutions/value-stream-management/",{"text":744,"config":745},"Analytics & Insights",{"href":746,"dataGaLocation":623,"dataGaName":747},"/solutions/analytics-and-insights/","Analytics and insights",{"title":749,"type":674,"items":750},"GitLab for",[751,757,763],{"text":752,"config":753},"Enterprise",{"icon":754,"href":755,"dataGaLocation":623,"dataGaName":756},"Building","/enterprise/","enterprise",{"text":758,"config":759},"Small Business",{"icon":760,"href":761,"dataGaLocation":623,"dataGaName":762},"Work","/small-business/","small business",{"text":764,"config":765},"Public Sector",{"icon":766,"href":767,"dataGaLocation":623,"dataGaName":768},"Organization","/solutions/public-sector/","public sector",{"text":770,"config":771},"Pricing",{"href":772,"dataGaName":773,"dataGaLocation":623,"dataNavLevelOne":773},"/pricing/","pricing",{"text":775,"config":776,"menu":778},"Resources",{"dataNavLevelOne":777},"resources",{"type":674,"link":779,"columns":783,"feature":876},{"text":780,"config":781},"View all resources",{"href":782,"dataGaName":777,"dataGaLocation":623},"/resources/",[784,816,843],{"title":508,"items":785},[786,791,796,801,806,811],{"text":787,"config":788},"Install",{"href":789,"dataGaName":790,"dataGaLocation":623},"/install/","install",{"text":792,"config":793},"Quick start guides",{"href":794,"dataGaName":795,"dataGaLocation":623},"/get-started/","quick setup checklists",{"text":797,"config":798},"Learn",{"href":799,"dataGaLocation":623,"dataGaName":800},"https://university.gitlab.com/","learn",{"text":802,"config":803},"Product documentation",{"href":804,"dataGaName":805,"dataGaLocation":623},"https://docs.gitlab.com/","product documentation",{"text":807,"config":808},"Best practice videos",{"href":809,"dataGaName":810,"dataGaLocation":623},"/getting-started-videos/","best practice videos",{"text":812,"config":813},"Integrations",{"href":814,"dataGaName":815,"dataGaLocation":623},"/integrations/","integrations",{"title":817,"items":818},"Discover",[819,824,829,834,838],{"text":820,"config":821},"Customer success stories",{"href":822,"dataGaName":823,"dataGaLocation":623},"/customers/","customer success stories",{"text":825,"config":826},"Blog",{"href":827,"dataGaName":828,"dataGaLocation":623},"/blog/","blog",{"text":830,"config":831},"Demo Hub",{"href":832,"dataGaName":833,"dataGaLocation":623},"/demo-hub/","demo hub",{"text":835,"config":836},"The Source",{"href":837,"dataGaName":828,"dataGaLocation":623},"/the-source/",{"text":839,"config":840},"Remote",{"href":841,"dataGaName":842,"dataGaLocation":623},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":844,"items":845},"Connect",[846,851,856,861,866,871],{"text":847,"config":848},"GitLab Services",{"href":849,"dataGaName":850,"dataGaLocation":623},"/services/","services",{"text":852,"config":853},"Contribute",{"href":854,"dataGaName":855,"dataGaLocation":623},"https://contributors.gitlab.com","contribute",{"text":857,"config":858},"Community",{"href":859,"dataGaName":860,"dataGaLocation":623},"/community/","community",{"text":862,"config":863},"Forum",{"href":864,"dataGaName":865,"dataGaLocation":623},"https://forum.gitlab.com/","forum",{"text":867,"config":868},"Events",{"href":869,"dataGaName":870,"dataGaLocation":623},"/events/","events",{"text":872,"config":873},"Partners",{"href":874,"dataGaName":875,"dataGaLocation":623},"/partners/","partners",{"config":877,"title":880,"text":881,"link":882},{"background":878,"textColor":879},"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":883,"config":884},"Read the latest",{"href":885,"dataGaName":886,"dataGaLocation":623},"/whats-new/","whats new",{"text":888,"config":889,"menu":891},"Company",{"dataNavLevelOne":890},"company",{"type":674,"columns":892},[893],{"items":894},[895,900,906,908,913,918,923,928,933,938],{"text":896,"config":897},"About",{"href":898,"dataGaName":899,"dataGaLocation":623},"/company/","about",{"text":901,"config":902,"footerGa":905},"Jobs",{"href":903,"dataGaName":904,"dataGaLocation":623},"/jobs/","jobs",{"dataGaName":904},{"text":867,"config":907},{"href":869,"dataGaName":870,"dataGaLocation":623},{"text":909,"config":910},"Leadership",{"href":911,"dataGaName":912,"dataGaLocation":623},"/company/team/e-group/","leadership",{"text":914,"config":915},"Handbook",{"href":916,"dataGaName":917,"dataGaLocation":623},"https://handbook.gitlab.com/","handbook",{"text":919,"config":920},"Investor relations",{"href":921,"dataGaName":922,"dataGaLocation":623},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":924,"config":925},"Trust Center",{"href":926,"dataGaName":927,"dataGaLocation":623},"/security/","trust center",{"text":929,"config":930},"AI Transparency Center",{"href":931,"dataGaName":932,"dataGaLocation":623},"/ai-transparency-center/","ai transparency center",{"text":934,"config":935},"Newsletter",{"href":936,"dataGaName":937,"dataGaLocation":623},"/company/contact/#contact-forms","newsletter",{"text":939,"config":940},"Press",{"href":941,"dataGaName":942,"dataGaLocation":623},"/press/","press",{"text":944,"config":945,"menu":946},"Contact us",{"dataNavLevelOne":890},{"type":674,"columns":947},[948],{"items":949},[950,955,960],{"text":951,"config":952},"Talk to sales",{"href":953,"dataGaName":954,"dataGaLocation":623},"/sales/","talk to sales",{"text":956,"config":957},"Support portal",{"href":958,"dataGaName":959,"dataGaLocation":623},"https://support.gitlab.com/hc/en-us","support portal",{"text":961,"config":962},"Customer portal",{"href":963,"dataGaName":964,"dataGaLocation":623},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":966,"login":967,"suggestions":974},"Close",{"text":968,"link":969},"To search repositories and projects, login to",{"text":970,"config":971},"gitlab.com",{"href":637,"dataGaName":972,"dataGaLocation":973},"search login","search",{"text":975,"default":976},"Suggestions",[977,979,983,985,989,993],{"text":654,"config":978},{"href":659,"dataGaName":654,"dataGaLocation":973},{"text":980,"config":981},"Code Suggestions (AI)",{"href":982,"dataGaName":980,"dataGaLocation":973},"/solutions/code-suggestions/",{"text":690,"config":984},{"href":692,"dataGaName":690,"dataGaLocation":973},{"text":986,"config":987},"GitLab on AWS",{"href":988,"dataGaName":986,"dataGaLocation":973},"/partners/technology-partners/aws/",{"text":990,"config":991},"GitLab on Google Cloud",{"href":992,"dataGaName":990,"dataGaLocation":973},"/partners/technology-partners/google-cloud-platform/",{"text":994,"config":995},"Why GitLab?",{"href":667,"dataGaName":994,"dataGaLocation":973},{"freeTrial":997,"mobileIcon":1002,"desktopIcon":1007,"secondaryButton":1010},{"text":998,"config":999},"Start free trial",{"href":1000,"dataGaName":628,"dataGaLocation":1001},"https://gitlab.com/-/trials/new/","nav",{"altText":1003,"config":1004},"Gitlab Icon",{"src":1005,"dataGaName":1006,"dataGaLocation":1001},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1003,"config":1008},{"src":1009,"dataGaName":1006,"dataGaLocation":1001},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1011,"config":1012},"Get Started",{"href":1013,"dataGaName":1014,"dataGaLocation":1001},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1016,"mobileIcon":1020,"desktopIcon":1022},{"text":1017,"config":1018},"Learn more about GitLab Duo",{"href":659,"dataGaName":1019,"dataGaLocation":1001},"gitlab duo",{"altText":1003,"config":1021},{"src":1005,"dataGaName":1006,"dataGaLocation":1001},{"altText":1003,"config":1023},{"src":1009,"dataGaName":1006,"dataGaLocation":1001},{"button":1025,"mobileIcon":1030,"desktopIcon":1032},{"text":1026,"config":1027},"/switch",{"href":1028,"dataGaName":1029,"dataGaLocation":1001},"#contact","switch",{"altText":1003,"config":1031},{"src":1005,"dataGaName":1006,"dataGaLocation":1001},{"altText":1003,"config":1033},{"src":1034,"dataGaName":1006,"dataGaLocation":1001},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1036,"mobileIcon":1041,"desktopIcon":1043},{"text":1037,"config":1038},"Back to pricing",{"href":772,"dataGaName":1039,"dataGaLocation":1001,"icon":1040},"back to pricing","GoBack",{"altText":1003,"config":1042},{"src":1005,"dataGaName":1006,"dataGaLocation":1001},{"altText":1003,"config":1044},{"src":1009,"dataGaName":1006,"dataGaLocation":1001},{"title":1046,"titleMobile":1047,"button":1048,"config":1053},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":665,"config":1049},{"href":1050,"dataGaName":1051,"dataGaLocation":1052},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1054,"disabled":606},"release",{"data":1056},{"text":1057,"source":1058,"edit":1064,"contribute":1069,"config":1074,"items":1079,"minimal":1288},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1059,"config":1060},"View page source",{"href":1061,"dataGaName":1062,"dataGaLocation":1063},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1065,"config":1066},"Edit this page",{"href":1067,"dataGaName":1068,"dataGaLocation":1063},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1070,"config":1071},"Please contribute",{"href":1072,"dataGaName":1073,"dataGaLocation":1063},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1075,"facebook":1076,"youtube":1077,"linkedin":1078},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1080,1127,1180,1224,1256],{"title":770,"links":1081,"subMenu":1096},[1082,1086,1091],{"text":1083,"config":1084},"View plans",{"href":772,"dataGaName":1085,"dataGaLocation":1063},"view plans",{"text":1087,"config":1088},"Why Premium?",{"href":1089,"dataGaName":1090,"dataGaLocation":1063},"/pricing/premium/","why premium",{"text":1092,"config":1093},"Why Ultimate?",{"href":1094,"dataGaName":1095,"dataGaLocation":1063},"/pricing/ultimate/","why ultimate",[1097],{"title":1098,"links":1099},"Contact Us",[1100,1103,1105,1107,1112,1117,1122],{"text":1101,"config":1102},"Contact sales",{"href":953,"dataGaName":633,"dataGaLocation":1063},{"text":956,"config":1104},{"href":958,"dataGaName":959,"dataGaLocation":1063},{"text":961,"config":1106},{"href":963,"dataGaName":964,"dataGaLocation":1063},{"text":1108,"config":1109},"Status",{"href":1110,"dataGaName":1111,"dataGaLocation":1063},"https://status.gitlab.com/","status",{"text":1113,"config":1114},"Terms of use",{"href":1115,"dataGaName":1116,"dataGaLocation":1063},"/terms/","terms of use",{"text":1118,"config":1119},"Privacy statement",{"href":1120,"dataGaName":1121,"dataGaLocation":1063},"/privacy/","privacy statement",{"text":1123,"config":1124},"Cookie preferences",{"dataGaName":1125,"dataGaLocation":1063,"id":1126,"isOneTrustButton":601},"cookie preferences","ot-sdk-btn",{"title":670,"links":1128,"subMenu":1137},[1129,1133],{"text":1130,"config":1131},"DevSecOps platform",{"href":652,"dataGaName":1132,"dataGaLocation":1063},"devsecops platform",{"text":1134,"config":1135},"AI-Assisted Development",{"href":659,"dataGaName":1136,"dataGaLocation":1063},"ai-assisted development",[1138],{"title":1139,"links":1140},"Topics",[1141,1146,1151,1156,1161,1165,1170,1175],{"text":1142,"config":1143},"CICD",{"href":1144,"dataGaName":1145,"dataGaLocation":1063},"/topics/ci-cd/","cicd",{"text":1147,"config":1148},"GitOps",{"href":1149,"dataGaName":1150,"dataGaLocation":1063},"/topics/gitops/","gitops",{"text":1152,"config":1153},"DevOps",{"href":1154,"dataGaName":1155,"dataGaLocation":1063},"/topics/devops/","devops",{"text":1157,"config":1158},"Version Control",{"href":1159,"dataGaName":1160,"dataGaLocation":1063},"/topics/version-control/","version control",{"text":613,"config":1162},{"href":1163,"dataGaName":1164,"dataGaLocation":1063},"/topics/devsecops/","devsecops",{"text":1166,"config":1167},"Cloud Native",{"href":1168,"dataGaName":1169,"dataGaLocation":1063},"/topics/cloud-native/","cloud native",{"text":1171,"config":1172},"AI for Coding",{"href":1173,"dataGaName":1174,"dataGaLocation":1063},"/topics/devops/ai-for-coding/","ai for coding",{"text":1176,"config":1177},"Agentic AI",{"href":1178,"dataGaName":1179,"dataGaLocation":1063},"/topics/agentic-ai/","agentic ai",{"title":1181,"links":1182},"Solutions",[1183,1185,1187,1192,1196,1199,1203,1206,1208,1211,1214,1219],{"text":714,"config":1184},{"href":709,"dataGaName":714,"dataGaLocation":1063},{"text":703,"config":1186},{"href":686,"dataGaName":687,"dataGaLocation":1063},{"text":1188,"config":1189},"Agile development",{"href":1190,"dataGaName":1191,"dataGaLocation":1063},"/solutions/agile-delivery/","agile delivery",{"text":1193,"config":1194},"SCM",{"href":699,"dataGaName":1195,"dataGaLocation":1063},"source code management",{"text":1142,"config":1197},{"href":692,"dataGaName":1198,"dataGaLocation":1063},"continuous integration & delivery",{"text":1200,"config":1201},"Value stream management",{"href":742,"dataGaName":1202,"dataGaLocation":1063},"value stream management",{"text":1147,"config":1204},{"href":1205,"dataGaName":1150,"dataGaLocation":1063},"/solutions/gitops/",{"text":752,"config":1207},{"href":755,"dataGaName":756,"dataGaLocation":1063},{"text":1209,"config":1210},"Small business",{"href":761,"dataGaName":762,"dataGaLocation":1063},{"text":1212,"config":1213},"Public sector",{"href":767,"dataGaName":768,"dataGaLocation":1063},{"text":1215,"config":1216},"Education",{"href":1217,"dataGaName":1218,"dataGaLocation":1063},"/solutions/education/","education",{"text":1220,"config":1221},"Financial services",{"href":1222,"dataGaName":1223,"dataGaLocation":1063},"/solutions/finance/","financial services",{"title":775,"links":1225},[1226,1228,1230,1232,1235,1237,1240,1242,1244,1246,1248,1250,1252,1254],{"text":787,"config":1227},{"href":789,"dataGaName":790,"dataGaLocation":1063},{"text":792,"config":1229},{"href":794,"dataGaName":795,"dataGaLocation":1063},{"text":797,"config":1231},{"href":799,"dataGaName":800,"dataGaLocation":1063},{"text":802,"config":1233},{"href":804,"dataGaName":1234,"dataGaLocation":1063},"docs",{"text":825,"config":1236},{"href":827,"dataGaName":828,"dataGaLocation":1063},{"text":1238,"config":1239},"What's new",{"href":885,"dataGaName":886,"dataGaLocation":1063},{"text":820,"config":1241},{"href":822,"dataGaName":823,"dataGaLocation":1063},{"text":839,"config":1243},{"href":841,"dataGaName":842,"dataGaLocation":1063},{"text":847,"config":1245},{"href":849,"dataGaName":850,"dataGaLocation":1063},{"text":852,"config":1247},{"href":854,"dataGaName":855,"dataGaLocation":1063},{"text":857,"config":1249},{"href":859,"dataGaName":860,"dataGaLocation":1063},{"text":862,"config":1251},{"href":864,"dataGaName":865,"dataGaLocation":1063},{"text":867,"config":1253},{"href":869,"dataGaName":870,"dataGaLocation":1063},{"text":872,"config":1255},{"href":874,"dataGaName":875,"dataGaLocation":1063},{"title":888,"links":1257},[1258,1260,1262,1264,1266,1268,1272,1277,1279,1281,1283],{"text":896,"config":1259},{"href":898,"dataGaName":890,"dataGaLocation":1063},{"text":901,"config":1261},{"href":903,"dataGaName":904,"dataGaLocation":1063},{"text":909,"config":1263},{"href":911,"dataGaName":912,"dataGaLocation":1063},{"text":914,"config":1265},{"href":916,"dataGaName":917,"dataGaLocation":1063},{"text":919,"config":1267},{"href":921,"dataGaName":922,"dataGaLocation":1063},{"text":1269,"config":1270},"Sustainability",{"href":1271,"dataGaName":1269,"dataGaLocation":1063},"/sustainability/",{"text":1273,"config":1274},"Diversity, inclusion and belonging (DIB)",{"href":1275,"dataGaName":1276,"dataGaLocation":1063},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":924,"config":1278},{"href":926,"dataGaName":927,"dataGaLocation":1063},{"text":934,"config":1280},{"href":936,"dataGaName":937,"dataGaLocation":1063},{"text":939,"config":1282},{"href":941,"dataGaName":942,"dataGaLocation":1063},{"text":1284,"config":1285},"Modern Slavery Transparency Statement",{"href":1286,"dataGaName":1287,"dataGaLocation":1063},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1289},[1290,1293,1296],{"text":1291,"config":1292},"Terms",{"href":1115,"dataGaName":1116,"dataGaLocation":1063},{"text":1294,"config":1295},"Cookies",{"dataGaName":1125,"dataGaLocation":1063,"id":1126,"isOneTrustButton":601},{"text":1297,"config":1298},"Privacy",{"href":1120,"dataGaName":1121,"dataGaLocation":1063},[1300],{"id":1301,"title":7,"body":600,"config":1302,"content":1304,"description":600,"extension":1308,"meta":1309,"navigation":601,"path":1310,"seo":1311,"stem":1312,"__hash__":1313},"blogAuthors/en-us/blog/authors/tim-rizzi.yml",{"template":1303},"BlogAuthor",{"name":7,"config":1305},{"headshot":1306,"ctfId":1307},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749661866/Blog/Author%20Headshots/trizzi-headshot.jpg","trizzi","yml",{},"/en-us/blog/authors/tim-rizzi",{},"en-us/blog/authors/tim-rizzi","ADPqrpcnKveFJS0m_zFV0VLtb_h_txu59QVgz_YwKMc",[1315,1321,1325],{"title":1316,"description":1317,"heroImage":1318,"category":596,"date":1319,"authors":600,"slug":600,"externalUrl":1320},"GitLab Patch Release: 19.2.2, 19.1.4, 19.0.6","Learn about this latest patch release for Community Edition and Enterprise Edition.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749661926/Blog/Hero%20Images/security-patch-blog-image-r2-0506-700x400-fy25_2x.jpg","2026-08-12","https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-2-2-released/",{"title":1322,"description":1317,"heroImage":1318,"category":596,"date":1323,"authors":600,"slug":600,"externalUrl":1324}," GitLab Patch Release: 19.2.1, 19.1.3, 19.0.5","2026-07-29","https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-2-1-released/",{"title":1326,"description":1327,"heroImage":1328,"category":596,"date":1329,"authors":1330,"slug":1332,"externalUrl":600},"Automate work item assignment with a \"Work item created\" trigger","Our step-by-step guide walks through this AI capability, which enables instant, scalable triage without manual intervention.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-07-20",[1331],"Cesar Saavedra","how-to-use-a-work-item-created-trigger",{"promotions":1334},[1335,1349,1360,1372],{"id":1336,"categories":1337,"header":1339,"text":1340,"button":1341,"image":1346},"ai-modernization",[1338],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1342,"config":1343},"Get your AI maturity score",{"href":1344,"dataGaName":1345,"dataGaLocation":828},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1347},{"src":1348},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1350,"categories":1351,"header":1352,"text":1340,"button":1353,"image":1357},"devops-modernization",[596,1164],"Are you just managing tools or shipping innovation?",{"text":1354,"config":1355},"Get your DevOps maturity score",{"href":1356,"dataGaName":1345,"dataGaLocation":828},"/assessments/devops-modernization-assessment/",{"config":1358},{"src":1359},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1361,"categories":1362,"header":1364,"text":1340,"button":1365,"image":1369},"security-modernization",[1363],"security","Are you trading speed for security?",{"text":1366,"config":1367},"Get your security maturity score",{"href":1368,"dataGaName":1345,"dataGaLocation":828},"/assessments/security-modernization-assessment/",{"config":1370},{"src":1371},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1373,"paths":1374,"header":1377,"text":1378,"button":1379,"image":1384},"github-azure-migration",[1375,1376],"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":1380,"config":1381},"See how GitLab compares to GitHub",{"href":1382,"dataGaName":1383,"dataGaLocation":828},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1385},{"src":1359},{"header":1387,"blurb":1388,"button":1389,"secondaryButton":1394},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1390,"config":1391},"Get your free trial",{"href":1392,"dataGaName":628,"dataGaLocation":1393},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1101,"config":1395},{"href":953,"dataGaName":633,"dataGaLocation":1393},1786803737796]