[{"data":1,"prerenderedAt":1039},["ShallowReactive",2],{"/blog/reviewer-roulette-one-year-on":3,"navigation-en-us":253,"banner-en-us":681,"footer-en-us":691,"blog-post-authors-en-us-Nick Thomas":935,"blog-related-posts-en-us-reviewer-roulette-one-year-on":949,"blog-promotions-en-us":975,"next-steps-en-us":1029},{"id":4,"title":5,"authors":6,"body":8,"category":231,"date":232,"description":233,"extension":234,"externalUrl":235,"faq":235,"featured":236,"heroImage":237,"meta":238,"navigation":239,"path":240,"seo":241,"slug":245,"stem":246,"tags":247,"template":251,"updatedDate":235,"__hash__":252},"blogPosts/en-us/blog/reviewer-roulette-one-year-on.md","Reviewer Roulette: (Just about) one year on",[7],"Nick Thomas",{"type":9,"value":10,"toc":223},"minimark",[11,27,30,35,44,47,50,54,63,66,75,79,88,102,110,117,126,129,133,140,157,185,202,210],[12,13,14,15,20,21,26],"p",{},"Just over a year ago, Dennis Tang\nintroduced us to ",[16,17,19],"a",{"href":18},"/blog/play-reviewer-roulette/","Reviewer Roulette",".\nThis was a shiny new tool designed to help us to find reviewers for our code.\nAt the time, our engineering department had around 150 people in it. At GitLab,\n",[16,22,25],{"href":23,"rel":24},"https://handbook.gitlab.com/handbook/engineering/workflow/code-review/#reviewer",[],"all our engineers are reviewers",",\nbut reviews were being unevenly distributed across them.",[12,28,29],{},"A year on, and with more than 380 people in engineering available to review,\nwe're still using a form of Reviewer Roulette – but its implementation, and how\nwe interact with it, has changed significantly. So, what's changed, and what's\nstayed the same?",[31,32,34],"h2",{"id":33},"the-good","The good",[12,36,37,38,43],{},"First off, roulette works really well. Code reviews can be time-consuming, and\nthey're a major part of quality control at GitLab, so it's crucial that we\ndistribute the load – research shows that ",[16,39,42],{"href":40,"rel":41},"https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/",[],"review quality nosedives","\nif you spend too much time doing it. It's even more\nimportant for our maintainers. We try to maintain a ratio of engineers to maintainers of around\n4:1, but if half of the reviews go to a quarter of the maintainers, some will\nexperience it as 6:1, while others will experience it as 2:1.",[12,45,46],{},"Also, people could become familiar with certain reviewers and maintainers and\nhabitually assign their work to the same people. This means that people who had\nbeen maintainers for longer tended to get more reviews. Without the\nrandomization effect of Reviewer Roulette, this led to the creation of knowledge\nsilos, where knowledge about a particular subject would be concentrated in a few\nindividuals, rather than being spread across the organization.",[12,48,49],{},"Roulette solved this for us with almost no cognitive load, and could scale\neffortlessly as our engineering team expands significantly. Sometimes, I first\nlearned someone new had joined the company through a review suggestion. The\nnumber and type of reviews a merge request needed was also increasing – I might\nneed to find a reviewer and maintainer for frontend, backend, QA, database,\ndocumentation, and UX concerns before merging. It's a lot to keep track of\nmanually!",[31,51,53],{"id":52},"the-bad","The bad",[12,55,56,57,62],{},"Despite the advantages of Reviewer Roulette, I used it inconsistently after a\nfew months, and never actually contributed any improvements to the code. The\nintegration with Slack didn't fit my workflow very well because a chat channel\nis the last place I want to be when working on code! I like to treat Slack as\nthe ",[16,58,61],{"href":59,"rel":60},"https://handbook.gitlab.com/handbook/communication/#slack",[],"informal, asynchronous"," communication\nchannel it is designed to be, but it is too easy to be sidetracked by ongoing\nconversations when popping in to get a reviewer recommendation.",[12,64,65],{},"Then, we began running into deployment problems, and sometimes Reviewer Roulette\njust wasn't available at all. It only took a few failed attempts before I fell\nout of the habit of trying to use it, and we never did get around to making the\ndeployment work with Auto DevOps.",[12,67,68,69,74],{},"It turns out that I wasn't the only one having trouble with this iteration of Reviewer Roulette – we found\nthat backend reviews were ",[16,70,73],{"href":71,"rel":72},"https://gitlab.com/gitlab-org/gitlab-foss/issues/53119#note_111796691",[],"very unevenly distributed",". Reviewer Roulette wasn't being used widely enough across GitLab for us to experience\nall the benefits, and as we geared up to add many more maintainers, fixing\nthis tool became very important.",[31,76,78],{"id":77},"the-fix","The fix",[12,80,81,82,87],{},"In the interim, staff backend engineer on Delivery, Yorick Peterse, introduced\n",[16,83,86],{"href":84,"rel":85},"https://github.com/danger/danger",[],"Danger bot"," into GitLab's CI pipeline and\nused it to enforce a fine set of coding standards that we couldn't quite express\nwith Rubocop.",[12,89,90,91,96,97,101],{},"The new bot would leave polite messages on our MRs, asking us to write\n",[16,92,95],{"href":93,"rel":94},"https://docs.gitlab.com/development/contributing/merge_request_workflow/#commit-messages-guidelines",[],"better commit messages",",\nor to seek database review if we'd changed any files in ",[98,99,100],"code",{},"db/",". That last part got me\nthinking: Why couldn't the Danger bot pick a potential database reviewer for us at the same\ntime? What was stopping it from detecting backend, frontend, or documentation\nchanges, and using Reviewer Roulette to choose reviewers and maintainers right there in\nthe merge request?",[12,103,104,109],{},[16,105,108],{"href":106,"rel":107},"https://gitlab.com/gitlab-org/gitlab/merge_requests/13506#note_175449376",[],"Very little, it turned out",":",[12,111,112],{},[113,114],"img",{"alt":115,"src":116},"Reviewer Roulette in Action","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398968/blog/Content%20Images/roulette-review.jpg",[12,118,119,120,125],{},"By making Reviewer Roulette happen automatically in the merge request itself, we\nremoved all the barriers that were preventing us from using the tool. I no longer had to be\non Slack to find a reviewer, instead the list was right there in the merge request as\nI went to change the assignee. Danger was guaranteed to run on every pipeline –\nthere were no deployments or environments to worry about, and if it broke,\nfixing it was automatically ",[16,121,124],{"href":122,"rel":123},"https://handbook.gitlab.com/handbook/engineering/workflow/#broken-master",[],"high priority",".",[12,127,128],{},"Contributing changes also became much easier – the code was right there in the\nGitLab repository, and changes took effect immediately (again, no deployments!).",[31,130,132],{"id":131},"whats-next","What's next?",[12,134,135,136,139],{},"The ChatOps version of Reviewer Roulette needed access to GitLab's Slack\nworkspace to use and so it wasn't available to most of our community contributors\nbeyond the core team. Moving Reviewer Roulette to Danger doesn't really solve this\nproblem – it doesn't work well on forks of the ",[98,137,138],{},"gitlab-org/gitlab"," project so\ncommunity contributors don't benefit. This problem is something I'd really\nlike to fix in the future, not least because I work on a fork of GitLab\nday-to-day as well.",[12,141,142,143,148,149,156],{},"Danger is a good tool but it does have ",[16,144,147],{"href":145,"rel":146},"https://docs.gitlab.com/development/dangerbot/",[],"some limitations"," –\nin particular, ",[16,150,153],{"href":151,"rel":152},"https://danger.systems/guides/troubleshooting.html#i-want-to-work-locally-on-my-dangerfile",[],[98,154,155],{},"danger local","\ndoesn't work for GitLab. This slows down development, since you have to commit\nand push changes to your merge request before you can see the effects.",[12,158,159,160,163,164,167,168,171,172,171,175,178,179,184],{},"Another big problem is that this most recent iteration of Reviewer Roulette only\nworks for the ",[98,161,162],{},"gitlab"," project. None of our satellite projects - ",[98,165,166],{},"gitaly",",\n",[98,169,170],{},"gitlab-workhorse",", ",[98,173,174],{},"gitlab-pages",[98,176,177],{},"gitlab-runner",", etc. – can use this\nversion of Reviewer Roulette. Similarly, ",[16,180,183],{"href":181,"rel":182},"https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/24938#note_141874188",[],"users of GitLab haven't\nbenefited from the work we've been doing on Roulette",".\nIdeally, we would have built this as a feature within GitLab itself, so everyone\ncould benefit from the tool.",[12,186,187,188,190,191,196,197,125],{},"By building Reviewer Roulette in Danger we've been able to protype and rapidly iterate\nto a solution that is working very well for the ",[98,189,162],{}," project. The next steps\nare to turn Reviewer Roulette ",[16,192,195],{"href":193,"rel":194},"https://gitlab.com/groups/gitlab-org/-/epics/1823",[],"into a feature"," that all users of GitLab can benefit from, perhaps by leveraging the ",[16,198,201],{"href":199,"rel":200},"https://gitlab.com/gitlab-org/gitlab/issues/12137",[],"CODEOWNERS file",[12,203,204,205,209],{},"Do you have any ideas on how we can better integrate Reviewer Roulette into GitLab? Let us know by commenting ",[16,206,208],{"href":193,"rel":207},[],"in the epic","\nor by opening a new issue!",[12,211,212,217,218,125],{},[16,213,216],{"href":214,"rel":215},"https://unsplash.com/photos/w6OniVDCfn0",[],"Cover photo"," by Krissia Cruz on ",[16,219,222],{"href":220,"rel":221},"https://unsplash.com/search/photos/roulette",[],"Unsplash",{"title":224,"searchDepth":225,"depth":225,"links":226},"",2,[227,228,229,230],{"id":33,"depth":225,"text":34},{"id":52,"depth":225,"text":53},{"id":77,"depth":225,"text":78},{"id":131,"depth":225,"text":132},"engineering","2019-10-23","Learn how Reviewer Roulette has evolved at GitLab over the last year.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749672195/Blog/Hero%20Images/play-reviewer-roulette.jpg",{},true,"/en-us/blog/reviewer-roulette-one-year-on",{"title":5,"description":233,"ogTitle":5,"ogDescription":233,"noIndex":236,"ogImage":237,"ogUrl":242,"ogSiteName":243,"ogType":244,"canonicalUrls":242},"https://about.gitlab.com/blog/reviewer-roulette-one-year-on","https://about.gitlab.com","article","reviewer-roulette-one-year-on","en-us/blog/reviewer-roulette-one-year-on",[248,249,250],"code review","workflow","DevOps","BlogPost","2GogZt8Ri9DdPhQMs0sJDCQ-Anx6S5mf64R5SDgTGs8",{"logo":254,"freeTrial":259,"sales":264,"login":269,"items":274,"search":601,"minimal":632,"duo":651,"switchNav":660,"pricingDeployment":671},{"config":255},{"href":256,"dataGaName":257,"dataGaLocation":258},"/","gitlab logo","header",{"text":260,"config":261},"Get free trial",{"href":262,"dataGaName":263,"dataGaLocation":258},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":265,"config":266},"Request a demo",{"href":267,"dataGaName":268,"dataGaLocation":258},"/sales/?contact-topic=request-demo","sales",{"text":270,"config":271},"Sign in",{"href":272,"dataGaName":273,"dataGaLocation":258},"https://gitlab.com/users/sign_in/","sign in",[275,304,404,409,523,579],{"text":276,"config":277,"menu":279},"Platform",{"dataNavLevelOne":278},"platform",{"type":280,"columns":281},"cards",[282,288,296],{"title":276,"description":283,"link":284},"The intelligent orchestration platform for DevSecOps",{"text":285,"config":286},"Explore our Platform",{"href":287,"dataGaName":278,"dataGaLocation":258},"/platform/",{"title":289,"description":290,"link":291},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":292,"config":293},"Meet GitLab Duo",{"href":294,"dataGaName":295,"dataGaLocation":258},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":297,"description":298,"link":299},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":300,"config":301},"Learn more",{"href":302,"dataGaName":303,"dataGaLocation":258},"/why-gitlab/","why gitlab",{"text":305,"left":239,"config":306,"menu":308},"Product",{"dataNavLevelOne":307},"solutions",{"type":309,"link":310,"columns":314,"feature":383},"lists",{"text":311,"config":312},"View all Solutions",{"href":313,"dataGaName":307,"dataGaLocation":258},"/solutions/",[315,339,362],{"title":316,"description":317,"link":318,"items":323},"Automation","CI/CD and automation to accelerate deployment",{"config":319},{"icon":320,"href":321,"dataGaName":322,"dataGaLocation":258},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[324,328,331,335],{"text":325,"config":326},"CI/CD",{"href":327,"dataGaLocation":258,"dataGaName":325},"/solutions/continuous-integration/",{"text":289,"config":329},{"href":294,"dataGaLocation":258,"dataGaName":330},"gitlab duo agent platform - product menu",{"text":332,"config":333},"Source Code Management",{"href":334,"dataGaLocation":258,"dataGaName":332},"/solutions/source-code-management/",{"text":336,"config":337},"Automated Software Delivery",{"href":321,"dataGaLocation":258,"dataGaName":338},"Automated software delivery",{"title":340,"description":341,"link":342,"items":347},"Security","Deliver code faster without compromising security",{"config":343},{"href":344,"dataGaName":345,"dataGaLocation":258,"icon":346},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[348,352,357],{"text":349,"config":350},"Application Security Testing",{"href":344,"dataGaName":351,"dataGaLocation":258},"Application security testing",{"text":353,"config":354},"Software Supply Chain Security",{"href":355,"dataGaLocation":258,"dataGaName":356},"/solutions/supply-chain/","Software supply chain security",{"text":358,"config":359},"Software Compliance",{"href":360,"dataGaName":361,"dataGaLocation":258},"/solutions/software-compliance/","software compliance",{"title":363,"link":364,"items":369},"Measurement",{"config":365},{"icon":366,"href":367,"dataGaName":368,"dataGaLocation":258},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[370,374,378],{"text":371,"config":372},"Visibility & Measurement",{"href":367,"dataGaLocation":258,"dataGaName":373},"Visibility and Measurement",{"text":375,"config":376},"Value Stream Management",{"href":377,"dataGaLocation":258,"dataGaName":375},"/solutions/value-stream-management/",{"text":379,"config":380},"Analytics & Insights",{"href":381,"dataGaLocation":258,"dataGaName":382},"/solutions/analytics-and-insights/","Analytics and insights",{"title":384,"type":309,"items":385},"GitLab for",[386,392,398],{"text":387,"config":388},"Enterprise",{"icon":389,"href":390,"dataGaLocation":258,"dataGaName":391},"Building","/enterprise/","enterprise",{"text":393,"config":394},"Small Business",{"icon":395,"href":396,"dataGaLocation":258,"dataGaName":397},"Work","/small-business/","small business",{"text":399,"config":400},"Public Sector",{"icon":401,"href":402,"dataGaLocation":258,"dataGaName":403},"Organization","/solutions/public-sector/","public sector",{"text":405,"config":406},"Pricing",{"href":407,"dataGaName":408,"dataGaLocation":258,"dataNavLevelOne":408},"/pricing/","pricing",{"text":410,"config":411,"menu":413},"Resources",{"dataNavLevelOne":412},"resources",{"type":309,"link":414,"columns":418,"feature":512},{"text":415,"config":416},"View all resources",{"href":417,"dataGaName":412,"dataGaLocation":258},"/resources/",[419,452,479],{"title":420,"items":421},"Getting started",[422,427,432,437,442,447],{"text":423,"config":424},"Install",{"href":425,"dataGaName":426,"dataGaLocation":258},"/install/","install",{"text":428,"config":429},"Quick start guides",{"href":430,"dataGaName":431,"dataGaLocation":258},"/get-started/","quick setup checklists",{"text":433,"config":434},"Learn",{"href":435,"dataGaLocation":258,"dataGaName":436},"https://university.gitlab.com/","learn",{"text":438,"config":439},"Product documentation",{"href":440,"dataGaName":441,"dataGaLocation":258},"https://docs.gitlab.com/","product documentation",{"text":443,"config":444},"Best practice videos",{"href":445,"dataGaName":446,"dataGaLocation":258},"/getting-started-videos/","best practice videos",{"text":448,"config":449},"Integrations",{"href":450,"dataGaName":451,"dataGaLocation":258},"/integrations/","integrations",{"title":453,"items":454},"Discover",[455,460,465,470,474],{"text":456,"config":457},"Customer success stories",{"href":458,"dataGaName":459,"dataGaLocation":258},"/customers/","customer success stories",{"text":461,"config":462},"Blog",{"href":463,"dataGaName":464,"dataGaLocation":258},"/blog/","blog",{"text":466,"config":467},"Demo Hub",{"href":468,"dataGaName":469,"dataGaLocation":258},"/demo-hub/","demo hub",{"text":471,"config":472},"The Source",{"href":473,"dataGaName":464,"dataGaLocation":258},"/the-source/",{"text":475,"config":476},"Remote",{"href":477,"dataGaName":478,"dataGaLocation":258},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":480,"items":481},"Connect",[482,487,492,497,502,507],{"text":483,"config":484},"GitLab Services",{"href":485,"dataGaName":486,"dataGaLocation":258},"/services/","services",{"text":488,"config":489},"Contribute",{"href":490,"dataGaName":491,"dataGaLocation":258},"https://contributors.gitlab.com","contribute",{"text":493,"config":494},"Community",{"href":495,"dataGaName":496,"dataGaLocation":258},"/community/","community",{"text":498,"config":499},"Forum",{"href":500,"dataGaName":501,"dataGaLocation":258},"https://forum.gitlab.com/","forum",{"text":503,"config":504},"Events",{"href":505,"dataGaName":506,"dataGaLocation":258},"/events/","events",{"text":508,"config":509},"Partners",{"href":510,"dataGaName":511,"dataGaLocation":258},"/partners/","partners",{"config":513,"title":516,"text":517,"link":518},{"background":514,"textColor":515},"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":519,"config":520},"Read the latest",{"href":521,"dataGaName":522,"dataGaLocation":258},"/whats-new/","whats new",{"text":524,"config":525,"menu":527},"Company",{"dataNavLevelOne":526},"company",{"type":309,"columns":528},[529],{"items":530},[531,536,542,544,549,554,559,564,569,574],{"text":532,"config":533},"About",{"href":534,"dataGaName":535,"dataGaLocation":258},"/company/","about",{"text":537,"config":538,"footerGa":541},"Jobs",{"href":539,"dataGaName":540,"dataGaLocation":258},"/jobs/","jobs",{"dataGaName":540},{"text":503,"config":543},{"href":505,"dataGaName":506,"dataGaLocation":258},{"text":545,"config":546},"Leadership",{"href":547,"dataGaName":548,"dataGaLocation":258},"/company/team/e-group/","leadership",{"text":550,"config":551},"Handbook",{"href":552,"dataGaName":553,"dataGaLocation":258},"https://handbook.gitlab.com/","handbook",{"text":555,"config":556},"Investor relations",{"href":557,"dataGaName":558,"dataGaLocation":258},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":560,"config":561},"Trust Center",{"href":562,"dataGaName":563,"dataGaLocation":258},"/security/","trust center",{"text":565,"config":566},"AI Transparency Center",{"href":567,"dataGaName":568,"dataGaLocation":258},"/ai-transparency-center/","ai transparency center",{"text":570,"config":571},"Newsletter",{"href":572,"dataGaName":573,"dataGaLocation":258},"/company/contact/#contact-forms","newsletter",{"text":575,"config":576},"Press",{"href":577,"dataGaName":578,"dataGaLocation":258},"/press/","press",{"text":580,"config":581,"menu":582},"Contact us",{"dataNavLevelOne":526},{"type":309,"columns":583},[584],{"items":585},[586,591,596],{"text":587,"config":588},"Talk to sales",{"href":589,"dataGaName":590,"dataGaLocation":258},"/sales/","talk to sales",{"text":592,"config":593},"Support portal",{"href":594,"dataGaName":595,"dataGaLocation":258},"https://support.gitlab.com/hc/en-us","support portal",{"text":597,"config":598},"Customer portal",{"href":599,"dataGaName":600,"dataGaLocation":258},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":602,"login":603,"suggestions":610},"Close",{"text":604,"link":605},"To search repositories and projects, login to",{"text":606,"config":607},"gitlab.com",{"href":272,"dataGaName":608,"dataGaLocation":609},"search login","search",{"text":611,"default":612},"Suggestions",[613,615,619,621,625,629],{"text":289,"config":614},{"href":294,"dataGaName":289,"dataGaLocation":609},{"text":616,"config":617},"Code Suggestions (AI)",{"href":618,"dataGaName":616,"dataGaLocation":609},"/solutions/code-suggestions/",{"text":325,"config":620},{"href":327,"dataGaName":325,"dataGaLocation":609},{"text":622,"config":623},"GitLab on AWS",{"href":624,"dataGaName":622,"dataGaLocation":609},"/partners/technology-partners/aws/",{"text":626,"config":627},"GitLab on Google Cloud",{"href":628,"dataGaName":626,"dataGaLocation":609},"/partners/technology-partners/google-cloud-platform/",{"text":630,"config":631},"Why GitLab?",{"href":302,"dataGaName":630,"dataGaLocation":609},{"freeTrial":633,"mobileIcon":638,"desktopIcon":643,"secondaryButton":646},{"text":634,"config":635},"Start free trial",{"href":636,"dataGaName":263,"dataGaLocation":637},"https://gitlab.com/-/trials/new/","nav",{"altText":639,"config":640},"Gitlab Icon",{"src":641,"dataGaName":642,"dataGaLocation":637},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":639,"config":644},{"src":645,"dataGaName":642,"dataGaLocation":637},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":647,"config":648},"Get Started",{"href":649,"dataGaName":650,"dataGaLocation":637},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":652,"mobileIcon":656,"desktopIcon":658},{"text":653,"config":654},"Learn more about GitLab Duo",{"href":294,"dataGaName":655,"dataGaLocation":637},"gitlab duo",{"altText":639,"config":657},{"src":641,"dataGaName":642,"dataGaLocation":637},{"altText":639,"config":659},{"src":645,"dataGaName":642,"dataGaLocation":637},{"button":661,"mobileIcon":666,"desktopIcon":668},{"text":662,"config":663},"/switch",{"href":664,"dataGaName":665,"dataGaLocation":637},"#contact","switch",{"altText":639,"config":667},{"src":641,"dataGaName":642,"dataGaLocation":637},{"altText":639,"config":669},{"src":670,"dataGaName":642,"dataGaLocation":637},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":672,"mobileIcon":677,"desktopIcon":679},{"text":673,"config":674},"Back to pricing",{"href":407,"dataGaName":675,"dataGaLocation":637,"icon":676},"back to pricing","GoBack",{"altText":639,"config":678},{"src":641,"dataGaName":642,"dataGaLocation":637},{"altText":639,"config":680},{"src":645,"dataGaName":642,"dataGaLocation":637},{"title":682,"titleMobile":683,"button":684,"config":689},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":300,"config":685},{"href":686,"dataGaName":687,"dataGaLocation":688},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":690,"disabled":236},"release",{"data":692},{"text":693,"source":694,"edit":700,"contribute":705,"config":710,"items":715,"minimal":924},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":695,"config":696},"View page source",{"href":697,"dataGaName":698,"dataGaLocation":699},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":701,"config":702},"Edit this page",{"href":703,"dataGaName":704,"dataGaLocation":699},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":706,"config":707},"Please contribute",{"href":708,"dataGaName":709,"dataGaLocation":699},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":711,"facebook":712,"youtube":713,"linkedin":714},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[716,763,816,860,892],{"title":405,"links":717,"subMenu":732},[718,722,727],{"text":719,"config":720},"View plans",{"href":407,"dataGaName":721,"dataGaLocation":699},"view plans",{"text":723,"config":724},"Why Premium?",{"href":725,"dataGaName":726,"dataGaLocation":699},"/pricing/premium/","why premium",{"text":728,"config":729},"Why Ultimate?",{"href":730,"dataGaName":731,"dataGaLocation":699},"/pricing/ultimate/","why ultimate",[733],{"title":734,"links":735},"Contact Us",[736,739,741,743,748,753,758],{"text":737,"config":738},"Contact sales",{"href":589,"dataGaName":268,"dataGaLocation":699},{"text":592,"config":740},{"href":594,"dataGaName":595,"dataGaLocation":699},{"text":597,"config":742},{"href":599,"dataGaName":600,"dataGaLocation":699},{"text":744,"config":745},"Status",{"href":746,"dataGaName":747,"dataGaLocation":699},"https://status.gitlab.com/","status",{"text":749,"config":750},"Terms of use",{"href":751,"dataGaName":752,"dataGaLocation":699},"/terms/","terms of use",{"text":754,"config":755},"Privacy statement",{"href":756,"dataGaName":757,"dataGaLocation":699},"/privacy/","privacy statement",{"text":759,"config":760},"Cookie preferences",{"dataGaName":761,"dataGaLocation":699,"id":762,"isOneTrustButton":239},"cookie preferences","ot-sdk-btn",{"title":305,"links":764,"subMenu":773},[765,769],{"text":766,"config":767},"DevSecOps platform",{"href":287,"dataGaName":768,"dataGaLocation":699},"devsecops platform",{"text":770,"config":771},"AI-Assisted Development",{"href":294,"dataGaName":772,"dataGaLocation":699},"ai-assisted development",[774],{"title":775,"links":776},"Topics",[777,782,787,791,796,801,806,811],{"text":778,"config":779},"CICD",{"href":780,"dataGaName":781,"dataGaLocation":699},"/topics/ci-cd/","cicd",{"text":783,"config":784},"GitOps",{"href":785,"dataGaName":786,"dataGaLocation":699},"/topics/gitops/","gitops",{"text":250,"config":788},{"href":789,"dataGaName":790,"dataGaLocation":699},"/topics/devops/","devops",{"text":792,"config":793},"Version Control",{"href":794,"dataGaName":795,"dataGaLocation":699},"/topics/version-control/","version control",{"text":797,"config":798},"DevSecOps",{"href":799,"dataGaName":800,"dataGaLocation":699},"/topics/devsecops/","devsecops",{"text":802,"config":803},"Cloud Native",{"href":804,"dataGaName":805,"dataGaLocation":699},"/topics/cloud-native/","cloud native",{"text":807,"config":808},"AI for Coding",{"href":809,"dataGaName":810,"dataGaLocation":699},"/topics/devops/ai-for-coding/","ai for coding",{"text":812,"config":813},"Agentic AI",{"href":814,"dataGaName":815,"dataGaLocation":699},"/topics/agentic-ai/","agentic ai",{"title":817,"links":818},"Solutions",[819,821,823,828,832,835,839,842,844,847,850,855],{"text":349,"config":820},{"href":344,"dataGaName":349,"dataGaLocation":699},{"text":338,"config":822},{"href":321,"dataGaName":322,"dataGaLocation":699},{"text":824,"config":825},"Agile development",{"href":826,"dataGaName":827,"dataGaLocation":699},"/solutions/agile-delivery/","agile delivery",{"text":829,"config":830},"SCM",{"href":334,"dataGaName":831,"dataGaLocation":699},"source code management",{"text":778,"config":833},{"href":327,"dataGaName":834,"dataGaLocation":699},"continuous integration & delivery",{"text":836,"config":837},"Value stream management",{"href":377,"dataGaName":838,"dataGaLocation":699},"value stream management",{"text":783,"config":840},{"href":841,"dataGaName":786,"dataGaLocation":699},"/solutions/gitops/",{"text":387,"config":843},{"href":390,"dataGaName":391,"dataGaLocation":699},{"text":845,"config":846},"Small business",{"href":396,"dataGaName":397,"dataGaLocation":699},{"text":848,"config":849},"Public sector",{"href":402,"dataGaName":403,"dataGaLocation":699},{"text":851,"config":852},"Education",{"href":853,"dataGaName":854,"dataGaLocation":699},"/solutions/education/","education",{"text":856,"config":857},"Financial services",{"href":858,"dataGaName":859,"dataGaLocation":699},"/solutions/finance/","financial services",{"title":410,"links":861},[862,864,866,868,871,873,876,878,880,882,884,886,888,890],{"text":423,"config":863},{"href":425,"dataGaName":426,"dataGaLocation":699},{"text":428,"config":865},{"href":430,"dataGaName":431,"dataGaLocation":699},{"text":433,"config":867},{"href":435,"dataGaName":436,"dataGaLocation":699},{"text":438,"config":869},{"href":440,"dataGaName":870,"dataGaLocation":699},"docs",{"text":461,"config":872},{"href":463,"dataGaName":464,"dataGaLocation":699},{"text":874,"config":875},"What's new",{"href":521,"dataGaName":522,"dataGaLocation":699},{"text":456,"config":877},{"href":458,"dataGaName":459,"dataGaLocation":699},{"text":475,"config":879},{"href":477,"dataGaName":478,"dataGaLocation":699},{"text":483,"config":881},{"href":485,"dataGaName":486,"dataGaLocation":699},{"text":488,"config":883},{"href":490,"dataGaName":491,"dataGaLocation":699},{"text":493,"config":885},{"href":495,"dataGaName":496,"dataGaLocation":699},{"text":498,"config":887},{"href":500,"dataGaName":501,"dataGaLocation":699},{"text":503,"config":889},{"href":505,"dataGaName":506,"dataGaLocation":699},{"text":508,"config":891},{"href":510,"dataGaName":511,"dataGaLocation":699},{"title":524,"links":893},[894,896,898,900,902,904,908,913,915,917,919],{"text":532,"config":895},{"href":534,"dataGaName":526,"dataGaLocation":699},{"text":537,"config":897},{"href":539,"dataGaName":540,"dataGaLocation":699},{"text":545,"config":899},{"href":547,"dataGaName":548,"dataGaLocation":699},{"text":550,"config":901},{"href":552,"dataGaName":553,"dataGaLocation":699},{"text":555,"config":903},{"href":557,"dataGaName":558,"dataGaLocation":699},{"text":905,"config":906},"Sustainability",{"href":907,"dataGaName":905,"dataGaLocation":699},"/sustainability/",{"text":909,"config":910},"Diversity, inclusion and belonging (DIB)",{"href":911,"dataGaName":912,"dataGaLocation":699},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":560,"config":914},{"href":562,"dataGaName":563,"dataGaLocation":699},{"text":570,"config":916},{"href":572,"dataGaName":573,"dataGaLocation":699},{"text":575,"config":918},{"href":577,"dataGaName":578,"dataGaLocation":699},{"text":920,"config":921},"Modern Slavery Transparency Statement",{"href":922,"dataGaName":923,"dataGaLocation":699},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":925},[926,929,932],{"text":927,"config":928},"Terms",{"href":751,"dataGaName":752,"dataGaLocation":699},{"text":930,"config":931},"Cookies",{"dataGaName":761,"dataGaLocation":699,"id":762,"isOneTrustButton":239},{"text":933,"config":934},"Privacy",{"href":756,"dataGaName":757,"dataGaLocation":699},[936],{"id":937,"title":7,"body":235,"config":938,"content":940,"description":235,"extension":943,"meta":944,"navigation":239,"path":945,"seo":946,"stem":947,"__hash__":948},"blogAuthors/en-us/blog/authors/nick-thomas.yml",{"template":939},"BlogAuthor",{"name":7,"config":941},{"headshot":224,"ctfId":942},"nickthomas","yml",{},"/en-us/blog/authors/nick-thomas",{},"en-us/blog/authors/nick-thomas","mWA2flVfR29E2MGT9J5qLbM0RXKZCi1uSL_EbSijgTc",[950,959,967],{"title":951,"description":952,"heroImage":953,"category":231,"date":954,"authors":955,"slug":958,"externalUrl":235},"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",[956,957],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":960,"description":961,"heroImage":962,"category":231,"date":963,"authors":964,"slug":966,"externalUrl":235},"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",[965],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":968,"description":969,"heroImage":970,"category":231,"date":971,"authors":972,"slug":974,"externalUrl":235},"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",[973],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":976},[977,991,1003,1015],{"id":978,"categories":979,"header":981,"text":982,"button":983,"image":988},"ai-modernization",[980],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":984,"config":985},"Get your AI maturity score",{"href":986,"dataGaName":987,"dataGaLocation":464},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":989},{"src":990},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":992,"categories":993,"header":995,"text":982,"button":996,"image":1000},"devops-modernization",[994,800],"product","Are you just managing tools or shipping innovation?",{"text":997,"config":998},"Get your DevOps maturity score",{"href":999,"dataGaName":987,"dataGaLocation":464},"/assessments/devops-modernization-assessment/",{"config":1001},{"src":1002},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1004,"categories":1005,"header":1007,"text":982,"button":1008,"image":1012},"security-modernization",[1006],"security","Are you trading speed for security?",{"text":1009,"config":1010},"Get your security maturity score",{"href":1011,"dataGaName":987,"dataGaLocation":464},"/assessments/security-modernization-assessment/",{"config":1013},{"src":1014},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1016,"paths":1017,"header":1020,"text":1021,"button":1022,"image":1027},"github-azure-migration",[1018,1019],"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":1023,"config":1024},"See how GitLab compares to GitHub",{"href":1025,"dataGaName":1026,"dataGaLocation":464},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1028},{"src":1002},{"header":1030,"blurb":1031,"button":1032,"secondaryButton":1037},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1033,"config":1034},"Get your free trial",{"href":1035,"dataGaName":263,"dataGaLocation":1036},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":737,"config":1038},{"href":589,"dataGaName":268,"dataGaLocation":1036},1786803737281]