[{"data":1,"prerenderedAt":910},["ShallowReactive",2],{"/blog/gitlab-got-bit-mysql-fails-at-rails-migrations-that-work-in-postgresql":3,"navigation-en-us":148,"banner-en-us":579,"footer-en-us":589,"blog-post-authors-en-us-Job van der Voort":850,"blog-related-posts-en-us-gitlab-got-bit-mysql-fails-at-rails-migrations-that-work-in-postgresql":866,"blog-share-wrapper-en-us":890,"next-steps-en-us":900},{"id":4,"title":5,"authors":6,"body":8,"category":126,"date":127,"description":128,"extension":129,"externalUrl":130,"faq":130,"featured":131,"heroImage":132,"meta":133,"navigation":138,"path":139,"seo":140,"slug":144,"stem":145,"tags":130,"template":146,"updatedDate":130,"__hash__":147},"blogPosts/en-us/blog/gitlab-got-bit-mysql-fails-at-rails-migrations-that-work-in-postgresql.md","GitLab got bit: MySQL fails at Rails migrations that work in PostgreSQL",[7],"Job van der Voort",{"type":9,"value":10,"toc":119},"minimark",[11,15,20,23,43,53,56,62,65,71,80,84,87,93,103,112],[12,13,14],"p",{},"One day after releasing GitLab 7.6 we had to release a patch. This is how we\ngot bit by a failing migration and why it was our own fault.",[16,17,19],"h2",{"id":18},"what-happened","What happened",[12,21,22],{},"GitLab supports two databases: MySQL and PostgreSQL.",[12,24,25,26,30,31,34,35,38,39,42],{},"To update our database models for identities in GitLab, we wanted to remove two columns from the ",[27,28,29],"code",{},"users"," table: ",[27,32,33],{},"extern_uid"," and ",[27,36,37],{},"provider",". These had a composite index, so that uniqueness was checked for any combination of ",[27,40,41],{},"extern_uid + provider",".",[44,45,51],"pre",{"className":46,"code":48,"language":49,"meta":50},[47],"language-text","add_index :users, [:extern_uid, :provider]\n","text","",[27,52,48],{"__ignoreMap":50},[12,54,55],{},"So to remove the columns, we wrote a simple migration:",[44,57,60],{"className":58,"code":59,"language":49,"meta":50},[47],"def up\n  remove_column :users, :extern_uid\n  remove_column :users, :provider\nend\n",[27,61,59],{"__ignoreMap":50},[12,63,64],{},"Run the migration on PostgreSQL and it works without a hitch. Try to run it on MySQL and:",[44,66,69],{"className":67,"code":68,"language":49,"meta":50},[47],"Mysql2::Error: Duplicate entry 'example' for key 'index_users_on_extern_uid_and_provider': ALTER TABLE `users` DROP `extern_uid`\n",[27,70,68],{"__ignoreMap":50},[12,72,73,74,76,77,79],{},"It seems that when removing the ",[27,75,33],{}," column, MySQL decided to rebuild the index using only the ",[27,78,37],{}," column, creating duplicate indices (which is not allowed).",[16,81,83],{"id":82},"how-we-fixed-it","How we fixed it",[12,85,86],{},"To fix this, all we had to do is check whether the index exists and remove it if it does.",[44,88,91],{"className":89,"code":90,"language":49,"meta":50},[47],"def up\n  if index_exists?(:users, [:extern_uid, :provider])\n    remove_index :users, [:extern_uid, :provider]\n  end\n\n  remove_column :users, :extern_uid\n  remove_column :users, :provider\nend\n",[27,92,90],{"__ignoreMap":50},[12,94,95,96,102],{},"We quickly released ",[97,98,101],"a",{"href":99,"rel":100},"https://docs.gitlab.com/releases/",[],"a new GitLab version","\nthat included the new migration.",[16,104,106,107,111],{"id":105},"why-well-probably-not-repeat-this-mistake","Why we'll ",[108,109,110],"em",{},"probably"," not repeat this mistake",[12,113,114,115],{},"So how did we miss such a simple mistake? GitLab has a pretty hefty test-suite that tests almost every line of code. On top of that, we do [QA testing](",[97,116,117],{"href":117,"rel":118},"https://docs.gitlab.com/release/monthly/#workdays-before-release",[],{"title":50,"searchDepth":120,"depth":120,"links":121},2,[122,123,124],{"id":18,"depth":120,"text":19},{"id":82,"depth":120,"text":83},{"id":105,"depth":120,"text":125},"Why we'll probably not repeat this mistake","company","2014-12-30","One day after releasing GitLab 7.6 we had to release a patch. This is how we got bit by a failing migration and why it was our own fault.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663397/Blog/Hero%20Images/logoforblogpost.jpg",{"excerpt":134},{"type":9,"value":135},[136],[12,137,14],{},true,"/en-us/blog/gitlab-got-bit-mysql-fails-at-rails-migrations-that-work-in-postgresql",{"title":5,"description":128,"ogTitle":5,"ogDescription":128,"noIndex":131,"ogImage":132,"ogUrl":141,"ogSiteName":142,"ogType":143,"canonicalUrls":141},"https://about.gitlab.com/blog/gitlab-got-bit-mysql-fails-at-rails-migrations-that-work-in-postgresql","https://about.gitlab.com","article","gitlab-got-bit-mysql-fails-at-rails-migrations-that-work-in-postgresql","en-us/blog/gitlab-got-bit-mysql-fails-at-rails-migrations-that-work-in-postgresql","BlogPost","G0k6KMLu6g5cSl_Oouog0pSv5IYK2ls2YSN7RzfS0HY",{"logo":149,"freeTrial":154,"sales":159,"login":164,"items":169,"search":499,"minimal":530,"duo":549,"switchNav":558,"pricingDeployment":569},{"config":150},{"href":151,"dataGaName":152,"dataGaLocation":153},"/","gitlab logo","header",{"text":155,"config":156},"Get free trial",{"href":157,"dataGaName":158,"dataGaLocation":153},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":160,"config":161},"Request a demo",{"href":162,"dataGaName":163,"dataGaLocation":153},"/request-a-demo/","sales",{"text":165,"config":166},"Sign in",{"href":167,"dataGaName":168,"dataGaLocation":153},"https://gitlab.com/users/sign_in/","sign in",[170,256,344,349,424,477],{"text":171,"left":138,"config":172,"menu":174},"Platform",{"dataNavLevelOne":173},"platform",{"type":175,"link":176,"columns":180,"feature":245},"lists",{"text":177,"config":178},"Explore the Platform",{"href":179,"dataGaName":173,"dataGaLocation":153},"/platform/",[181,204,227],{"title":182,"items":183},"Execution & Workflows",[184,189,194,199],{"text":185,"config":186},"CI/CD",{"href":187,"dataGaLocation":153,"dataGaName":188},"/solutions/continuous-integration/","ci/cd",{"text":190,"config":191},"Source Code Management",{"href":192,"dataGaLocation":153,"dataGaName":193},"/solutions/source-code-management/","source code management",{"text":195,"config":196},"Agile Delivery",{"href":197,"dataGaLocation":153,"dataGaName":198},"/solutions/agile-delivery/","agile delivery",{"text":200,"config":201},"Artifact Management",{"href":202,"dataGaLocation":153,"dataGaName":203},"/artifact-central/","artifact management",{"title":205,"items":206},"Security & Governance",[207,212,217,222],{"text":208,"config":209},"Application Security Testing",{"href":210,"dataGaLocation":153,"dataGaName":211},"/solutions/application-security-testing/","application security testing",{"text":213,"config":214},"Governance & Compliance",{"href":215,"dataGaLocation":153,"dataGaName":216},"/solutions/software-compliance/","governance and compliance",{"text":218,"config":219},"Secrets Management",{"href":220,"dataGaLocation":153,"dataGaName":221},"/gitlab-secrets-manager/","secrets management",{"text":223,"config":224},"Supply Chain Security",{"href":225,"dataGaLocation":153,"dataGaName":226},"/solutions/supply-chain/","supply chain security",{"title":228,"items":229},"Context & AI",[230,235,240],{"text":231,"config":232},"Agentic Orchestration",{"href":233,"dataGaLocation":153,"dataGaName":234},"/gitlab-duo-agent-platform/","agentic orchestration",{"text":236,"config":237},"Context Graph",{"href":238,"dataGaLocation":153,"dataGaName":239},"/gitlab-orbit/","context graph",{"text":241,"config":242},"Visibility & Measurement",{"href":243,"dataGaLocation":153,"dataGaName":244},"/solutions/visibility-measurement/","visibility and measurement",{"config":246,"title":249,"text":250,"link":251},{"background":247,"textColor":248},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1790185102/o7dn32anqcb6z8dgd3as.jpg')","#000","Why GitLab","One platform for speed with control across your software lifecycle.",{"text":252,"config":253},"Learn more",{"href":254,"dataGaName":255,"dataGaLocation":153},"/why-gitlab/","why gitlab",{"text":257,"left":138,"config":258,"menu":260},"Solutions",{"dataNavLevelOne":259},"solutions",{"type":175,"link":261,"columns":265,"feature":335},{"text":262,"config":263},"View all Solutions",{"href":264,"dataGaName":259,"dataGaLocation":153},"/solutions/",[266,284,302],{"title":267,"items":268},"Outcomes",[269,274,279],{"text":270,"config":271},"DevOps Modernization",{"href":272,"dataGaLocation":153,"dataGaName":273},"/assessments/devops-modernization-assessment/","devops modernization",{"text":275,"config":276},"Security Modernization",{"href":277,"dataGaLocation":153,"dataGaName":278},"/assessments/security-modernization-assessment/","security modernization",{"text":280,"config":281},"AI Modernization",{"href":282,"dataGaLocation":153,"dataGaName":283},"/assessments/ai-modernization-assessment/","ai modernization",{"title":285,"items":286},"By size",[287,292,297],{"text":288,"config":289},"Enterprise",{"href":290,"dataGaLocation":153,"dataGaName":291},"/enterprise/","enterprise",{"text":293,"config":294},"Small Business",{"href":295,"dataGaLocation":153,"dataGaName":296},"/small-business/","small business",{"text":298,"config":299},"Startups",{"href":300,"dataGaLocation":153,"dataGaName":301},"/solutions/startups/","startups",{"title":303,"items":304},"Industries",[305,310,315,320,325,330],{"text":306,"config":307},"Financial Services",{"href":308,"dataGaLocation":153,"dataGaName":309},"/solutions/finance/","financial services",{"text":311,"config":312},"Public Sector",{"href":313,"dataGaLocation":153,"dataGaName":314},"/solutions/public-sector/","public sector",{"text":316,"config":317},"Telecommunications",{"href":318,"dataGaLocation":153,"dataGaName":319},"/solutions/telecommunications/","telecommunications",{"text":321,"config":322},"Automotive",{"href":323,"dataGaLocation":153,"dataGaName":324},"/solutions/automotive/","automotive",{"text":326,"config":327},"Education",{"href":328,"dataGaLocation":153,"dataGaName":329},"/solutions/education/","education",{"text":331,"config":332},"Aerospace",{"href":333,"dataGaLocation":153,"dataGaName":334},"/solutions/aerospace/","aerospace",{"config":336,"title":337,"text":338,"link":339},{"background":247,"textColor":248},"GitLab Security Standard","Learn how to harden your software factory and let AI agents earn autonomy, without trading away security.",{"text":340,"config":341},"Explore the standard",{"href":342,"dataGaName":343,"dataGaLocation":153},"/gitlab-security-standard/","gitlab security standard",{"text":345,"config":346},"Pricing",{"href":347,"dataGaName":348,"dataGaLocation":153,"dataNavLevelOne":348},"/pricing/","pricing",{"text":350,"config":351,"menu":353},"Resources",{"dataNavLevelOne":352},"resources",{"type":175,"link":354,"columns":358,"feature":415},{"text":355,"config":356},"View all resources",{"href":357,"dataGaName":352,"dataGaLocation":153},"/resources/",[359,387],{"title":360,"items":361},"Discover",[362,367,372,377,382],{"text":363,"config":364},"Docs",{"href":365,"dataGaName":366,"dataGaLocation":153},"https://docs.gitlab.com/","docs",{"text":368,"config":369},"University",{"href":370,"dataGaName":371,"dataGaLocation":153},"https://university.gitlab.com/","university",{"text":373,"config":374},"Demo Series",{"href":375,"dataGaName":376,"dataGaLocation":153},"/gitlab-technical-demo-series/","demo series",{"text":378,"config":379},"Demo Hub",{"href":380,"dataGaName":381,"dataGaLocation":153},"/demo-hub/","demo hub",{"text":383,"config":384},"Services",{"href":385,"dataGaName":386,"dataGaLocation":153},"/services/","services",{"title":388,"items":389},"Connect",[390,395,400,405,410],{"text":391,"config":392},"Blog",{"href":393,"dataGaName":394,"dataGaLocation":153},"/blog/","blog",{"text":396,"config":397},"Community",{"href":398,"dataGaName":399,"dataGaLocation":153},"/community/","community",{"text":401,"config":402},"Customers",{"href":403,"dataGaName":404,"dataGaLocation":153},"/customers/","customers",{"text":406,"config":407},"Partners",{"href":408,"dataGaName":409,"dataGaLocation":153},"/partners/","partners",{"text":411,"config":412},"Events",{"href":413,"dataGaName":414,"dataGaLocation":153},"/events/","events",{"config":416,"title":417,"text":418,"link":419},{"background":247,"textColor":248},"What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":420,"config":421},"Read the latest",{"href":422,"dataGaName":423,"dataGaLocation":153},"/whats-new/","whats new",{"text":425,"config":426,"menu":427},"Company",{"dataNavLevelOne":126},{"type":175,"columns":428},[429],{"items":430},[431,436,442,447,452,457,462,467,472],{"text":432,"config":433},"About",{"href":434,"dataGaName":435,"dataGaLocation":153},"/company/","about",{"text":437,"config":438,"footerGa":441},"Jobs",{"href":439,"dataGaName":440,"dataGaLocation":153},"/jobs/","jobs",{"dataGaName":440},{"text":443,"config":444},"Press",{"href":445,"dataGaName":446,"dataGaLocation":153},"/press/","press",{"text":448,"config":449},"Handbook",{"href":450,"dataGaName":451,"dataGaLocation":153},"https://handbook.gitlab.com/","handbook",{"text":453,"config":454},"Leadership",{"href":455,"dataGaName":456,"dataGaLocation":153},"/company/team/e-group/","leadership",{"text":458,"config":459},"Investor relations",{"href":460,"dataGaName":461,"dataGaLocation":153},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":463,"config":464},"Trust Center",{"href":465,"dataGaName":466,"dataGaLocation":153},"/security/","trust center",{"text":468,"config":469},"AI Transparency Center",{"href":470,"dataGaName":471,"dataGaLocation":153},"/ai-transparency-center/","ai transparency center",{"text":473,"config":474},"Newsletter",{"href":475,"dataGaName":476,"dataGaLocation":153},"/company/contact/#contact-forms","newsletter",{"text":478,"config":479,"menu":480},"Contact us",{"dataNavLevelOne":126},{"type":175,"columns":481},[482],{"items":483},[484,489,494],{"text":485,"config":486},"Talk to sales",{"href":487,"dataGaName":488,"dataGaLocation":153},"/sales/","talk to sales",{"text":490,"config":491},"Support portal",{"href":492,"dataGaName":493,"dataGaLocation":153},"https://support.gitlab.com/hc/en-us","support portal",{"text":495,"config":496},"Customer portal",{"href":497,"dataGaName":498,"dataGaLocation":153},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":500,"login":501,"suggestions":508},"Close",{"text":502,"link":503},"To search repositories and projects, login to",{"text":504,"config":505},"gitlab.com",{"href":167,"dataGaName":506,"dataGaLocation":507},"search login","search",{"text":509,"default":510},"Suggestions",[511,514,517,519,523,527],{"text":512,"config":513},"GitLab Duo Agent Platform",{"href":233,"dataGaName":512,"dataGaLocation":507},{"text":515,"config":516},"Code Suggestions (AI)",{"href":233,"dataGaName":515,"dataGaLocation":507},{"text":185,"config":518},{"href":187,"dataGaName":185,"dataGaLocation":507},{"text":520,"config":521},"GitLab on AWS",{"href":522,"dataGaName":520,"dataGaLocation":507},"/partners/technology-partners/aws/",{"text":524,"config":525},"GitLab on Google Cloud",{"href":526,"dataGaName":524,"dataGaLocation":507},"/partners/technology-partners/google-cloud-platform/",{"text":528,"config":529},"Why GitLab?",{"href":254,"dataGaName":528,"dataGaLocation":507},{"freeTrial":531,"mobileIcon":536,"desktopIcon":541,"secondaryButton":544},{"text":532,"config":533},"Start free trial",{"href":534,"dataGaName":158,"dataGaLocation":535},"https://gitlab.com/-/trials/new/","nav",{"altText":537,"config":538},"Gitlab Icon",{"src":539,"dataGaName":540,"dataGaLocation":535},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":537,"config":542},{"src":543,"dataGaName":540,"dataGaLocation":535},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":545,"config":546},"Get Started",{"href":547,"dataGaName":548,"dataGaLocation":535},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":550,"mobileIcon":554,"desktopIcon":556},{"text":551,"config":552},"Learn more about GitLab Duo",{"href":233,"dataGaName":553,"dataGaLocation":535},"gitlab duo",{"altText":537,"config":555},{"src":539,"dataGaName":540,"dataGaLocation":535},{"altText":537,"config":557},{"src":543,"dataGaName":540,"dataGaLocation":535},{"button":559,"mobileIcon":564,"desktopIcon":566},{"text":560,"config":561},"/switch",{"href":562,"dataGaName":563,"dataGaLocation":535},"#contact","switch",{"altText":537,"config":565},{"src":539,"dataGaName":540,"dataGaLocation":535},{"altText":537,"config":567},{"src":568,"dataGaName":540,"dataGaLocation":535},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":570,"mobileIcon":575,"desktopIcon":577},{"text":571,"config":572},"Back to pricing",{"href":347,"dataGaName":573,"dataGaLocation":535,"icon":574},"back to pricing","GoBack",{"altText":537,"config":576},{"src":539,"dataGaName":540,"dataGaLocation":535},{"altText":537,"config":578},{"src":543,"dataGaName":540,"dataGaLocation":535},{"title":580,"button":581,"config":587},"Ship at agent speed. Prove every step. Transcend is here.",{"text":582,"config":583},"Watch now",{"href":584,"dataGaName":585,"dataGaLocation":586},"/events/transcend/virtual/#watch-gitlab-transcend","transcend-october-2026-banner","global-banner",{"layout":588,"disabled":131},"release",{"data":590},{"text":591,"source":592,"edit":598,"contribute":603,"config":608,"items":613,"minimal":839},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":593,"config":594},"View page source",{"href":595,"dataGaName":596,"dataGaLocation":597},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":599,"config":600},"Edit this page",{"href":601,"dataGaName":602,"dataGaLocation":597},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":604,"config":605},"Please contribute",{"href":606,"dataGaName":607,"dataGaLocation":597},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":609,"facebook":610,"youtube":611,"linkedin":612},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[614,661,719,766,807],{"title":345,"links":615,"subMenu":630},[616,620,625],{"text":617,"config":618},"View plans",{"href":347,"dataGaName":619,"dataGaLocation":597},"view plans",{"text":621,"config":622},"Why Premium?",{"href":623,"dataGaName":624,"dataGaLocation":597},"/pricing/premium/","why premium",{"text":626,"config":627},"Why Ultimate?",{"href":628,"dataGaName":629,"dataGaLocation":597},"/pricing/ultimate/","why ultimate",[631],{"title":632,"links":633},"Contact Us",[634,637,639,641,646,651,656],{"text":635,"config":636},"Contact sales",{"href":487,"dataGaName":163,"dataGaLocation":597},{"text":490,"config":638},{"href":492,"dataGaName":493,"dataGaLocation":597},{"text":495,"config":640},{"href":497,"dataGaName":498,"dataGaLocation":597},{"text":642,"config":643},"Status",{"href":644,"dataGaName":645,"dataGaLocation":597},"https://status.gitlab.com/","status",{"text":647,"config":648},"Terms of use",{"href":649,"dataGaName":650,"dataGaLocation":597},"/terms/","terms of use",{"text":652,"config":653},"Privacy statement",{"href":654,"dataGaName":655,"dataGaLocation":597},"/privacy/","privacy statement",{"text":657,"config":658},"Cookie preferences",{"dataGaName":659,"dataGaLocation":597,"id":660,"isOneTrustButton":138},"cookie preferences","ot-sdk-btn",{"title":171,"links":662,"subMenu":676},[663,666,668,670,672,674],{"text":664,"config":665},"Explore the platform",{"href":179,"dataGaName":173,"dataGaLocation":597},{"text":231,"config":667},{"href":233,"dataGaName":234,"dataGaLocation":597},{"text":185,"config":669},{"href":187,"dataGaName":188,"dataGaLocation":597},{"text":236,"config":671},{"href":238,"dataGaName":239,"dataGaLocation":597},{"text":218,"config":673},{"href":220,"dataGaName":221,"dataGaLocation":597},{"text":249,"config":675},{"href":254,"dataGaName":255,"dataGaLocation":597},[677],{"title":678,"links":679},"Topics",[680,684,689,694,699,704,709,714],{"text":185,"config":681},{"href":682,"dataGaName":683,"dataGaLocation":597},"/topics/ci-cd/","cicd",{"text":685,"config":686},"GitOps",{"href":687,"dataGaName":688,"dataGaLocation":597},"/topics/gitops/","gitops",{"text":690,"config":691},"DevOps",{"href":692,"dataGaName":693,"dataGaLocation":597},"/topics/devops/","devops",{"text":695,"config":696},"Version Control",{"href":697,"dataGaName":698,"dataGaLocation":597},"/topics/version-control/","version control",{"text":700,"config":701},"DevSecOps",{"href":702,"dataGaName":703,"dataGaLocation":597},"/topics/devsecops/","devsecops",{"text":705,"config":706},"Cloud Native",{"href":707,"dataGaName":708,"dataGaLocation":597},"/topics/cloud-native/","cloud native",{"text":710,"config":711},"AI for Coding",{"href":712,"dataGaName":713,"dataGaLocation":597},"/topics/devops/ai-for-coding/","ai for coding",{"text":715,"config":716},"Agentic AI",{"href":717,"dataGaName":718,"dataGaLocation":597},"/topics/agentic-ai/","agentic ai",{"title":257,"links":720},[721,724,727,730,733,736,738,740,742,744,746,749,751,754,758,762],{"text":722,"config":723},"DevOps modernization",{"href":272,"dataGaName":273,"dataGaLocation":597},{"text":725,"config":726},"Security modernization",{"href":277,"dataGaName":278,"dataGaLocation":597},{"text":728,"config":729},"AI modernization",{"href":282,"dataGaName":283,"dataGaLocation":597},{"text":731,"config":732},"Financial services",{"href":308,"dataGaName":309,"dataGaLocation":597},{"text":734,"config":735},"Public sector",{"href":313,"dataGaName":314,"dataGaLocation":597},{"text":316,"config":737},{"href":318,"dataGaName":319,"dataGaLocation":597},{"text":321,"config":739},{"href":323,"dataGaName":324,"dataGaLocation":597},{"text":326,"config":741},{"href":328,"dataGaName":329,"dataGaLocation":597},{"text":331,"config":743},{"href":333,"dataGaName":334,"dataGaLocation":597},{"text":288,"config":745},{"href":290,"dataGaName":291,"dataGaLocation":597},{"text":747,"config":748},"Small business",{"href":295,"dataGaName":296,"dataGaLocation":597},{"text":298,"config":750},{"href":300,"dataGaName":301,"dataGaLocation":597},{"text":685,"config":752},{"href":753,"dataGaName":688,"dataGaLocation":597},"/solutions/gitops/",{"text":755,"config":756},"Software composition analysis",{"href":225,"dataGaName":757,"dataGaLocation":597},"software composition analysis",{"text":759,"config":760},"Value stream management",{"href":243,"dataGaName":761,"dataGaLocation":597},"value stream management",{"text":763,"config":764},"All solutions",{"href":264,"dataGaName":765,"dataGaLocation":597},"all solutions",{"title":350,"links":767},[768,773,778,780,782,784,786,788,790,792,794,796,798,800,803],{"text":769,"config":770},"Install",{"href":771,"dataGaName":772,"dataGaLocation":597},"/install/","install",{"text":774,"config":775},"Quick start guides",{"href":776,"dataGaName":777,"dataGaLocation":597},"/get-started/","quick setup checklists",{"text":363,"config":779},{"href":365,"dataGaName":366,"dataGaLocation":597},{"text":368,"config":781},{"href":370,"dataGaName":371,"dataGaLocation":597},{"text":373,"config":783},{"href":375,"dataGaName":376,"dataGaLocation":597},{"text":378,"config":785},{"href":380,"dataGaName":381,"dataGaLocation":597},{"text":383,"config":787},{"href":385,"dataGaName":386,"dataGaLocation":597},{"text":391,"config":789},{"href":393,"dataGaName":394,"dataGaLocation":597},{"text":396,"config":791},{"href":398,"dataGaName":399,"dataGaLocation":597},{"text":401,"config":793},{"href":403,"dataGaName":404,"dataGaLocation":597},{"text":406,"config":795},{"href":408,"dataGaName":409,"dataGaLocation":597},{"text":411,"config":797},{"href":413,"dataGaName":414,"dataGaLocation":597},{"text":473,"config":799},{"href":475,"dataGaName":476,"dataGaLocation":597},{"text":801,"config":802},"What's new",{"href":422,"dataGaName":423,"dataGaLocation":597},{"text":804,"config":805},"All resources",{"href":357,"dataGaName":806,"dataGaLocation":597},"all resources",{"title":425,"links":808},[809,811,813,815,817,819,821,823,825,829,834],{"text":432,"config":810},{"href":434,"dataGaName":126,"dataGaLocation":597},{"text":437,"config":812},{"href":439,"dataGaName":440,"dataGaLocation":597},{"text":443,"config":814},{"href":445,"dataGaName":446,"dataGaLocation":597},{"text":448,"config":816},{"href":450,"dataGaName":451,"dataGaLocation":597},{"text":453,"config":818},{"href":455,"dataGaName":456,"dataGaLocation":597},{"text":458,"config":820},{"href":460,"dataGaName":461,"dataGaLocation":597},{"text":463,"config":822},{"href":465,"dataGaName":466,"dataGaLocation":597},{"text":468,"config":824},{"href":470,"dataGaName":471,"dataGaLocation":597},{"text":826,"config":827},"Sustainability",{"href":828,"dataGaName":826,"dataGaLocation":597},"/sustainability/",{"text":830,"config":831},"Diversity, inclusion and belonging (DIB)",{"href":832,"dataGaName":833,"dataGaLocation":597},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":835,"config":836},"Modern Slavery Transparency Statement",{"href":837,"dataGaName":838,"dataGaLocation":597},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":840},[841,844,847],{"text":842,"config":843},"Terms",{"href":649,"dataGaName":650,"dataGaLocation":597},{"text":845,"config":846},"Cookies",{"dataGaName":659,"dataGaLocation":597,"id":660,"isOneTrustButton":138},{"text":848,"config":849},"Privacy",{"href":654,"dataGaName":655,"dataGaLocation":597},[851],{"id":852,"title":853,"body":130,"config":854,"content":856,"description":130,"extension":860,"meta":861,"navigation":138,"path":862,"seo":863,"stem":864,"__hash__":865},"blogAuthors/en-us/blog/authors/job-van-der-voort.yml","Job Van Der Voort",{"template":855},"BlogAuthor",{"name":7,"config":857},{"headshot":858,"ctfId":859},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Job-van-der-Voort","yml",{},"/en-us/blog/authors/job-van-der-voort",{},"en-us/blog/authors/job-van-der-voort","w8TOn_hGFgQQOv35VnObjxoMM-hviRbwtijFETooJCM",[867,875,882],{"title":868,"description":869,"heroImage":870,"category":126,"date":871,"authors":872,"slug":874,"externalUrl":130},"Why GitLab signed the Open Weights and American AI Leadership letter","GitLab supports customer choice, data privacy, and AI model neutrality, empowering teams to run secure, cost-effective, local solutions.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785333264/ww4mlighwlvvzgnmbe6w.png","2026-07-29",[873],"Bill Staples","open-weight-model-letter",{"title":876,"description":877,"heroImage":878,"category":126,"date":879,"authors":880,"slug":881,"externalUrl":130},"GitLab Act 2","A letter to our customers and our investors.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776362275/ozbwn9tk0dditpnfddlz.png","2026-05-11",[873],"gitlab-act-2",{"title":883,"description":884,"heroImage":885,"category":126,"date":886,"authors":887,"slug":889,"externalUrl":130},"GitLab named a 2026 Omdia Universe Leader","Omdia's 2026 report on AI-assisted software development ranked 19 vendors. Here is what GitLab's top scores mean for engineering teams.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-13",[888],"Rebecca Carter","gitlab-named-a-2026-omdia-universe-leader",{"header":891,"text":892,"button":896,"disclaimer":899},"Start your free\n\n30-day GitLab trial\n",[893,894,895],"GitLab Duo Agent Platform access","Try our most advanced features","Automate complex tasks with AI",{"text":155,"config":897},{"href":898,"dataGaName":158,"dataGaLocation":394},"https://gitlab.com/-/trials/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/blog/","No credit card required.",{"header":901,"blurb":902,"button":903,"secondaryButton":908},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":904,"config":905},"Get your free trial",{"href":906,"dataGaName":158,"dataGaLocation":907},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":635,"config":909},{"href":487,"dataGaName":163,"dataGaLocation":907},1791990482682]