[{"data":1,"prerenderedAt":943},["ShallowReactive",2],{"/blog/how-gitlab-uses-unicorn-and-unicorn-worker-killer":3,"navigation-en-us":155,"banner-en-us":583,"footer-en-us":593,"blog-post-authors-en-us-Jacob Vosmaer":838,"blog-related-posts-en-us-how-gitlab-uses-unicorn-and-unicorn-worker-killer":853,"blog-promotions-en-us":879,"next-steps-en-us":933},{"id":4,"title":5,"authors":6,"body":8,"category":133,"date":134,"description":135,"extension":136,"externalUrl":137,"faq":137,"featured":138,"heroImage":139,"meta":140,"navigation":145,"path":146,"seo":147,"slug":151,"stem":152,"tags":137,"template":153,"updatedDate":137,"__hash__":154},"blogPosts/en-us/blog/how-gitlab-uses-unicorn-and-unicorn-worker-killer.md","How GitLab uses Unicorn and unicorn-worker-killer",[7],"Jacob Vosmaer",{"type":9,"value":10,"toc":124},"minimark",[11,15,18,23,28,37,40,43,51,61,65,74,77,80,95,103,106,112,115],[12,13,14],"p",{},"We just wrote some new documentation on how Gitlab uses Unicorn and\nunicorn-worker-killer, available on docs.gitlab.com but\nalso included below. We would love to hear from the community if you have other\nquestions so we can improve this documentation resource!",[12,16,17],{},"Update 19:29 CEST: made link to docs.gitlab.com more specific.",[19,20,22],"h2",{"id":21},"understanding-unicorn-and-unicorn-worker-killer","Understanding Unicorn and unicorn-worker-killer",[24,25,27],"h3",{"id":26},"unicorn","Unicorn",[12,29,30,31,36],{},"GitLab uses ",[32,33,27],"a",{"href":34,"rel":35},"http://unicorn.bogomips.org/",[],", a pre-forking Ruby web\nserver, to handle web requests (web browsers and Git HTTP clients). Unicorn is\na daemon written in Ruby and C that can load and run a Ruby on Rails\napplication; in our case the Rails application is GitLab Community Edition or\nGitLab Enterprise Edition.",[12,38,39],{},"Unicorn has a multi-process architecture to make better use of available CPU\ncores (processes can run on different cores) and to have stronger fault\ntolerance (most failures stay isolated in only one process and cannot take down\nGitLab entirely). On startup, the Unicorn 'master' process loads a clean Ruby\nenvironment with the GitLab application code, and then spawns 'workers' which\ninherit this clean initial environment. The 'master' never handles any\nrequests, that is left to the workers. The operating system network stack\nqueues incoming requests and distributes them among the workers.",[12,41,42],{},"In a perfect world, the master would spawn its pool of workers once, and then\nthe workers handle incoming web requests one after another until the end of\ntime. In reality, worker processes can crash or time out: if the master notices\nthat a worker takes too long to handle a request it will terminate the worker\nprocess with SIGKILL ('kill -9'). No matter how the worker process ended, the\nmaster process will replace it with a new 'clean' process again. Unicorn is\ndesigned to be able to replace 'crashed' workers without dropping user\nrequests.",[12,44,45,46,50],{},"This is what a Unicorn worker timeout looks like in ",[47,48,49],"code",{},"unicorn_stderr.log",". The\nmaster process has PID 56227 below.",[52,53,59],"pre",{"className":54,"code":56,"language":57,"meta":58},[55],"language-text","[2015-06-05T10:58:08.660325 #56227] ERROR -- : worker=10 PID:53009 timeout (61s > 60s), killing\n[2015-06-05T10:58:08.699360 #56227] ERROR -- : reaped #\u003CProcess::Status: pid 53009 SIGKILL (signal 9)> worker=10\n[2015-06-05T10:58:08.708141 #62538]  INFO -- : worker=10 spawned pid=62538\n[2015-06-05T10:58:08.708824 #62538]  INFO -- : worker=10 ready\n","text","",[47,60,56],{"__ignoreMap":58},[24,62,64],{"id":63},"tunables","Tunables",[12,66,67,68,73],{},"The main tunables for Unicorn are the number of worker processes and the\nrequest timeout after which the Unicorn master terminates a worker process.\nSee the ",[32,69,72],{"href":70,"rel":71},"https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/unicorn.md",[],"omnibus-gitlab Unicorn settings\ndocumentation","\nif you want to adjust these settings.",[19,75,76],{"id":76},"unicorn-worker-killer",[12,78,79],{},"GitLab has memory leaks. These memory leaks manifest themselves in long-running\nprocesses, such as Unicorn workers. (The Unicorn master process is not known to\nleak memory, probably because it does not handle user requests.)",[12,81,82,83,88,89,94],{},"To make these memory leaks manageable, GitLab comes with the\n",[32,84,87],{"href":85,"rel":86},"https://github.com/kzk/unicorn-worker-killer",[],"unicorn-worker-killer gem",". This\ngem ",[32,90,93],{"href":91,"rel":92},"http://en.wikipedia.org/wiki/Monkey_patch",[],"monkey-patches"," the Unicorn\nworkers to do a memory self-check after every 16 requests. If the memory of the\nUnicorn worker exceeds a pre-set limit then the worker process exits. The\nUnicorn master then automatically replaces the worker process.",[12,96,97,98,102],{},"This is a robust way to handle memory leaks: Unicorn is designed to handle\nworkers that 'crash' so no user requests will be dropped. The\nunicorn-worker-killer gem is designed to only terminate a worker process ",[99,100,101],"em",{},"in\nbetween requests",", so no user requests are affected.",[12,104,105],{},"This is what a Unicorn worker memory restart looks like in unicorn_stderr.log.\nYou see that worker 4 (PID 125918) is inspecting itself and decides to exit.\nThe threshold memory value was 254802235 bytes, about 250MB. With GitLab this\nthreshold is a random value between 200 and 250 MB.  The master process (PID\n117565) then reaps the worker process and spawns a new 'worker 4' with PID\n127549.",[52,107,110],{"className":108,"code":109,"language":57,"meta":58},[55],"[2015-06-05T12:07:41.828374 #125918]  WARN -- : #\u003CUnicorn::HttpServer:0x00000002734770>: worker (pid: 125918) exceeds memory limit (256413696 bytes > 254802235 bytes)\n[2015-06-05T12:07:41.828472 #125918]  WARN -- : Unicorn::WorkerKiller send SIGQUIT (pid: 125918) alive: 23 sec (trial 1)\n[2015-06-05T12:07:42.025916 #117565]  INFO -- : reaped #\u003CProcess::Status: pid 125918 exit 0> worker=4\n[2015-06-05T12:07:42.034527 #127549]  INFO -- : worker=4 spawned pid=127549\n[2015-06-05T12:07:42.035217 #127549]  INFO -- : worker=4 ready\n",[47,111,109],{"__ignoreMap":58},[12,113,114],{},"One other thing that stands out in the log snippet above, taken from\nGitlab.com, is that 'worker 4' was serving requests for only 23 seconds. This\nis a normal value for our current GitLab.com setup and traffic.",[12,116,117,118,123],{},"The high frequency of Unicorn memory restarts on some GitLab sites can be a\nsource of confusion for administrators. Usually they are a ",[32,119,122],{"href":120,"rel":121},"http://en.wikipedia.org/wiki/Red_herring",[],"red\nherring",".",{"title":58,"searchDepth":125,"depth":125,"links":126},2,[127,132],{"id":21,"depth":125,"text":22,"children":128},[129,131],{"id":26,"depth":130,"text":27},3,{"id":63,"depth":130,"text":64},{"id":76,"depth":125,"text":76},"engineering","2015-06-05","We just wrote some new documentation on how Gitlab uses Unicorn and unicorn-worker-killer, available on https://docs.gitlab.com/. Read here!","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663397/Blog/Hero%20Images/logoforblogpost.jpg",{"excerpt":141},{"type":9,"value":142},[143],[12,144,14],{},true,"/en-us/blog/how-gitlab-uses-unicorn-and-unicorn-worker-killer",{"title":5,"description":135,"ogTitle":5,"ogDescription":135,"noIndex":138,"ogImage":139,"ogUrl":148,"ogSiteName":149,"ogType":150,"canonicalUrls":148},"https://about.gitlab.com/blog/how-gitlab-uses-unicorn-and-unicorn-worker-killer","https://about.gitlab.com","article","how-gitlab-uses-unicorn-and-unicorn-worker-killer","en-us/blog/how-gitlab-uses-unicorn-and-unicorn-worker-killer","BlogPost","7g6HoRiS6d8tjM74PYxcR9nN6Px5f1JXtOaSMjhsS_M",{"logo":156,"freeTrial":161,"sales":166,"login":171,"items":176,"search":503,"minimal":534,"duo":553,"switchNav":562,"pricingDeployment":573},{"config":157},{"href":158,"dataGaName":159,"dataGaLocation":160},"/","gitlab logo","header",{"text":162,"config":163},"Get free trial",{"href":164,"dataGaName":165,"dataGaLocation":160},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":167,"config":168},"Request a demo",{"href":169,"dataGaName":170,"dataGaLocation":160},"/sales/?contact-topic=request-demo","sales",{"text":172,"config":173},"Sign in",{"href":174,"dataGaName":175,"dataGaLocation":160},"https://gitlab.com/users/sign_in/","sign in",[177,206,306,311,425,481],{"text":178,"config":179,"menu":181},"Platform",{"dataNavLevelOne":180},"platform",{"type":182,"columns":183},"cards",[184,190,198],{"title":178,"description":185,"link":186},"The intelligent orchestration platform for DevSecOps",{"text":187,"config":188},"Explore our Platform",{"href":189,"dataGaName":180,"dataGaLocation":160},"/platform/",{"title":191,"description":192,"link":193},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":194,"config":195},"Meet GitLab Duo",{"href":196,"dataGaName":197,"dataGaLocation":160},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":199,"description":200,"link":201},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":202,"config":203},"Learn more",{"href":204,"dataGaName":205,"dataGaLocation":160},"/why-gitlab/","why gitlab",{"text":207,"left":145,"config":208,"menu":210},"Product",{"dataNavLevelOne":209},"solutions",{"type":211,"link":212,"columns":216,"feature":285},"lists",{"text":213,"config":214},"View all Solutions",{"href":215,"dataGaName":209,"dataGaLocation":160},"/solutions/",[217,241,264],{"title":218,"description":219,"link":220,"items":225},"Automation","CI/CD and automation to accelerate deployment",{"config":221},{"icon":222,"href":223,"dataGaName":224,"dataGaLocation":160},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[226,230,233,237],{"text":227,"config":228},"CI/CD",{"href":229,"dataGaLocation":160,"dataGaName":227},"/solutions/continuous-integration/",{"text":191,"config":231},{"href":196,"dataGaLocation":160,"dataGaName":232},"gitlab duo agent platform - product menu",{"text":234,"config":235},"Source Code Management",{"href":236,"dataGaLocation":160,"dataGaName":234},"/solutions/source-code-management/",{"text":238,"config":239},"Automated Software Delivery",{"href":223,"dataGaLocation":160,"dataGaName":240},"Automated software delivery",{"title":242,"description":243,"link":244,"items":249},"Security","Deliver code faster without compromising security",{"config":245},{"href":246,"dataGaName":247,"dataGaLocation":160,"icon":248},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[250,254,259],{"text":251,"config":252},"Application Security Testing",{"href":246,"dataGaName":253,"dataGaLocation":160},"Application security testing",{"text":255,"config":256},"Software Supply Chain Security",{"href":257,"dataGaLocation":160,"dataGaName":258},"/solutions/supply-chain/","Software supply chain security",{"text":260,"config":261},"Software Compliance",{"href":262,"dataGaName":263,"dataGaLocation":160},"/solutions/software-compliance/","software compliance",{"title":265,"link":266,"items":271},"Measurement",{"config":267},{"icon":268,"href":269,"dataGaName":270,"dataGaLocation":160},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[272,276,280],{"text":273,"config":274},"Visibility & Measurement",{"href":269,"dataGaLocation":160,"dataGaName":275},"Visibility and Measurement",{"text":277,"config":278},"Value Stream Management",{"href":279,"dataGaLocation":160,"dataGaName":277},"/solutions/value-stream-management/",{"text":281,"config":282},"Analytics & Insights",{"href":283,"dataGaLocation":160,"dataGaName":284},"/solutions/analytics-and-insights/","Analytics and insights",{"title":286,"type":211,"items":287},"GitLab for",[288,294,300],{"text":289,"config":290},"Enterprise",{"icon":291,"href":292,"dataGaLocation":160,"dataGaName":293},"Building","/enterprise/","enterprise",{"text":295,"config":296},"Small Business",{"icon":297,"href":298,"dataGaLocation":160,"dataGaName":299},"Work","/small-business/","small business",{"text":301,"config":302},"Public Sector",{"icon":303,"href":304,"dataGaLocation":160,"dataGaName":305},"Organization","/solutions/public-sector/","public sector",{"text":307,"config":308},"Pricing",{"href":309,"dataGaName":310,"dataGaLocation":160,"dataNavLevelOne":310},"/pricing/","pricing",{"text":312,"config":313,"menu":315},"Resources",{"dataNavLevelOne":314},"resources",{"type":211,"link":316,"columns":320,"feature":414},{"text":317,"config":318},"View all resources",{"href":319,"dataGaName":314,"dataGaLocation":160},"/resources/",[321,354,381],{"title":322,"items":323},"Getting started",[324,329,334,339,344,349],{"text":325,"config":326},"Install",{"href":327,"dataGaName":328,"dataGaLocation":160},"/install/","install",{"text":330,"config":331},"Quick start guides",{"href":332,"dataGaName":333,"dataGaLocation":160},"/get-started/","quick setup checklists",{"text":335,"config":336},"Learn",{"href":337,"dataGaLocation":160,"dataGaName":338},"https://university.gitlab.com/","learn",{"text":340,"config":341},"Product documentation",{"href":342,"dataGaName":343,"dataGaLocation":160},"https://docs.gitlab.com/","product documentation",{"text":345,"config":346},"Best practice videos",{"href":347,"dataGaName":348,"dataGaLocation":160},"/getting-started-videos/","best practice videos",{"text":350,"config":351},"Integrations",{"href":352,"dataGaName":353,"dataGaLocation":160},"/integrations/","integrations",{"title":355,"items":356},"Discover",[357,362,367,372,376],{"text":358,"config":359},"Customer success stories",{"href":360,"dataGaName":361,"dataGaLocation":160},"/customers/","customer success stories",{"text":363,"config":364},"Blog",{"href":365,"dataGaName":366,"dataGaLocation":160},"/blog/","blog",{"text":368,"config":369},"Demo Hub",{"href":370,"dataGaName":371,"dataGaLocation":160},"/demo-hub/","demo hub",{"text":373,"config":374},"The Source",{"href":375,"dataGaName":366,"dataGaLocation":160},"/the-source/",{"text":377,"config":378},"Remote",{"href":379,"dataGaName":380,"dataGaLocation":160},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":382,"items":383},"Connect",[384,389,394,399,404,409],{"text":385,"config":386},"GitLab Services",{"href":387,"dataGaName":388,"dataGaLocation":160},"/services/","services",{"text":390,"config":391},"Contribute",{"href":392,"dataGaName":393,"dataGaLocation":160},"https://contributors.gitlab.com","contribute",{"text":395,"config":396},"Community",{"href":397,"dataGaName":398,"dataGaLocation":160},"/community/","community",{"text":400,"config":401},"Forum",{"href":402,"dataGaName":403,"dataGaLocation":160},"https://forum.gitlab.com/","forum",{"text":405,"config":406},"Events",{"href":407,"dataGaName":408,"dataGaLocation":160},"/events/","events",{"text":410,"config":411},"Partners",{"href":412,"dataGaName":413,"dataGaLocation":160},"/partners/","partners",{"config":415,"title":418,"text":419,"link":420},{"background":416,"textColor":417},"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":421,"config":422},"Read the latest",{"href":423,"dataGaName":424,"dataGaLocation":160},"/whats-new/","whats new",{"text":426,"config":427,"menu":429},"Company",{"dataNavLevelOne":428},"company",{"type":211,"columns":430},[431],{"items":432},[433,438,444,446,451,456,461,466,471,476],{"text":434,"config":435},"About",{"href":436,"dataGaName":437,"dataGaLocation":160},"/company/","about",{"text":439,"config":440,"footerGa":443},"Jobs",{"href":441,"dataGaName":442,"dataGaLocation":160},"/jobs/","jobs",{"dataGaName":442},{"text":405,"config":445},{"href":407,"dataGaName":408,"dataGaLocation":160},{"text":447,"config":448},"Leadership",{"href":449,"dataGaName":450,"dataGaLocation":160},"/company/team/e-group/","leadership",{"text":452,"config":453},"Handbook",{"href":454,"dataGaName":455,"dataGaLocation":160},"https://handbook.gitlab.com/","handbook",{"text":457,"config":458},"Investor relations",{"href":459,"dataGaName":460,"dataGaLocation":160},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":462,"config":463},"Trust Center",{"href":464,"dataGaName":465,"dataGaLocation":160},"/security/","trust center",{"text":467,"config":468},"AI Transparency Center",{"href":469,"dataGaName":470,"dataGaLocation":160},"/ai-transparency-center/","ai transparency center",{"text":472,"config":473},"Newsletter",{"href":474,"dataGaName":475,"dataGaLocation":160},"/company/contact/#contact-forms","newsletter",{"text":477,"config":478},"Press",{"href":479,"dataGaName":480,"dataGaLocation":160},"/press/","press",{"text":482,"config":483,"menu":484},"Contact us",{"dataNavLevelOne":428},{"type":211,"columns":485},[486],{"items":487},[488,493,498],{"text":489,"config":490},"Talk to sales",{"href":491,"dataGaName":492,"dataGaLocation":160},"/sales/","talk to sales",{"text":494,"config":495},"Support portal",{"href":496,"dataGaName":497,"dataGaLocation":160},"https://support.gitlab.com/hc/en-us","support portal",{"text":499,"config":500},"Customer portal",{"href":501,"dataGaName":502,"dataGaLocation":160},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":504,"login":505,"suggestions":512},"Close",{"text":506,"link":507},"To search repositories and projects, login to",{"text":508,"config":509},"gitlab.com",{"href":174,"dataGaName":510,"dataGaLocation":511},"search login","search",{"text":513,"default":514},"Suggestions",[515,517,521,523,527,531],{"text":191,"config":516},{"href":196,"dataGaName":191,"dataGaLocation":511},{"text":518,"config":519},"Code Suggestions (AI)",{"href":520,"dataGaName":518,"dataGaLocation":511},"/solutions/code-suggestions/",{"text":227,"config":522},{"href":229,"dataGaName":227,"dataGaLocation":511},{"text":524,"config":525},"GitLab on AWS",{"href":526,"dataGaName":524,"dataGaLocation":511},"/partners/technology-partners/aws/",{"text":528,"config":529},"GitLab on Google Cloud",{"href":530,"dataGaName":528,"dataGaLocation":511},"/partners/technology-partners/google-cloud-platform/",{"text":532,"config":533},"Why GitLab?",{"href":204,"dataGaName":532,"dataGaLocation":511},{"freeTrial":535,"mobileIcon":540,"desktopIcon":545,"secondaryButton":548},{"text":536,"config":537},"Start free trial",{"href":538,"dataGaName":165,"dataGaLocation":539},"https://gitlab.com/-/trials/new/","nav",{"altText":541,"config":542},"Gitlab Icon",{"src":543,"dataGaName":544,"dataGaLocation":539},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":541,"config":546},{"src":547,"dataGaName":544,"dataGaLocation":539},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":549,"config":550},"Get Started",{"href":551,"dataGaName":552,"dataGaLocation":539},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":554,"mobileIcon":558,"desktopIcon":560},{"text":555,"config":556},"Learn more about GitLab Duo",{"href":196,"dataGaName":557,"dataGaLocation":539},"gitlab duo",{"altText":541,"config":559},{"src":543,"dataGaName":544,"dataGaLocation":539},{"altText":541,"config":561},{"src":547,"dataGaName":544,"dataGaLocation":539},{"button":563,"mobileIcon":568,"desktopIcon":570},{"text":564,"config":565},"/switch",{"href":566,"dataGaName":567,"dataGaLocation":539},"#contact","switch",{"altText":541,"config":569},{"src":543,"dataGaName":544,"dataGaLocation":539},{"altText":541,"config":571},{"src":572,"dataGaName":544,"dataGaLocation":539},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":574,"mobileIcon":579,"desktopIcon":581},{"text":575,"config":576},"Back to pricing",{"href":309,"dataGaName":577,"dataGaLocation":539,"icon":578},"back to pricing","GoBack",{"altText":541,"config":580},{"src":543,"dataGaName":544,"dataGaLocation":539},{"altText":541,"config":582},{"src":547,"dataGaName":544,"dataGaLocation":539},{"title":584,"titleMobile":585,"button":586,"config":591},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":202,"config":587},{"href":588,"dataGaName":589,"dataGaLocation":590},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":592,"disabled":138},"release",{"data":594},{"text":595,"source":596,"edit":602,"contribute":607,"config":612,"items":617,"minimal":827},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":597,"config":598},"View page source",{"href":599,"dataGaName":600,"dataGaLocation":601},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":603,"config":604},"Edit this page",{"href":605,"dataGaName":606,"dataGaLocation":601},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":608,"config":609},"Please contribute",{"href":610,"dataGaName":611,"dataGaLocation":601},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":613,"facebook":614,"youtube":615,"linkedin":616},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[618,665,719,763,795],{"title":307,"links":619,"subMenu":634},[620,624,629],{"text":621,"config":622},"View plans",{"href":309,"dataGaName":623,"dataGaLocation":601},"view plans",{"text":625,"config":626},"Why Premium?",{"href":627,"dataGaName":628,"dataGaLocation":601},"/pricing/premium/","why premium",{"text":630,"config":631},"Why Ultimate?",{"href":632,"dataGaName":633,"dataGaLocation":601},"/pricing/ultimate/","why ultimate",[635],{"title":636,"links":637},"Contact Us",[638,641,643,645,650,655,660],{"text":639,"config":640},"Contact sales",{"href":491,"dataGaName":170,"dataGaLocation":601},{"text":494,"config":642},{"href":496,"dataGaName":497,"dataGaLocation":601},{"text":499,"config":644},{"href":501,"dataGaName":502,"dataGaLocation":601},{"text":646,"config":647},"Status",{"href":648,"dataGaName":649,"dataGaLocation":601},"https://status.gitlab.com/","status",{"text":651,"config":652},"Terms of use",{"href":653,"dataGaName":654,"dataGaLocation":601},"/terms/","terms of use",{"text":656,"config":657},"Privacy statement",{"href":658,"dataGaName":659,"dataGaLocation":601},"/privacy/","privacy statement",{"text":661,"config":662},"Cookie preferences",{"dataGaName":663,"dataGaLocation":601,"id":664,"isOneTrustButton":145},"cookie preferences","ot-sdk-btn",{"title":207,"links":666,"subMenu":675},[667,671],{"text":668,"config":669},"DevSecOps platform",{"href":189,"dataGaName":670,"dataGaLocation":601},"devsecops platform",{"text":672,"config":673},"AI-Assisted Development",{"href":196,"dataGaName":674,"dataGaLocation":601},"ai-assisted development",[676],{"title":677,"links":678},"Topics",[679,684,689,694,699,704,709,714],{"text":680,"config":681},"CICD",{"href":682,"dataGaName":683,"dataGaLocation":601},"/topics/ci-cd/","cicd",{"text":685,"config":686},"GitOps",{"href":687,"dataGaName":688,"dataGaLocation":601},"/topics/gitops/","gitops",{"text":690,"config":691},"DevOps",{"href":692,"dataGaName":693,"dataGaLocation":601},"/topics/devops/","devops",{"text":695,"config":696},"Version Control",{"href":697,"dataGaName":698,"dataGaLocation":601},"/topics/version-control/","version control",{"text":700,"config":701},"DevSecOps",{"href":702,"dataGaName":703,"dataGaLocation":601},"/topics/devsecops/","devsecops",{"text":705,"config":706},"Cloud Native",{"href":707,"dataGaName":708,"dataGaLocation":601},"/topics/cloud-native/","cloud native",{"text":710,"config":711},"AI for Coding",{"href":712,"dataGaName":713,"dataGaLocation":601},"/topics/devops/ai-for-coding/","ai for coding",{"text":715,"config":716},"Agentic AI",{"href":717,"dataGaName":718,"dataGaLocation":601},"/topics/agentic-ai/","agentic ai",{"title":720,"links":721},"Solutions",[722,724,726,731,735,738,742,745,747,750,753,758],{"text":251,"config":723},{"href":246,"dataGaName":251,"dataGaLocation":601},{"text":240,"config":725},{"href":223,"dataGaName":224,"dataGaLocation":601},{"text":727,"config":728},"Agile development",{"href":729,"dataGaName":730,"dataGaLocation":601},"/solutions/agile-delivery/","agile delivery",{"text":732,"config":733},"SCM",{"href":236,"dataGaName":734,"dataGaLocation":601},"source code management",{"text":680,"config":736},{"href":229,"dataGaName":737,"dataGaLocation":601},"continuous integration & delivery",{"text":739,"config":740},"Value stream management",{"href":279,"dataGaName":741,"dataGaLocation":601},"value stream management",{"text":685,"config":743},{"href":744,"dataGaName":688,"dataGaLocation":601},"/solutions/gitops/",{"text":289,"config":746},{"href":292,"dataGaName":293,"dataGaLocation":601},{"text":748,"config":749},"Small business",{"href":298,"dataGaName":299,"dataGaLocation":601},{"text":751,"config":752},"Public sector",{"href":304,"dataGaName":305,"dataGaLocation":601},{"text":754,"config":755},"Education",{"href":756,"dataGaName":757,"dataGaLocation":601},"/solutions/education/","education",{"text":759,"config":760},"Financial services",{"href":761,"dataGaName":762,"dataGaLocation":601},"/solutions/finance/","financial services",{"title":312,"links":764},[765,767,769,771,774,776,779,781,783,785,787,789,791,793],{"text":325,"config":766},{"href":327,"dataGaName":328,"dataGaLocation":601},{"text":330,"config":768},{"href":332,"dataGaName":333,"dataGaLocation":601},{"text":335,"config":770},{"href":337,"dataGaName":338,"dataGaLocation":601},{"text":340,"config":772},{"href":342,"dataGaName":773,"dataGaLocation":601},"docs",{"text":363,"config":775},{"href":365,"dataGaName":366,"dataGaLocation":601},{"text":777,"config":778},"What's new",{"href":423,"dataGaName":424,"dataGaLocation":601},{"text":358,"config":780},{"href":360,"dataGaName":361,"dataGaLocation":601},{"text":377,"config":782},{"href":379,"dataGaName":380,"dataGaLocation":601},{"text":385,"config":784},{"href":387,"dataGaName":388,"dataGaLocation":601},{"text":390,"config":786},{"href":392,"dataGaName":393,"dataGaLocation":601},{"text":395,"config":788},{"href":397,"dataGaName":398,"dataGaLocation":601},{"text":400,"config":790},{"href":402,"dataGaName":403,"dataGaLocation":601},{"text":405,"config":792},{"href":407,"dataGaName":408,"dataGaLocation":601},{"text":410,"config":794},{"href":412,"dataGaName":413,"dataGaLocation":601},{"title":426,"links":796},[797,799,801,803,805,807,811,816,818,820,822],{"text":434,"config":798},{"href":436,"dataGaName":428,"dataGaLocation":601},{"text":439,"config":800},{"href":441,"dataGaName":442,"dataGaLocation":601},{"text":447,"config":802},{"href":449,"dataGaName":450,"dataGaLocation":601},{"text":452,"config":804},{"href":454,"dataGaName":455,"dataGaLocation":601},{"text":457,"config":806},{"href":459,"dataGaName":460,"dataGaLocation":601},{"text":808,"config":809},"Sustainability",{"href":810,"dataGaName":808,"dataGaLocation":601},"/sustainability/",{"text":812,"config":813},"Diversity, inclusion and belonging (DIB)",{"href":814,"dataGaName":815,"dataGaLocation":601},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":462,"config":817},{"href":464,"dataGaName":465,"dataGaLocation":601},{"text":472,"config":819},{"href":474,"dataGaName":475,"dataGaLocation":601},{"text":477,"config":821},{"href":479,"dataGaName":480,"dataGaLocation":601},{"text":823,"config":824},"Modern Slavery Transparency Statement",{"href":825,"dataGaName":826,"dataGaLocation":601},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":828},[829,832,835],{"text":830,"config":831},"Terms",{"href":653,"dataGaName":654,"dataGaLocation":601},{"text":833,"config":834},"Cookies",{"dataGaName":663,"dataGaLocation":601,"id":664,"isOneTrustButton":145},{"text":836,"config":837},"Privacy",{"href":658,"dataGaName":659,"dataGaLocation":601},[839],{"id":840,"title":7,"body":137,"config":841,"content":843,"description":137,"extension":847,"meta":848,"navigation":145,"path":849,"seo":850,"stem":851,"__hash__":852},"blogAuthors/en-us/blog/authors/jacob-vosmaer.yml",{"template":842},"BlogAuthor",{"name":7,"config":844},{"headshot":845,"ctfId":846},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Jacob-Vosmaer","yml",{},"/en-us/blog/authors/jacob-vosmaer",{},"en-us/blog/authors/jacob-vosmaer","8CR6ShwBsKxqGM4AAocQnzaLp61rqybzr4XSir9Y3Ag",[854,863,871],{"title":855,"description":856,"heroImage":857,"category":133,"date":858,"authors":859,"slug":862,"externalUrl":137},"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",[860,861],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":864,"description":865,"heroImage":866,"category":133,"date":867,"authors":868,"slug":870,"externalUrl":137},"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",[869],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":872,"description":873,"heroImage":874,"category":133,"date":875,"authors":876,"slug":878,"externalUrl":137},"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",[877],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":880},[881,895,907,919],{"id":882,"categories":883,"header":885,"text":886,"button":887,"image":892},"ai-modernization",[884],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":888,"config":889},"Get your AI maturity score",{"href":890,"dataGaName":891,"dataGaLocation":366},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":893},{"src":894},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":896,"categories":897,"header":899,"text":886,"button":900,"image":904},"devops-modernization",[898,703],"product","Are you just managing tools or shipping innovation?",{"text":901,"config":902},"Get your DevOps maturity score",{"href":903,"dataGaName":891,"dataGaLocation":366},"/assessments/devops-modernization-assessment/",{"config":905},{"src":906},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":908,"categories":909,"header":911,"text":886,"button":912,"image":916},"security-modernization",[910],"security","Are you trading speed for security?",{"text":913,"config":914},"Get your security maturity score",{"href":915,"dataGaName":891,"dataGaLocation":366},"/assessments/security-modernization-assessment/",{"config":917},{"src":918},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":920,"paths":921,"header":924,"text":925,"button":926,"image":931},"github-azure-migration",[922,923],"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":927,"config":928},"See how GitLab compares to GitHub",{"href":929,"dataGaName":930,"dataGaLocation":366},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":932},{"src":906},{"header":934,"blurb":935,"button":936,"secondaryButton":941},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":937,"config":938},"Get your free trial",{"href":939,"dataGaName":165,"dataGaLocation":940},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":639,"config":942},{"href":491,"dataGaName":170,"dataGaLocation":940},1786803751494]