[{"data":1,"prerenderedAt":1438},["ShallowReactive",2],{"/blog/a-visual-guide-to-gitlab-ci-caching":3,"navigation-en-us":652,"banner-en-us":1080,"footer-en-us":1090,"blog-post-authors-en-us-Matthieu Fronton":1334,"blog-related-posts-en-us-a-visual-guide-to-gitlab-ci-caching":1348,"blog-promotions-en-us":1374,"next-steps-en-us":1428},{"id":4,"title":5,"authors":6,"body":8,"category":630,"date":631,"description":632,"extension":633,"externalUrl":634,"faq":634,"featured":635,"heroImage":636,"meta":637,"navigation":306,"path":638,"seo":639,"slug":643,"stem":644,"tags":645,"template":650,"updatedDate":634,"__hash__":651},"blogPosts/en-us/blog/a-visual-guide-to-gitlab-ci-caching.md","A visual guide to GitLab CI/CD caching",[7],"Matthieu Fronton",{"type":9,"value":10,"toc":622},"minimark",[11,15,18,23,31,41,44,50,58,62,65,68,76,82,86,107,171,177,196,249,255,267,273,277,291,329,335,338,395,401,405,426,602,618],[12,13,14],"p",{},"If you've ever worked with GitLab CI/CD you may have needed, at some point, to use a cache to share content between jobs. The decentralized nature of GitLab CI/CD is a strength that can confuse the understanding of even the best of us when we want to connect wires all together. For instance, we need to know critical information such as the difference between artifacts and cache and where/how to place setups.",[12,16,17],{},"This visual guide will help with both challenges.",[19,20,22],"h2",{"id":21},"cache-vs-artifacts","Cache vs. artifacts",[12,24,25,26,30],{},"The concepts ",[27,28,29],"em",{},"may"," seem to overlap because they are about sharing content between jobs, but they actually are fundamentally different:",[32,33,34,38],"ul",{},[35,36,37],"li",{},"If your job does not rely on the the previous one (i.e. can produce it by itself but if content already exists the job will run faster), then use cache.",[35,39,40],{},"If your job does rely on the output of the previous one (i.e. cannot produce it by itself), then use artifacts and dependencies.",[12,42,43],{},"Here is a simple sentence to remember if you struggle between choosing cache or artifact:",[45,46,47],"blockquote",{},[12,48,49],{},"Cache is here to speed up your job but it may not exist, so don't rely on it.",[12,51,52,53,57],{},"This article will focus on ",[54,55,56],"strong",{},"cache",".",[19,59,61],{"id":60},"initial-setup","Initial setup",[12,63,64],{},"We'll go with a simple representation of the GitLab CI/CD pipelining model and ignore (for now) that the jobs can be executed on any runners and hosts. It will help get the basics.",[12,66,67],{},"Let's say you have:",[32,69,70,73],{},[35,71,72],{},"1 project with 3 branches",[35,74,75],{},"1 host running 2 docker runners",[12,77,78],{},[79,80],"img",{"alt":61,"src":81},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399274/blog/Content%20Images/visual-guide-caching/vgc-1.png",[19,83,85],{"id":84},"local-cache-docker-volume","Local cache: Docker volume",[12,87,88,89,95,96,101,102,106],{},"If you want a ",[90,91,94],"a",{"href":92,"rel":93},"https://docs.gitlab.com/ci/caching/#where-the-caches-are-stored",[],"local cache"," between all your jobs running on the same runner, use the ",[90,97,100],{"href":98,"rel":99},"https://docs.gitlab.com/ci/yaml/#cache",[],"cache statement"," in your ",[103,104,105],"code",{},".gitlab-ci.yml",":",[108,109,114],"pre",{"className":110,"code":111,"language":112,"meta":113,"style":113},"language-yaml shiki shiki-themes github-light","default:\n  cache:\n    path:\n      - relative/path/to/folder/*.ext\n      - relative/path/to/another_folder/\n      - relative/path/to/file\n\n","yaml","",[103,115,116,129,137,145,155,163],{"__ignoreMap":113},[117,118,121,125],"span",{"class":119,"line":120},"line",1,[117,122,124],{"class":123},"shJU0","default",[117,126,128],{"class":127},"sgsFI",":\n",[117,130,132,135],{"class":119,"line":131},2,[117,133,134],{"class":123},"  cache",[117,136,128],{"class":127},[117,138,140,143],{"class":119,"line":139},3,[117,141,142],{"class":123},"    path",[117,144,128],{"class":127},[117,146,148,151],{"class":119,"line":147},4,[117,149,150],{"class":127},"      - ",[117,152,154],{"class":153},"sYBdl","relative/path/to/folder/*.ext\n",[117,156,158,160],{"class":119,"line":157},5,[117,159,150],{"class":127},[117,161,162],{"class":153},"relative/path/to/another_folder/\n",[117,164,166,168],{"class":119,"line":165},6,[117,167,150],{"class":127},[117,169,170],{"class":153},"relative/path/to/file\n",[12,172,173],{},[79,174],{"alt":175,"src":176},"local / container / all branches / all jobs","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399274/blog/Content%20Images/visual-guide-caching/vgc-2.png",[12,178,179,180,185,186,189,190,195],{},"Using the ",[90,181,184],{"href":182,"rel":183},"https://docs.gitlab.com/ci/variables/predefined_variables/",[],"predefined variable"," ",[103,187,188],{},"CI_COMMIT_REF_NAME"," as the ",[90,191,194],{"href":192,"rel":193},"https://docs.gitlab.com/ci/yaml/#cachekey",[],"cache key",", you can ensure the cache is tied to a specific branch:",[108,197,199],{"className":110,"code":198,"language":112,"meta":113,"style":113},"default:\n  cache:\n    key: $CI_COMMIT_REF_NAME\n    path:\n      - relative/path/to/folder/*.ext\n      - relative/path/to/another_folder/\n      - relative/path/to/file\n\n",[103,200,201,207,213,224,230,236,242],{"__ignoreMap":113},[117,202,203,205],{"class":119,"line":120},[117,204,124],{"class":123},[117,206,128],{"class":127},[117,208,209,211],{"class":119,"line":131},[117,210,134],{"class":123},[117,212,128],{"class":127},[117,214,215,218,221],{"class":119,"line":139},[117,216,217],{"class":123},"    key",[117,219,220],{"class":127},": ",[117,222,223],{"class":153},"$CI_COMMIT_REF_NAME\n",[117,225,226,228],{"class":119,"line":147},[117,227,142],{"class":123},[117,229,128],{"class":127},[117,231,232,234],{"class":119,"line":157},[117,233,150],{"class":127},[117,235,154],{"class":153},[117,237,238,240],{"class":119,"line":165},[117,239,150],{"class":127},[117,241,162],{"class":153},[117,243,245,247],{"class":119,"line":244},7,[117,246,150],{"class":127},[117,248,170],{"class":153},[12,250,251],{},[79,252],{"alt":253,"src":254},"local / container / one branch / all jobs","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399275/blog/Content%20Images/visual-guide-caching/vgc-3.png",[12,256,179,257,185,260,189,263,266],{},[90,258,184],{"href":182,"rel":259},[],[103,261,262],{},"CI_JOB_NAME",[90,264,194],{"href":192,"rel":265},[],", you can ensure the cache is tied to a specific job:",[12,268,269],{},[79,270],{"alt":271,"src":272},"local / container / all branch / one jobs","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399275/blog/Content%20Images/visual-guide-caching/vgc-4.png",[19,274,276],{"id":275},"local-cache-bind-mount","Local cache: Bind mount",[12,278,279,280,285,286,101,289,106],{},"If you don't want to use a volume for caching purposes (debugging purpose, cleanup disk space more easily, etc.), you can configure a ",[90,281,284],{"href":282,"rel":283},"https://docs.docker.com/storage/bind-mounts/",[],"bind mount for Docker volumes"," while registering the runner. With this setup, you do not need to set up the ",[90,287,100],{"href":98,"rel":288},[],[103,290,105],{},[108,292,294],{"className":110,"code":293,"language":112,"meta":113,"style":113},"#!/bin/bash\n\ngitlab-runner register                             \\\n  --name=\"Bind-Mount Runner\"                       \\\n  --docker-volumes=\"/host/path:/container/path:rw\" \\\n...\n",[103,295,296,302,308,313,318,323],{"__ignoreMap":113},[117,297,298],{"class":119,"line":120},[117,299,301],{"class":300},"sAwPA","#!/bin/bash\n",[117,303,304],{"class":119,"line":131},[117,305,307],{"emptyLinePlaceholder":306},true,"\n",[117,309,310],{"class":119,"line":139},[117,311,312],{"class":153},"gitlab-runner register                             \\\n",[117,314,315],{"class":119,"line":147},[117,316,317],{"class":153},"  --name=\"Bind-Mount Runner\"                       \\\n",[117,319,320],{"class":119,"line":157},[117,321,322],{"class":153},"  --docker-volumes=\"/host/path:/container/path:rw\" \\\n",[117,324,325],{"class":119,"line":165},[117,326,328],{"class":327},"s7eDp","...\n",[12,330,331],{},[79,332],{"alt":333,"src":334},"local / one runners / one host / all branch / all jobs","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399275/blog/Content%20Images/visual-guide-caching/vgc-5.png",[12,336,337],{},"In fact, this setup even allows you to share a cache between jobs running on the same host without requiring you to set up a distributed cache (which we'll talk about later):",[108,339,341],{"className":110,"code":340,"language":112,"meta":113,"style":113},"#!/bin/bash\n\ngitlab-runner register                             \\\n  --name=\"Bind-Mount Runner X\"                     \\\n  --docker-volumes=\"/host/path:/container/path:rw\" \\\n...\n\ngitlab-runner register                                 \\\n  --name=\"Bind-Mount Runner Y\"                         \\\n  --docker-volumes=\"/host/path:/container/alt/path:rw\" \\\n...\n",[103,342,343,347,351,355,360,364,368,372,378,384,390],{"__ignoreMap":113},[117,344,345],{"class":119,"line":120},[117,346,301],{"class":300},[117,348,349],{"class":119,"line":131},[117,350,307],{"emptyLinePlaceholder":306},[117,352,353],{"class":119,"line":139},[117,354,312],{"class":153},[117,356,357],{"class":119,"line":147},[117,358,359],{"class":153},"  --name=\"Bind-Mount Runner X\"                     \\\n",[117,361,362],{"class":119,"line":157},[117,363,322],{"class":153},[117,365,366],{"class":119,"line":165},[117,367,328],{"class":327},[117,369,370],{"class":119,"line":244},[117,371,307],{"emptyLinePlaceholder":306},[117,373,375],{"class":119,"line":374},8,[117,376,377],{"class":153},"gitlab-runner register                                 \\\n",[117,379,381],{"class":119,"line":380},9,[117,382,383],{"class":153},"  --name=\"Bind-Mount Runner Y\"                         \\\n",[117,385,387],{"class":119,"line":386},10,[117,388,389],{"class":153},"  --docker-volumes=\"/host/path:/container/alt/path:rw\" \\\n",[117,391,393],{"class":119,"line":392},11,[117,394,328],{"class":327},[12,396,397],{},[79,398],{"alt":399,"src":400},"local / multiple runners / one host / all branch / all jobs","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399275/blog/Content%20Images/visual-guide-caching/vgc-6.png",[19,402,404],{"id":403},"distributed-cache","Distributed cache",[12,406,407,408,413,414,420],{},"If you want to have a ",[90,409,412],{"href":410,"rel":411},"https://docs.gitlab.com/runner/configuration/autoscale/#distributed-runners-caching",[],"shared cache"," between all your jobs running on multiple runners and hosts, use the ",[90,415,417],{"href":416},"https://docs.gitlab.com/runner/configuration/advanced-configuration/#the-runnerscache-section",[117,418,419],{},"runner.cache",[90,421,422,423,106],{}," section in your ",[103,424,425],{},"config.toml",[90,427,428,557,563,569,575,579,582,585,588,593,599],{},[108,429,433],{"className":430,"code":431,"language":432,"meta":113,"style":113},"language-toml shiki shiki-themes github-light","[[runners]]\n  name = \"Distributed-Cache Runner\"\n...\n  [runners.cache]\n    Type = \"s3\"\n    Path = \"bucket/path/prefix\"\n    Shared = true\n    [runners.cache.s3]\n      ServerAddress = \"s3.amazonaws.com\"\n      AccessKey = \"\u003Cchangeme>\"\n      SecretKey = \"\u003Cchangeme>\"\n      BucketName = \"foobar\"\n      BucketLocation = \"us-east-1\"\n\n","toml",[103,434,435,446,454,459,473,481,489,498,516,524,532,539,548],{"__ignoreMap":113},[117,436,437,440,443],{"class":119,"line":120},[117,438,439],{"class":127},"[[",[117,441,442],{"class":327},"runners",[117,444,445],{"class":127},"]]\n",[117,447,448,451],{"class":119,"line":131},[117,449,450],{"class":127},"  name = ",[117,452,453],{"class":153},"\"Distributed-Cache Runner\"\n",[117,455,456],{"class":119,"line":139},[117,457,328],{"class":458},"sB1qb",[117,460,461,464,466,468,470],{"class":119,"line":147},[117,462,463],{"class":127},"  [",[117,465,442],{"class":327},[117,467,57],{"class":127},[117,469,56],{"class":327},[117,471,472],{"class":127},"]\n",[117,474,475,478],{"class":119,"line":157},[117,476,477],{"class":127},"    Type = ",[117,479,480],{"class":153},"\"s3\"\n",[117,482,483,486],{"class":119,"line":165},[117,484,485],{"class":127},"    Path = ",[117,487,488],{"class":153},"\"bucket/path/prefix\"\n",[117,490,491,494],{"class":119,"line":244},[117,492,493],{"class":127},"    Shared = ",[117,495,497],{"class":496},"sYu0t","true\n",[117,499,500,503,505,507,509,511,514],{"class":119,"line":374},[117,501,502],{"class":127},"    [",[117,504,442],{"class":327},[117,506,57],{"class":127},[117,508,56],{"class":327},[117,510,57],{"class":127},[117,512,513],{"class":327},"s3",[117,515,472],{"class":127},[117,517,518,521],{"class":119,"line":380},[117,519,520],{"class":127},"      ServerAddress = ",[117,522,523],{"class":153},"\"s3.amazonaws.com\"\n",[117,525,526,529],{"class":119,"line":386},[117,527,528],{"class":127},"      AccessKey = ",[117,530,531],{"class":153},"\"\u003Cchangeme>\"\n",[117,533,534,537],{"class":119,"line":392},[117,535,536],{"class":127},"      SecretKey = ",[117,538,531],{"class":153},[117,540,542,545],{"class":119,"line":541},12,[117,543,544],{"class":127},"      BucketName = ",[117,546,547],{"class":153},"\"foobar\"\n",[117,549,551,554],{"class":119,"line":550},13,[117,552,553],{"class":127},"      BucketLocation = ",[117,555,556],{"class":153},"\"us-east-1\"\n",[12,558,559],{},[79,560],{"alt":561,"src":562},"remote / multiple runners / multiple hosts / all branch / all jobs","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399276/blog/Content%20Images/visual-guide-caching/vgc-7.png",[12,564,565,566,568],{},"Using the predefined variable ",[103,567,188],{}," as the cache key you can ensure the cache is tied to a specific branch between multiple runners and hosts:",[12,570,571],{},[79,572],{"alt":573,"src":574},"remote / multiple runners / multiple hosts / one branch / all jobs","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399276/blog/Content%20Images/visual-guide-caching/vgc-8.png",[19,576,578],{"id":577},"real-life-setup","Real-life setup",[12,580,581],{},"The above assumptions allowed you to harness your understanding of the concepts and possibilities.",[12,583,584],{},"In real life, you'll face more complex wiring and we hope this article will help you as a visual cheatsheet along with the reference documentation.",[12,586,587],{},"Just to give you a sneak peek, here is an exercise for you:",[32,589,590],{},[35,591,592],{},"Set up a cache between all the jobs of a specific stage, running on any runner and any hosts, but only between pipeline of the same branches:",[12,594,595],{},[79,596],{"alt":597,"src":598},"Real-life test assignment","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399276/blog/Content%20Images/visual-guide-caching/vgc-9.png",[12,600,601],{},"Happy caching, folks!",[12,603,604,607,612,613],{},[90,605,606],{},"Cover image by ",[90,608,611],{"href":609,"rel":610},"https://unsplash.com/@alinnnaaaa",[],"Alina Grubnyak"," on ",[90,614,617],{"href":615,"rel":616},"https://unsplash.com",[],"Unsplash",[619,620,621],"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);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sB1qb, html code.shiki .sB1qb{--shiki-default:#B31D28;--shiki-default-font-style:italic}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":113,"searchDepth":131,"depth":131,"links":623},[624,625,626,627,628,629],{"id":21,"depth":131,"text":22},{"id":60,"depth":131,"text":61},{"id":84,"depth":131,"text":85},{"id":275,"depth":131,"text":276},{"id":403,"depth":131,"text":404},{"id":577,"depth":131,"text":578},"engineering","2022-09-12","Learn cache types, as well as when and how to use them.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682443/Blog/Hero%20Images/cover.jpg",{},"/en-us/blog/a-visual-guide-to-gitlab-ci-caching",{"title":5,"description":632,"ogTitle":5,"ogDescription":632,"noIndex":635,"ogImage":636,"ogUrl":640,"ogSiteName":641,"ogType":642,"canonicalUrls":640},"https://about.gitlab.com/blog/a-visual-guide-to-gitlab-ci-caching","https://about.gitlab.com","article","a-visual-guide-to-gitlab-ci-caching","en-us/blog/a-visual-guide-to-gitlab-ci-caching",[646,647,648,649],"CI","CD","DevOps","tutorial","BlogPost","BOxMYB6qxQEO4iT9gORe53-5YNsepNR2LjVBGuS6_EI",{"logo":653,"freeTrial":658,"sales":663,"login":668,"items":673,"search":1000,"minimal":1031,"duo":1050,"switchNav":1059,"pricingDeployment":1070},{"config":654},{"href":655,"dataGaName":656,"dataGaLocation":657},"/","gitlab logo","header",{"text":659,"config":660},"Get free trial",{"href":661,"dataGaName":662,"dataGaLocation":657},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":664,"config":665},"Request a demo",{"href":666,"dataGaName":667,"dataGaLocation":657},"/sales/?contact-topic=request-demo","sales",{"text":669,"config":670},"Sign in",{"href":671,"dataGaName":672,"dataGaLocation":657},"https://gitlab.com/users/sign_in/","sign in",[674,703,803,808,922,978],{"text":675,"config":676,"menu":678},"Platform",{"dataNavLevelOne":677},"platform",{"type":679,"columns":680},"cards",[681,687,695],{"title":675,"description":682,"link":683},"The intelligent orchestration platform for DevSecOps",{"text":684,"config":685},"Explore our Platform",{"href":686,"dataGaName":677,"dataGaLocation":657},"/platform/",{"title":688,"description":689,"link":690},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":691,"config":692},"Meet GitLab Duo",{"href":693,"dataGaName":694,"dataGaLocation":657},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":696,"description":697,"link":698},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":699,"config":700},"Learn more",{"href":701,"dataGaName":702,"dataGaLocation":657},"/why-gitlab/","why gitlab",{"text":704,"left":306,"config":705,"menu":707},"Product",{"dataNavLevelOne":706},"solutions",{"type":708,"link":709,"columns":713,"feature":782},"lists",{"text":710,"config":711},"View all Solutions",{"href":712,"dataGaName":706,"dataGaLocation":657},"/solutions/",[714,738,761],{"title":715,"description":716,"link":717,"items":722},"Automation","CI/CD and automation to accelerate deployment",{"config":718},{"icon":719,"href":720,"dataGaName":721,"dataGaLocation":657},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[723,727,730,734],{"text":724,"config":725},"CI/CD",{"href":726,"dataGaLocation":657,"dataGaName":724},"/solutions/continuous-integration/",{"text":688,"config":728},{"href":693,"dataGaLocation":657,"dataGaName":729},"gitlab duo agent platform - product menu",{"text":731,"config":732},"Source Code Management",{"href":733,"dataGaLocation":657,"dataGaName":731},"/solutions/source-code-management/",{"text":735,"config":736},"Automated Software Delivery",{"href":720,"dataGaLocation":657,"dataGaName":737},"Automated software delivery",{"title":739,"description":740,"link":741,"items":746},"Security","Deliver code faster without compromising security",{"config":742},{"href":743,"dataGaName":744,"dataGaLocation":657,"icon":745},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[747,751,756],{"text":748,"config":749},"Application Security Testing",{"href":743,"dataGaName":750,"dataGaLocation":657},"Application security testing",{"text":752,"config":753},"Software Supply Chain Security",{"href":754,"dataGaLocation":657,"dataGaName":755},"/solutions/supply-chain/","Software supply chain security",{"text":757,"config":758},"Software Compliance",{"href":759,"dataGaName":760,"dataGaLocation":657},"/solutions/software-compliance/","software compliance",{"title":762,"link":763,"items":768},"Measurement",{"config":764},{"icon":765,"href":766,"dataGaName":767,"dataGaLocation":657},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[769,773,777],{"text":770,"config":771},"Visibility & Measurement",{"href":766,"dataGaLocation":657,"dataGaName":772},"Visibility and Measurement",{"text":774,"config":775},"Value Stream Management",{"href":776,"dataGaLocation":657,"dataGaName":774},"/solutions/value-stream-management/",{"text":778,"config":779},"Analytics & Insights",{"href":780,"dataGaLocation":657,"dataGaName":781},"/solutions/analytics-and-insights/","Analytics and insights",{"title":783,"type":708,"items":784},"GitLab for",[785,791,797],{"text":786,"config":787},"Enterprise",{"icon":788,"href":789,"dataGaLocation":657,"dataGaName":790},"Building","/enterprise/","enterprise",{"text":792,"config":793},"Small Business",{"icon":794,"href":795,"dataGaLocation":657,"dataGaName":796},"Work","/small-business/","small business",{"text":798,"config":799},"Public Sector",{"icon":800,"href":801,"dataGaLocation":657,"dataGaName":802},"Organization","/solutions/public-sector/","public sector",{"text":804,"config":805},"Pricing",{"href":806,"dataGaName":807,"dataGaLocation":657,"dataNavLevelOne":807},"/pricing/","pricing",{"text":809,"config":810,"menu":812},"Resources",{"dataNavLevelOne":811},"resources",{"type":708,"link":813,"columns":817,"feature":911},{"text":814,"config":815},"View all resources",{"href":816,"dataGaName":811,"dataGaLocation":657},"/resources/",[818,851,878],{"title":819,"items":820},"Getting started",[821,826,831,836,841,846],{"text":822,"config":823},"Install",{"href":824,"dataGaName":825,"dataGaLocation":657},"/install/","install",{"text":827,"config":828},"Quick start guides",{"href":829,"dataGaName":830,"dataGaLocation":657},"/get-started/","quick setup checklists",{"text":832,"config":833},"Learn",{"href":834,"dataGaLocation":657,"dataGaName":835},"https://university.gitlab.com/","learn",{"text":837,"config":838},"Product documentation",{"href":839,"dataGaName":840,"dataGaLocation":657},"https://docs.gitlab.com/","product documentation",{"text":842,"config":843},"Best practice videos",{"href":844,"dataGaName":845,"dataGaLocation":657},"/getting-started-videos/","best practice videos",{"text":847,"config":848},"Integrations",{"href":849,"dataGaName":850,"dataGaLocation":657},"/integrations/","integrations",{"title":852,"items":853},"Discover",[854,859,864,869,873],{"text":855,"config":856},"Customer success stories",{"href":857,"dataGaName":858,"dataGaLocation":657},"/customers/","customer success stories",{"text":860,"config":861},"Blog",{"href":862,"dataGaName":863,"dataGaLocation":657},"/blog/","blog",{"text":865,"config":866},"Demo Hub",{"href":867,"dataGaName":868,"dataGaLocation":657},"/demo-hub/","demo hub",{"text":870,"config":871},"The Source",{"href":872,"dataGaName":863,"dataGaLocation":657},"/the-source/",{"text":874,"config":875},"Remote",{"href":876,"dataGaName":877,"dataGaLocation":657},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":879,"items":880},"Connect",[881,886,891,896,901,906],{"text":882,"config":883},"GitLab Services",{"href":884,"dataGaName":885,"dataGaLocation":657},"/services/","services",{"text":887,"config":888},"Contribute",{"href":889,"dataGaName":890,"dataGaLocation":657},"https://contributors.gitlab.com","contribute",{"text":892,"config":893},"Community",{"href":894,"dataGaName":895,"dataGaLocation":657},"/community/","community",{"text":897,"config":898},"Forum",{"href":899,"dataGaName":900,"dataGaLocation":657},"https://forum.gitlab.com/","forum",{"text":902,"config":903},"Events",{"href":904,"dataGaName":905,"dataGaLocation":657},"/events/","events",{"text":907,"config":908},"Partners",{"href":909,"dataGaName":910,"dataGaLocation":657},"/partners/","partners",{"config":912,"title":915,"text":916,"link":917},{"background":913,"textColor":914},"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":918,"config":919},"Read the latest",{"href":920,"dataGaName":921,"dataGaLocation":657},"/whats-new/","whats new",{"text":923,"config":924,"menu":926},"Company",{"dataNavLevelOne":925},"company",{"type":708,"columns":927},[928],{"items":929},[930,935,941,943,948,953,958,963,968,973],{"text":931,"config":932},"About",{"href":933,"dataGaName":934,"dataGaLocation":657},"/company/","about",{"text":936,"config":937,"footerGa":940},"Jobs",{"href":938,"dataGaName":939,"dataGaLocation":657},"/jobs/","jobs",{"dataGaName":939},{"text":902,"config":942},{"href":904,"dataGaName":905,"dataGaLocation":657},{"text":944,"config":945},"Leadership",{"href":946,"dataGaName":947,"dataGaLocation":657},"/company/team/e-group/","leadership",{"text":949,"config":950},"Handbook",{"href":951,"dataGaName":952,"dataGaLocation":657},"https://handbook.gitlab.com/","handbook",{"text":954,"config":955},"Investor relations",{"href":956,"dataGaName":957,"dataGaLocation":657},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":959,"config":960},"Trust Center",{"href":961,"dataGaName":962,"dataGaLocation":657},"/security/","trust center",{"text":964,"config":965},"AI Transparency Center",{"href":966,"dataGaName":967,"dataGaLocation":657},"/ai-transparency-center/","ai transparency center",{"text":969,"config":970},"Newsletter",{"href":971,"dataGaName":972,"dataGaLocation":657},"/company/contact/#contact-forms","newsletter",{"text":974,"config":975},"Press",{"href":976,"dataGaName":977,"dataGaLocation":657},"/press/","press",{"text":979,"config":980,"menu":981},"Contact us",{"dataNavLevelOne":925},{"type":708,"columns":982},[983],{"items":984},[985,990,995],{"text":986,"config":987},"Talk to sales",{"href":988,"dataGaName":989,"dataGaLocation":657},"/sales/","talk to sales",{"text":991,"config":992},"Support portal",{"href":993,"dataGaName":994,"dataGaLocation":657},"https://support.gitlab.com/hc/en-us","support portal",{"text":996,"config":997},"Customer portal",{"href":998,"dataGaName":999,"dataGaLocation":657},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1001,"login":1002,"suggestions":1009},"Close",{"text":1003,"link":1004},"To search repositories and projects, login to",{"text":1005,"config":1006},"gitlab.com",{"href":671,"dataGaName":1007,"dataGaLocation":1008},"search login","search",{"text":1010,"default":1011},"Suggestions",[1012,1014,1018,1020,1024,1028],{"text":688,"config":1013},{"href":693,"dataGaName":688,"dataGaLocation":1008},{"text":1015,"config":1016},"Code Suggestions (AI)",{"href":1017,"dataGaName":1015,"dataGaLocation":1008},"/solutions/code-suggestions/",{"text":724,"config":1019},{"href":726,"dataGaName":724,"dataGaLocation":1008},{"text":1021,"config":1022},"GitLab on AWS",{"href":1023,"dataGaName":1021,"dataGaLocation":1008},"/partners/technology-partners/aws/",{"text":1025,"config":1026},"GitLab on Google Cloud",{"href":1027,"dataGaName":1025,"dataGaLocation":1008},"/partners/technology-partners/google-cloud-platform/",{"text":1029,"config":1030},"Why GitLab?",{"href":701,"dataGaName":1029,"dataGaLocation":1008},{"freeTrial":1032,"mobileIcon":1037,"desktopIcon":1042,"secondaryButton":1045},{"text":1033,"config":1034},"Start free trial",{"href":1035,"dataGaName":662,"dataGaLocation":1036},"https://gitlab.com/-/trials/new/","nav",{"altText":1038,"config":1039},"Gitlab Icon",{"src":1040,"dataGaName":1041,"dataGaLocation":1036},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1038,"config":1043},{"src":1044,"dataGaName":1041,"dataGaLocation":1036},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1046,"config":1047},"Get Started",{"href":1048,"dataGaName":1049,"dataGaLocation":1036},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1051,"mobileIcon":1055,"desktopIcon":1057},{"text":1052,"config":1053},"Learn more about GitLab Duo",{"href":693,"dataGaName":1054,"dataGaLocation":1036},"gitlab duo",{"altText":1038,"config":1056},{"src":1040,"dataGaName":1041,"dataGaLocation":1036},{"altText":1038,"config":1058},{"src":1044,"dataGaName":1041,"dataGaLocation":1036},{"button":1060,"mobileIcon":1065,"desktopIcon":1067},{"text":1061,"config":1062},"/switch",{"href":1063,"dataGaName":1064,"dataGaLocation":1036},"#contact","switch",{"altText":1038,"config":1066},{"src":1040,"dataGaName":1041,"dataGaLocation":1036},{"altText":1038,"config":1068},{"src":1069,"dataGaName":1041,"dataGaLocation":1036},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1071,"mobileIcon":1076,"desktopIcon":1078},{"text":1072,"config":1073},"Back to pricing",{"href":806,"dataGaName":1074,"dataGaLocation":1036,"icon":1075},"back to pricing","GoBack",{"altText":1038,"config":1077},{"src":1040,"dataGaName":1041,"dataGaLocation":1036},{"altText":1038,"config":1079},{"src":1044,"dataGaName":1041,"dataGaLocation":1036},{"title":1081,"titleMobile":1082,"button":1083,"config":1088},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":699,"config":1084},{"href":1085,"dataGaName":1086,"dataGaLocation":1087},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1089,"disabled":635},"release",{"data":1091},{"text":1092,"source":1093,"edit":1099,"contribute":1104,"config":1109,"items":1114,"minimal":1323},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1094,"config":1095},"View page source",{"href":1096,"dataGaName":1097,"dataGaLocation":1098},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1100,"config":1101},"Edit this page",{"href":1102,"dataGaName":1103,"dataGaLocation":1098},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1105,"config":1106},"Please contribute",{"href":1107,"dataGaName":1108,"dataGaLocation":1098},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1110,"facebook":1111,"youtube":1112,"linkedin":1113},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1115,1162,1215,1259,1291],{"title":804,"links":1116,"subMenu":1131},[1117,1121,1126],{"text":1118,"config":1119},"View plans",{"href":806,"dataGaName":1120,"dataGaLocation":1098},"view plans",{"text":1122,"config":1123},"Why Premium?",{"href":1124,"dataGaName":1125,"dataGaLocation":1098},"/pricing/premium/","why premium",{"text":1127,"config":1128},"Why Ultimate?",{"href":1129,"dataGaName":1130,"dataGaLocation":1098},"/pricing/ultimate/","why ultimate",[1132],{"title":1133,"links":1134},"Contact Us",[1135,1138,1140,1142,1147,1152,1157],{"text":1136,"config":1137},"Contact sales",{"href":988,"dataGaName":667,"dataGaLocation":1098},{"text":991,"config":1139},{"href":993,"dataGaName":994,"dataGaLocation":1098},{"text":996,"config":1141},{"href":998,"dataGaName":999,"dataGaLocation":1098},{"text":1143,"config":1144},"Status",{"href":1145,"dataGaName":1146,"dataGaLocation":1098},"https://status.gitlab.com/","status",{"text":1148,"config":1149},"Terms of use",{"href":1150,"dataGaName":1151,"dataGaLocation":1098},"/terms/","terms of use",{"text":1153,"config":1154},"Privacy statement",{"href":1155,"dataGaName":1156,"dataGaLocation":1098},"/privacy/","privacy statement",{"text":1158,"config":1159},"Cookie preferences",{"dataGaName":1160,"dataGaLocation":1098,"id":1161,"isOneTrustButton":306},"cookie preferences","ot-sdk-btn",{"title":704,"links":1163,"subMenu":1172},[1164,1168],{"text":1165,"config":1166},"DevSecOps platform",{"href":686,"dataGaName":1167,"dataGaLocation":1098},"devsecops platform",{"text":1169,"config":1170},"AI-Assisted Development",{"href":693,"dataGaName":1171,"dataGaLocation":1098},"ai-assisted development",[1173],{"title":1174,"links":1175},"Topics",[1176,1181,1186,1190,1195,1200,1205,1210],{"text":1177,"config":1178},"CICD",{"href":1179,"dataGaName":1180,"dataGaLocation":1098},"/topics/ci-cd/","cicd",{"text":1182,"config":1183},"GitOps",{"href":1184,"dataGaName":1185,"dataGaLocation":1098},"/topics/gitops/","gitops",{"text":648,"config":1187},{"href":1188,"dataGaName":1189,"dataGaLocation":1098},"/topics/devops/","devops",{"text":1191,"config":1192},"Version Control",{"href":1193,"dataGaName":1194,"dataGaLocation":1098},"/topics/version-control/","version control",{"text":1196,"config":1197},"DevSecOps",{"href":1198,"dataGaName":1199,"dataGaLocation":1098},"/topics/devsecops/","devsecops",{"text":1201,"config":1202},"Cloud Native",{"href":1203,"dataGaName":1204,"dataGaLocation":1098},"/topics/cloud-native/","cloud native",{"text":1206,"config":1207},"AI for Coding",{"href":1208,"dataGaName":1209,"dataGaLocation":1098},"/topics/devops/ai-for-coding/","ai for coding",{"text":1211,"config":1212},"Agentic AI",{"href":1213,"dataGaName":1214,"dataGaLocation":1098},"/topics/agentic-ai/","agentic ai",{"title":1216,"links":1217},"Solutions",[1218,1220,1222,1227,1231,1234,1238,1241,1243,1246,1249,1254],{"text":748,"config":1219},{"href":743,"dataGaName":748,"dataGaLocation":1098},{"text":737,"config":1221},{"href":720,"dataGaName":721,"dataGaLocation":1098},{"text":1223,"config":1224},"Agile development",{"href":1225,"dataGaName":1226,"dataGaLocation":1098},"/solutions/agile-delivery/","agile delivery",{"text":1228,"config":1229},"SCM",{"href":733,"dataGaName":1230,"dataGaLocation":1098},"source code management",{"text":1177,"config":1232},{"href":726,"dataGaName":1233,"dataGaLocation":1098},"continuous integration & delivery",{"text":1235,"config":1236},"Value stream management",{"href":776,"dataGaName":1237,"dataGaLocation":1098},"value stream management",{"text":1182,"config":1239},{"href":1240,"dataGaName":1185,"dataGaLocation":1098},"/solutions/gitops/",{"text":786,"config":1242},{"href":789,"dataGaName":790,"dataGaLocation":1098},{"text":1244,"config":1245},"Small business",{"href":795,"dataGaName":796,"dataGaLocation":1098},{"text":1247,"config":1248},"Public sector",{"href":801,"dataGaName":802,"dataGaLocation":1098},{"text":1250,"config":1251},"Education",{"href":1252,"dataGaName":1253,"dataGaLocation":1098},"/solutions/education/","education",{"text":1255,"config":1256},"Financial services",{"href":1257,"dataGaName":1258,"dataGaLocation":1098},"/solutions/finance/","financial services",{"title":809,"links":1260},[1261,1263,1265,1267,1270,1272,1275,1277,1279,1281,1283,1285,1287,1289],{"text":822,"config":1262},{"href":824,"dataGaName":825,"dataGaLocation":1098},{"text":827,"config":1264},{"href":829,"dataGaName":830,"dataGaLocation":1098},{"text":832,"config":1266},{"href":834,"dataGaName":835,"dataGaLocation":1098},{"text":837,"config":1268},{"href":839,"dataGaName":1269,"dataGaLocation":1098},"docs",{"text":860,"config":1271},{"href":862,"dataGaName":863,"dataGaLocation":1098},{"text":1273,"config":1274},"What's new",{"href":920,"dataGaName":921,"dataGaLocation":1098},{"text":855,"config":1276},{"href":857,"dataGaName":858,"dataGaLocation":1098},{"text":874,"config":1278},{"href":876,"dataGaName":877,"dataGaLocation":1098},{"text":882,"config":1280},{"href":884,"dataGaName":885,"dataGaLocation":1098},{"text":887,"config":1282},{"href":889,"dataGaName":890,"dataGaLocation":1098},{"text":892,"config":1284},{"href":894,"dataGaName":895,"dataGaLocation":1098},{"text":897,"config":1286},{"href":899,"dataGaName":900,"dataGaLocation":1098},{"text":902,"config":1288},{"href":904,"dataGaName":905,"dataGaLocation":1098},{"text":907,"config":1290},{"href":909,"dataGaName":910,"dataGaLocation":1098},{"title":923,"links":1292},[1293,1295,1297,1299,1301,1303,1307,1312,1314,1316,1318],{"text":931,"config":1294},{"href":933,"dataGaName":925,"dataGaLocation":1098},{"text":936,"config":1296},{"href":938,"dataGaName":939,"dataGaLocation":1098},{"text":944,"config":1298},{"href":946,"dataGaName":947,"dataGaLocation":1098},{"text":949,"config":1300},{"href":951,"dataGaName":952,"dataGaLocation":1098},{"text":954,"config":1302},{"href":956,"dataGaName":957,"dataGaLocation":1098},{"text":1304,"config":1305},"Sustainability",{"href":1306,"dataGaName":1304,"dataGaLocation":1098},"/sustainability/",{"text":1308,"config":1309},"Diversity, inclusion and belonging (DIB)",{"href":1310,"dataGaName":1311,"dataGaLocation":1098},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":959,"config":1313},{"href":961,"dataGaName":962,"dataGaLocation":1098},{"text":969,"config":1315},{"href":971,"dataGaName":972,"dataGaLocation":1098},{"text":974,"config":1317},{"href":976,"dataGaName":977,"dataGaLocation":1098},{"text":1319,"config":1320},"Modern Slavery Transparency Statement",{"href":1321,"dataGaName":1322,"dataGaLocation":1098},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1324},[1325,1328,1331],{"text":1326,"config":1327},"Terms",{"href":1150,"dataGaName":1151,"dataGaLocation":1098},{"text":1329,"config":1330},"Cookies",{"dataGaName":1160,"dataGaLocation":1098,"id":1161,"isOneTrustButton":306},{"text":1332,"config":1333},"Privacy",{"href":1155,"dataGaName":1156,"dataGaLocation":1098},[1335],{"id":1336,"title":7,"body":634,"config":1337,"content":1339,"description":634,"extension":1342,"meta":1343,"navigation":306,"path":1344,"seo":1345,"stem":1346,"__hash__":1347},"blogAuthors/en-us/blog/authors/matthieu-fronton.yml",{"template":1338},"BlogAuthor",{"name":7,"config":1340},{"headshot":113,"ctfId":1341},"frntn","yml",{},"/en-us/blog/authors/matthieu-fronton",{},"en-us/blog/authors/matthieu-fronton","vvBydQGlEIOLmgOLhrHNl1RTEg6iXBIPjSlPq1Ox1Fw",[1349,1358,1366],{"title":1350,"description":1351,"heroImage":1352,"category":630,"date":1353,"authors":1354,"slug":1357,"externalUrl":634},"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",[1355,1356],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1359,"description":1360,"heroImage":1361,"category":630,"date":1362,"authors":1363,"slug":1365,"externalUrl":634},"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",[1364],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1367,"description":1368,"heroImage":1369,"category":630,"date":1370,"authors":1371,"slug":1373,"externalUrl":634},"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",[1372],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1375},[1376,1390,1402,1414],{"id":1377,"categories":1378,"header":1380,"text":1381,"button":1382,"image":1387},"ai-modernization",[1379],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1383,"config":1384},"Get your AI maturity score",{"href":1385,"dataGaName":1386,"dataGaLocation":863},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1388},{"src":1389},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1391,"categories":1392,"header":1394,"text":1381,"button":1395,"image":1399},"devops-modernization",[1393,1199],"product","Are you just managing tools or shipping innovation?",{"text":1396,"config":1397},"Get your DevOps maturity score",{"href":1398,"dataGaName":1386,"dataGaLocation":863},"/assessments/devops-modernization-assessment/",{"config":1400},{"src":1401},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1403,"categories":1404,"header":1406,"text":1381,"button":1407,"image":1411},"security-modernization",[1405],"security","Are you trading speed for security?",{"text":1408,"config":1409},"Get your security maturity score",{"href":1410,"dataGaName":1386,"dataGaLocation":863},"/assessments/security-modernization-assessment/",{"config":1412},{"src":1413},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1415,"paths":1416,"header":1419,"text":1420,"button":1421,"image":1426},"github-azure-migration",[1417,1418],"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":1422,"config":1423},"See how GitLab compares to GitHub",{"href":1424,"dataGaName":1425,"dataGaLocation":863},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1427},{"src":1401},{"header":1429,"blurb":1430,"button":1431,"secondaryButton":1436},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1432,"config":1433},"Get your free trial",{"href":1434,"dataGaName":662,"dataGaLocation":1435},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1136,"config":1437},{"href":988,"dataGaName":667,"dataGaLocation":1435},1786803743732]