[{"data":1,"prerenderedAt":1026},["ShallowReactive",2],{"/blog/how-we-added-eslint-into-vue":3,"navigation-en-us":239,"banner-en-us":667,"footer-en-us":677,"blog-post-authors-en-us-Filipa Lacerda":922,"blog-related-posts-en-us-how-we-added-eslint-into-vue":936,"blog-promotions-en-us":962,"next-steps-en-us":1016},{"id":4,"title":5,"authors":6,"body":8,"category":211,"date":212,"description":213,"extension":214,"externalUrl":215,"faq":215,"featured":216,"heroImage":217,"meta":218,"navigation":226,"path":227,"seo":228,"slug":232,"stem":233,"tags":234,"template":237,"updatedDate":215,"__hash__":238},"blogPosts/en-us/blog/how-we-added-eslint-into-vue.md","How eslint-plugin-vue improved our code reviews",[7],"Filipa Lacerda",{"type":9,"value":10,"toc":205},"minimark",[11,22,47,62,67,104,141,145,164,171,180,183,186],[12,13,14,15,21],"p",{},"We've (finally) integrated ",[16,17,20],"a",{"href":18,"rel":19},"https://github.com/vuejs/eslint-plugin-vue",[],"eslint-plugin-vue"," successfully into our codebase!",[12,23,24,25,30,31,34,35,40,41,46],{},"When we ",[16,26,29],{"href":27,"rel":28},"https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/5845",[],"added Vue"," to our codebase back in April 2016, ",[16,32,20],{"href":18,"rel":33},[]," did not yet ",[16,36,39],{"href":37,"rel":38},"https://github.com/vuejs/eslint-plugin-vue/commit/6a3a6db540e823b51af1e02950896ac9c2b49219",[],"exist"," and we had not yet started using ",[16,42,45],{"href":43,"rel":44},"https://eslint.org/",[],"eslint"," at all.",[12,48,49,50,55,56,61],{},"One of the things I love the most about GitLab being an open source tool is that anyone can contribute! ",[16,51,54],{"href":52,"rel":53},"https://gitlab.com/winh",[],"Winnie Hellmann",", who has since joined the team, did this amazing work ",[16,57,60],{"href":58,"rel":59},"https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/5445",[],"adding eslint"," as a community contribution. Thanks Winnie! 🙇‍",[63,64,66],"h2",{"id":65},"the-start-of-a-style-guide","The start of a style guide",[12,68,69,70,75,76,75,81,75,86,91,92,97,98,103],{},"As our Vue codebase grew from a few features to quite a large usage (",[16,71,74],{"href":72,"rel":73},"https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/5554",[],"issue boards",", ",[16,77,80],{"href":78,"rel":79},"https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8954",[],"environments",[16,82,85],{"href":83,"rel":84},"https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/7366",[],"cycle analytics",[16,87,90],{"href":88,"rel":89},"https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/10878",[],"pipelines",") we noticed that each of our Vue apps followed a different style. At that time we felt the need to ",[16,93,96],{"href":94,"rel":95},"https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8866",[],"document how to architecture a Vue application"," to ensure a consistent codebase. Once we defined and documented how to use the component system and Flux architecture ",[16,99,102],{"href":100,"rel":101},"https://docs.gitlab.com/development/fe_guide/vue/#vue-architecture",[],"with our codebase",", we noticed that our Vue code also differed in very small things, such as indentation or the order we declared the methods. These inconsistencies, although small, increased the complexity of the review process and for maintaining a healthy codebase.",[12,105,106,107,112,113,75,118,75,123,128,129,134,135,140],{},"With the goal of decreasing the time we spent reviewing Vue code and debating on each of these aspects, and because at the time there wasn't an official Vue style guide, ",[16,108,111],{"href":109,"rel":110},"https://gitlab.com/gitlab-org/gitlab-ce/commit/8c3bdc853a5237a3bef6e26fcf22132db7e8bd9c",[],"we started our own","! You can check out our documentation here. As the Vue community grew, the need for an official style guide and for an eslint plugin for Vue grew with it. Thanks to the wonderful team ",[16,114,117],{"href":115,"rel":116},"https://github.com/michalsnik",[],"Michał Sajnóg",[16,119,122],{"href":120,"rel":121},"https://github.com/mysticatea",[],"Toru Nagashima",[16,124,127],{"href":125,"rel":126},"https://github.com/armano2",[],"Armano"," and ",[16,130,133],{"href":131,"rel":132},"https://github.com/chrisvfritz",[],"Chris Fritz"," leading the development of such a tool, we are now able to use it in production! And we even got to act as source of ",[16,136,139],{"href":137,"rel":138},"https://github.com/vuejs/eslint-plugin-vue/issues/77#issuecomment-315834845",[],"inspiration for the official one"," ❤",[63,142,144],{"id":143},"adding-eslint-vue-plugin","Adding eslint-vue-plugin",[12,146,147,148,153,154,157,158,163],{},"After ",[16,149,152],{"href":150,"rel":151},"https://gitlab.com/gitlab-org/gitlab-ce/issues/34312",[],"waiting a couple of months"," for a stable version of ",[16,155,20],{"href":18,"rel":156},[],", we finally gave it a try once version ",[16,159,162],{"href":160,"rel":161},"https://github.com/vuejs/eslint-plugin-vue/releases/tag/v4.0.0",[],"4.0.0"," was released.",[12,165,166],{},[167,168],"img",{"alt":169,"src":170,"title":169},"EE Conflicts","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782404845/site/Content%20Images/eslint-vue-plugin/eslint-conflicts-team-help.png",[12,172,173],{},[174,175,176],"em",{},[177,178,179],"small",{},"Frontend team working together to resolve all the vue eslint problems",[12,181,182],{},"It took a couple of days to fix all the problems eslint identified in our code, but we were able to successfully add it and thanks to a huge team effort, the second row of conflicts was solved very quickly. Thanks again Luke, Eric, Kushal and José!",[12,184,185],{},"Now our review process is even faster, we don't have to manually check for the style guide rules anymore! 🎉",[12,187,188,193,194,199,200],{},[16,189,192],{"href":190,"rel":191},"https://pixabay.com/en/computer-computer-code-screen-1209641/",[],"Cover image"," by ",[16,195,198],{"href":196,"rel":197},"https://pixabay.com/en/users/Free-Photos-242387/",[],"Free-Photos"," is licensed under ",[16,201,204],{"href":202,"rel":203},"https://creativecommons.org/publicdomain/zero/1.0/",[],"CC0 1.0",{"title":206,"searchDepth":207,"depth":207,"links":208},"",2,[209,210],{"id":65,"depth":207,"text":66},{"id":143,"depth":207,"text":144},"engineering","2018-02-13","A few months ago we felt the need to build a style guide for Vue and now are using eslint-vue-plugin, which is saving us time in our code reviews.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749680227/Blog/Hero%20Images/code_cover_image.jpg",{"excerpt":219},{"type":9,"value":220},[221],[12,222,14,223,21],{},[16,224,20],{"href":18,"rel":225},[],true,"/en-us/blog/how-we-added-eslint-into-vue",{"title":5,"description":213,"ogTitle":5,"ogDescription":213,"noIndex":216,"ogImage":217,"ogUrl":229,"ogSiteName":230,"ogType":231,"canonicalUrls":229},"https://about.gitlab.com/blog/how-we-added-eslint-into-vue","https://about.gitlab.com","article","how-we-added-eslint-into-vue","en-us/blog/how-we-added-eslint-into-vue",[235,236],"inside GitLab","frontend","BlogPost","d4f7NgSA6RSiNfAxBZuK3bFlIYd_njIQx0kG-OwAQGQ",{"logo":240,"freeTrial":245,"sales":250,"login":255,"items":260,"search":587,"minimal":618,"duo":637,"switchNav":646,"pricingDeployment":657},{"config":241},{"href":242,"dataGaName":243,"dataGaLocation":244},"/","gitlab logo","header",{"text":246,"config":247},"Get free trial",{"href":248,"dataGaName":249,"dataGaLocation":244},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":251,"config":252},"Request a demo",{"href":253,"dataGaName":254,"dataGaLocation":244},"/sales/?contact-topic=request-demo","sales",{"text":256,"config":257},"Sign in",{"href":258,"dataGaName":259,"dataGaLocation":244},"https://gitlab.com/users/sign_in/","sign in",[261,290,390,395,509,565],{"text":262,"config":263,"menu":265},"Platform",{"dataNavLevelOne":264},"platform",{"type":266,"columns":267},"cards",[268,274,282],{"title":262,"description":269,"link":270},"The intelligent orchestration platform for DevSecOps",{"text":271,"config":272},"Explore our Platform",{"href":273,"dataGaName":264,"dataGaLocation":244},"/platform/",{"title":275,"description":276,"link":277},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":278,"config":279},"Meet GitLab Duo",{"href":280,"dataGaName":281,"dataGaLocation":244},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":283,"description":284,"link":285},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":286,"config":287},"Learn more",{"href":288,"dataGaName":289,"dataGaLocation":244},"/why-gitlab/","why gitlab",{"text":291,"left":226,"config":292,"menu":294},"Product",{"dataNavLevelOne":293},"solutions",{"type":295,"link":296,"columns":300,"feature":369},"lists",{"text":297,"config":298},"View all Solutions",{"href":299,"dataGaName":293,"dataGaLocation":244},"/solutions/",[301,325,348],{"title":302,"description":303,"link":304,"items":309},"Automation","CI/CD and automation to accelerate deployment",{"config":305},{"icon":306,"href":307,"dataGaName":308,"dataGaLocation":244},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[310,314,317,321],{"text":311,"config":312},"CI/CD",{"href":313,"dataGaLocation":244,"dataGaName":311},"/solutions/continuous-integration/",{"text":275,"config":315},{"href":280,"dataGaLocation":244,"dataGaName":316},"gitlab duo agent platform - product menu",{"text":318,"config":319},"Source Code Management",{"href":320,"dataGaLocation":244,"dataGaName":318},"/solutions/source-code-management/",{"text":322,"config":323},"Automated Software Delivery",{"href":307,"dataGaLocation":244,"dataGaName":324},"Automated software delivery",{"title":326,"description":327,"link":328,"items":333},"Security","Deliver code faster without compromising security",{"config":329},{"href":330,"dataGaName":331,"dataGaLocation":244,"icon":332},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[334,338,343],{"text":335,"config":336},"Application Security Testing",{"href":330,"dataGaName":337,"dataGaLocation":244},"Application security testing",{"text":339,"config":340},"Software Supply Chain Security",{"href":341,"dataGaLocation":244,"dataGaName":342},"/solutions/supply-chain/","Software supply chain security",{"text":344,"config":345},"Software Compliance",{"href":346,"dataGaName":347,"dataGaLocation":244},"/solutions/software-compliance/","software compliance",{"title":349,"link":350,"items":355},"Measurement",{"config":351},{"icon":352,"href":353,"dataGaName":354,"dataGaLocation":244},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[356,360,364],{"text":357,"config":358},"Visibility & Measurement",{"href":353,"dataGaLocation":244,"dataGaName":359},"Visibility and Measurement",{"text":361,"config":362},"Value Stream Management",{"href":363,"dataGaLocation":244,"dataGaName":361},"/solutions/value-stream-management/",{"text":365,"config":366},"Analytics & Insights",{"href":367,"dataGaLocation":244,"dataGaName":368},"/solutions/analytics-and-insights/","Analytics and insights",{"title":370,"type":295,"items":371},"GitLab for",[372,378,384],{"text":373,"config":374},"Enterprise",{"icon":375,"href":376,"dataGaLocation":244,"dataGaName":377},"Building","/enterprise/","enterprise",{"text":379,"config":380},"Small Business",{"icon":381,"href":382,"dataGaLocation":244,"dataGaName":383},"Work","/small-business/","small business",{"text":385,"config":386},"Public Sector",{"icon":387,"href":388,"dataGaLocation":244,"dataGaName":389},"Organization","/solutions/public-sector/","public sector",{"text":391,"config":392},"Pricing",{"href":393,"dataGaName":394,"dataGaLocation":244,"dataNavLevelOne":394},"/pricing/","pricing",{"text":396,"config":397,"menu":399},"Resources",{"dataNavLevelOne":398},"resources",{"type":295,"link":400,"columns":404,"feature":498},{"text":401,"config":402},"View all resources",{"href":403,"dataGaName":398,"dataGaLocation":244},"/resources/",[405,438,465],{"title":406,"items":407},"Getting started",[408,413,418,423,428,433],{"text":409,"config":410},"Install",{"href":411,"dataGaName":412,"dataGaLocation":244},"/install/","install",{"text":414,"config":415},"Quick start guides",{"href":416,"dataGaName":417,"dataGaLocation":244},"/get-started/","quick setup checklists",{"text":419,"config":420},"Learn",{"href":421,"dataGaLocation":244,"dataGaName":422},"https://university.gitlab.com/","learn",{"text":424,"config":425},"Product documentation",{"href":426,"dataGaName":427,"dataGaLocation":244},"https://docs.gitlab.com/","product documentation",{"text":429,"config":430},"Best practice videos",{"href":431,"dataGaName":432,"dataGaLocation":244},"/getting-started-videos/","best practice videos",{"text":434,"config":435},"Integrations",{"href":436,"dataGaName":437,"dataGaLocation":244},"/integrations/","integrations",{"title":439,"items":440},"Discover",[441,446,451,456,460],{"text":442,"config":443},"Customer success stories",{"href":444,"dataGaName":445,"dataGaLocation":244},"/customers/","customer success stories",{"text":447,"config":448},"Blog",{"href":449,"dataGaName":450,"dataGaLocation":244},"/blog/","blog",{"text":452,"config":453},"Demo Hub",{"href":454,"dataGaName":455,"dataGaLocation":244},"/demo-hub/","demo hub",{"text":457,"config":458},"The Source",{"href":459,"dataGaName":450,"dataGaLocation":244},"/the-source/",{"text":461,"config":462},"Remote",{"href":463,"dataGaName":464,"dataGaLocation":244},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":466,"items":467},"Connect",[468,473,478,483,488,493],{"text":469,"config":470},"GitLab Services",{"href":471,"dataGaName":472,"dataGaLocation":244},"/services/","services",{"text":474,"config":475},"Contribute",{"href":476,"dataGaName":477,"dataGaLocation":244},"https://contributors.gitlab.com","contribute",{"text":479,"config":480},"Community",{"href":481,"dataGaName":482,"dataGaLocation":244},"/community/","community",{"text":484,"config":485},"Forum",{"href":486,"dataGaName":487,"dataGaLocation":244},"https://forum.gitlab.com/","forum",{"text":489,"config":490},"Events",{"href":491,"dataGaName":492,"dataGaLocation":244},"/events/","events",{"text":494,"config":495},"Partners",{"href":496,"dataGaName":497,"dataGaLocation":244},"/partners/","partners",{"config":499,"title":502,"text":503,"link":504},{"background":500,"textColor":501},"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":505,"config":506},"Read the latest",{"href":507,"dataGaName":508,"dataGaLocation":244},"/whats-new/","whats new",{"text":510,"config":511,"menu":513},"Company",{"dataNavLevelOne":512},"company",{"type":295,"columns":514},[515],{"items":516},[517,522,528,530,535,540,545,550,555,560],{"text":518,"config":519},"About",{"href":520,"dataGaName":521,"dataGaLocation":244},"/company/","about",{"text":523,"config":524,"footerGa":527},"Jobs",{"href":525,"dataGaName":526,"dataGaLocation":244},"/jobs/","jobs",{"dataGaName":526},{"text":489,"config":529},{"href":491,"dataGaName":492,"dataGaLocation":244},{"text":531,"config":532},"Leadership",{"href":533,"dataGaName":534,"dataGaLocation":244},"/company/team/e-group/","leadership",{"text":536,"config":537},"Handbook",{"href":538,"dataGaName":539,"dataGaLocation":244},"https://handbook.gitlab.com/","handbook",{"text":541,"config":542},"Investor relations",{"href":543,"dataGaName":544,"dataGaLocation":244},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":546,"config":547},"Trust Center",{"href":548,"dataGaName":549,"dataGaLocation":244},"/security/","trust center",{"text":551,"config":552},"AI Transparency Center",{"href":553,"dataGaName":554,"dataGaLocation":244},"/ai-transparency-center/","ai transparency center",{"text":556,"config":557},"Newsletter",{"href":558,"dataGaName":559,"dataGaLocation":244},"/company/contact/#contact-forms","newsletter",{"text":561,"config":562},"Press",{"href":563,"dataGaName":564,"dataGaLocation":244},"/press/","press",{"text":566,"config":567,"menu":568},"Contact us",{"dataNavLevelOne":512},{"type":295,"columns":569},[570],{"items":571},[572,577,582],{"text":573,"config":574},"Talk to sales",{"href":575,"dataGaName":576,"dataGaLocation":244},"/sales/","talk to sales",{"text":578,"config":579},"Support portal",{"href":580,"dataGaName":581,"dataGaLocation":244},"https://support.gitlab.com/hc/en-us","support portal",{"text":583,"config":584},"Customer portal",{"href":585,"dataGaName":586,"dataGaLocation":244},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":588,"login":589,"suggestions":596},"Close",{"text":590,"link":591},"To search repositories and projects, login to",{"text":592,"config":593},"gitlab.com",{"href":258,"dataGaName":594,"dataGaLocation":595},"search login","search",{"text":597,"default":598},"Suggestions",[599,601,605,607,611,615],{"text":275,"config":600},{"href":280,"dataGaName":275,"dataGaLocation":595},{"text":602,"config":603},"Code Suggestions (AI)",{"href":604,"dataGaName":602,"dataGaLocation":595},"/solutions/code-suggestions/",{"text":311,"config":606},{"href":313,"dataGaName":311,"dataGaLocation":595},{"text":608,"config":609},"GitLab on AWS",{"href":610,"dataGaName":608,"dataGaLocation":595},"/partners/technology-partners/aws/",{"text":612,"config":613},"GitLab on Google Cloud",{"href":614,"dataGaName":612,"dataGaLocation":595},"/partners/technology-partners/google-cloud-platform/",{"text":616,"config":617},"Why GitLab?",{"href":288,"dataGaName":616,"dataGaLocation":595},{"freeTrial":619,"mobileIcon":624,"desktopIcon":629,"secondaryButton":632},{"text":620,"config":621},"Start free trial",{"href":622,"dataGaName":249,"dataGaLocation":623},"https://gitlab.com/-/trials/new/","nav",{"altText":625,"config":626},"Gitlab Icon",{"src":627,"dataGaName":628,"dataGaLocation":623},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":625,"config":630},{"src":631,"dataGaName":628,"dataGaLocation":623},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":633,"config":634},"Get Started",{"href":635,"dataGaName":636,"dataGaLocation":623},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":638,"mobileIcon":642,"desktopIcon":644},{"text":639,"config":640},"Learn more about GitLab Duo",{"href":280,"dataGaName":641,"dataGaLocation":623},"gitlab duo",{"altText":625,"config":643},{"src":627,"dataGaName":628,"dataGaLocation":623},{"altText":625,"config":645},{"src":631,"dataGaName":628,"dataGaLocation":623},{"button":647,"mobileIcon":652,"desktopIcon":654},{"text":648,"config":649},"/switch",{"href":650,"dataGaName":651,"dataGaLocation":623},"#contact","switch",{"altText":625,"config":653},{"src":627,"dataGaName":628,"dataGaLocation":623},{"altText":625,"config":655},{"src":656,"dataGaName":628,"dataGaLocation":623},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":658,"mobileIcon":663,"desktopIcon":665},{"text":659,"config":660},"Back to pricing",{"href":393,"dataGaName":661,"dataGaLocation":623,"icon":662},"back to pricing","GoBack",{"altText":625,"config":664},{"src":627,"dataGaName":628,"dataGaLocation":623},{"altText":625,"config":666},{"src":631,"dataGaName":628,"dataGaLocation":623},{"title":668,"titleMobile":669,"button":670,"config":675},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":286,"config":671},{"href":672,"dataGaName":673,"dataGaLocation":674},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":676,"disabled":216},"release",{"data":678},{"text":679,"source":680,"edit":686,"contribute":691,"config":696,"items":701,"minimal":911},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":681,"config":682},"View page source",{"href":683,"dataGaName":684,"dataGaLocation":685},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":687,"config":688},"Edit this page",{"href":689,"dataGaName":690,"dataGaLocation":685},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":692,"config":693},"Please contribute",{"href":694,"dataGaName":695,"dataGaLocation":685},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":697,"facebook":698,"youtube":699,"linkedin":700},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[702,749,803,847,879],{"title":391,"links":703,"subMenu":718},[704,708,713],{"text":705,"config":706},"View plans",{"href":393,"dataGaName":707,"dataGaLocation":685},"view plans",{"text":709,"config":710},"Why Premium?",{"href":711,"dataGaName":712,"dataGaLocation":685},"/pricing/premium/","why premium",{"text":714,"config":715},"Why Ultimate?",{"href":716,"dataGaName":717,"dataGaLocation":685},"/pricing/ultimate/","why ultimate",[719],{"title":720,"links":721},"Contact Us",[722,725,727,729,734,739,744],{"text":723,"config":724},"Contact sales",{"href":575,"dataGaName":254,"dataGaLocation":685},{"text":578,"config":726},{"href":580,"dataGaName":581,"dataGaLocation":685},{"text":583,"config":728},{"href":585,"dataGaName":586,"dataGaLocation":685},{"text":730,"config":731},"Status",{"href":732,"dataGaName":733,"dataGaLocation":685},"https://status.gitlab.com/","status",{"text":735,"config":736},"Terms of use",{"href":737,"dataGaName":738,"dataGaLocation":685},"/terms/","terms of use",{"text":740,"config":741},"Privacy statement",{"href":742,"dataGaName":743,"dataGaLocation":685},"/privacy/","privacy statement",{"text":745,"config":746},"Cookie preferences",{"dataGaName":747,"dataGaLocation":685,"id":748,"isOneTrustButton":226},"cookie preferences","ot-sdk-btn",{"title":291,"links":750,"subMenu":759},[751,755],{"text":752,"config":753},"DevSecOps platform",{"href":273,"dataGaName":754,"dataGaLocation":685},"devsecops platform",{"text":756,"config":757},"AI-Assisted Development",{"href":280,"dataGaName":758,"dataGaLocation":685},"ai-assisted development",[760],{"title":761,"links":762},"Topics",[763,768,773,778,783,788,793,798],{"text":764,"config":765},"CICD",{"href":766,"dataGaName":767,"dataGaLocation":685},"/topics/ci-cd/","cicd",{"text":769,"config":770},"GitOps",{"href":771,"dataGaName":772,"dataGaLocation":685},"/topics/gitops/","gitops",{"text":774,"config":775},"DevOps",{"href":776,"dataGaName":777,"dataGaLocation":685},"/topics/devops/","devops",{"text":779,"config":780},"Version Control",{"href":781,"dataGaName":782,"dataGaLocation":685},"/topics/version-control/","version control",{"text":784,"config":785},"DevSecOps",{"href":786,"dataGaName":787,"dataGaLocation":685},"/topics/devsecops/","devsecops",{"text":789,"config":790},"Cloud Native",{"href":791,"dataGaName":792,"dataGaLocation":685},"/topics/cloud-native/","cloud native",{"text":794,"config":795},"AI for Coding",{"href":796,"dataGaName":797,"dataGaLocation":685},"/topics/devops/ai-for-coding/","ai for coding",{"text":799,"config":800},"Agentic AI",{"href":801,"dataGaName":802,"dataGaLocation":685},"/topics/agentic-ai/","agentic ai",{"title":804,"links":805},"Solutions",[806,808,810,815,819,822,826,829,831,834,837,842],{"text":335,"config":807},{"href":330,"dataGaName":335,"dataGaLocation":685},{"text":324,"config":809},{"href":307,"dataGaName":308,"dataGaLocation":685},{"text":811,"config":812},"Agile development",{"href":813,"dataGaName":814,"dataGaLocation":685},"/solutions/agile-delivery/","agile delivery",{"text":816,"config":817},"SCM",{"href":320,"dataGaName":818,"dataGaLocation":685},"source code management",{"text":764,"config":820},{"href":313,"dataGaName":821,"dataGaLocation":685},"continuous integration & delivery",{"text":823,"config":824},"Value stream management",{"href":363,"dataGaName":825,"dataGaLocation":685},"value stream management",{"text":769,"config":827},{"href":828,"dataGaName":772,"dataGaLocation":685},"/solutions/gitops/",{"text":373,"config":830},{"href":376,"dataGaName":377,"dataGaLocation":685},{"text":832,"config":833},"Small business",{"href":382,"dataGaName":383,"dataGaLocation":685},{"text":835,"config":836},"Public sector",{"href":388,"dataGaName":389,"dataGaLocation":685},{"text":838,"config":839},"Education",{"href":840,"dataGaName":841,"dataGaLocation":685},"/solutions/education/","education",{"text":843,"config":844},"Financial services",{"href":845,"dataGaName":846,"dataGaLocation":685},"/solutions/finance/","financial services",{"title":396,"links":848},[849,851,853,855,858,860,863,865,867,869,871,873,875,877],{"text":409,"config":850},{"href":411,"dataGaName":412,"dataGaLocation":685},{"text":414,"config":852},{"href":416,"dataGaName":417,"dataGaLocation":685},{"text":419,"config":854},{"href":421,"dataGaName":422,"dataGaLocation":685},{"text":424,"config":856},{"href":426,"dataGaName":857,"dataGaLocation":685},"docs",{"text":447,"config":859},{"href":449,"dataGaName":450,"dataGaLocation":685},{"text":861,"config":862},"What's new",{"href":507,"dataGaName":508,"dataGaLocation":685},{"text":442,"config":864},{"href":444,"dataGaName":445,"dataGaLocation":685},{"text":461,"config":866},{"href":463,"dataGaName":464,"dataGaLocation":685},{"text":469,"config":868},{"href":471,"dataGaName":472,"dataGaLocation":685},{"text":474,"config":870},{"href":476,"dataGaName":477,"dataGaLocation":685},{"text":479,"config":872},{"href":481,"dataGaName":482,"dataGaLocation":685},{"text":484,"config":874},{"href":486,"dataGaName":487,"dataGaLocation":685},{"text":489,"config":876},{"href":491,"dataGaName":492,"dataGaLocation":685},{"text":494,"config":878},{"href":496,"dataGaName":497,"dataGaLocation":685},{"title":510,"links":880},[881,883,885,887,889,891,895,900,902,904,906],{"text":518,"config":882},{"href":520,"dataGaName":512,"dataGaLocation":685},{"text":523,"config":884},{"href":525,"dataGaName":526,"dataGaLocation":685},{"text":531,"config":886},{"href":533,"dataGaName":534,"dataGaLocation":685},{"text":536,"config":888},{"href":538,"dataGaName":539,"dataGaLocation":685},{"text":541,"config":890},{"href":543,"dataGaName":544,"dataGaLocation":685},{"text":892,"config":893},"Sustainability",{"href":894,"dataGaName":892,"dataGaLocation":685},"/sustainability/",{"text":896,"config":897},"Diversity, inclusion and belonging (DIB)",{"href":898,"dataGaName":899,"dataGaLocation":685},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":546,"config":901},{"href":548,"dataGaName":549,"dataGaLocation":685},{"text":556,"config":903},{"href":558,"dataGaName":559,"dataGaLocation":685},{"text":561,"config":905},{"href":563,"dataGaName":564,"dataGaLocation":685},{"text":907,"config":908},"Modern Slavery Transparency Statement",{"href":909,"dataGaName":910,"dataGaLocation":685},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":912},[913,916,919],{"text":914,"config":915},"Terms",{"href":737,"dataGaName":738,"dataGaLocation":685},{"text":917,"config":918},"Cookies",{"dataGaName":747,"dataGaLocation":685,"id":748,"isOneTrustButton":226},{"text":920,"config":921},"Privacy",{"href":742,"dataGaName":743,"dataGaLocation":685},[923],{"id":924,"title":7,"body":215,"config":925,"content":927,"description":215,"extension":930,"meta":931,"navigation":226,"path":932,"seo":933,"stem":934,"__hash__":935},"blogAuthors/en-us/blog/authors/filipa-lacerda.yml",{"template":926},"BlogAuthor",{"name":7,"config":928},{"headshot":206,"ctfId":929},"filipa","yml",{},"/en-us/blog/authors/filipa-lacerda",{},"en-us/blog/authors/filipa-lacerda","PJOnqPRcISHrOS1QcKT87stWcDtc8CpBxLaJ95gzJ0Y",[937,946,954],{"title":938,"description":939,"heroImage":940,"category":211,"date":941,"authors":942,"slug":945,"externalUrl":215},"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",[943,944],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":947,"description":948,"heroImage":949,"category":211,"date":950,"authors":951,"slug":953,"externalUrl":215},"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",[952],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":955,"description":956,"heroImage":957,"category":211,"date":958,"authors":959,"slug":961,"externalUrl":215},"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",[960],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":963},[964,978,990,1002],{"id":965,"categories":966,"header":968,"text":969,"button":970,"image":975},"ai-modernization",[967],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":971,"config":972},"Get your AI maturity score",{"href":973,"dataGaName":974,"dataGaLocation":450},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":976},{"src":977},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":979,"categories":980,"header":982,"text":969,"button":983,"image":987},"devops-modernization",[981,787],"product","Are you just managing tools or shipping innovation?",{"text":984,"config":985},"Get your DevOps maturity score",{"href":986,"dataGaName":974,"dataGaLocation":450},"/assessments/devops-modernization-assessment/",{"config":988},{"src":989},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":991,"categories":992,"header":994,"text":969,"button":995,"image":999},"security-modernization",[993],"security","Are you trading speed for security?",{"text":996,"config":997},"Get your security maturity score",{"href":998,"dataGaName":974,"dataGaLocation":450},"/assessments/security-modernization-assessment/",{"config":1000},{"src":1001},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1003,"paths":1004,"header":1007,"text":1008,"button":1009,"image":1014},"github-azure-migration",[1005,1006],"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":1010,"config":1011},"See how GitLab compares to GitHub",{"href":1012,"dataGaName":1013,"dataGaLocation":450},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1015},{"src":989},{"header":1017,"blurb":1018,"button":1019,"secondaryButton":1024},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1020,"config":1021},"Get your free trial",{"href":1022,"dataGaName":249,"dataGaLocation":1023},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":723,"config":1025},{"href":575,"dataGaName":254,"dataGaLocation":1023},1786803770204]