[{"data":1,"prerenderedAt":1040},["ShallowReactive",2],{"/blog/efficient-pipelines":3,"navigation-en-us":253,"banner-en-us":681,"footer-en-us":691,"blog-post-authors-en-us-Vlad Budica":935,"blog-related-posts-en-us-efficient-pipelines":950,"blog-promotions-en-us":976,"next-steps-en-us":1030},{"id":4,"title":5,"authors":6,"body":8,"category":231,"date":232,"description":233,"extension":234,"externalUrl":235,"faq":235,"featured":236,"heroImage":237,"meta":238,"navigation":239,"path":240,"seo":241,"slug":245,"stem":246,"tags":247,"template":251,"updatedDate":235,"__hash__":252},"blogPosts/en-us/blog/efficient-pipelines.md","Extract greater efficiency from your CI pipelines",[7],"Vlad Budica",{"type":9,"value":10,"toc":215},"minimark",[11,15,18,21,31,34,38,41,46,49,59,67,71,74,89,92,95,98,101,105,120,129,136,139,143,146,155,159,162,170,174,177,180,183,186,194,198,201,204,207],[12,13,14],"p",{},"When discussing efficiency, typically we need to balance two things: time and money. It's quite easy to optimize for just one of these parameters. However, that can be an oversimplification. Within some constraints, more resources (i.e., hardware and Runners) equal better performance. Yet, the exact opposite is true for other constraints. In this article, I will walk you through the process of finding the sweet spot in optimizing your GitLab CI pipeline. The principles that I'll cover work well for existing pipelines and also for new ones. Please note that this is subjective and the sweet spot might be very different for different users in different scenarios.",[12,16,17],{},"As we dig into the technical aspects, note that we are looking for an overall optimization of a pipeline, as opposed to just looking at a particular job. The reasoning behind it is that local optimizations might make the overall pipeline less efficient (we might generate bottlenecks).",[12,19,20],{},"The optimization recommendations below fall into two categories:",[22,23,24,28],"ul",{},[25,26,27],"li",{},"Execute fewer jobs and pipelines",[25,29,30],{},"Shorten the execution time of jobs and pipelines",[12,32,33],{},"The first step before modifying an aspect of a system is to understand it. Observe it in full. You need to know the overall pipeline architecture and also the current metrics for it. You need to know the total execution time, jobs that take a large amount of time to finish (any bottlenecks), and the total job workload (potential queue time) and Runner capacity – these last two go hand in hand. Finally, we can use Directed Acyclic Graphs, or DAGs, to visualize the pipeline and see the critical path (the minimum and maximum pipeline duration). We want to do this because we want to minimize as much as possible the detrimental impact doing changes can have on pipeline performance.",[35,36,27],"h2",{"id":37},"execute-fewer-jobs-and-pipelines",[12,39,40],{},"Let's look at ways of reducing the number of jobs and pipelines that get executed.",[42,43,45],"h3",{"id":44},"apply-rules","Apply rules",[12,47,48],{},"The first thing would be to decide what needs to be executed and when. For example, with a website, if the only change that was performed is to the text on the page, then the resulting pipeline doesn't need to contain all the tests and checks that are performed when changing the web app.",[12,50,51,52,58],{},"This requires the use of the ",[53,54,57],"a",{"href":55,"rel":56},"https://docs.gitlab.com/ci/yaml/#rules",[],"rules keyword",". Rules are evaluated when a pipeline is created (at each trigger), and evaluated in order until the first match. When a match is found, the job is either included or excluded from the pipeline, depending on the configuration.",[12,60,61,62,66],{},"Through the rules keyword you can decide very precisely when a job should run or not. More information about use cases and configuration parameters can be found in the ",[53,63,65],{"href":55,"rel":64},[],"doc page for rules",".",[42,68,70],{"id":69},"make-jobs-interruptible","Make jobs interruptible",[12,72,73],{},"Now that jobs are only running when needed, you can focus on what happens when a new pipeline is triggered while a job is still running. This can lead to inefficiencies because we already know the job isn't running on the latest change performed on the target branch and that the results will get scrapped.",[12,75,76,77,82,83,88],{},"This is where the ",[53,78,81],{"href":79,"rel":80},"https://docs.gitlab.com/ci/yaml/#interruptible",[],"interruptible keyword"," comes in. It enables us to specify that a job can be interrupted when a newer one is triggered on the same branch. This should be coupled with the ",[53,84,87],{"href":85,"rel":86},"https://docs.gitlab.com/ci/pipelines/settings/#auto-cancel-redundant-pipelines",[],"automatic cancellation of redundant pipelines feature"," so, in the end, jobs will be automatically canceled when newer pipelines are triggered.",[12,90,91],{},"One word of caution, use this mechanism only with jobs that are safe to stop such as a build or a test job. Don't use this with your deployment jobs as you're eventually going to end up with partial deployments.",[12,93,94],{},"One last point around executing fewer jobs and pipelines is to try to reschedule non-essential pipelines to as least frequent as possible. It's a balance that needs to be found between running the pipelines too often and not running them enough. Just go with the minimum acceptable by your company policy.",[35,96,30],{"id":97},"shorten-the-execution-time-of-jobs-and-pipelines",[12,99,100],{},"The next thing would be to find ways of making our jobs and pipelines execute in less time.",[42,102,104],{"id":103},"execute-jobs-in-parallel","Execute jobs in parallel",[12,106,107,108,113,114,119],{},"You can create DAGs in your pipelines to create relationships between jobs and ensure that jobs are executed as soon as all the requirements are met if there are any and that they aren't waiting unnecessarily for other jobs to finish. By using the ",[53,109,112],{"href":110,"rel":111},"https://docs.gitlab.com/ci/yaml/#needs",[],"needs keyword"," together with the ",[53,115,118],{"href":116,"rel":117},"https://docs.gitlab.com/ci/yaml/#parallel",[],"parallel keyword",", you can implement DAGs.",[12,121,122,123,128],{},"Another useful mechanism to drive parallelism is ",[53,124,127],{"href":125,"rel":126},"https://docs.gitlab.com/ci/pipelines/downstream_pipelines/",[],"parent-child pipelines",", which enable you to trigger concurrently running pipelines.",[12,130,131,132,135],{},"These offer great flexibility and by using them you can execute your workloads in parallel as efficiently as possible. This can be a double-edged sword though as DAGs and ",[53,133,127],{"href":125,"rel":134},[]," will increase the complexity of your pipelines, making them harder to analyze and understand. Within this very complex environment, you can run into unwanted side effects such as increased cost or even reduced efficiency.",[12,137,138],{},"The more jobs and pipelines you run in parallel, the more load will be put on your Runner infrastructure. If you do have an autoscaling mechanism and a large enough pool of resources, this will ensure no big queues are created and that things are running smoothly, but also lead to increased infrastructure costs. On the other hand, if you don't have autoscaling or if you have lower limits for the amount of resources available, the costs will be kept in check but your overall execution time will suffer because jobs will wait longer in queues.",[42,140,142],{"id":141},"fail-fast","Fail fast",[12,144,145],{},"It's desirable to detect errors and critical failures as soon as possible in your jobs and pipelines, and stop the execution. If you wait until toward the end of the pipeline to fail, the whole pipeline will waste hardware resources and increase your execution and waiting times. This is easier to implement when first designing a pipeline but can be achieved as well through refactoring of your existing ones.",[12,147,148,149,154],{},"Testing usually takes a lot of time so this means that we're waiting for the execution to finish before canceling the whole pipeline if the tests fail. What we want to do is move the jobs that run quicker earlier in the pipeline thus getting feedback sooner. To configure this behavior, use the ",[53,150,153],{"href":151,"rel":152},"https://docs.gitlab.com/ci/yaml/#allow_failure",[],"allow_failure keyword"," and only for jobs that when fail should fail the whole pipeline.",[42,156,158],{"id":157},"caching","Caching",[12,160,161],{},"You can also optimize the caching of your dependencies, which will improve the execution time. This can be very useful for jobs that fail often but for which the dependencies don't change that often.",[12,163,164,165,66],{},"To configure this in your jobs, you should use the ",[53,166,169],{"href":167,"rel":168},"https://docs.gitlab.com/ci/yaml/#cachewhen",[],"cache:when keyword",[42,171,173],{"id":172},"optimize-your-container-images","Optimize your container images",[12,175,176],{},"Using big images in your pipelines can slow things down significantly, as they take longer to be pulled. So the solution would be to use smaller images. Simple, right?",[12,178,179],{},"Well, it's not always that easy to do, so you should start by analyzing your base image and your network speed as these two will give an indication of how long it will take for the image to be pulled. The network connection we're interested in is the one between your Runner and your container registry.",[12,181,182],{},"Once we have this kind of information, we can decide to host the image in another container registry. If you have GitLab hosted in a public cloud you should use the container image registry provided by that provider. An alternative that works no matter where GitLab is hosted is to use the internal GitLab container registry that's included with your service.",[12,184,185],{},"You will get better results if instead of using a master container image that holds everything that you need to run the whole pipeline, you use multiple smaller ones that are tailored for each job. It's faster if you use custom container images and have all the tools you need pre-installed. This would also be a safer option because you can validate more thoroughly the contents of the image.",[12,187,188,189,66],{},"More information about this topic can be found in ",[53,190,193],{"href":191,"rel":192},"https://docs.docker.com/develop/develop-images/dockerfile_best-practices/",[],"Docker's \"Best practices for writing Dockerfiles\"",[35,195,197],{"id":196},"pipeline-optimization-is-part-science-part-art","Pipeline optimization is part science, part art",[12,199,200],{},"You should approach your pipeline optimization efforts through a continuous improvement lens. This process is part science, part art as there aren't any quick solutions that you can apply and get your ideal result.",[12,202,203],{},"I encourage you to test, document, and analyze the results when it comes to pipeline optimization efforts. You try one thing, look for feedback from the metrics of your pipelines, document the results, the changes, and the new architecture (this can happen in GitLab issues and merge requests) so you can extract some learnings, and the cycle starts again.",[12,205,206],{},"Small gains will add up and provide significant improvements at a higher scale. As I mentioned before, look for overall improvements instead of local ones. Now applying these principles to each project (pipeline templates makes it easier to adopt at scale), we can look at how these improvements across projects add up.",[12,208,209,210,66],{},"Read more: Learn how to ",[53,211,214],{"href":212,"rel":213},"https://docs.gitlab.com/ci/debugging/",[],"troubleshoot a GitLab pipeline failure",{"title":216,"searchDepth":217,"depth":217,"links":218},"",2,[219,224,230],{"id":37,"depth":217,"text":27,"children":220},[221,223],{"id":44,"depth":222,"text":45},3,{"id":69,"depth":222,"text":70},{"id":97,"depth":217,"text":30,"children":225},[226,227,228,229],{"id":103,"depth":222,"text":104},{"id":141,"depth":222,"text":142},{"id":157,"depth":222,"text":158},{"id":172,"depth":222,"text":173},{"id":196,"depth":217,"text":197},"engineering","2022-03-09","Learn some techniques to find the balance between pipeline performance and resource utilization.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749667534/Blog/Hero%20Images/ci-pipeline.jpg",{},true,"/en-us/blog/efficient-pipelines",{"title":5,"description":233,"ogTitle":5,"ogDescription":233,"noIndex":236,"ogImage":237,"ogUrl":242,"ogSiteName":243,"ogType":244,"canonicalUrls":242},"https://about.gitlab.com/blog/efficient-pipelines","https://about.gitlab.com","article","efficient-pipelines","en-us/blog/efficient-pipelines",[248,249,250],"DevOps","CI","CD","BlogPost","seFHZNXjLq5rojQVTF7jkFEWNXHTmAvCM7lHDlySUos",{"logo":254,"freeTrial":259,"sales":264,"login":269,"items":274,"search":601,"minimal":632,"duo":651,"switchNav":660,"pricingDeployment":671},{"config":255},{"href":256,"dataGaName":257,"dataGaLocation":258},"/","gitlab logo","header",{"text":260,"config":261},"Get free trial",{"href":262,"dataGaName":263,"dataGaLocation":258},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":265,"config":266},"Request a demo",{"href":267,"dataGaName":268,"dataGaLocation":258},"/sales/?contact-topic=request-demo","sales",{"text":270,"config":271},"Sign in",{"href":272,"dataGaName":273,"dataGaLocation":258},"https://gitlab.com/users/sign_in/","sign in",[275,304,404,409,523,579],{"text":276,"config":277,"menu":279},"Platform",{"dataNavLevelOne":278},"platform",{"type":280,"columns":281},"cards",[282,288,296],{"title":276,"description":283,"link":284},"The intelligent orchestration platform for DevSecOps",{"text":285,"config":286},"Explore our Platform",{"href":287,"dataGaName":278,"dataGaLocation":258},"/platform/",{"title":289,"description":290,"link":291},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":292,"config":293},"Meet GitLab Duo",{"href":294,"dataGaName":295,"dataGaLocation":258},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":297,"description":298,"link":299},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":300,"config":301},"Learn more",{"href":302,"dataGaName":303,"dataGaLocation":258},"/why-gitlab/","why gitlab",{"text":305,"left":239,"config":306,"menu":308},"Product",{"dataNavLevelOne":307},"solutions",{"type":309,"link":310,"columns":314,"feature":383},"lists",{"text":311,"config":312},"View all Solutions",{"href":313,"dataGaName":307,"dataGaLocation":258},"/solutions/",[315,339,362],{"title":316,"description":317,"link":318,"items":323},"Automation","CI/CD and automation to accelerate deployment",{"config":319},{"icon":320,"href":321,"dataGaName":322,"dataGaLocation":258},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[324,328,331,335],{"text":325,"config":326},"CI/CD",{"href":327,"dataGaLocation":258,"dataGaName":325},"/solutions/continuous-integration/",{"text":289,"config":329},{"href":294,"dataGaLocation":258,"dataGaName":330},"gitlab duo agent platform - product menu",{"text":332,"config":333},"Source Code Management",{"href":334,"dataGaLocation":258,"dataGaName":332},"/solutions/source-code-management/",{"text":336,"config":337},"Automated Software Delivery",{"href":321,"dataGaLocation":258,"dataGaName":338},"Automated software delivery",{"title":340,"description":341,"link":342,"items":347},"Security","Deliver code faster without compromising security",{"config":343},{"href":344,"dataGaName":345,"dataGaLocation":258,"icon":346},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[348,352,357],{"text":349,"config":350},"Application Security Testing",{"href":344,"dataGaName":351,"dataGaLocation":258},"Application security testing",{"text":353,"config":354},"Software Supply Chain Security",{"href":355,"dataGaLocation":258,"dataGaName":356},"/solutions/supply-chain/","Software supply chain security",{"text":358,"config":359},"Software Compliance",{"href":360,"dataGaName":361,"dataGaLocation":258},"/solutions/software-compliance/","software compliance",{"title":363,"link":364,"items":369},"Measurement",{"config":365},{"icon":366,"href":367,"dataGaName":368,"dataGaLocation":258},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[370,374,378],{"text":371,"config":372},"Visibility & Measurement",{"href":367,"dataGaLocation":258,"dataGaName":373},"Visibility and Measurement",{"text":375,"config":376},"Value Stream Management",{"href":377,"dataGaLocation":258,"dataGaName":375},"/solutions/value-stream-management/",{"text":379,"config":380},"Analytics & Insights",{"href":381,"dataGaLocation":258,"dataGaName":382},"/solutions/analytics-and-insights/","Analytics and insights",{"title":384,"type":309,"items":385},"GitLab for",[386,392,398],{"text":387,"config":388},"Enterprise",{"icon":389,"href":390,"dataGaLocation":258,"dataGaName":391},"Building","/enterprise/","enterprise",{"text":393,"config":394},"Small Business",{"icon":395,"href":396,"dataGaLocation":258,"dataGaName":397},"Work","/small-business/","small business",{"text":399,"config":400},"Public Sector",{"icon":401,"href":402,"dataGaLocation":258,"dataGaName":403},"Organization","/solutions/public-sector/","public sector",{"text":405,"config":406},"Pricing",{"href":407,"dataGaName":408,"dataGaLocation":258,"dataNavLevelOne":408},"/pricing/","pricing",{"text":410,"config":411,"menu":413},"Resources",{"dataNavLevelOne":412},"resources",{"type":309,"link":414,"columns":418,"feature":512},{"text":415,"config":416},"View all resources",{"href":417,"dataGaName":412,"dataGaLocation":258},"/resources/",[419,452,479],{"title":420,"items":421},"Getting started",[422,427,432,437,442,447],{"text":423,"config":424},"Install",{"href":425,"dataGaName":426,"dataGaLocation":258},"/install/","install",{"text":428,"config":429},"Quick start guides",{"href":430,"dataGaName":431,"dataGaLocation":258},"/get-started/","quick setup checklists",{"text":433,"config":434},"Learn",{"href":435,"dataGaLocation":258,"dataGaName":436},"https://university.gitlab.com/","learn",{"text":438,"config":439},"Product documentation",{"href":440,"dataGaName":441,"dataGaLocation":258},"https://docs.gitlab.com/","product documentation",{"text":443,"config":444},"Best practice videos",{"href":445,"dataGaName":446,"dataGaLocation":258},"/getting-started-videos/","best practice videos",{"text":448,"config":449},"Integrations",{"href":450,"dataGaName":451,"dataGaLocation":258},"/integrations/","integrations",{"title":453,"items":454},"Discover",[455,460,465,470,474],{"text":456,"config":457},"Customer success stories",{"href":458,"dataGaName":459,"dataGaLocation":258},"/customers/","customer success stories",{"text":461,"config":462},"Blog",{"href":463,"dataGaName":464,"dataGaLocation":258},"/blog/","blog",{"text":466,"config":467},"Demo Hub",{"href":468,"dataGaName":469,"dataGaLocation":258},"/demo-hub/","demo hub",{"text":471,"config":472},"The Source",{"href":473,"dataGaName":464,"dataGaLocation":258},"/the-source/",{"text":475,"config":476},"Remote",{"href":477,"dataGaName":478,"dataGaLocation":258},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":480,"items":481},"Connect",[482,487,492,497,502,507],{"text":483,"config":484},"GitLab Services",{"href":485,"dataGaName":486,"dataGaLocation":258},"/services/","services",{"text":488,"config":489},"Contribute",{"href":490,"dataGaName":491,"dataGaLocation":258},"https://contributors.gitlab.com","contribute",{"text":493,"config":494},"Community",{"href":495,"dataGaName":496,"dataGaLocation":258},"/community/","community",{"text":498,"config":499},"Forum",{"href":500,"dataGaName":501,"dataGaLocation":258},"https://forum.gitlab.com/","forum",{"text":503,"config":504},"Events",{"href":505,"dataGaName":506,"dataGaLocation":258},"/events/","events",{"text":508,"config":509},"Partners",{"href":510,"dataGaName":511,"dataGaLocation":258},"/partners/","partners",{"config":513,"title":516,"text":517,"link":518},{"background":514,"textColor":515},"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":519,"config":520},"Read the latest",{"href":521,"dataGaName":522,"dataGaLocation":258},"/whats-new/","whats new",{"text":524,"config":525,"menu":527},"Company",{"dataNavLevelOne":526},"company",{"type":309,"columns":528},[529],{"items":530},[531,536,542,544,549,554,559,564,569,574],{"text":532,"config":533},"About",{"href":534,"dataGaName":535,"dataGaLocation":258},"/company/","about",{"text":537,"config":538,"footerGa":541},"Jobs",{"href":539,"dataGaName":540,"dataGaLocation":258},"/jobs/","jobs",{"dataGaName":540},{"text":503,"config":543},{"href":505,"dataGaName":506,"dataGaLocation":258},{"text":545,"config":546},"Leadership",{"href":547,"dataGaName":548,"dataGaLocation":258},"/company/team/e-group/","leadership",{"text":550,"config":551},"Handbook",{"href":552,"dataGaName":553,"dataGaLocation":258},"https://handbook.gitlab.com/","handbook",{"text":555,"config":556},"Investor relations",{"href":557,"dataGaName":558,"dataGaLocation":258},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":560,"config":561},"Trust Center",{"href":562,"dataGaName":563,"dataGaLocation":258},"/security/","trust center",{"text":565,"config":566},"AI Transparency Center",{"href":567,"dataGaName":568,"dataGaLocation":258},"/ai-transparency-center/","ai transparency center",{"text":570,"config":571},"Newsletter",{"href":572,"dataGaName":573,"dataGaLocation":258},"/company/contact/#contact-forms","newsletter",{"text":575,"config":576},"Press",{"href":577,"dataGaName":578,"dataGaLocation":258},"/press/","press",{"text":580,"config":581,"menu":582},"Contact us",{"dataNavLevelOne":526},{"type":309,"columns":583},[584],{"items":585},[586,591,596],{"text":587,"config":588},"Talk to sales",{"href":589,"dataGaName":590,"dataGaLocation":258},"/sales/","talk to sales",{"text":592,"config":593},"Support portal",{"href":594,"dataGaName":595,"dataGaLocation":258},"https://support.gitlab.com/hc/en-us","support portal",{"text":597,"config":598},"Customer portal",{"href":599,"dataGaName":600,"dataGaLocation":258},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":602,"login":603,"suggestions":610},"Close",{"text":604,"link":605},"To search repositories and projects, login to",{"text":606,"config":607},"gitlab.com",{"href":272,"dataGaName":608,"dataGaLocation":609},"search login","search",{"text":611,"default":612},"Suggestions",[613,615,619,621,625,629],{"text":289,"config":614},{"href":294,"dataGaName":289,"dataGaLocation":609},{"text":616,"config":617},"Code Suggestions (AI)",{"href":618,"dataGaName":616,"dataGaLocation":609},"/solutions/code-suggestions/",{"text":325,"config":620},{"href":327,"dataGaName":325,"dataGaLocation":609},{"text":622,"config":623},"GitLab on AWS",{"href":624,"dataGaName":622,"dataGaLocation":609},"/partners/technology-partners/aws/",{"text":626,"config":627},"GitLab on Google Cloud",{"href":628,"dataGaName":626,"dataGaLocation":609},"/partners/technology-partners/google-cloud-platform/",{"text":630,"config":631},"Why GitLab?",{"href":302,"dataGaName":630,"dataGaLocation":609},{"freeTrial":633,"mobileIcon":638,"desktopIcon":643,"secondaryButton":646},{"text":634,"config":635},"Start free trial",{"href":636,"dataGaName":263,"dataGaLocation":637},"https://gitlab.com/-/trials/new/","nav",{"altText":639,"config":640},"Gitlab Icon",{"src":641,"dataGaName":642,"dataGaLocation":637},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":639,"config":644},{"src":645,"dataGaName":642,"dataGaLocation":637},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":647,"config":648},"Get Started",{"href":649,"dataGaName":650,"dataGaLocation":637},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":652,"mobileIcon":656,"desktopIcon":658},{"text":653,"config":654},"Learn more about GitLab Duo",{"href":294,"dataGaName":655,"dataGaLocation":637},"gitlab duo",{"altText":639,"config":657},{"src":641,"dataGaName":642,"dataGaLocation":637},{"altText":639,"config":659},{"src":645,"dataGaName":642,"dataGaLocation":637},{"button":661,"mobileIcon":666,"desktopIcon":668},{"text":662,"config":663},"/switch",{"href":664,"dataGaName":665,"dataGaLocation":637},"#contact","switch",{"altText":639,"config":667},{"src":641,"dataGaName":642,"dataGaLocation":637},{"altText":639,"config":669},{"src":670,"dataGaName":642,"dataGaLocation":637},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":672,"mobileIcon":677,"desktopIcon":679},{"text":673,"config":674},"Back to pricing",{"href":407,"dataGaName":675,"dataGaLocation":637,"icon":676},"back to pricing","GoBack",{"altText":639,"config":678},{"src":641,"dataGaName":642,"dataGaLocation":637},{"altText":639,"config":680},{"src":645,"dataGaName":642,"dataGaLocation":637},{"title":682,"titleMobile":683,"button":684,"config":689},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":300,"config":685},{"href":686,"dataGaName":687,"dataGaLocation":688},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":690,"disabled":236},"release",{"data":692},{"text":693,"source":694,"edit":700,"contribute":705,"config":710,"items":715,"minimal":924},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":695,"config":696},"View page source",{"href":697,"dataGaName":698,"dataGaLocation":699},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":701,"config":702},"Edit this page",{"href":703,"dataGaName":704,"dataGaLocation":699},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":706,"config":707},"Please contribute",{"href":708,"dataGaName":709,"dataGaLocation":699},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":711,"facebook":712,"youtube":713,"linkedin":714},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[716,763,816,860,892],{"title":405,"links":717,"subMenu":732},[718,722,727],{"text":719,"config":720},"View plans",{"href":407,"dataGaName":721,"dataGaLocation":699},"view plans",{"text":723,"config":724},"Why Premium?",{"href":725,"dataGaName":726,"dataGaLocation":699},"/pricing/premium/","why premium",{"text":728,"config":729},"Why Ultimate?",{"href":730,"dataGaName":731,"dataGaLocation":699},"/pricing/ultimate/","why ultimate",[733],{"title":734,"links":735},"Contact Us",[736,739,741,743,748,753,758],{"text":737,"config":738},"Contact sales",{"href":589,"dataGaName":268,"dataGaLocation":699},{"text":592,"config":740},{"href":594,"dataGaName":595,"dataGaLocation":699},{"text":597,"config":742},{"href":599,"dataGaName":600,"dataGaLocation":699},{"text":744,"config":745},"Status",{"href":746,"dataGaName":747,"dataGaLocation":699},"https://status.gitlab.com/","status",{"text":749,"config":750},"Terms of use",{"href":751,"dataGaName":752,"dataGaLocation":699},"/terms/","terms of use",{"text":754,"config":755},"Privacy statement",{"href":756,"dataGaName":757,"dataGaLocation":699},"/privacy/","privacy statement",{"text":759,"config":760},"Cookie preferences",{"dataGaName":761,"dataGaLocation":699,"id":762,"isOneTrustButton":239},"cookie preferences","ot-sdk-btn",{"title":305,"links":764,"subMenu":773},[765,769],{"text":766,"config":767},"DevSecOps platform",{"href":287,"dataGaName":768,"dataGaLocation":699},"devsecops platform",{"text":770,"config":771},"AI-Assisted Development",{"href":294,"dataGaName":772,"dataGaLocation":699},"ai-assisted development",[774],{"title":775,"links":776},"Topics",[777,782,787,791,796,801,806,811],{"text":778,"config":779},"CICD",{"href":780,"dataGaName":781,"dataGaLocation":699},"/topics/ci-cd/","cicd",{"text":783,"config":784},"GitOps",{"href":785,"dataGaName":786,"dataGaLocation":699},"/topics/gitops/","gitops",{"text":248,"config":788},{"href":789,"dataGaName":790,"dataGaLocation":699},"/topics/devops/","devops",{"text":792,"config":793},"Version Control",{"href":794,"dataGaName":795,"dataGaLocation":699},"/topics/version-control/","version control",{"text":797,"config":798},"DevSecOps",{"href":799,"dataGaName":800,"dataGaLocation":699},"/topics/devsecops/","devsecops",{"text":802,"config":803},"Cloud Native",{"href":804,"dataGaName":805,"dataGaLocation":699},"/topics/cloud-native/","cloud native",{"text":807,"config":808},"AI for Coding",{"href":809,"dataGaName":810,"dataGaLocation":699},"/topics/devops/ai-for-coding/","ai for coding",{"text":812,"config":813},"Agentic AI",{"href":814,"dataGaName":815,"dataGaLocation":699},"/topics/agentic-ai/","agentic ai",{"title":817,"links":818},"Solutions",[819,821,823,828,832,835,839,842,844,847,850,855],{"text":349,"config":820},{"href":344,"dataGaName":349,"dataGaLocation":699},{"text":338,"config":822},{"href":321,"dataGaName":322,"dataGaLocation":699},{"text":824,"config":825},"Agile development",{"href":826,"dataGaName":827,"dataGaLocation":699},"/solutions/agile-delivery/","agile delivery",{"text":829,"config":830},"SCM",{"href":334,"dataGaName":831,"dataGaLocation":699},"source code management",{"text":778,"config":833},{"href":327,"dataGaName":834,"dataGaLocation":699},"continuous integration & delivery",{"text":836,"config":837},"Value stream management",{"href":377,"dataGaName":838,"dataGaLocation":699},"value stream management",{"text":783,"config":840},{"href":841,"dataGaName":786,"dataGaLocation":699},"/solutions/gitops/",{"text":387,"config":843},{"href":390,"dataGaName":391,"dataGaLocation":699},{"text":845,"config":846},"Small business",{"href":396,"dataGaName":397,"dataGaLocation":699},{"text":848,"config":849},"Public sector",{"href":402,"dataGaName":403,"dataGaLocation":699},{"text":851,"config":852},"Education",{"href":853,"dataGaName":854,"dataGaLocation":699},"/solutions/education/","education",{"text":856,"config":857},"Financial services",{"href":858,"dataGaName":859,"dataGaLocation":699},"/solutions/finance/","financial services",{"title":410,"links":861},[862,864,866,868,871,873,876,878,880,882,884,886,888,890],{"text":423,"config":863},{"href":425,"dataGaName":426,"dataGaLocation":699},{"text":428,"config":865},{"href":430,"dataGaName":431,"dataGaLocation":699},{"text":433,"config":867},{"href":435,"dataGaName":436,"dataGaLocation":699},{"text":438,"config":869},{"href":440,"dataGaName":870,"dataGaLocation":699},"docs",{"text":461,"config":872},{"href":463,"dataGaName":464,"dataGaLocation":699},{"text":874,"config":875},"What's new",{"href":521,"dataGaName":522,"dataGaLocation":699},{"text":456,"config":877},{"href":458,"dataGaName":459,"dataGaLocation":699},{"text":475,"config":879},{"href":477,"dataGaName":478,"dataGaLocation":699},{"text":483,"config":881},{"href":485,"dataGaName":486,"dataGaLocation":699},{"text":488,"config":883},{"href":490,"dataGaName":491,"dataGaLocation":699},{"text":493,"config":885},{"href":495,"dataGaName":496,"dataGaLocation":699},{"text":498,"config":887},{"href":500,"dataGaName":501,"dataGaLocation":699},{"text":503,"config":889},{"href":505,"dataGaName":506,"dataGaLocation":699},{"text":508,"config":891},{"href":510,"dataGaName":511,"dataGaLocation":699},{"title":524,"links":893},[894,896,898,900,902,904,908,913,915,917,919],{"text":532,"config":895},{"href":534,"dataGaName":526,"dataGaLocation":699},{"text":537,"config":897},{"href":539,"dataGaName":540,"dataGaLocation":699},{"text":545,"config":899},{"href":547,"dataGaName":548,"dataGaLocation":699},{"text":550,"config":901},{"href":552,"dataGaName":553,"dataGaLocation":699},{"text":555,"config":903},{"href":557,"dataGaName":558,"dataGaLocation":699},{"text":905,"config":906},"Sustainability",{"href":907,"dataGaName":905,"dataGaLocation":699},"/sustainability/",{"text":909,"config":910},"Diversity, inclusion and belonging (DIB)",{"href":911,"dataGaName":912,"dataGaLocation":699},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":560,"config":914},{"href":562,"dataGaName":563,"dataGaLocation":699},{"text":570,"config":916},{"href":572,"dataGaName":573,"dataGaLocation":699},{"text":575,"config":918},{"href":577,"dataGaName":578,"dataGaLocation":699},{"text":920,"config":921},"Modern Slavery Transparency Statement",{"href":922,"dataGaName":923,"dataGaLocation":699},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":925},[926,929,932],{"text":927,"config":928},"Terms",{"href":751,"dataGaName":752,"dataGaLocation":699},{"text":930,"config":931},"Cookies",{"dataGaName":761,"dataGaLocation":699,"id":762,"isOneTrustButton":239},{"text":933,"config":934},"Privacy",{"href":756,"dataGaName":757,"dataGaLocation":699},[936],{"id":937,"title":7,"body":235,"config":938,"content":940,"description":235,"extension":944,"meta":945,"navigation":239,"path":946,"seo":947,"stem":948,"__hash__":949},"blogAuthors/en-us/blog/authors/vlad-budica.yml",{"template":939},"BlogAuthor",{"name":7,"config":941},{"headshot":942,"ctfId":943},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Vlad-Budica","yml",{},"/en-us/blog/authors/vlad-budica",{},"en-us/blog/authors/vlad-budica","iXdNFZcbv0Ma_-SyrC46x95hWwchwNkvyq-NhDfurvk",[951,960,968],{"title":952,"description":953,"heroImage":954,"category":231,"date":955,"authors":956,"slug":959,"externalUrl":235},"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",[957,958],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":961,"description":962,"heroImage":963,"category":231,"date":964,"authors":965,"slug":967,"externalUrl":235},"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",[966],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":969,"description":970,"heroImage":971,"category":231,"date":972,"authors":973,"slug":975,"externalUrl":235},"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",[974],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":977},[978,992,1004,1016],{"id":979,"categories":980,"header":982,"text":983,"button":984,"image":989},"ai-modernization",[981],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":985,"config":986},"Get your AI maturity score",{"href":987,"dataGaName":988,"dataGaLocation":464},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":990},{"src":991},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":993,"categories":994,"header":996,"text":983,"button":997,"image":1001},"devops-modernization",[995,800],"product","Are you just managing tools or shipping innovation?",{"text":998,"config":999},"Get your DevOps maturity score",{"href":1000,"dataGaName":988,"dataGaLocation":464},"/assessments/devops-modernization-assessment/",{"config":1002},{"src":1003},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1005,"categories":1006,"header":1008,"text":983,"button":1009,"image":1013},"security-modernization",[1007],"security","Are you trading speed for security?",{"text":1010,"config":1011},"Get your security maturity score",{"href":1012,"dataGaName":988,"dataGaLocation":464},"/assessments/security-modernization-assessment/",{"config":1014},{"src":1015},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1017,"paths":1018,"header":1021,"text":1022,"button":1023,"image":1028},"github-azure-migration",[1019,1020],"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":1024,"config":1025},"See how GitLab compares to GitHub",{"href":1026,"dataGaName":1027,"dataGaLocation":464},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1029},{"src":1003},{"header":1031,"blurb":1032,"button":1033,"secondaryButton":1038},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1034,"config":1035},"Get your free trial",{"href":1036,"dataGaName":263,"dataGaLocation":1037},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":737,"config":1039},{"href":589,"dataGaName":268,"dataGaLocation":1037},1786803766510]