[{"data":1,"prerenderedAt":1120},["ShallowReactive",2],{"/blog/top-engineering-stories-gitlab":3,"navigation-en-us":334,"banner-en-us":761,"footer-en-us":771,"blog-post-authors-en-us-Sara Kassabian":1016,"blog-related-posts-en-us-top-engineering-stories-gitlab":1030,"blog-promotions-en-us":1056,"next-steps-en-us":1110},{"id":4,"title":5,"authors":6,"body":8,"category":313,"date":314,"description":315,"extension":316,"externalUrl":317,"faq":317,"featured":318,"heroImage":319,"meta":320,"navigation":321,"path":322,"seo":323,"slug":327,"stem":328,"tags":329,"template":332,"updatedDate":317,"__hash__":333},"blogPosts/en-us/blog/top-engineering-stories-gitlab.md","These are your favorite GitLab engineering stories",[7],"Sara Kassabian",{"type":9,"value":10,"toc":293},"minimark",[11,22,27,32,40,53,61,65,73,77,84,88,96,109,112,120,127,131,134,141,148,156,160,167,174,178,182,190,197,201,214,218,225,231,235,242,248,252,260,268,279],[12,13,14,15,21],"p",{},"Some of our most popular and enduring engineering stories show how we use GitLab technology to take small steps to achieve major upgrades, fixes, and integrations to improve upon GitLab features. These stories demonstrate one of our core values at GitLab, ",[16,17,20],"a",{"href":18,"rel":19},"https://handbook.gitlab.com/handbook/values/#iteration",[],"iteration"," – meaning we ship the smallest changes first. When it comes to building new features or introducing fixes at GitLab, our engineering team operates under the principle that incremental change drives the greatest value.",[23,24,26],"h2",{"id":25},"how-we-executed-on-milestone-migrations","How we executed on milestone migrations",[28,29,31],"h3",{"id":30},"azure-to-gcp","Azure to GCP",[12,33,34,35,39],{},"Azure simply was not cutting it for hosting GitLab.com, and we decided it was time to migrate GitLab over to Google Cloud Platform (GCP). This was no small decision or endeavor, and we documented our end-to-end process publicly in the hopes that other companies might learn from our experience. ",[16,36,38],{"href":37},"/blog/gitlab-journey-from-azure-to-gcp/","Read the blog post describing the migration to GCP",", or watch the video below to learn more about this major migration.",[41,42,45,46],"figure",{"className":43},[44],"video_container","\n  ",[47,48,52],"iframe",{"src":49,"frameBorder":50,"allowFullScreen":51},"https://www.youtube-nocookie.com/embed/Ve_9mbJHPXQ","0","true"," ",[12,54,55,56,60],{},"Next, we explain how we analyzed data to see ",[16,57,59],{"href":58},"/blog/gitlab-com-stability-post-gcp-migration/","how GitLab.com was performing on GCP after this major migration",". Turns out, GitLab.com availability improved by 61% post-migration.",[28,62,64],{"id":63},"upgrading-postgresql","Upgrading PostgreSQL",[12,66,67,68,72],{},"In another blog post, one of GitLab.com’s main PostgreSQL clusters needed a major version upgrade. We knew it wouldn’t be easy, but in May 2020, we pulled off a ",[16,69,71],{"href":70},"/blog/gitlab-pg-upgrade/","near-perfect execution of this substantial upgrade",". We explain how the process unfolded, from planning to testing to full automation.",[28,74,76],{"id":75},"moving-to-kubernetes","Moving to Kubernetes",[12,78,79,83],{},[16,80,82],{"href":81},"/blog/year-of-kubernetes/","Migrating GitLab.com over to Kubernetes"," was a painstaking and complex process. In one of our most popular blog posts last year, we share the trials and triumphs from the year after the migration.",[23,85,87],{"id":86},"code-detectives-show-their-debugging-work","Code detectives show their debugging work",[12,89,90,91,95],{},"GitLab engineering fellow Stan Hu explains ",[16,92,94],{"href":93},"/blog/tracking-down-missing-tcp-keepalives/","how debugging a bug in the Docker client library"," that was used in the GitLab runner taught him more about Docker, Golang, and even GitLab.",[12,97,98,99,103,104,108],{},"Back in 2018, a customer flagged a bug in the NFS that the Support team escalated to Stan and his fellow engineers. It took ",[100,101,102],"em",{},"two weeks"," to hunt down the NFS bug that was disrupting the Linux kernel, and ",[16,105,107],{"href":106},"/blog/how-we-spent-two-weeks-hunting-an-nfs-bug/","Stan chronicles the intricacies of his investigation in this blog post",".",[12,110,111],{},"After GitLab.com users reported getting the same, mysterious error message, our Scalability team rolled up their sleeves to figure out the origins of the message – and uncovered a complex problem.",[12,113,114,119],{},[115,116],"img",{"alt":117,"src":118},"Graph showing connection errors is part of the GitLab Scalability team's troubleshooting efforts","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398113/blog/Content%20Images/connectionerrorsgraph.png","\nGraph showing connection errors, grouped by second-of-the-minute, indicates a lot of clustering going on in the time dimension.",[12,121,122,123,108],{},"There were ",[16,124,126],{"href":125},"/blog/tyranny-of-the-clock/","six key lessons we learned while debugging this scaling problem on GitLab.com",[23,128,130],{"id":129},"using-data-for-anomaly-detection","Using data for anomaly detection",[12,132,133],{},"Two years ago we switched over from our legacy NFS file-sharing service to Gitaly, and soon we noticed that our Gitaly service was lagging.",[12,135,136,140],{},[115,137],{"alt":138,"src":139},"Graph showing lagging problems with Gitaly service","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398459/blog/Content%20Images/graph-01.png","\nWe noticed that the 99th percentile performance of the gRPC endpoint for Gitaly service had dropped from 400ms down to 100ms for an unknown reason.",[12,142,143,144,108],{},"Through solid application monitoring, we were able to identify the problem and quickly fix it. ",[16,145,147],{"href":146},"/blog/how-a-fix-in-go-19-sped-up-our-gitaly-service-by-30x/","Unpack the process behind the Gitaly fix in this popular blog post",[12,149,150,151,155],{},"Prometheus reports on time-series data, which can be used for anomaly detection and alerting. ",[16,152,154],{"href":153},"/blog/anomaly-detection-using-prometheus/","Learn how you can use this data to set up analysis and alerting with Prometheus"," and use the code snippets to try it out in your own system.",[23,157,159],{"id":158},"inside-gitlab","Inside GitLab",[12,161,162,163,108],{},"When GitLab co-founder Dmitriy Zaporozhets built GitLab on Ruby on Rails, despite working mostly in PHP at the time. In this foundational blog post, our GitLab CEO, Sid Sijbrandij, explains ",[16,164,166],{"href":165},"/blog/why-we-use-rails-to-build-gitlab/","why building on rails was the best decision for GitLab",[12,168,169,170,108],{},"We built our Web IDE to make it easier to edit code using GitLab. Explore ",[16,171,173],{"href":172},"/blog/introducing-gitlab-s-integrated-development-environment/","how we took the GitLab Web IDE from an experiment to working feature",[23,175,177],{"id":176},"the-extensions-and-integrations-that-power-us","The extensions and integrations that power us",[28,179,181],{"id":180},"how-we-built-a-vs-code-extension","How we built a VS Code extension",[12,183,184,185,189],{},"After a survey revealed that VS Code was the most-used tool by our Frontend team, we decided to build a VS Code extension that works with GitLab. Learn ",[16,186,188],{"href":187},"/blog/gitlab-vscode-extension/","how we built the VS Code extension"," in a series of iterations.",[12,191,192,193,108],{},"Soon, we found out our VS Code extension was very popular. So we wrote a blog post explaining ",[16,194,196],{"href":195},"/blog/vscode-extension-development-with-gitlab/","how users can develop their own extensions with VS Code and GitLab",[28,198,200],{"id":199},"challenges-with-elasticsearch","Challenges with Elasticsearch",[12,202,203,204,208,209,213],{},"Elasticsearch enables global code search on GitLab.com and would allow us to run advanced syntax search and advanced global search of our codebase. But we ran into trouble with GitLab’s integration with Elasticsearch and ",[16,205,207],{"href":206},"/blog/enabling-global-search-elasticsearch-gitlab-com/","hit some dead ends on our first attempt to initiate the integration",". We recalibrated, learned from our mistakes, and ",[16,210,212],{"href":211},"/blog/elasticsearch-update/","made a second attempt at the integration"," a few months later.",[28,215,217],{"id":216},"dogfooding-at-gitlab","Dogfooding at GitLab",[12,219,220,221,108],{},"The engineering productivity team at GitLab built Insights to examine trends in the GitLab.com issue tracker at a high-level, but soon realized Insights could be useful to our GitLab Ultimate users. Watch the video below or ",[16,222,224],{"href":223},"/blog/insights/","read the blog post to explore the origins of Insights",[41,226,45,228],{"className":227},[44],[47,229,52],{"src":230,"frameBorder":50,"allowFullScreen":51},"https://www.youtube-nocookie.com/embed/kKnQzS9qorc",[28,232,234],{"id":233},"how-we-reimagined-the-technical-interview","How we reimagined the technical interview",[12,236,237,238,108],{},"The trouble with technical interviews is that they rarely reflect the job you’re interviewing for. Learn how former GitLab team member, Clement Ho, ",[16,239,241],{"href":240},"/blog/the-trouble-with-technical-interviews/","reimagined the technical interview for Frontend engineers",[41,243,45,245],{"className":244},[44],[47,246,52],{"src":247,"frameBorder":50,"allowFullScreen":51},"https://www.youtube-nocookie.com/embed/dNABW84sTzs",[23,249,251],{"id":250},"how-troubleshooting-and-security-modeling-can-prevent-disaster","How troubleshooting and security modeling can prevent disaster",[12,253,254,255,259],{},"In a major feat of coordination, our globally distributed engineering team managed to work synchronously to troubleshoot an issue with our Hashicorp Consul, successfully avoiding any significant problems, including the outage we anticipated. Read \"",[16,256,258],{"href":257},"/blog/the-consul-outage-that-never-happened/","The consul outage that never happened","\" to learn how they did it.",[12,261,262,263,267],{},"Our Red team at GitLab is continually searching for vulnerabilities, big and small, and introduces patches to make it function. In one of our most popular 2020 posts, ",[16,264,266],{"href":265},"/blog/plundering-gcp-escalating-privileges-in-google-cloud-platform/","our security team explains how an attacker who already gained unauthorized access to the cloud platform might be able to take advantage of GCP privileges",", and how replicating this breach scenario could help you prevent this from happening on your GCP instance.",[12,269,270,274,275,108],{},[271,272,273],"strong",{},"Did we miss something?"," Share a link to your favorite GitLab engineering story below and ",[16,276,278],{"href":277},"/blog/gitlab-for-cicd-agile-gitops-cloudnative/","check out our round-up of some of our top stories about how to apply GitLab technology",[12,280,281,282,287,288],{},"Cover image by ",[16,283,286],{"href":284,"rel":285},"https://unsplash.com/@jsclick?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[],"Jamie Saw"," on ",[16,289,292],{"href":290,"rel":291},"https://unsplash.com/s/photos/series-of-stairs?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[],"Unsplash",{"title":294,"searchDepth":295,"depth":295,"links":296},"",2,[297,303,304,305,306,312],{"id":25,"depth":295,"text":26,"children":298},[299,301,302],{"id":30,"depth":300,"text":31},3,{"id":63,"depth":300,"text":64},{"id":75,"depth":300,"text":76},{"id":86,"depth":295,"text":87},{"id":129,"depth":295,"text":130},{"id":158,"depth":295,"text":159},{"id":176,"depth":295,"text":177,"children":307},[308,309,310,311],{"id":180,"depth":300,"text":181},{"id":199,"depth":300,"text":200},{"id":216,"depth":300,"text":217},{"id":233,"depth":300,"text":234},{"id":250,"depth":295,"text":251},"engineering","2021-01-07","From building a Web IDE, to our migration to GCP, to tracking down a bug in NFS – these are some of our most popular engineering blog posts.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749681835/Blog/Hero%20Images/stairs_iteration.jpg",{},true,"/en-us/blog/top-engineering-stories-gitlab",{"title":5,"description":315,"ogTitle":5,"ogDescription":315,"noIndex":318,"ogImage":319,"ogUrl":324,"ogSiteName":325,"ogType":326,"canonicalUrls":324},"https://about.gitlab.com/blog/top-engineering-stories-gitlab","https://about.gitlab.com","article","top-engineering-stories-gitlab","en-us/blog/top-engineering-stories-gitlab",[330,331],"inside GitLab","integrations","BlogPost","BKnEmjBx25uVSmXKs_eJ3r04f4DtZ1JX6bU5H8Y3bR4",{"logo":335,"freeTrial":340,"sales":345,"login":350,"items":355,"search":681,"minimal":712,"duo":731,"switchNav":740,"pricingDeployment":751},{"config":336},{"href":337,"dataGaName":338,"dataGaLocation":339},"/","gitlab logo","header",{"text":341,"config":342},"Get free trial",{"href":343,"dataGaName":344,"dataGaLocation":339},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":346,"config":347},"Request a demo",{"href":348,"dataGaName":349,"dataGaLocation":339},"/sales/?contact-topic=request-demo","sales",{"text":351,"config":352},"Sign in",{"href":353,"dataGaName":354,"dataGaLocation":339},"https://gitlab.com/users/sign_in/","sign in",[356,385,485,490,603,659],{"text":357,"config":358,"menu":360},"Platform",{"dataNavLevelOne":359},"platform",{"type":361,"columns":362},"cards",[363,369,377],{"title":357,"description":364,"link":365},"The intelligent orchestration platform for DevSecOps",{"text":366,"config":367},"Explore our Platform",{"href":368,"dataGaName":359,"dataGaLocation":339},"/platform/",{"title":370,"description":371,"link":372},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":373,"config":374},"Meet GitLab Duo",{"href":375,"dataGaName":376,"dataGaLocation":339},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":378,"description":379,"link":380},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":381,"config":382},"Learn more",{"href":383,"dataGaName":384,"dataGaLocation":339},"/why-gitlab/","why gitlab",{"text":386,"left":321,"config":387,"menu":389},"Product",{"dataNavLevelOne":388},"solutions",{"type":390,"link":391,"columns":395,"feature":464},"lists",{"text":392,"config":393},"View all Solutions",{"href":394,"dataGaName":388,"dataGaLocation":339},"/solutions/",[396,420,443],{"title":397,"description":398,"link":399,"items":404},"Automation","CI/CD and automation to accelerate deployment",{"config":400},{"icon":401,"href":402,"dataGaName":403,"dataGaLocation":339},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[405,409,412,416],{"text":406,"config":407},"CI/CD",{"href":408,"dataGaLocation":339,"dataGaName":406},"/solutions/continuous-integration/",{"text":370,"config":410},{"href":375,"dataGaLocation":339,"dataGaName":411},"gitlab duo agent platform - product menu",{"text":413,"config":414},"Source Code Management",{"href":415,"dataGaLocation":339,"dataGaName":413},"/solutions/source-code-management/",{"text":417,"config":418},"Automated Software Delivery",{"href":402,"dataGaLocation":339,"dataGaName":419},"Automated software delivery",{"title":421,"description":422,"link":423,"items":428},"Security","Deliver code faster without compromising security",{"config":424},{"href":425,"dataGaName":426,"dataGaLocation":339,"icon":427},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[429,433,438],{"text":430,"config":431},"Application Security Testing",{"href":425,"dataGaName":432,"dataGaLocation":339},"Application security testing",{"text":434,"config":435},"Software Supply Chain Security",{"href":436,"dataGaLocation":339,"dataGaName":437},"/solutions/supply-chain/","Software supply chain security",{"text":439,"config":440},"Software Compliance",{"href":441,"dataGaName":442,"dataGaLocation":339},"/solutions/software-compliance/","software compliance",{"title":444,"link":445,"items":450},"Measurement",{"config":446},{"icon":447,"href":448,"dataGaName":449,"dataGaLocation":339},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[451,455,459],{"text":452,"config":453},"Visibility & Measurement",{"href":448,"dataGaLocation":339,"dataGaName":454},"Visibility and Measurement",{"text":456,"config":457},"Value Stream Management",{"href":458,"dataGaLocation":339,"dataGaName":456},"/solutions/value-stream-management/",{"text":460,"config":461},"Analytics & Insights",{"href":462,"dataGaLocation":339,"dataGaName":463},"/solutions/analytics-and-insights/","Analytics and insights",{"title":465,"type":390,"items":466},"GitLab for",[467,473,479],{"text":468,"config":469},"Enterprise",{"icon":470,"href":471,"dataGaLocation":339,"dataGaName":472},"Building","/enterprise/","enterprise",{"text":474,"config":475},"Small Business",{"icon":476,"href":477,"dataGaLocation":339,"dataGaName":478},"Work","/small-business/","small business",{"text":480,"config":481},"Public Sector",{"icon":482,"href":483,"dataGaLocation":339,"dataGaName":484},"Organization","/solutions/public-sector/","public sector",{"text":486,"config":487},"Pricing",{"href":488,"dataGaName":489,"dataGaLocation":339,"dataNavLevelOne":489},"/pricing/","pricing",{"text":491,"config":492,"menu":494},"Resources",{"dataNavLevelOne":493},"resources",{"type":390,"link":495,"columns":499,"feature":592},{"text":496,"config":497},"View all resources",{"href":498,"dataGaName":493,"dataGaLocation":339},"/resources/",[500,532,559],{"title":501,"items":502},"Getting started",[503,508,513,518,523,528],{"text":504,"config":505},"Install",{"href":506,"dataGaName":507,"dataGaLocation":339},"/install/","install",{"text":509,"config":510},"Quick start guides",{"href":511,"dataGaName":512,"dataGaLocation":339},"/get-started/","quick setup checklists",{"text":514,"config":515},"Learn",{"href":516,"dataGaLocation":339,"dataGaName":517},"https://university.gitlab.com/","learn",{"text":519,"config":520},"Product documentation",{"href":521,"dataGaName":522,"dataGaLocation":339},"https://docs.gitlab.com/","product documentation",{"text":524,"config":525},"Best practice videos",{"href":526,"dataGaName":527,"dataGaLocation":339},"/getting-started-videos/","best practice videos",{"text":529,"config":530},"Integrations",{"href":531,"dataGaName":331,"dataGaLocation":339},"/integrations/",{"title":533,"items":534},"Discover",[535,540,545,550,554],{"text":536,"config":537},"Customer success stories",{"href":538,"dataGaName":539,"dataGaLocation":339},"/customers/","customer success stories",{"text":541,"config":542},"Blog",{"href":543,"dataGaName":544,"dataGaLocation":339},"/blog/","blog",{"text":546,"config":547},"Demo Hub",{"href":548,"dataGaName":549,"dataGaLocation":339},"/demo-hub/","demo hub",{"text":551,"config":552},"The Source",{"href":553,"dataGaName":544,"dataGaLocation":339},"/the-source/",{"text":555,"config":556},"Remote",{"href":557,"dataGaName":558,"dataGaLocation":339},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":560,"items":561},"Connect",[562,567,572,577,582,587],{"text":563,"config":564},"GitLab Services",{"href":565,"dataGaName":566,"dataGaLocation":339},"/services/","services",{"text":568,"config":569},"Contribute",{"href":570,"dataGaName":571,"dataGaLocation":339},"https://contributors.gitlab.com","contribute",{"text":573,"config":574},"Community",{"href":575,"dataGaName":576,"dataGaLocation":339},"/community/","community",{"text":578,"config":579},"Forum",{"href":580,"dataGaName":581,"dataGaLocation":339},"https://forum.gitlab.com/","forum",{"text":583,"config":584},"Events",{"href":585,"dataGaName":586,"dataGaLocation":339},"/events/","events",{"text":588,"config":589},"Partners",{"href":590,"dataGaName":591,"dataGaLocation":339},"/partners/","partners",{"config":593,"title":596,"text":597,"link":598},{"background":594,"textColor":595},"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":599,"config":600},"Read the latest",{"href":601,"dataGaName":602,"dataGaLocation":339},"/whats-new/","whats new",{"text":604,"config":605,"menu":607},"Company",{"dataNavLevelOne":606},"company",{"type":390,"columns":608},[609],{"items":610},[611,616,622,624,629,634,639,644,649,654],{"text":612,"config":613},"About",{"href":614,"dataGaName":615,"dataGaLocation":339},"/company/","about",{"text":617,"config":618,"footerGa":621},"Jobs",{"href":619,"dataGaName":620,"dataGaLocation":339},"/jobs/","jobs",{"dataGaName":620},{"text":583,"config":623},{"href":585,"dataGaName":586,"dataGaLocation":339},{"text":625,"config":626},"Leadership",{"href":627,"dataGaName":628,"dataGaLocation":339},"/company/team/e-group/","leadership",{"text":630,"config":631},"Handbook",{"href":632,"dataGaName":633,"dataGaLocation":339},"https://handbook.gitlab.com/","handbook",{"text":635,"config":636},"Investor relations",{"href":637,"dataGaName":638,"dataGaLocation":339},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":640,"config":641},"Trust Center",{"href":642,"dataGaName":643,"dataGaLocation":339},"/security/","trust center",{"text":645,"config":646},"AI Transparency Center",{"href":647,"dataGaName":648,"dataGaLocation":339},"/ai-transparency-center/","ai transparency center",{"text":650,"config":651},"Newsletter",{"href":652,"dataGaName":653,"dataGaLocation":339},"/company/contact/#contact-forms","newsletter",{"text":655,"config":656},"Press",{"href":657,"dataGaName":658,"dataGaLocation":339},"/press/","press",{"text":660,"config":661,"menu":662},"Contact us",{"dataNavLevelOne":606},{"type":390,"columns":663},[664],{"items":665},[666,671,676],{"text":667,"config":668},"Talk to sales",{"href":669,"dataGaName":670,"dataGaLocation":339},"/sales/","talk to sales",{"text":672,"config":673},"Support portal",{"href":674,"dataGaName":675,"dataGaLocation":339},"https://support.gitlab.com/hc/en-us","support portal",{"text":677,"config":678},"Customer portal",{"href":679,"dataGaName":680,"dataGaLocation":339},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":682,"login":683,"suggestions":690},"Close",{"text":684,"link":685},"To search repositories and projects, login to",{"text":686,"config":687},"gitlab.com",{"href":353,"dataGaName":688,"dataGaLocation":689},"search login","search",{"text":691,"default":692},"Suggestions",[693,695,699,701,705,709],{"text":370,"config":694},{"href":375,"dataGaName":370,"dataGaLocation":689},{"text":696,"config":697},"Code Suggestions (AI)",{"href":698,"dataGaName":696,"dataGaLocation":689},"/solutions/code-suggestions/",{"text":406,"config":700},{"href":408,"dataGaName":406,"dataGaLocation":689},{"text":702,"config":703},"GitLab on AWS",{"href":704,"dataGaName":702,"dataGaLocation":689},"/partners/technology-partners/aws/",{"text":706,"config":707},"GitLab on Google Cloud",{"href":708,"dataGaName":706,"dataGaLocation":689},"/partners/technology-partners/google-cloud-platform/",{"text":710,"config":711},"Why GitLab?",{"href":383,"dataGaName":710,"dataGaLocation":689},{"freeTrial":713,"mobileIcon":718,"desktopIcon":723,"secondaryButton":726},{"text":714,"config":715},"Start free trial",{"href":716,"dataGaName":344,"dataGaLocation":717},"https://gitlab.com/-/trials/new/","nav",{"altText":719,"config":720},"Gitlab Icon",{"src":721,"dataGaName":722,"dataGaLocation":717},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":719,"config":724},{"src":725,"dataGaName":722,"dataGaLocation":717},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":727,"config":728},"Get Started",{"href":729,"dataGaName":730,"dataGaLocation":717},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":732,"mobileIcon":736,"desktopIcon":738},{"text":733,"config":734},"Learn more about GitLab Duo",{"href":375,"dataGaName":735,"dataGaLocation":717},"gitlab duo",{"altText":719,"config":737},{"src":721,"dataGaName":722,"dataGaLocation":717},{"altText":719,"config":739},{"src":725,"dataGaName":722,"dataGaLocation":717},{"button":741,"mobileIcon":746,"desktopIcon":748},{"text":742,"config":743},"/switch",{"href":744,"dataGaName":745,"dataGaLocation":717},"#contact","switch",{"altText":719,"config":747},{"src":721,"dataGaName":722,"dataGaLocation":717},{"altText":719,"config":749},{"src":750,"dataGaName":722,"dataGaLocation":717},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":752,"mobileIcon":757,"desktopIcon":759},{"text":753,"config":754},"Back to pricing",{"href":488,"dataGaName":755,"dataGaLocation":717,"icon":756},"back to pricing","GoBack",{"altText":719,"config":758},{"src":721,"dataGaName":722,"dataGaLocation":717},{"altText":719,"config":760},{"src":725,"dataGaName":722,"dataGaLocation":717},{"title":762,"titleMobile":763,"button":764,"config":769},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":381,"config":765},{"href":766,"dataGaName":767,"dataGaLocation":768},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":770,"disabled":318},"release",{"data":772},{"text":773,"source":774,"edit":780,"contribute":785,"config":790,"items":795,"minimal":1005},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":775,"config":776},"View page source",{"href":777,"dataGaName":778,"dataGaLocation":779},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":781,"config":782},"Edit this page",{"href":783,"dataGaName":784,"dataGaLocation":779},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":786,"config":787},"Please contribute",{"href":788,"dataGaName":789,"dataGaLocation":779},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":791,"facebook":792,"youtube":793,"linkedin":794},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[796,843,897,941,973],{"title":486,"links":797,"subMenu":812},[798,802,807],{"text":799,"config":800},"View plans",{"href":488,"dataGaName":801,"dataGaLocation":779},"view plans",{"text":803,"config":804},"Why Premium?",{"href":805,"dataGaName":806,"dataGaLocation":779},"/pricing/premium/","why premium",{"text":808,"config":809},"Why Ultimate?",{"href":810,"dataGaName":811,"dataGaLocation":779},"/pricing/ultimate/","why ultimate",[813],{"title":814,"links":815},"Contact Us",[816,819,821,823,828,833,838],{"text":817,"config":818},"Contact sales",{"href":669,"dataGaName":349,"dataGaLocation":779},{"text":672,"config":820},{"href":674,"dataGaName":675,"dataGaLocation":779},{"text":677,"config":822},{"href":679,"dataGaName":680,"dataGaLocation":779},{"text":824,"config":825},"Status",{"href":826,"dataGaName":827,"dataGaLocation":779},"https://status.gitlab.com/","status",{"text":829,"config":830},"Terms of use",{"href":831,"dataGaName":832,"dataGaLocation":779},"/terms/","terms of use",{"text":834,"config":835},"Privacy statement",{"href":836,"dataGaName":837,"dataGaLocation":779},"/privacy/","privacy statement",{"text":839,"config":840},"Cookie preferences",{"dataGaName":841,"dataGaLocation":779,"id":842,"isOneTrustButton":321},"cookie preferences","ot-sdk-btn",{"title":386,"links":844,"subMenu":853},[845,849],{"text":846,"config":847},"DevSecOps platform",{"href":368,"dataGaName":848,"dataGaLocation":779},"devsecops platform",{"text":850,"config":851},"AI-Assisted Development",{"href":375,"dataGaName":852,"dataGaLocation":779},"ai-assisted development",[854],{"title":855,"links":856},"Topics",[857,862,867,872,877,882,887,892],{"text":858,"config":859},"CICD",{"href":860,"dataGaName":861,"dataGaLocation":779},"/topics/ci-cd/","cicd",{"text":863,"config":864},"GitOps",{"href":865,"dataGaName":866,"dataGaLocation":779},"/topics/gitops/","gitops",{"text":868,"config":869},"DevOps",{"href":870,"dataGaName":871,"dataGaLocation":779},"/topics/devops/","devops",{"text":873,"config":874},"Version Control",{"href":875,"dataGaName":876,"dataGaLocation":779},"/topics/version-control/","version control",{"text":878,"config":879},"DevSecOps",{"href":880,"dataGaName":881,"dataGaLocation":779},"/topics/devsecops/","devsecops",{"text":883,"config":884},"Cloud Native",{"href":885,"dataGaName":886,"dataGaLocation":779},"/topics/cloud-native/","cloud native",{"text":888,"config":889},"AI for Coding",{"href":890,"dataGaName":891,"dataGaLocation":779},"/topics/devops/ai-for-coding/","ai for coding",{"text":893,"config":894},"Agentic AI",{"href":895,"dataGaName":896,"dataGaLocation":779},"/topics/agentic-ai/","agentic ai",{"title":898,"links":899},"Solutions",[900,902,904,909,913,916,920,923,925,928,931,936],{"text":430,"config":901},{"href":425,"dataGaName":430,"dataGaLocation":779},{"text":419,"config":903},{"href":402,"dataGaName":403,"dataGaLocation":779},{"text":905,"config":906},"Agile development",{"href":907,"dataGaName":908,"dataGaLocation":779},"/solutions/agile-delivery/","agile delivery",{"text":910,"config":911},"SCM",{"href":415,"dataGaName":912,"dataGaLocation":779},"source code management",{"text":858,"config":914},{"href":408,"dataGaName":915,"dataGaLocation":779},"continuous integration & delivery",{"text":917,"config":918},"Value stream management",{"href":458,"dataGaName":919,"dataGaLocation":779},"value stream management",{"text":863,"config":921},{"href":922,"dataGaName":866,"dataGaLocation":779},"/solutions/gitops/",{"text":468,"config":924},{"href":471,"dataGaName":472,"dataGaLocation":779},{"text":926,"config":927},"Small business",{"href":477,"dataGaName":478,"dataGaLocation":779},{"text":929,"config":930},"Public sector",{"href":483,"dataGaName":484,"dataGaLocation":779},{"text":932,"config":933},"Education",{"href":934,"dataGaName":935,"dataGaLocation":779},"/solutions/education/","education",{"text":937,"config":938},"Financial services",{"href":939,"dataGaName":940,"dataGaLocation":779},"/solutions/finance/","financial services",{"title":491,"links":942},[943,945,947,949,952,954,957,959,961,963,965,967,969,971],{"text":504,"config":944},{"href":506,"dataGaName":507,"dataGaLocation":779},{"text":509,"config":946},{"href":511,"dataGaName":512,"dataGaLocation":779},{"text":514,"config":948},{"href":516,"dataGaName":517,"dataGaLocation":779},{"text":519,"config":950},{"href":521,"dataGaName":951,"dataGaLocation":779},"docs",{"text":541,"config":953},{"href":543,"dataGaName":544,"dataGaLocation":779},{"text":955,"config":956},"What's new",{"href":601,"dataGaName":602,"dataGaLocation":779},{"text":536,"config":958},{"href":538,"dataGaName":539,"dataGaLocation":779},{"text":555,"config":960},{"href":557,"dataGaName":558,"dataGaLocation":779},{"text":563,"config":962},{"href":565,"dataGaName":566,"dataGaLocation":779},{"text":568,"config":964},{"href":570,"dataGaName":571,"dataGaLocation":779},{"text":573,"config":966},{"href":575,"dataGaName":576,"dataGaLocation":779},{"text":578,"config":968},{"href":580,"dataGaName":581,"dataGaLocation":779},{"text":583,"config":970},{"href":585,"dataGaName":586,"dataGaLocation":779},{"text":588,"config":972},{"href":590,"dataGaName":591,"dataGaLocation":779},{"title":604,"links":974},[975,977,979,981,983,985,989,994,996,998,1000],{"text":612,"config":976},{"href":614,"dataGaName":606,"dataGaLocation":779},{"text":617,"config":978},{"href":619,"dataGaName":620,"dataGaLocation":779},{"text":625,"config":980},{"href":627,"dataGaName":628,"dataGaLocation":779},{"text":630,"config":982},{"href":632,"dataGaName":633,"dataGaLocation":779},{"text":635,"config":984},{"href":637,"dataGaName":638,"dataGaLocation":779},{"text":986,"config":987},"Sustainability",{"href":988,"dataGaName":986,"dataGaLocation":779},"/sustainability/",{"text":990,"config":991},"Diversity, inclusion and belonging (DIB)",{"href":992,"dataGaName":993,"dataGaLocation":779},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":640,"config":995},{"href":642,"dataGaName":643,"dataGaLocation":779},{"text":650,"config":997},{"href":652,"dataGaName":653,"dataGaLocation":779},{"text":655,"config":999},{"href":657,"dataGaName":658,"dataGaLocation":779},{"text":1001,"config":1002},"Modern Slavery Transparency Statement",{"href":1003,"dataGaName":1004,"dataGaLocation":779},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1006},[1007,1010,1013],{"text":1008,"config":1009},"Terms",{"href":831,"dataGaName":832,"dataGaLocation":779},{"text":1011,"config":1012},"Cookies",{"dataGaName":841,"dataGaLocation":779,"id":842,"isOneTrustButton":321},{"text":1014,"config":1015},"Privacy",{"href":836,"dataGaName":837,"dataGaLocation":779},[1017],{"id":1018,"title":7,"body":317,"config":1019,"content":1021,"description":317,"extension":1024,"meta":1025,"navigation":321,"path":1026,"seo":1027,"stem":1028,"__hash__":1029},"blogAuthors/en-us/blog/authors/sara-kassabian.yml",{"template":1020},"BlogAuthor",{"name":7,"config":1022},{"headshot":294,"ctfId":1023},"skassabian","yml",{},"/en-us/blog/authors/sara-kassabian",{},"en-us/blog/authors/sara-kassabian","6cCCPpjzkCDfb77tMVCyG8_FImRVQXA2VCMyiAjhFX0",[1031,1040,1048],{"title":1032,"description":1033,"heroImage":1034,"category":313,"date":1035,"authors":1036,"slug":1039,"externalUrl":317},"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",[1037,1038],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1041,"description":1042,"heroImage":1043,"category":313,"date":1044,"authors":1045,"slug":1047,"externalUrl":317},"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",[1046],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1049,"description":1050,"heroImage":1051,"category":313,"date":1052,"authors":1053,"slug":1055,"externalUrl":317},"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",[1054],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1057},[1058,1072,1084,1096],{"id":1059,"categories":1060,"header":1062,"text":1063,"button":1064,"image":1069},"ai-modernization",[1061],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1065,"config":1066},"Get your AI maturity score",{"href":1067,"dataGaName":1068,"dataGaLocation":544},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1070},{"src":1071},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1073,"categories":1074,"header":1076,"text":1063,"button":1077,"image":1081},"devops-modernization",[1075,881],"product","Are you just managing tools or shipping innovation?",{"text":1078,"config":1079},"Get your DevOps maturity score",{"href":1080,"dataGaName":1068,"dataGaLocation":544},"/assessments/devops-modernization-assessment/",{"config":1082},{"src":1083},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1085,"categories":1086,"header":1088,"text":1063,"button":1089,"image":1093},"security-modernization",[1087],"security","Are you trading speed for security?",{"text":1090,"config":1091},"Get your security maturity score",{"href":1092,"dataGaName":1068,"dataGaLocation":544},"/assessments/security-modernization-assessment/",{"config":1094},{"src":1095},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1097,"paths":1098,"header":1101,"text":1102,"button":1103,"image":1108},"github-azure-migration",[1099,1100],"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":1104,"config":1105},"See how GitLab compares to GitHub",{"href":1106,"dataGaName":1107,"dataGaLocation":544},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1109},{"src":1083},{"header":1111,"blurb":1112,"button":1113,"secondaryButton":1118},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1114,"config":1115},"Get your free trial",{"href":1116,"dataGaName":344,"dataGaLocation":1117},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":817,"config":1119},{"href":669,"dataGaName":349,"dataGaLocation":1117},1786803775868]