[{"data":1,"prerenderedAt":977},["ShallowReactive",2],{"/blog/merge-trains-explained":3,"navigation-en-us":190,"banner-en-us":618,"footer-en-us":628,"blog-post-authors-en-us-Veethika Mishra":872,"blog-related-posts-en-us-merge-trains-explained":887,"blog-promotions-en-us":913,"next-steps-en-us":967},{"id":4,"title":5,"authors":6,"body":8,"category":166,"date":167,"description":168,"extension":169,"externalUrl":170,"faq":170,"featured":171,"heroImage":172,"meta":173,"navigation":174,"path":175,"seo":176,"slug":180,"stem":181,"tags":182,"template":188,"updatedDate":170,"__hash__":189},"blogPosts/en-us/blog/merge-trains-explained.md","How to use merge train pipelines with GitLab",[7],"Veethika Mishra",{"type":9,"value":10,"toc":157},"minimark",[11,15,30,33,38,51,58,63,66,79,85,94,97,101,104,118,121,126,129,132,137,140,149],[12,13,14],"p",{},"This blog post was originally published on the GitLab Unfiltered blog. It was reviewed and republished on 2021-01-20.",[12,16,17,23,24,29],{},[18,19,22],"a",{"href":20,"rel":21},"https://docs.gitlab.com/ci/pipelines/merge_trains/",[],"Merge trains"," is a powerful GitLab feature that empowers users to harness the potential of ",[18,25,28],{"href":26,"rel":27},"https://docs.gitlab.com/ci/pipelines/merge_request_pipelines/",[],"pipelines for merge results"," to the fullest and also automatically merge a series of (queued) merge requests (MRs) without breaking the target branch. However, due to the structural complexity of the concept, users are often unable to use it effectively for their projects and play it safe by restricting their usage to MRs that pose minimum or no conflict with the target branch.",[12,31,32],{},"As a senior product designer for Continuous Integration (CI), I often deconstruct certain concepts and logic for features related to CI so that I have a strong foundation of understanding when making design proposals. Recently, I had a chance to hold a discussion around a very interesting feature - merge trains — with the team. This post unpacks the concept of merge trains by explaining the difference between merge trains, pipelines for MRs, and pipelines for merge results.",[34,35,37],"h2",{"id":36},"pipelines-for-merge-requests","Pipelines for merge requests",[12,39,40,41,45,46,50],{},"Generally, when a new merge request is created, a pipeline runs to check if the new changes are eligible to be merged to the target branch. This is called the pipeline for merge requests (MRs). A good practice is to only keep the necessary jobs for validating the changes at this step, so the pipeline doesn’t take a long time to complete and CI minutes are not overused. GitLab allows users to ",[18,42,44],{"href":26,"rel":43},[],"configure the pipeline for MRs"," by adding ",[47,48,49],"code",{},"rules:if: $CI_MERGE_REQUEST_IID"," to the jobs they wish to run for MRs.",[12,52,53],{},[54,55],"img",{"alt":56,"src":57},"Pipeline for merge request","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398653/blog/Content%20Images/merge-train-explained-pipeline-for-merge-requests.jpg",[59,60,62],"h3",{"id":61},"pipelines-for-merge-results","Pipelines for merge results",[12,64,65],{},"Merge request pipelines verify the branch in isolation. The target branch may change several times during the lifetime of the MR, and these changes are not taken into consideration. In the time during which the pipeline for the MR runs (and succeeds), if the target branch progresses in the background and a user merges the changes to the target branch, they might eventually end up with a broken target.",[12,67,68,69,73,74,78],{},"When a ",[18,70,72],{"href":26,"rel":71},[],"pipeline for merge results"," runs, GitLab CI performs a ",[75,76,77],"em",{},"pretend"," merge against the updated target branch by creating a commit on an internal ref from the source branch, and then runs a pipeline against it. This pipeline validates the result prior to merging, therefore increasing the chances of keeping the target branch green.",[12,80,81],{},[54,82],{"alt":83,"src":84},"Pipeline for merge results","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398655/blog/Content%20Images/merge-train-explained-pipeline-for-merge-results.jpg",[12,86,87,88,93],{},"We should keep in mind that this pipeline does not run automatically with every update to the target branch. To learn more about this feature in detail and understand the process of enabling it in your GitLab instance, you can refer to the ",[18,89,92],{"href":90,"rel":91},"https://docs.gitlab.com/ci/pipelines/merged_results_pipelines/",[],"official documentation on merge results",".",[12,95,96],{},"However, if a long time has passed since the last successful pipeline ran, by the time the MR is ready to be merged, the target branch may have already changed and advanced. If we go ahead and merge your MR without re-running the pipeline for MRs, we could end up with a broken target branch. Merge trains can prevent this from happening.",[59,98,100],{"id":99},"about-merge-trains","About merge trains",[12,102,103],{},"Pipeline for merge results is an extremely useful feature in itself, but tracking the right slot to merge the feature branch into the target and remembering to run the pipeline manually before doing so is a lot to expect from a developer buried in tasks that involve deep logical thinking.",[12,105,106,107,111,112,117],{},"To tackle this complexity in workflow, GitLab introduced ",[18,108,110],{"href":20,"rel":109},[],"the merge trains feature"," in ",[18,113,116],{"href":114,"rel":115},"https://docs.gitlab.com/releases/#sequential-merge-trains",[],"GitLab Premium 12.0",". Merge trains allow users to capitalize on the capabilities of pipelines for merge results to automate the process of merging to the target branch with minimum chances of breaking it.",[12,119,120],{},"With merge trains enabled, a merge request can be added to the train, which takes care of it until merged.\nA merge train can be imagined as a queue of MRs that is automatically managed for you.",[122,123,125],"h4",{"id":124},"how-do-merge-trains-work","How do merge trains work?",[12,127,128],{},"When users queue up their MRs in a merge train, GitLab performs a pretend merge for each source branch on top of the previous branch in the queue, where the first branch on the train is merged against the target branch.\nBy creating a temporary commit for each of these merges, GitLab can run merged result pipelines.\nThe first MR in the queue, after having a successful pipeline run for MRs, gets merged to the target branch.",[12,130,131],{},"Every time a merge request is merged into the target branch, the pipelines for the newly added MRs in the train would run against the target branch and the newly added changes from the recently merged MR and changes that are from MRs already in the train.",[12,133,134],{},[54,135],{"alt":83,"src":136},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398655/blog/Content%20Images/merge-train-explained-working.gif",[12,138,139],{},"Merge trains carry an immense possibility for innovation with GitLab as a toolchain. But to be able to build upon the concept, it is imperative to have a holistic understanding of the same at the system level.",[12,141,142,143,148],{},"Hopefully, this post does the job of breaking down the concept into layman's terms, thereby opening doors for future collaboration within ",[18,144,147],{"href":145,"rel":146},"https://handbook.gitlab.com/handbook/product/categories/",[],"stage groups"," at GitLab.",[12,150,151,152,93],{},"Have suggestions around improving merge trains? please leave your thoughts on this ",[18,153,156],{"href":154,"rel":155},"https://gitlab.com/groups/gitlab-org/-/epics/5122",[],"epic",{"title":158,"searchDepth":159,"depth":159,"links":160},"",2,[161],{"id":36,"depth":159,"text":37,"children":162},[163,165],{"id":61,"depth":164,"text":62},3,{"id":99,"depth":164,"text":100},"engineering","2020-12-14","Read here an introduction on what merge trains are, how to use them and how to incorporate them to your GitLab project.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749667210/Blog/Hero%20Images/merge-train-explained-banner.jpg",{},true,"/en-us/blog/merge-trains-explained",{"title":5,"description":168,"ogTitle":5,"ogDescription":168,"noIndex":171,"ogImage":172,"ogUrl":177,"ogSiteName":178,"ogType":179,"canonicalUrls":177},"https://about.gitlab.com/blog/merge-trains-explained","https://about.gitlab.com","article","merge-trains-explained","en-us/blog/merge-trains-explained",[183,184,185,186,187],"CI","CD","features","DevOps","inside GitLab","BlogPost","lt1nzKQrD6UrguokchzO51mUAw2e0SQs5JdAiGx4xKE",{"logo":191,"freeTrial":196,"sales":201,"login":206,"items":211,"search":538,"minimal":569,"duo":588,"switchNav":597,"pricingDeployment":608},{"config":192},{"href":193,"dataGaName":194,"dataGaLocation":195},"/","gitlab logo","header",{"text":197,"config":198},"Get free trial",{"href":199,"dataGaName":200,"dataGaLocation":195},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":202,"config":203},"Request a demo",{"href":204,"dataGaName":205,"dataGaLocation":195},"/sales/?contact-topic=request-demo","sales",{"text":207,"config":208},"Sign in",{"href":209,"dataGaName":210,"dataGaLocation":195},"https://gitlab.com/users/sign_in/","sign in",[212,241,341,346,460,516],{"text":213,"config":214,"menu":216},"Platform",{"dataNavLevelOne":215},"platform",{"type":217,"columns":218},"cards",[219,225,233],{"title":213,"description":220,"link":221},"The intelligent orchestration platform for DevSecOps",{"text":222,"config":223},"Explore our Platform",{"href":224,"dataGaName":215,"dataGaLocation":195},"/platform/",{"title":226,"description":227,"link":228},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":229,"config":230},"Meet GitLab Duo",{"href":231,"dataGaName":232,"dataGaLocation":195},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":234,"description":235,"link":236},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":237,"config":238},"Learn more",{"href":239,"dataGaName":240,"dataGaLocation":195},"/why-gitlab/","why gitlab",{"text":242,"left":174,"config":243,"menu":245},"Product",{"dataNavLevelOne":244},"solutions",{"type":246,"link":247,"columns":251,"feature":320},"lists",{"text":248,"config":249},"View all Solutions",{"href":250,"dataGaName":244,"dataGaLocation":195},"/solutions/",[252,276,299],{"title":253,"description":254,"link":255,"items":260},"Automation","CI/CD and automation to accelerate deployment",{"config":256},{"icon":257,"href":258,"dataGaName":259,"dataGaLocation":195},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[261,265,268,272],{"text":262,"config":263},"CI/CD",{"href":264,"dataGaLocation":195,"dataGaName":262},"/solutions/continuous-integration/",{"text":226,"config":266},{"href":231,"dataGaLocation":195,"dataGaName":267},"gitlab duo agent platform - product menu",{"text":269,"config":270},"Source Code Management",{"href":271,"dataGaLocation":195,"dataGaName":269},"/solutions/source-code-management/",{"text":273,"config":274},"Automated Software Delivery",{"href":258,"dataGaLocation":195,"dataGaName":275},"Automated software delivery",{"title":277,"description":278,"link":279,"items":284},"Security","Deliver code faster without compromising security",{"config":280},{"href":281,"dataGaName":282,"dataGaLocation":195,"icon":283},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[285,289,294],{"text":286,"config":287},"Application Security Testing",{"href":281,"dataGaName":288,"dataGaLocation":195},"Application security testing",{"text":290,"config":291},"Software Supply Chain Security",{"href":292,"dataGaLocation":195,"dataGaName":293},"/solutions/supply-chain/","Software supply chain security",{"text":295,"config":296},"Software Compliance",{"href":297,"dataGaName":298,"dataGaLocation":195},"/solutions/software-compliance/","software compliance",{"title":300,"link":301,"items":306},"Measurement",{"config":302},{"icon":303,"href":304,"dataGaName":305,"dataGaLocation":195},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[307,311,315],{"text":308,"config":309},"Visibility & Measurement",{"href":304,"dataGaLocation":195,"dataGaName":310},"Visibility and Measurement",{"text":312,"config":313},"Value Stream Management",{"href":314,"dataGaLocation":195,"dataGaName":312},"/solutions/value-stream-management/",{"text":316,"config":317},"Analytics & Insights",{"href":318,"dataGaLocation":195,"dataGaName":319},"/solutions/analytics-and-insights/","Analytics and insights",{"title":321,"type":246,"items":322},"GitLab for",[323,329,335],{"text":324,"config":325},"Enterprise",{"icon":326,"href":327,"dataGaLocation":195,"dataGaName":328},"Building","/enterprise/","enterprise",{"text":330,"config":331},"Small Business",{"icon":332,"href":333,"dataGaLocation":195,"dataGaName":334},"Work","/small-business/","small business",{"text":336,"config":337},"Public Sector",{"icon":338,"href":339,"dataGaLocation":195,"dataGaName":340},"Organization","/solutions/public-sector/","public sector",{"text":342,"config":343},"Pricing",{"href":344,"dataGaName":345,"dataGaLocation":195,"dataNavLevelOne":345},"/pricing/","pricing",{"text":347,"config":348,"menu":350},"Resources",{"dataNavLevelOne":349},"resources",{"type":246,"link":351,"columns":355,"feature":449},{"text":352,"config":353},"View all resources",{"href":354,"dataGaName":349,"dataGaLocation":195},"/resources/",[356,389,416],{"title":357,"items":358},"Getting started",[359,364,369,374,379,384],{"text":360,"config":361},"Install",{"href":362,"dataGaName":363,"dataGaLocation":195},"/install/","install",{"text":365,"config":366},"Quick start guides",{"href":367,"dataGaName":368,"dataGaLocation":195},"/get-started/","quick setup checklists",{"text":370,"config":371},"Learn",{"href":372,"dataGaLocation":195,"dataGaName":373},"https://university.gitlab.com/","learn",{"text":375,"config":376},"Product documentation",{"href":377,"dataGaName":378,"dataGaLocation":195},"https://docs.gitlab.com/","product documentation",{"text":380,"config":381},"Best practice videos",{"href":382,"dataGaName":383,"dataGaLocation":195},"/getting-started-videos/","best practice videos",{"text":385,"config":386},"Integrations",{"href":387,"dataGaName":388,"dataGaLocation":195},"/integrations/","integrations",{"title":390,"items":391},"Discover",[392,397,402,407,411],{"text":393,"config":394},"Customer success stories",{"href":395,"dataGaName":396,"dataGaLocation":195},"/customers/","customer success stories",{"text":398,"config":399},"Blog",{"href":400,"dataGaName":401,"dataGaLocation":195},"/blog/","blog",{"text":403,"config":404},"Demo Hub",{"href":405,"dataGaName":406,"dataGaLocation":195},"/demo-hub/","demo hub",{"text":408,"config":409},"The Source",{"href":410,"dataGaName":401,"dataGaLocation":195},"/the-source/",{"text":412,"config":413},"Remote",{"href":414,"dataGaName":415,"dataGaLocation":195},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":417,"items":418},"Connect",[419,424,429,434,439,444],{"text":420,"config":421},"GitLab Services",{"href":422,"dataGaName":423,"dataGaLocation":195},"/services/","services",{"text":425,"config":426},"Contribute",{"href":427,"dataGaName":428,"dataGaLocation":195},"https://contributors.gitlab.com","contribute",{"text":430,"config":431},"Community",{"href":432,"dataGaName":433,"dataGaLocation":195},"/community/","community",{"text":435,"config":436},"Forum",{"href":437,"dataGaName":438,"dataGaLocation":195},"https://forum.gitlab.com/","forum",{"text":440,"config":441},"Events",{"href":442,"dataGaName":443,"dataGaLocation":195},"/events/","events",{"text":445,"config":446},"Partners",{"href":447,"dataGaName":448,"dataGaLocation":195},"/partners/","partners",{"config":450,"title":453,"text":454,"link":455},{"background":451,"textColor":452},"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":456,"config":457},"Read the latest",{"href":458,"dataGaName":459,"dataGaLocation":195},"/whats-new/","whats new",{"text":461,"config":462,"menu":464},"Company",{"dataNavLevelOne":463},"company",{"type":246,"columns":465},[466],{"items":467},[468,473,479,481,486,491,496,501,506,511],{"text":469,"config":470},"About",{"href":471,"dataGaName":472,"dataGaLocation":195},"/company/","about",{"text":474,"config":475,"footerGa":478},"Jobs",{"href":476,"dataGaName":477,"dataGaLocation":195},"/jobs/","jobs",{"dataGaName":477},{"text":440,"config":480},{"href":442,"dataGaName":443,"dataGaLocation":195},{"text":482,"config":483},"Leadership",{"href":484,"dataGaName":485,"dataGaLocation":195},"/company/team/e-group/","leadership",{"text":487,"config":488},"Handbook",{"href":489,"dataGaName":490,"dataGaLocation":195},"https://handbook.gitlab.com/","handbook",{"text":492,"config":493},"Investor relations",{"href":494,"dataGaName":495,"dataGaLocation":195},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":497,"config":498},"Trust Center",{"href":499,"dataGaName":500,"dataGaLocation":195},"/security/","trust center",{"text":502,"config":503},"AI Transparency Center",{"href":504,"dataGaName":505,"dataGaLocation":195},"/ai-transparency-center/","ai transparency center",{"text":507,"config":508},"Newsletter",{"href":509,"dataGaName":510,"dataGaLocation":195},"/company/contact/#contact-forms","newsletter",{"text":512,"config":513},"Press",{"href":514,"dataGaName":515,"dataGaLocation":195},"/press/","press",{"text":517,"config":518,"menu":519},"Contact us",{"dataNavLevelOne":463},{"type":246,"columns":520},[521],{"items":522},[523,528,533],{"text":524,"config":525},"Talk to sales",{"href":526,"dataGaName":527,"dataGaLocation":195},"/sales/","talk to sales",{"text":529,"config":530},"Support portal",{"href":531,"dataGaName":532,"dataGaLocation":195},"https://support.gitlab.com/hc/en-us","support portal",{"text":534,"config":535},"Customer portal",{"href":536,"dataGaName":537,"dataGaLocation":195},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":539,"login":540,"suggestions":547},"Close",{"text":541,"link":542},"To search repositories and projects, login to",{"text":543,"config":544},"gitlab.com",{"href":209,"dataGaName":545,"dataGaLocation":546},"search login","search",{"text":548,"default":549},"Suggestions",[550,552,556,558,562,566],{"text":226,"config":551},{"href":231,"dataGaName":226,"dataGaLocation":546},{"text":553,"config":554},"Code Suggestions (AI)",{"href":555,"dataGaName":553,"dataGaLocation":546},"/solutions/code-suggestions/",{"text":262,"config":557},{"href":264,"dataGaName":262,"dataGaLocation":546},{"text":559,"config":560},"GitLab on AWS",{"href":561,"dataGaName":559,"dataGaLocation":546},"/partners/technology-partners/aws/",{"text":563,"config":564},"GitLab on Google Cloud",{"href":565,"dataGaName":563,"dataGaLocation":546},"/partners/technology-partners/google-cloud-platform/",{"text":567,"config":568},"Why GitLab?",{"href":239,"dataGaName":567,"dataGaLocation":546},{"freeTrial":570,"mobileIcon":575,"desktopIcon":580,"secondaryButton":583},{"text":571,"config":572},"Start free trial",{"href":573,"dataGaName":200,"dataGaLocation":574},"https://gitlab.com/-/trials/new/","nav",{"altText":576,"config":577},"Gitlab Icon",{"src":578,"dataGaName":579,"dataGaLocation":574},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":576,"config":581},{"src":582,"dataGaName":579,"dataGaLocation":574},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":584,"config":585},"Get Started",{"href":586,"dataGaName":587,"dataGaLocation":574},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":589,"mobileIcon":593,"desktopIcon":595},{"text":590,"config":591},"Learn more about GitLab Duo",{"href":231,"dataGaName":592,"dataGaLocation":574},"gitlab duo",{"altText":576,"config":594},{"src":578,"dataGaName":579,"dataGaLocation":574},{"altText":576,"config":596},{"src":582,"dataGaName":579,"dataGaLocation":574},{"button":598,"mobileIcon":603,"desktopIcon":605},{"text":599,"config":600},"/switch",{"href":601,"dataGaName":602,"dataGaLocation":574},"#contact","switch",{"altText":576,"config":604},{"src":578,"dataGaName":579,"dataGaLocation":574},{"altText":576,"config":606},{"src":607,"dataGaName":579,"dataGaLocation":574},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":609,"mobileIcon":614,"desktopIcon":616},{"text":610,"config":611},"Back to pricing",{"href":344,"dataGaName":612,"dataGaLocation":574,"icon":613},"back to pricing","GoBack",{"altText":576,"config":615},{"src":578,"dataGaName":579,"dataGaLocation":574},{"altText":576,"config":617},{"src":582,"dataGaName":579,"dataGaLocation":574},{"title":619,"titleMobile":620,"button":621,"config":626},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":237,"config":622},{"href":623,"dataGaName":624,"dataGaLocation":625},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":627,"disabled":171},"release",{"data":629},{"text":630,"source":631,"edit":637,"contribute":642,"config":647,"items":652,"minimal":861},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":632,"config":633},"View page source",{"href":634,"dataGaName":635,"dataGaLocation":636},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":638,"config":639},"Edit this page",{"href":640,"dataGaName":641,"dataGaLocation":636},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":643,"config":644},"Please contribute",{"href":645,"dataGaName":646,"dataGaLocation":636},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":648,"facebook":649,"youtube":650,"linkedin":651},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[653,700,753,797,829],{"title":342,"links":654,"subMenu":669},[655,659,664],{"text":656,"config":657},"View plans",{"href":344,"dataGaName":658,"dataGaLocation":636},"view plans",{"text":660,"config":661},"Why Premium?",{"href":662,"dataGaName":663,"dataGaLocation":636},"/pricing/premium/","why premium",{"text":665,"config":666},"Why Ultimate?",{"href":667,"dataGaName":668,"dataGaLocation":636},"/pricing/ultimate/","why ultimate",[670],{"title":671,"links":672},"Contact Us",[673,676,678,680,685,690,695],{"text":674,"config":675},"Contact sales",{"href":526,"dataGaName":205,"dataGaLocation":636},{"text":529,"config":677},{"href":531,"dataGaName":532,"dataGaLocation":636},{"text":534,"config":679},{"href":536,"dataGaName":537,"dataGaLocation":636},{"text":681,"config":682},"Status",{"href":683,"dataGaName":684,"dataGaLocation":636},"https://status.gitlab.com/","status",{"text":686,"config":687},"Terms of use",{"href":688,"dataGaName":689,"dataGaLocation":636},"/terms/","terms of use",{"text":691,"config":692},"Privacy statement",{"href":693,"dataGaName":694,"dataGaLocation":636},"/privacy/","privacy statement",{"text":696,"config":697},"Cookie preferences",{"dataGaName":698,"dataGaLocation":636,"id":699,"isOneTrustButton":174},"cookie preferences","ot-sdk-btn",{"title":242,"links":701,"subMenu":710},[702,706],{"text":703,"config":704},"DevSecOps platform",{"href":224,"dataGaName":705,"dataGaLocation":636},"devsecops platform",{"text":707,"config":708},"AI-Assisted Development",{"href":231,"dataGaName":709,"dataGaLocation":636},"ai-assisted development",[711],{"title":712,"links":713},"Topics",[714,719,724,728,733,738,743,748],{"text":715,"config":716},"CICD",{"href":717,"dataGaName":718,"dataGaLocation":636},"/topics/ci-cd/","cicd",{"text":720,"config":721},"GitOps",{"href":722,"dataGaName":723,"dataGaLocation":636},"/topics/gitops/","gitops",{"text":186,"config":725},{"href":726,"dataGaName":727,"dataGaLocation":636},"/topics/devops/","devops",{"text":729,"config":730},"Version Control",{"href":731,"dataGaName":732,"dataGaLocation":636},"/topics/version-control/","version control",{"text":734,"config":735},"DevSecOps",{"href":736,"dataGaName":737,"dataGaLocation":636},"/topics/devsecops/","devsecops",{"text":739,"config":740},"Cloud Native",{"href":741,"dataGaName":742,"dataGaLocation":636},"/topics/cloud-native/","cloud native",{"text":744,"config":745},"AI for Coding",{"href":746,"dataGaName":747,"dataGaLocation":636},"/topics/devops/ai-for-coding/","ai for coding",{"text":749,"config":750},"Agentic AI",{"href":751,"dataGaName":752,"dataGaLocation":636},"/topics/agentic-ai/","agentic ai",{"title":754,"links":755},"Solutions",[756,758,760,765,769,772,776,779,781,784,787,792],{"text":286,"config":757},{"href":281,"dataGaName":286,"dataGaLocation":636},{"text":275,"config":759},{"href":258,"dataGaName":259,"dataGaLocation":636},{"text":761,"config":762},"Agile development",{"href":763,"dataGaName":764,"dataGaLocation":636},"/solutions/agile-delivery/","agile delivery",{"text":766,"config":767},"SCM",{"href":271,"dataGaName":768,"dataGaLocation":636},"source code management",{"text":715,"config":770},{"href":264,"dataGaName":771,"dataGaLocation":636},"continuous integration & delivery",{"text":773,"config":774},"Value stream management",{"href":314,"dataGaName":775,"dataGaLocation":636},"value stream management",{"text":720,"config":777},{"href":778,"dataGaName":723,"dataGaLocation":636},"/solutions/gitops/",{"text":324,"config":780},{"href":327,"dataGaName":328,"dataGaLocation":636},{"text":782,"config":783},"Small business",{"href":333,"dataGaName":334,"dataGaLocation":636},{"text":785,"config":786},"Public sector",{"href":339,"dataGaName":340,"dataGaLocation":636},{"text":788,"config":789},"Education",{"href":790,"dataGaName":791,"dataGaLocation":636},"/solutions/education/","education",{"text":793,"config":794},"Financial services",{"href":795,"dataGaName":796,"dataGaLocation":636},"/solutions/finance/","financial services",{"title":347,"links":798},[799,801,803,805,808,810,813,815,817,819,821,823,825,827],{"text":360,"config":800},{"href":362,"dataGaName":363,"dataGaLocation":636},{"text":365,"config":802},{"href":367,"dataGaName":368,"dataGaLocation":636},{"text":370,"config":804},{"href":372,"dataGaName":373,"dataGaLocation":636},{"text":375,"config":806},{"href":377,"dataGaName":807,"dataGaLocation":636},"docs",{"text":398,"config":809},{"href":400,"dataGaName":401,"dataGaLocation":636},{"text":811,"config":812},"What's new",{"href":458,"dataGaName":459,"dataGaLocation":636},{"text":393,"config":814},{"href":395,"dataGaName":396,"dataGaLocation":636},{"text":412,"config":816},{"href":414,"dataGaName":415,"dataGaLocation":636},{"text":420,"config":818},{"href":422,"dataGaName":423,"dataGaLocation":636},{"text":425,"config":820},{"href":427,"dataGaName":428,"dataGaLocation":636},{"text":430,"config":822},{"href":432,"dataGaName":433,"dataGaLocation":636},{"text":435,"config":824},{"href":437,"dataGaName":438,"dataGaLocation":636},{"text":440,"config":826},{"href":442,"dataGaName":443,"dataGaLocation":636},{"text":445,"config":828},{"href":447,"dataGaName":448,"dataGaLocation":636},{"title":461,"links":830},[831,833,835,837,839,841,845,850,852,854,856],{"text":469,"config":832},{"href":471,"dataGaName":463,"dataGaLocation":636},{"text":474,"config":834},{"href":476,"dataGaName":477,"dataGaLocation":636},{"text":482,"config":836},{"href":484,"dataGaName":485,"dataGaLocation":636},{"text":487,"config":838},{"href":489,"dataGaName":490,"dataGaLocation":636},{"text":492,"config":840},{"href":494,"dataGaName":495,"dataGaLocation":636},{"text":842,"config":843},"Sustainability",{"href":844,"dataGaName":842,"dataGaLocation":636},"/sustainability/",{"text":846,"config":847},"Diversity, inclusion and belonging (DIB)",{"href":848,"dataGaName":849,"dataGaLocation":636},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":497,"config":851},{"href":499,"dataGaName":500,"dataGaLocation":636},{"text":507,"config":853},{"href":509,"dataGaName":510,"dataGaLocation":636},{"text":512,"config":855},{"href":514,"dataGaName":515,"dataGaLocation":636},{"text":857,"config":858},"Modern Slavery Transparency Statement",{"href":859,"dataGaName":860,"dataGaLocation":636},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":862},[863,866,869],{"text":864,"config":865},"Terms",{"href":688,"dataGaName":689,"dataGaLocation":636},{"text":867,"config":868},"Cookies",{"dataGaName":698,"dataGaLocation":636,"id":699,"isOneTrustButton":174},{"text":870,"config":871},"Privacy",{"href":693,"dataGaName":694,"dataGaLocation":636},[873],{"id":874,"title":7,"body":170,"config":875,"content":877,"description":170,"extension":881,"meta":882,"navigation":174,"path":883,"seo":884,"stem":885,"__hash__":886},"blogAuthors/en-us/blog/authors/veethika-mishra.yml",{"template":876},"BlogAuthor",{"name":7,"config":878},{"headshot":879,"ctfId":880},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664676/Blog/Author%20Headshots/veethika-headshot.jpg","veethika","yml",{},"/en-us/blog/authors/veethika-mishra",{},"en-us/blog/authors/veethika-mishra","avkx2hzdTVpCmkhh26RGfXRkuPdPQWwSTuPDuHtSjSQ",[888,897,905],{"title":889,"description":890,"heroImage":891,"category":166,"date":892,"authors":893,"slug":896,"externalUrl":170},"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",[894,895],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":898,"description":899,"heroImage":900,"category":166,"date":901,"authors":902,"slug":904,"externalUrl":170},"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",[903],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":906,"description":907,"heroImage":908,"category":166,"date":909,"authors":910,"slug":912,"externalUrl":170},"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",[911],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":914},[915,929,941,953],{"id":916,"categories":917,"header":919,"text":920,"button":921,"image":926},"ai-modernization",[918],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":922,"config":923},"Get your AI maturity score",{"href":924,"dataGaName":925,"dataGaLocation":401},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":927},{"src":928},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":930,"categories":931,"header":933,"text":920,"button":934,"image":938},"devops-modernization",[932,737],"product","Are you just managing tools or shipping innovation?",{"text":935,"config":936},"Get your DevOps maturity score",{"href":937,"dataGaName":925,"dataGaLocation":401},"/assessments/devops-modernization-assessment/",{"config":939},{"src":940},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":942,"categories":943,"header":945,"text":920,"button":946,"image":950},"security-modernization",[944],"security","Are you trading speed for security?",{"text":947,"config":948},"Get your security maturity score",{"href":949,"dataGaName":925,"dataGaLocation":401},"/assessments/security-modernization-assessment/",{"config":951},{"src":952},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":954,"paths":955,"header":958,"text":959,"button":960,"image":965},"github-azure-migration",[956,957],"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":961,"config":962},"See how GitLab compares to GitHub",{"href":963,"dataGaName":964,"dataGaLocation":401},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":966},{"src":940},{"header":968,"blurb":969,"button":970,"secondaryButton":975},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":971,"config":972},"Get your free trial",{"href":973,"dataGaName":200,"dataGaLocation":974},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":674,"config":976},{"href":526,"dataGaName":205,"dataGaLocation":974},1786803753193]