[{"data":1,"prerenderedAt":1249},["ShallowReactive",2],{"/blog/how-to-become-more-productive-with-gitlab-ci":3,"navigation-en-us":462,"banner-en-us":889,"footer-en-us":899,"blog-post-authors-en-us-Veethika Mishra":1144,"blog-related-posts-en-us-how-to-become-more-productive-with-gitlab-ci":1159,"blog-promotions-en-us":1185,"next-steps-en-us":1239},{"id":4,"title":5,"authors":6,"body":8,"category":440,"date":441,"description":442,"extension":443,"externalUrl":444,"faq":444,"featured":445,"heroImage":446,"meta":447,"navigation":154,"path":448,"seo":449,"slug":453,"stem":454,"tags":455,"template":460,"updatedDate":444,"__hash__":461},"blogPosts/en-us/blog/how-to-become-more-productive-with-gitlab-ci.md","How to become more productive with Gitlab CI",[7],"Veethika Mishra",{"type":9,"value":10,"toc":431},"minimark",[11,15,24,29,37,46,54,61,65,68,86,90,103,269,279,348,355,359,366,379,382,386,395,399,408,412,415,418,427],[12,13,14],"p",{},"CI/CD pipelines are the preeminent solution to mitigate potential risks while integrating code changes into the repository. CI/CD pipelines help isolate the impact of potential errors, making it easier to fix them. Top that with a tool that provides effective visibility into the running tasks and there you have a recipe for success.",[12,16,17,18,23],{},"Since the primary purpose of CI/CD pipelines is to speed up the development process and provide value to the end user faster, there's always room to make the process more efficient. This blog post unpacks some strategies that can help you get the most out of your pipeline definition in ",[19,20,22],"a",{"href":21},"/solutions/continuous-integration/","GitLab CI",".",[25,26,28],"h2",{"id":27},"how-directed-acyclic-graphs-dag-enable-concurrent-pipelines","How Directed Acyclic Graphs (DAG) enable concurrent pipelines",[12,30,31,36],{},[32,33],"img",{"alt":34,"src":35},"By using Needs keyword you can define dependencies for jobs that need to be used from previous stages.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398138/blog/Content%20Images/dag-explained.jpg","\nBy using the \"Needs\" keyword you can define dependencies for jobs that need to be used from previous stages.",[12,38,39,40,45],{},"In a ",[19,41,44],{"href":42,"rel":43},"https://docs.gitlab.com/ci/pipelines/pipeline_architectures/#basic-pipelines",[],"basic-pipeline"," structure, all the jobs in a particular stage run concurrently and the jobs in the subsequent stage have to wait on those to finish to get started. This continues for all the stages.",[12,47,48,49,53],{},"In the image above, the first job in the second stage only depends on the first two job in the first stage to get started. But with the basic pipeline order in place, it has to wait for all three jobs in the first stage to complete before it can start executing, which slows down the overall pipeline considerably. However, by using ",[50,51,52],"code",{},"needs:"," keywords, you can define a direct dependency for the jobs and they would only have to wait on the job they depend on to get started. By using the DAG strategy, you could shed out a few minutes from the processes for a certain project, thereby increasing the pipeline execution speed and bringing down the CI minutes consumption.",[12,55,56,57,60],{},"By using ",[50,58,59],{},"needs: []"," you can make the job in any stage run immediately, as it doesn't have to wait on any other job to finish.",[25,62,64],{"id":63},"why-parallel-jobs-increase-productivity","Why parallel jobs increase productivity",[12,66,67],{},"Not all the jobs in a pipeline have an equal run-time. While some may take just a few seconds, some take much longer to finish. When there are many team members waiting on a running pipeline to finish to be able to make a contribution to the project, the productivity of the team takes a hit.",[12,69,70,71,74,75,80,81,85],{},"GitLab provides a method to make clones of a job and run them in parallel for faster execution using the ",[50,72,73],{},"parallel:"," keyword. While ",[19,76,79],{"href":77,"rel":78},"https://docs.gitlab.com/ci/yaml/#parallel",[],"parallel jobs"," may not help in reducing the consumption of ",[19,82,84],{"href":83},"/pricing/faq-compute-minutes/","CI minutes",", they definitely help increase work productivity.",[25,87,89],{"id":88},"break-down-big-pipelines-with-parallel-matrix-jobs","Break down big pipelines with parallel matrix Jobs",[12,91,92,93,98,99,102],{},"Before the release of ",[19,94,97],{"href":95,"rel":96},"https://docs.gitlab.com/ci/yaml/#parallel-matrix-jobs",[],"parallel matrix jobs",", in order to run multiple instances of a job with different variable values, the jobs had to be manually defined in the ",[50,100,101],{},".gitlab-ci-yml"," like this:",[104,105,110],"pre",{"className":106,"code":107,"language":108,"meta":109,"style":109},"language-yaml shiki shiki-themes github-light",".run-test:\n  script: run-test $PLATFORM\n  stage: test\n\ntest-win:\n  extends: .run-test\n  variables:\n    - PLATFORM: windows\ntest-mac:\n  extends: .run-test\n  variables:\n    - PLATFORM: mac\ntest-linux:\n  extends: .run-test\n  variables:\n    - PLATFORM: linux\n\n","yaml","",[50,111,112,125,138,149,156,164,175,183,197,205,214,221,233,241,250,257],{"__ignoreMap":109},[113,114,117,121],"span",{"class":115,"line":116},"line",1,[113,118,120],{"class":119},"shJU0",".run-test",[113,122,124],{"class":123},"sgsFI",":\n",[113,126,128,131,134],{"class":115,"line":127},2,[113,129,130],{"class":119},"  script",[113,132,133],{"class":123},": ",[113,135,137],{"class":136},"sYBdl","run-test $PLATFORM\n",[113,139,141,144,146],{"class":115,"line":140},3,[113,142,143],{"class":119},"  stage",[113,145,133],{"class":123},[113,147,148],{"class":136},"test\n",[113,150,152],{"class":115,"line":151},4,[113,153,155],{"emptyLinePlaceholder":154},true,"\n",[113,157,159,162],{"class":115,"line":158},5,[113,160,161],{"class":119},"test-win",[113,163,124],{"class":123},[113,165,167,170,172],{"class":115,"line":166},6,[113,168,169],{"class":119},"  extends",[113,171,133],{"class":123},[113,173,174],{"class":136},".run-test\n",[113,176,178,181],{"class":115,"line":177},7,[113,179,180],{"class":119},"  variables",[113,182,124],{"class":123},[113,184,186,189,192,194],{"class":115,"line":185},8,[113,187,188],{"class":123},"    - ",[113,190,191],{"class":119},"PLATFORM",[113,193,133],{"class":123},[113,195,196],{"class":136},"windows\n",[113,198,200,203],{"class":115,"line":199},9,[113,201,202],{"class":119},"test-mac",[113,204,124],{"class":123},[113,206,208,210,212],{"class":115,"line":207},10,[113,209,169],{"class":119},[113,211,133],{"class":123},[113,213,174],{"class":136},[113,215,217,219],{"class":115,"line":216},11,[113,218,180],{"class":119},[113,220,124],{"class":123},[113,222,224,226,228,230],{"class":115,"line":223},12,[113,225,188],{"class":123},[113,227,191],{"class":119},[113,229,133],{"class":123},[113,231,232],{"class":136},"mac\n",[113,234,236,239],{"class":115,"line":235},13,[113,237,238],{"class":119},"test-linux",[113,240,124],{"class":123},[113,242,244,246,248],{"class":115,"line":243},14,[113,245,169],{"class":119},[113,247,133],{"class":123},[113,249,174],{"class":136},[113,251,253,255],{"class":115,"line":252},15,[113,254,180],{"class":119},[113,256,124],{"class":123},[113,258,260,262,264,266],{"class":115,"line":259},16,[113,261,188],{"class":123},[113,263,191],{"class":119},[113,265,133],{"class":123},[113,267,268],{"class":136},"linux\n",[12,270,271,272,274,275,278],{},"Parallel matrix jobs were released with GitLab 13.3 and allow you to create jobs at runtime based on specified variables. Let's say there is a need to run multiple instances a job with different variables values for each instance — with a combination of ",[50,273,73],{}," and ",[50,276,277],{},"matrix:"," you accomplish just that.",[104,280,282],{"className":106,"code":281,"language":108,"meta":109,"style":109},"test:\n  stage: test\n  script: run-test $PLATFORM\n  parallel:\n    matrix:\n      - PLATFORM: [windows, mac, linux]\n\n",[50,283,284,291,299,307,314,321],{"__ignoreMap":109},[113,285,286,289],{"class":115,"line":116},[113,287,288],{"class":119},"test",[113,290,124],{"class":123},[113,292,293,295,297],{"class":115,"line":127},[113,294,143],{"class":119},[113,296,133],{"class":123},[113,298,148],{"class":136},[113,300,301,303,305],{"class":115,"line":140},[113,302,130],{"class":119},[113,304,133],{"class":123},[113,306,137],{"class":136},[113,308,309,312],{"class":115,"line":151},[113,310,311],{"class":119},"  parallel",[113,313,124],{"class":123},[113,315,316,319],{"class":115,"line":158},[113,317,318],{"class":119},"    matrix",[113,320,124],{"class":123},[113,322,323,326,328,331,334,337,340,342,345],{"class":115,"line":166},[113,324,325],{"class":123},"      - ",[113,327,191],{"class":119},[113,329,330],{"class":123},": [",[113,332,333],{"class":136},"windows",[113,335,336],{"class":123},", ",[113,338,339],{"class":136},"mac",[113,341,336],{"class":123},[113,343,344],{"class":136},"linux",[113,346,347],{"class":123},"]\n",[12,349,56,350,274,352,354],{},[50,351,73],{},[50,353,277],{},", big pipelines can be broken down into manageable parts for efficient maintainance.",[25,356,358],{"id":357},"reduce-the-risk-of-merge-conflicts-with-parentchild-pipelines","Reduce the risk of merge conflicts with parent/child pipelines",[12,360,361,365],{},[32,362],{"alt":363,"src":364},"Parent-child pipelines can include external YAML files in you configuration","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398820/blog/Content%20Images/parent-child-explained.jpg","\nThe parent pipeline generates a child pipeline via the trigger:include keywords.",[12,367,368,369,374,375,378],{},"For better management of dependencies, many organizations prefer a mono-repo setup for their projects. But mono-repos have a flip side too. If a repository hosts a large number of projects and a single pipeline definition is used to trigger different automated processes for different components, the pipeline performance is negatively affected. By using ",[19,370,373],{"href":371,"rel":372},"https://docs.gitlab.com/ci/pipelines/downstream_pipelines/",[],"parent-child pipelines"," you can design more efficient pipelines, since you can have multiple child-pipelines that run in parallel. The keyword ",[50,376,377],{},"include:"," is used to include external YAML files in your CI/CD configuration for this purpose. In the image above a pipeline (the parent) generates a child pipeline via the trigger:include keywords.",[12,380,381],{},"This approach also reduces the chances of merge conflicts from happening, as it allows to only edit a section of the pipeline if necessary.",[25,383,385],{"id":384},"merge-trains-help-the-target-branch-stay-stable","Merge trains help the target branch stay stable",[12,387,388,389,394],{},"When there's a lot of merge requests flowing into a project, there is a risk of merge conflicts. ",[19,390,393],{"href":391,"rel":392},"https://docs.gitlab.com/ci/pipelines/merge_trains/",[],"Merge trains"," is a powerful feature by GitLab that allows users to automatically merge a series of (queued) merge requests without breaking the target branch. Using this feature, you can add an MR to the train, and it would take care of it until it is merged.",[25,396,398],{"id":397},"use-multiple-caches-in-the-same-job","Use multiple caches in the same job",[12,400,401,402,407],{},"Starting 13.11, GitLab CI/CD provides the ability to ",[19,403,406],{"href":404,"rel":405},"https://docs.gitlab.com/releases/#use-multiple-caches-in-the-same-job",[],"configure multiple cache keys in a single job"," which will help you increase your pipeline performance. This functionality could help you save precious development time when the jobs are running.",[25,409,411],{"id":410},"how-can-an-efficient-pipeline-save-you-money","How can an efficient pipeline save you money?",[12,413,414],{},"By using CI/CD strategies that ensure safe merging of new changes and a green master, organizations can worry less about unanticipated downtimes caused by infrastructural failures and code conflicts.",[12,416,417],{},"With faster pipelines, developers end up spending lesser time in maintenance and find time and space to bring in more thoughtfulness and creativity in their work, leading to improvements in code quality and the company atmosphere and morale.",[12,419,420,421,426],{},"If you are looking to bring down the cost of running your CI/CD pipelines for a large project, look up the ",[19,422,425],{"href":423,"rel":424},"https://docs.gitlab.com/ci/runners/configure_runners/#artifact-and-cache-settings",[],"Artifact and cache settings"," and Optimizing GitLab for large repositories sections in the documentation.",[428,429,430],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":109,"searchDepth":127,"depth":127,"links":432},[433,434,435,436,437,438,439],{"id":27,"depth":127,"text":28},{"id":63,"depth":127,"text":64},{"id":88,"depth":127,"text":89},{"id":357,"depth":127,"text":358},{"id":384,"depth":127,"text":385},{"id":397,"depth":127,"text":398},{"id":410,"depth":127,"text":411},"engineering","2021-06-21","Explore some CI/CD strategies that can make your team more efficient and productive.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749667358/Blog/Hero%20Images/gitlab-productivity.jpg",{},"/en-us/blog/how-to-become-more-productive-with-gitlab-ci",{"title":5,"description":442,"ogTitle":5,"ogDescription":442,"noIndex":445,"ogImage":446,"ogUrl":450,"ogSiteName":451,"ogType":452,"canonicalUrls":450},"https://about.gitlab.com/blog/how-to-become-more-productive-with-gitlab-ci","https://about.gitlab.com","article","how-to-become-more-productive-with-gitlab-ci","en-us/blog/how-to-become-more-productive-with-gitlab-ci",[456,457,458,459],"CI","CD","features","inside GitLab","BlogPost","nkKqG534ldIkCB7kZN2he0rW81UEkiVaTXyQYlTO2N8",{"logo":463,"freeTrial":468,"sales":473,"login":478,"items":483,"search":809,"minimal":840,"duo":859,"switchNav":868,"pricingDeployment":879},{"config":464},{"href":465,"dataGaName":466,"dataGaLocation":467},"/","gitlab logo","header",{"text":469,"config":470},"Get free trial",{"href":471,"dataGaName":472,"dataGaLocation":467},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":474,"config":475},"Request a demo",{"href":476,"dataGaName":477,"dataGaLocation":467},"/sales/?contact-topic=request-demo","sales",{"text":479,"config":480},"Sign in",{"href":481,"dataGaName":482,"dataGaLocation":467},"https://gitlab.com/users/sign_in/","sign in",[484,513,612,617,731,787],{"text":485,"config":486,"menu":488},"Platform",{"dataNavLevelOne":487},"platform",{"type":489,"columns":490},"cards",[491,497,505],{"title":485,"description":492,"link":493},"The intelligent orchestration platform for DevSecOps",{"text":494,"config":495},"Explore our Platform",{"href":496,"dataGaName":487,"dataGaLocation":467},"/platform/",{"title":498,"description":499,"link":500},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":501,"config":502},"Meet GitLab Duo",{"href":503,"dataGaName":504,"dataGaLocation":467},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":506,"description":507,"link":508},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":509,"config":510},"Learn more",{"href":511,"dataGaName":512,"dataGaLocation":467},"/why-gitlab/","why gitlab",{"text":514,"left":154,"config":515,"menu":517},"Product",{"dataNavLevelOne":516},"solutions",{"type":518,"link":519,"columns":523,"feature":591},"lists",{"text":520,"config":521},"View all Solutions",{"href":522,"dataGaName":516,"dataGaLocation":467},"/solutions/",[524,547,570],{"title":525,"description":526,"link":527,"items":532},"Automation","CI/CD and automation to accelerate deployment",{"config":528},{"icon":529,"href":530,"dataGaName":531,"dataGaLocation":467},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[533,536,539,543],{"text":534,"config":535},"CI/CD",{"href":21,"dataGaLocation":467,"dataGaName":534},{"text":498,"config":537},{"href":503,"dataGaLocation":467,"dataGaName":538},"gitlab duo agent platform - product menu",{"text":540,"config":541},"Source Code Management",{"href":542,"dataGaLocation":467,"dataGaName":540},"/solutions/source-code-management/",{"text":544,"config":545},"Automated Software Delivery",{"href":530,"dataGaLocation":467,"dataGaName":546},"Automated software delivery",{"title":548,"description":549,"link":550,"items":555},"Security","Deliver code faster without compromising security",{"config":551},{"href":552,"dataGaName":553,"dataGaLocation":467,"icon":554},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[556,560,565],{"text":557,"config":558},"Application Security Testing",{"href":552,"dataGaName":559,"dataGaLocation":467},"Application security testing",{"text":561,"config":562},"Software Supply Chain Security",{"href":563,"dataGaLocation":467,"dataGaName":564},"/solutions/supply-chain/","Software supply chain security",{"text":566,"config":567},"Software Compliance",{"href":568,"dataGaName":569,"dataGaLocation":467},"/solutions/software-compliance/","software compliance",{"title":571,"link":572,"items":577},"Measurement",{"config":573},{"icon":574,"href":575,"dataGaName":576,"dataGaLocation":467},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[578,582,586],{"text":579,"config":580},"Visibility & Measurement",{"href":575,"dataGaLocation":467,"dataGaName":581},"Visibility and Measurement",{"text":583,"config":584},"Value Stream Management",{"href":585,"dataGaLocation":467,"dataGaName":583},"/solutions/value-stream-management/",{"text":587,"config":588},"Analytics & Insights",{"href":589,"dataGaLocation":467,"dataGaName":590},"/solutions/analytics-and-insights/","Analytics and insights",{"title":592,"type":518,"items":593},"GitLab for",[594,600,606],{"text":595,"config":596},"Enterprise",{"icon":597,"href":598,"dataGaLocation":467,"dataGaName":599},"Building","/enterprise/","enterprise",{"text":601,"config":602},"Small Business",{"icon":603,"href":604,"dataGaLocation":467,"dataGaName":605},"Work","/small-business/","small business",{"text":607,"config":608},"Public Sector",{"icon":609,"href":610,"dataGaLocation":467,"dataGaName":611},"Organization","/solutions/public-sector/","public sector",{"text":613,"config":614},"Pricing",{"href":615,"dataGaName":616,"dataGaLocation":467,"dataNavLevelOne":616},"/pricing/","pricing",{"text":618,"config":619,"menu":621},"Resources",{"dataNavLevelOne":620},"resources",{"type":518,"link":622,"columns":626,"feature":720},{"text":623,"config":624},"View all resources",{"href":625,"dataGaName":620,"dataGaLocation":467},"/resources/",[627,660,687],{"title":628,"items":629},"Getting started",[630,635,640,645,650,655],{"text":631,"config":632},"Install",{"href":633,"dataGaName":634,"dataGaLocation":467},"/install/","install",{"text":636,"config":637},"Quick start guides",{"href":638,"dataGaName":639,"dataGaLocation":467},"/get-started/","quick setup checklists",{"text":641,"config":642},"Learn",{"href":643,"dataGaLocation":467,"dataGaName":644},"https://university.gitlab.com/","learn",{"text":646,"config":647},"Product documentation",{"href":648,"dataGaName":649,"dataGaLocation":467},"https://docs.gitlab.com/","product documentation",{"text":651,"config":652},"Best practice videos",{"href":653,"dataGaName":654,"dataGaLocation":467},"/getting-started-videos/","best practice videos",{"text":656,"config":657},"Integrations",{"href":658,"dataGaName":659,"dataGaLocation":467},"/integrations/","integrations",{"title":661,"items":662},"Discover",[663,668,673,678,682],{"text":664,"config":665},"Customer success stories",{"href":666,"dataGaName":667,"dataGaLocation":467},"/customers/","customer success stories",{"text":669,"config":670},"Blog",{"href":671,"dataGaName":672,"dataGaLocation":467},"/blog/","blog",{"text":674,"config":675},"Demo Hub",{"href":676,"dataGaName":677,"dataGaLocation":467},"/demo-hub/","demo hub",{"text":679,"config":680},"The Source",{"href":681,"dataGaName":672,"dataGaLocation":467},"/the-source/",{"text":683,"config":684},"Remote",{"href":685,"dataGaName":686,"dataGaLocation":467},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":688,"items":689},"Connect",[690,695,700,705,710,715],{"text":691,"config":692},"GitLab Services",{"href":693,"dataGaName":694,"dataGaLocation":467},"/services/","services",{"text":696,"config":697},"Contribute",{"href":698,"dataGaName":699,"dataGaLocation":467},"https://contributors.gitlab.com","contribute",{"text":701,"config":702},"Community",{"href":703,"dataGaName":704,"dataGaLocation":467},"/community/","community",{"text":706,"config":707},"Forum",{"href":708,"dataGaName":709,"dataGaLocation":467},"https://forum.gitlab.com/","forum",{"text":711,"config":712},"Events",{"href":713,"dataGaName":714,"dataGaLocation":467},"/events/","events",{"text":716,"config":717},"Partners",{"href":718,"dataGaName":719,"dataGaLocation":467},"/partners/","partners",{"config":721,"title":724,"text":725,"link":726},{"background":722,"textColor":723},"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":727,"config":728},"Read the latest",{"href":729,"dataGaName":730,"dataGaLocation":467},"/whats-new/","whats new",{"text":732,"config":733,"menu":735},"Company",{"dataNavLevelOne":734},"company",{"type":518,"columns":736},[737],{"items":738},[739,744,750,752,757,762,767,772,777,782],{"text":740,"config":741},"About",{"href":742,"dataGaName":743,"dataGaLocation":467},"/company/","about",{"text":745,"config":746,"footerGa":749},"Jobs",{"href":747,"dataGaName":748,"dataGaLocation":467},"/jobs/","jobs",{"dataGaName":748},{"text":711,"config":751},{"href":713,"dataGaName":714,"dataGaLocation":467},{"text":753,"config":754},"Leadership",{"href":755,"dataGaName":756,"dataGaLocation":467},"/company/team/e-group/","leadership",{"text":758,"config":759},"Handbook",{"href":760,"dataGaName":761,"dataGaLocation":467},"https://handbook.gitlab.com/","handbook",{"text":763,"config":764},"Investor relations",{"href":765,"dataGaName":766,"dataGaLocation":467},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":768,"config":769},"Trust Center",{"href":770,"dataGaName":771,"dataGaLocation":467},"/security/","trust center",{"text":773,"config":774},"AI Transparency Center",{"href":775,"dataGaName":776,"dataGaLocation":467},"/ai-transparency-center/","ai transparency center",{"text":778,"config":779},"Newsletter",{"href":780,"dataGaName":781,"dataGaLocation":467},"/company/contact/#contact-forms","newsletter",{"text":783,"config":784},"Press",{"href":785,"dataGaName":786,"dataGaLocation":467},"/press/","press",{"text":788,"config":789,"menu":790},"Contact us",{"dataNavLevelOne":734},{"type":518,"columns":791},[792],{"items":793},[794,799,804],{"text":795,"config":796},"Talk to sales",{"href":797,"dataGaName":798,"dataGaLocation":467},"/sales/","talk to sales",{"text":800,"config":801},"Support portal",{"href":802,"dataGaName":803,"dataGaLocation":467},"https://support.gitlab.com/hc/en-us","support portal",{"text":805,"config":806},"Customer portal",{"href":807,"dataGaName":808,"dataGaLocation":467},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":810,"login":811,"suggestions":818},"Close",{"text":812,"link":813},"To search repositories and projects, login to",{"text":814,"config":815},"gitlab.com",{"href":481,"dataGaName":816,"dataGaLocation":817},"search login","search",{"text":819,"default":820},"Suggestions",[821,823,827,829,833,837],{"text":498,"config":822},{"href":503,"dataGaName":498,"dataGaLocation":817},{"text":824,"config":825},"Code Suggestions (AI)",{"href":826,"dataGaName":824,"dataGaLocation":817},"/solutions/code-suggestions/",{"text":534,"config":828},{"href":21,"dataGaName":534,"dataGaLocation":817},{"text":830,"config":831},"GitLab on AWS",{"href":832,"dataGaName":830,"dataGaLocation":817},"/partners/technology-partners/aws/",{"text":834,"config":835},"GitLab on Google Cloud",{"href":836,"dataGaName":834,"dataGaLocation":817},"/partners/technology-partners/google-cloud-platform/",{"text":838,"config":839},"Why GitLab?",{"href":511,"dataGaName":838,"dataGaLocation":817},{"freeTrial":841,"mobileIcon":846,"desktopIcon":851,"secondaryButton":854},{"text":842,"config":843},"Start free trial",{"href":844,"dataGaName":472,"dataGaLocation":845},"https://gitlab.com/-/trials/new/","nav",{"altText":847,"config":848},"Gitlab Icon",{"src":849,"dataGaName":850,"dataGaLocation":845},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":847,"config":852},{"src":853,"dataGaName":850,"dataGaLocation":845},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":855,"config":856},"Get Started",{"href":857,"dataGaName":858,"dataGaLocation":845},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":860,"mobileIcon":864,"desktopIcon":866},{"text":861,"config":862},"Learn more about GitLab Duo",{"href":503,"dataGaName":863,"dataGaLocation":845},"gitlab duo",{"altText":847,"config":865},{"src":849,"dataGaName":850,"dataGaLocation":845},{"altText":847,"config":867},{"src":853,"dataGaName":850,"dataGaLocation":845},{"button":869,"mobileIcon":874,"desktopIcon":876},{"text":870,"config":871},"/switch",{"href":872,"dataGaName":873,"dataGaLocation":845},"#contact","switch",{"altText":847,"config":875},{"src":849,"dataGaName":850,"dataGaLocation":845},{"altText":847,"config":877},{"src":878,"dataGaName":850,"dataGaLocation":845},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":880,"mobileIcon":885,"desktopIcon":887},{"text":881,"config":882},"Back to pricing",{"href":615,"dataGaName":883,"dataGaLocation":845,"icon":884},"back to pricing","GoBack",{"altText":847,"config":886},{"src":849,"dataGaName":850,"dataGaLocation":845},{"altText":847,"config":888},{"src":853,"dataGaName":850,"dataGaLocation":845},{"title":890,"titleMobile":891,"button":892,"config":897},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":509,"config":893},{"href":894,"dataGaName":895,"dataGaLocation":896},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":898,"disabled":445},"release",{"data":900},{"text":901,"source":902,"edit":908,"contribute":913,"config":918,"items":923,"minimal":1133},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":903,"config":904},"View page source",{"href":905,"dataGaName":906,"dataGaLocation":907},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":909,"config":910},"Edit this page",{"href":911,"dataGaName":912,"dataGaLocation":907},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":914,"config":915},"Please contribute",{"href":916,"dataGaName":917,"dataGaLocation":907},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":919,"facebook":920,"youtube":921,"linkedin":922},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[924,971,1025,1069,1101],{"title":613,"links":925,"subMenu":940},[926,930,935],{"text":927,"config":928},"View plans",{"href":615,"dataGaName":929,"dataGaLocation":907},"view plans",{"text":931,"config":932},"Why Premium?",{"href":933,"dataGaName":934,"dataGaLocation":907},"/pricing/premium/","why premium",{"text":936,"config":937},"Why Ultimate?",{"href":938,"dataGaName":939,"dataGaLocation":907},"/pricing/ultimate/","why ultimate",[941],{"title":942,"links":943},"Contact Us",[944,947,949,951,956,961,966],{"text":945,"config":946},"Contact sales",{"href":797,"dataGaName":477,"dataGaLocation":907},{"text":800,"config":948},{"href":802,"dataGaName":803,"dataGaLocation":907},{"text":805,"config":950},{"href":807,"dataGaName":808,"dataGaLocation":907},{"text":952,"config":953},"Status",{"href":954,"dataGaName":955,"dataGaLocation":907},"https://status.gitlab.com/","status",{"text":957,"config":958},"Terms of use",{"href":959,"dataGaName":960,"dataGaLocation":907},"/terms/","terms of use",{"text":962,"config":963},"Privacy statement",{"href":964,"dataGaName":965,"dataGaLocation":907},"/privacy/","privacy statement",{"text":967,"config":968},"Cookie preferences",{"dataGaName":969,"dataGaLocation":907,"id":970,"isOneTrustButton":154},"cookie preferences","ot-sdk-btn",{"title":514,"links":972,"subMenu":981},[973,977],{"text":974,"config":975},"DevSecOps platform",{"href":496,"dataGaName":976,"dataGaLocation":907},"devsecops platform",{"text":978,"config":979},"AI-Assisted Development",{"href":503,"dataGaName":980,"dataGaLocation":907},"ai-assisted development",[982],{"title":983,"links":984},"Topics",[985,990,995,1000,1005,1010,1015,1020],{"text":986,"config":987},"CICD",{"href":988,"dataGaName":989,"dataGaLocation":907},"/topics/ci-cd/","cicd",{"text":991,"config":992},"GitOps",{"href":993,"dataGaName":994,"dataGaLocation":907},"/topics/gitops/","gitops",{"text":996,"config":997},"DevOps",{"href":998,"dataGaName":999,"dataGaLocation":907},"/topics/devops/","devops",{"text":1001,"config":1002},"Version Control",{"href":1003,"dataGaName":1004,"dataGaLocation":907},"/topics/version-control/","version control",{"text":1006,"config":1007},"DevSecOps",{"href":1008,"dataGaName":1009,"dataGaLocation":907},"/topics/devsecops/","devsecops",{"text":1011,"config":1012},"Cloud Native",{"href":1013,"dataGaName":1014,"dataGaLocation":907},"/topics/cloud-native/","cloud native",{"text":1016,"config":1017},"AI for Coding",{"href":1018,"dataGaName":1019,"dataGaLocation":907},"/topics/devops/ai-for-coding/","ai for coding",{"text":1021,"config":1022},"Agentic AI",{"href":1023,"dataGaName":1024,"dataGaLocation":907},"/topics/agentic-ai/","agentic ai",{"title":1026,"links":1027},"Solutions",[1028,1030,1032,1037,1041,1044,1048,1051,1053,1056,1059,1064],{"text":557,"config":1029},{"href":552,"dataGaName":557,"dataGaLocation":907},{"text":546,"config":1031},{"href":530,"dataGaName":531,"dataGaLocation":907},{"text":1033,"config":1034},"Agile development",{"href":1035,"dataGaName":1036,"dataGaLocation":907},"/solutions/agile-delivery/","agile delivery",{"text":1038,"config":1039},"SCM",{"href":542,"dataGaName":1040,"dataGaLocation":907},"source code management",{"text":986,"config":1042},{"href":21,"dataGaName":1043,"dataGaLocation":907},"continuous integration & delivery",{"text":1045,"config":1046},"Value stream management",{"href":585,"dataGaName":1047,"dataGaLocation":907},"value stream management",{"text":991,"config":1049},{"href":1050,"dataGaName":994,"dataGaLocation":907},"/solutions/gitops/",{"text":595,"config":1052},{"href":598,"dataGaName":599,"dataGaLocation":907},{"text":1054,"config":1055},"Small business",{"href":604,"dataGaName":605,"dataGaLocation":907},{"text":1057,"config":1058},"Public sector",{"href":610,"dataGaName":611,"dataGaLocation":907},{"text":1060,"config":1061},"Education",{"href":1062,"dataGaName":1063,"dataGaLocation":907},"/solutions/education/","education",{"text":1065,"config":1066},"Financial services",{"href":1067,"dataGaName":1068,"dataGaLocation":907},"/solutions/finance/","financial services",{"title":618,"links":1070},[1071,1073,1075,1077,1080,1082,1085,1087,1089,1091,1093,1095,1097,1099],{"text":631,"config":1072},{"href":633,"dataGaName":634,"dataGaLocation":907},{"text":636,"config":1074},{"href":638,"dataGaName":639,"dataGaLocation":907},{"text":641,"config":1076},{"href":643,"dataGaName":644,"dataGaLocation":907},{"text":646,"config":1078},{"href":648,"dataGaName":1079,"dataGaLocation":907},"docs",{"text":669,"config":1081},{"href":671,"dataGaName":672,"dataGaLocation":907},{"text":1083,"config":1084},"What's new",{"href":729,"dataGaName":730,"dataGaLocation":907},{"text":664,"config":1086},{"href":666,"dataGaName":667,"dataGaLocation":907},{"text":683,"config":1088},{"href":685,"dataGaName":686,"dataGaLocation":907},{"text":691,"config":1090},{"href":693,"dataGaName":694,"dataGaLocation":907},{"text":696,"config":1092},{"href":698,"dataGaName":699,"dataGaLocation":907},{"text":701,"config":1094},{"href":703,"dataGaName":704,"dataGaLocation":907},{"text":706,"config":1096},{"href":708,"dataGaName":709,"dataGaLocation":907},{"text":711,"config":1098},{"href":713,"dataGaName":714,"dataGaLocation":907},{"text":716,"config":1100},{"href":718,"dataGaName":719,"dataGaLocation":907},{"title":732,"links":1102},[1103,1105,1107,1109,1111,1113,1117,1122,1124,1126,1128],{"text":740,"config":1104},{"href":742,"dataGaName":734,"dataGaLocation":907},{"text":745,"config":1106},{"href":747,"dataGaName":748,"dataGaLocation":907},{"text":753,"config":1108},{"href":755,"dataGaName":756,"dataGaLocation":907},{"text":758,"config":1110},{"href":760,"dataGaName":761,"dataGaLocation":907},{"text":763,"config":1112},{"href":765,"dataGaName":766,"dataGaLocation":907},{"text":1114,"config":1115},"Sustainability",{"href":1116,"dataGaName":1114,"dataGaLocation":907},"/sustainability/",{"text":1118,"config":1119},"Diversity, inclusion and belonging (DIB)",{"href":1120,"dataGaName":1121,"dataGaLocation":907},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":768,"config":1123},{"href":770,"dataGaName":771,"dataGaLocation":907},{"text":778,"config":1125},{"href":780,"dataGaName":781,"dataGaLocation":907},{"text":783,"config":1127},{"href":785,"dataGaName":786,"dataGaLocation":907},{"text":1129,"config":1130},"Modern Slavery Transparency Statement",{"href":1131,"dataGaName":1132,"dataGaLocation":907},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1134},[1135,1138,1141],{"text":1136,"config":1137},"Terms",{"href":959,"dataGaName":960,"dataGaLocation":907},{"text":1139,"config":1140},"Cookies",{"dataGaName":969,"dataGaLocation":907,"id":970,"isOneTrustButton":154},{"text":1142,"config":1143},"Privacy",{"href":964,"dataGaName":965,"dataGaLocation":907},[1145],{"id":1146,"title":7,"body":444,"config":1147,"content":1149,"description":444,"extension":1153,"meta":1154,"navigation":154,"path":1155,"seo":1156,"stem":1157,"__hash__":1158},"blogAuthors/en-us/blog/authors/veethika-mishra.yml",{"template":1148},"BlogAuthor",{"name":7,"config":1150},{"headshot":1151,"ctfId":1152},"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",[1160,1169,1177],{"title":1161,"description":1162,"heroImage":1163,"category":440,"date":1164,"authors":1165,"slug":1168,"externalUrl":444},"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",[1166,1167],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1170,"description":1171,"heroImage":1172,"category":440,"date":1173,"authors":1174,"slug":1176,"externalUrl":444},"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",[1175],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1178,"description":1179,"heroImage":1180,"category":440,"date":1181,"authors":1182,"slug":1184,"externalUrl":444},"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",[1183],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1186},[1187,1201,1213,1225],{"id":1188,"categories":1189,"header":1191,"text":1192,"button":1193,"image":1198},"ai-modernization",[1190],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1194,"config":1195},"Get your AI maturity score",{"href":1196,"dataGaName":1197,"dataGaLocation":672},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1199},{"src":1200},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1202,"categories":1203,"header":1205,"text":1192,"button":1206,"image":1210},"devops-modernization",[1204,1009],"product","Are you just managing tools or shipping innovation?",{"text":1207,"config":1208},"Get your DevOps maturity score",{"href":1209,"dataGaName":1197,"dataGaLocation":672},"/assessments/devops-modernization-assessment/",{"config":1211},{"src":1212},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1214,"categories":1215,"header":1217,"text":1192,"button":1218,"image":1222},"security-modernization",[1216],"security","Are you trading speed for security?",{"text":1219,"config":1220},"Get your security maturity score",{"href":1221,"dataGaName":1197,"dataGaLocation":672},"/assessments/security-modernization-assessment/",{"config":1223},{"src":1224},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1226,"paths":1227,"header":1230,"text":1231,"button":1232,"image":1237},"github-azure-migration",[1228,1229],"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":1233,"config":1234},"See how GitLab compares to GitHub",{"href":1235,"dataGaName":1236,"dataGaLocation":672},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1238},{"src":1212},{"header":1240,"blurb":1241,"button":1242,"secondaryButton":1247},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1243,"config":1244},"Get your free trial",{"href":1245,"dataGaName":472,"dataGaLocation":1246},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":945,"config":1248},{"href":797,"dataGaName":477,"dataGaLocation":1246},1786803749664]