[{"data":1,"prerenderedAt":1201},["ShallowReactive",2],{"/blog/how-to-set-up-gitlab-runner-on-digitalocean":3,"navigation-en-us":413,"banner-en-us":841,"footer-en-us":851,"blog-post-authors-en-us-Achilleas Pipinellis":1096,"blog-related-posts-en-us-how-to-set-up-gitlab-runner-on-digitalocean":1111,"blog-promotions-en-us":1137,"next-steps-en-us":1191},{"id":4,"title":5,"authors":6,"body":8,"category":395,"date":396,"description":397,"extension":398,"externalUrl":399,"faq":399,"featured":400,"heroImage":401,"meta":402,"navigation":403,"path":404,"seo":405,"slug":409,"stem":410,"tags":399,"template":411,"updatedDate":399,"__hash__":412},"blogPosts/en-us/blog/how-to-set-up-gitlab-runner-on-digitalocean.md","How to set up GitLab Runner on DigitalOcean",[7],"Achilleas Pipinellis",{"type":9,"value":10,"toc":386},"minimark",[11,16,29,40,47,52,59,66,76,80,87,94,97,103,114,120,123,129,132,136,139,161,164,167,194,197,200,219,222,235,238,249,253,256,259,266,272,275,292,295,350,353,367,373,379,382],[12,13,15],"h3",{"id":14},"introduction","Introduction",[17,18,19,20,24,25,28],"p",{},"GitLab has [built-in continuous integration]",[21,22,23],"span",{},"doc-ci"," to allow you to run a\nnumber of tasks as you prepare to deploy your software. Typical tasks\nmight be to build a software package or to run tests as specified in a\nYAML file. These tasks need to run by something, and in GitLab this something\nis called a [Runner]",[21,26,27],{},"doc-runners","; an application that processes builds.",[17,30,31,32,35,36,39],{},"In March we introduced [GitLab Runner 1.1]",[21,33,34],{},"1_1"," with the cool feature of\nautoscaling and a week later we announced that all [shared Runners on GitLab.com\nuse autoscaling]",[21,37,38],{},"autoscale-post",". The shared Runners can be used for free by\nany user with a GitLab.com account.",[17,41,42,43,46],{},"In this tutorial we will explore how easy it is to install and set up your own\nRunner on ",[21,44,45],{},"DigitalOcean","; a Runner that will be 'specific' to your projects as\nwe say in the GitLab lingo.",[48,49,51],"h2",{"id":50},"prerequisites","Prerequisites",[17,53,54,55,58],{},"We will use the Docker executor since it has the most supported features\naccording to the [GitLab Runner executor compatibility chart]",[21,56,57],{},"chart",". For this,\nwe will need to install Docker on the server that will host the GitLab Runner.",[17,60,61,62,65],{},"Fortunately, DigitalOcean has a [one-click image with Docker]",[21,63,64],{},"one-docker","\npre-installed on Ubuntu 14.04 and this is what we will use.",[67,68,69],"blockquote",{},[17,70,71,75],{},[72,73,74],"strong",{},"Note:","\nYou are free to use any Linux distribution supported by DigitalOcean, even\nFreeBSD. GitLab Runner is supported on all Operating Systems.",[48,77,79],{"id":78},"create-a-droplet","Create a droplet",[17,81,82,83,86],{},"[Login to DigitalOcean]",[21,84,85],{},"cloud"," and from the Control Panel, click on the \"Create\nDroplet\" button that is visible from any page.",[17,88,89],{},[90,91],"img",{"alt":92,"src":93},"Create Droplet","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398511/blog/Content%20Images/how-to-set-up-gitlab-runner-on-digitalocean/create-droplet-shadow.png",[17,95,96],{},"Under the \"Choose an image\" section, select the \"One-click Apps\" tab and click\nthe \"Docker\" image (the version might differ).",[17,98,99],{},[90,100],{"alt":101,"src":102},"Droplet app","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398513/blog/Content%20Images/how-to-set-up-gitlab-runner-on-digitalocean/select-docker-shadow.png",[17,104,105,106,109,110,113],{},"The next step is to choose the droplet size and the region you would like to use.\nYou are advised to use the ",[72,107,108],{},"1 GB"," / ",[72,111,112],{},"1 CPU"," droplet for quicker builds.",[17,115,116],{},[90,117],{"alt":118,"src":119},"Hardware","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398512/blog/Content%20Images/how-to-set-up-gitlab-runner-on-digitalocean/hardware-shadow.png",[17,121,122],{},"Add any SSH Keys, select any settings you'd like to use, and click \"Create\" at\nthe bottom.",[17,124,125],{},[90,126],{"alt":127,"src":128},"Finalize creation","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398511/blog/Content%20Images/how-to-set-up-gitlab-runner-on-digitalocean/finalize-shadow.png",[17,130,131],{},"Your Docker droplet will be created and available in a few minutes!",[48,133,135],{"id":134},"install-the-gitlab-runner","Install the GitLab Runner",[17,137,138],{},"First, login to the new droplet via SSH and verify that Docker is installed with:",[140,141,146],"pre",{"className":142,"code":143,"language":144,"meta":145,"style":145},"language-bash shiki shiki-themes github-light","docker info\n","bash","",[147,148,149],"code",{"__ignoreMap":145},[21,150,153,157],{"class":151,"line":152},"line",1,[21,154,156],{"class":155},"s7eDp","docker",[21,158,160],{"class":159},"sYBdl"," info\n",[17,162,163],{},"This should show a bunch of information about the Docker version, the number of\nimages and containers, etc. With that set, we're ready to install GitLab\nRunner.",[17,165,166],{},"GitLab provides a repository where you can easily install and update GitLab\nRunner. The supported distros as Debian, Ubuntu and CentOS. Let's install the\nrepository with this one-line:",[140,168,170],{"className":142,"code":169,"language":144,"meta":145,"style":145},"curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash\n",[147,171,172],{"__ignoreMap":145},[21,173,174,177,181,184,188,191],{"class":151,"line":152},[21,175,176],{"class":155},"curl",[21,178,180],{"class":179},"sYu0t"," -L",[21,182,183],{"class":159}," https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh",[21,185,187],{"class":186},"sD7c4"," |",[21,189,190],{"class":155}," sudo",[21,192,193],{"class":159}," bash\n",[17,195,196],{},"Feel free to read the script before you execute it if you want.",[17,198,199],{},"Now let's install GitLab Runner:",[140,201,203],{"className":142,"code":202,"language":144,"meta":145,"style":145},"sudo apt-get install gitlab-runner\n",[147,204,205],{"__ignoreMap":145},[21,206,207,210,213,216],{"class":151,"line":152},[21,208,209],{"class":155},"sudo",[21,211,212],{"class":159}," apt-get",[21,214,215],{"class":159}," install",[21,217,218],{"class":159}," gitlab-runner\n",[17,220,221],{},"And verify it's installed:",[140,223,225],{"className":142,"code":224,"language":144,"meta":145,"style":145},"gitlab-runner --version\n",[147,226,227],{"__ignoreMap":145},[21,228,229,232],{"class":151,"line":152},[21,230,231],{"class":155},"gitlab-runner",[21,233,234],{"class":179}," --version\n",[17,236,237],{},"Excellent! We're now ready to start using it.",[67,239,240],{},[17,241,242,244,245,248],{},[72,243,74],{},"\nFor other installation methods and Operating Systems, see the\n[installation documentation]",[21,246,247],{},"doc-install",".",[48,250,252],{"id":251},"register-the-gitlab-runner","Register the GitLab Runner",[17,254,255],{},"Registering a Runner is the process of tying it with a specific GitLab project.\nEach project on GitLab has a unique token that is used by the Runner in order\nto be able to talk to GitLab via its API.",[17,257,258],{},"When we installed GitLab Runner in the previous step, we installed GitLab Runner\nthe service. Each GitLab Runner service can spawn as many Runner processes you\nwant, so you can eventually register multiple Runners in a single droplet, each\nof which can be tied to a separate project.",[17,260,261,262,265],{},"To register a Runner we first need to know the project's token. Go to your\nnewly created project or pick one that already uses GitLab.com's shared Runners.\nNavigate to the project's ",[72,263,264],{},"Settings > Runners"," and notice that the shared\nRunners are enabled. In the left side you get detailed information on the steps\nneeded to register a new Runner.",[17,267,268],{},[90,269],{"alt":270,"src":271},"Runners settings","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398513/blog/Content%20Images/how-to-set-up-gitlab-runner-on-digitalocean/runners-shadow.png",[17,273,274],{},"Now, let's get back to the droplet and start registering a Runner:",[140,276,280],{"className":277,"code":278,"language":279,"meta":145,"style":145},"language-shell shiki shiki-themes github-light","sudo gitlab-runner register\n","shell",[147,281,282],{"__ignoreMap":145},[21,283,284,286,289],{"class":151,"line":152},[21,285,209],{"class":155},[21,287,288],{"class":159}," gitlab-runner",[21,290,291],{"class":159}," register\n",[17,293,294],{},"The command above is interactive, so you will be asked the information needed to\nregister a new Runner.",[296,297,298,308,314,320,334,342],"ul",{},[299,300,301,304,305,248],"li",{},[72,302,303],{},"the gitlab-ci coordinator URL:"," Enter ",[147,306,307],{},"https://gitlab.com/ci",[299,309,310,313],{},[72,311,312],{},"the gitlab-ci token for this runner:"," The token in the previous image.",[299,315,316,319],{},[72,317,318],{},"the gitlab-ci description for this runner:"," This is for your own accord,\nin case you have multiple Runners and want something to remind you what the\nRunner is about. If you don't enter a description, the hostname of the\ndroplet will be used.",[299,321,322,325,326,329,330,333],{},[72,323,324],{},"the gitlab-ci tags for this runner:"," You can use tags in your\n",[147,327,328],{},".gitlab-ci.yml"," to limit jobs to specific Runners. Useful if for example\nyou are running tests on different OSes. Enter ",[147,331,332],{},"docker,digitalocean"," for this\nexample.",[299,335,336,339,340,248],{},[72,337,338],{},"enter the executor:"," Our executor will be ",[147,341,156],{},[299,343,344,347,348,248],{},[72,345,346],{},"enter the default Docker image:"," The default Docker image that will be\nused if you don't specify it in ",[147,349,328],{},[17,351,352],{},"Once answered all questions, you can verify that the Runner is registered with:",[140,354,356],{"className":277,"code":355,"language":279,"meta":145,"style":145},"sudo gitlab-runner list\n",[147,357,358],{"__ignoreMap":145},[21,359,360,362,364],{"class":151,"line":152},[21,361,209],{"class":155},[21,363,288],{"class":159},[21,365,366],{"class":159}," list\n",[17,368,369,370,372],{},"Now if you head back in your project's ",[72,371,264],{}," you will see that\nthe Runner appeared in the list.",[17,374,375],{},[90,376],{"alt":377,"src":378},"Runner","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398512/blog/Content%20Images/how-to-set-up-gitlab-runner-on-digitalocean/runner-shadow.png",[17,380,381],{},"You can now start using this specific Runner for your project and you may\ndisable the shared Runners.",[383,384,385],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}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 .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}",{"title":145,"searchDepth":387,"depth":387,"links":388},2,[389,391,392,393,394],{"id":14,"depth":390,"text":15},3,{"id":50,"depth":387,"text":51},{"id":78,"depth":387,"text":79},{"id":134,"depth":387,"text":135},{"id":251,"depth":387,"text":252},"engineering","2016-04-19","In this tutorial we will explore how easy it is to install and set up your own Runner on DigitalOcean.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749684667/Blog/Hero%20Images/runners.jpg",{},true,"/en-us/blog/how-to-set-up-gitlab-runner-on-digitalocean",{"title":5,"description":397,"ogTitle":5,"ogDescription":397,"noIndex":400,"ogImage":401,"ogUrl":406,"ogSiteName":407,"ogType":408,"canonicalUrls":406},"https://about.gitlab.com/blog/how-to-set-up-gitlab-runner-on-digitalocean","https://about.gitlab.com","article","how-to-set-up-gitlab-runner-on-digitalocean","en-us/blog/how-to-set-up-gitlab-runner-on-digitalocean","BlogPost","4G2HdIydSYCRP4g-CRWPqc47Z1eTQfCFtKgGsbMkrMw",{"logo":414,"freeTrial":419,"sales":424,"login":429,"items":434,"search":761,"minimal":792,"duo":811,"switchNav":820,"pricingDeployment":831},{"config":415},{"href":416,"dataGaName":417,"dataGaLocation":418},"/","gitlab logo","header",{"text":420,"config":421},"Get free trial",{"href":422,"dataGaName":423,"dataGaLocation":418},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":425,"config":426},"Request a demo",{"href":427,"dataGaName":428,"dataGaLocation":418},"/sales/?contact-topic=request-demo","sales",{"text":430,"config":431},"Sign in",{"href":432,"dataGaName":433,"dataGaLocation":418},"https://gitlab.com/users/sign_in/","sign in",[435,464,564,569,683,739],{"text":436,"config":437,"menu":439},"Platform",{"dataNavLevelOne":438},"platform",{"type":440,"columns":441},"cards",[442,448,456],{"title":436,"description":443,"link":444},"The intelligent orchestration platform for DevSecOps",{"text":445,"config":446},"Explore our Platform",{"href":447,"dataGaName":438,"dataGaLocation":418},"/platform/",{"title":449,"description":450,"link":451},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":452,"config":453},"Meet GitLab Duo",{"href":454,"dataGaName":455,"dataGaLocation":418},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":457,"description":458,"link":459},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":460,"config":461},"Learn more",{"href":462,"dataGaName":463,"dataGaLocation":418},"/why-gitlab/","why gitlab",{"text":465,"left":403,"config":466,"menu":468},"Product",{"dataNavLevelOne":467},"solutions",{"type":469,"link":470,"columns":474,"feature":543},"lists",{"text":471,"config":472},"View all Solutions",{"href":473,"dataGaName":467,"dataGaLocation":418},"/solutions/",[475,499,522],{"title":476,"description":477,"link":478,"items":483},"Automation","CI/CD and automation to accelerate deployment",{"config":479},{"icon":480,"href":481,"dataGaName":482,"dataGaLocation":418},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[484,488,491,495],{"text":485,"config":486},"CI/CD",{"href":487,"dataGaLocation":418,"dataGaName":485},"/solutions/continuous-integration/",{"text":449,"config":489},{"href":454,"dataGaLocation":418,"dataGaName":490},"gitlab duo agent platform - product menu",{"text":492,"config":493},"Source Code Management",{"href":494,"dataGaLocation":418,"dataGaName":492},"/solutions/source-code-management/",{"text":496,"config":497},"Automated Software Delivery",{"href":481,"dataGaLocation":418,"dataGaName":498},"Automated software delivery",{"title":500,"description":501,"link":502,"items":507},"Security","Deliver code faster without compromising security",{"config":503},{"href":504,"dataGaName":505,"dataGaLocation":418,"icon":506},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[508,512,517],{"text":509,"config":510},"Application Security Testing",{"href":504,"dataGaName":511,"dataGaLocation":418},"Application security testing",{"text":513,"config":514},"Software Supply Chain Security",{"href":515,"dataGaLocation":418,"dataGaName":516},"/solutions/supply-chain/","Software supply chain security",{"text":518,"config":519},"Software Compliance",{"href":520,"dataGaName":521,"dataGaLocation":418},"/solutions/software-compliance/","software compliance",{"title":523,"link":524,"items":529},"Measurement",{"config":525},{"icon":526,"href":527,"dataGaName":528,"dataGaLocation":418},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[530,534,538],{"text":531,"config":532},"Visibility & Measurement",{"href":527,"dataGaLocation":418,"dataGaName":533},"Visibility and Measurement",{"text":535,"config":536},"Value Stream Management",{"href":537,"dataGaLocation":418,"dataGaName":535},"/solutions/value-stream-management/",{"text":539,"config":540},"Analytics & Insights",{"href":541,"dataGaLocation":418,"dataGaName":542},"/solutions/analytics-and-insights/","Analytics and insights",{"title":544,"type":469,"items":545},"GitLab for",[546,552,558],{"text":547,"config":548},"Enterprise",{"icon":549,"href":550,"dataGaLocation":418,"dataGaName":551},"Building","/enterprise/","enterprise",{"text":553,"config":554},"Small Business",{"icon":555,"href":556,"dataGaLocation":418,"dataGaName":557},"Work","/small-business/","small business",{"text":559,"config":560},"Public Sector",{"icon":561,"href":562,"dataGaLocation":418,"dataGaName":563},"Organization","/solutions/public-sector/","public sector",{"text":565,"config":566},"Pricing",{"href":567,"dataGaName":568,"dataGaLocation":418,"dataNavLevelOne":568},"/pricing/","pricing",{"text":570,"config":571,"menu":573},"Resources",{"dataNavLevelOne":572},"resources",{"type":469,"link":574,"columns":578,"feature":672},{"text":575,"config":576},"View all resources",{"href":577,"dataGaName":572,"dataGaLocation":418},"/resources/",[579,612,639],{"title":580,"items":581},"Getting started",[582,587,592,597,602,607],{"text":583,"config":584},"Install",{"href":585,"dataGaName":586,"dataGaLocation":418},"/install/","install",{"text":588,"config":589},"Quick start guides",{"href":590,"dataGaName":591,"dataGaLocation":418},"/get-started/","quick setup checklists",{"text":593,"config":594},"Learn",{"href":595,"dataGaLocation":418,"dataGaName":596},"https://university.gitlab.com/","learn",{"text":598,"config":599},"Product documentation",{"href":600,"dataGaName":601,"dataGaLocation":418},"https://docs.gitlab.com/","product documentation",{"text":603,"config":604},"Best practice videos",{"href":605,"dataGaName":606,"dataGaLocation":418},"/getting-started-videos/","best practice videos",{"text":608,"config":609},"Integrations",{"href":610,"dataGaName":611,"dataGaLocation":418},"/integrations/","integrations",{"title":613,"items":614},"Discover",[615,620,625,630,634],{"text":616,"config":617},"Customer success stories",{"href":618,"dataGaName":619,"dataGaLocation":418},"/customers/","customer success stories",{"text":621,"config":622},"Blog",{"href":623,"dataGaName":624,"dataGaLocation":418},"/blog/","blog",{"text":626,"config":627},"Demo Hub",{"href":628,"dataGaName":629,"dataGaLocation":418},"/demo-hub/","demo hub",{"text":631,"config":632},"The Source",{"href":633,"dataGaName":624,"dataGaLocation":418},"/the-source/",{"text":635,"config":636},"Remote",{"href":637,"dataGaName":638,"dataGaLocation":418},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":640,"items":641},"Connect",[642,647,652,657,662,667],{"text":643,"config":644},"GitLab Services",{"href":645,"dataGaName":646,"dataGaLocation":418},"/services/","services",{"text":648,"config":649},"Contribute",{"href":650,"dataGaName":651,"dataGaLocation":418},"https://contributors.gitlab.com","contribute",{"text":653,"config":654},"Community",{"href":655,"dataGaName":656,"dataGaLocation":418},"/community/","community",{"text":658,"config":659},"Forum",{"href":660,"dataGaName":661,"dataGaLocation":418},"https://forum.gitlab.com/","forum",{"text":663,"config":664},"Events",{"href":665,"dataGaName":666,"dataGaLocation":418},"/events/","events",{"text":668,"config":669},"Partners",{"href":670,"dataGaName":671,"dataGaLocation":418},"/partners/","partners",{"config":673,"title":676,"text":677,"link":678},{"background":674,"textColor":675},"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":679,"config":680},"Read the latest",{"href":681,"dataGaName":682,"dataGaLocation":418},"/whats-new/","whats new",{"text":684,"config":685,"menu":687},"Company",{"dataNavLevelOne":686},"company",{"type":469,"columns":688},[689],{"items":690},[691,696,702,704,709,714,719,724,729,734],{"text":692,"config":693},"About",{"href":694,"dataGaName":695,"dataGaLocation":418},"/company/","about",{"text":697,"config":698,"footerGa":701},"Jobs",{"href":699,"dataGaName":700,"dataGaLocation":418},"/jobs/","jobs",{"dataGaName":700},{"text":663,"config":703},{"href":665,"dataGaName":666,"dataGaLocation":418},{"text":705,"config":706},"Leadership",{"href":707,"dataGaName":708,"dataGaLocation":418},"/company/team/e-group/","leadership",{"text":710,"config":711},"Handbook",{"href":712,"dataGaName":713,"dataGaLocation":418},"https://handbook.gitlab.com/","handbook",{"text":715,"config":716},"Investor relations",{"href":717,"dataGaName":718,"dataGaLocation":418},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":720,"config":721},"Trust Center",{"href":722,"dataGaName":723,"dataGaLocation":418},"/security/","trust center",{"text":725,"config":726},"AI Transparency Center",{"href":727,"dataGaName":728,"dataGaLocation":418},"/ai-transparency-center/","ai transparency center",{"text":730,"config":731},"Newsletter",{"href":732,"dataGaName":733,"dataGaLocation":418},"/company/contact/#contact-forms","newsletter",{"text":735,"config":736},"Press",{"href":737,"dataGaName":738,"dataGaLocation":418},"/press/","press",{"text":740,"config":741,"menu":742},"Contact us",{"dataNavLevelOne":686},{"type":469,"columns":743},[744],{"items":745},[746,751,756],{"text":747,"config":748},"Talk to sales",{"href":749,"dataGaName":750,"dataGaLocation":418},"/sales/","talk to sales",{"text":752,"config":753},"Support portal",{"href":754,"dataGaName":755,"dataGaLocation":418},"https://support.gitlab.com/hc/en-us","support portal",{"text":757,"config":758},"Customer portal",{"href":759,"dataGaName":760,"dataGaLocation":418},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":762,"login":763,"suggestions":770},"Close",{"text":764,"link":765},"To search repositories and projects, login to",{"text":766,"config":767},"gitlab.com",{"href":432,"dataGaName":768,"dataGaLocation":769},"search login","search",{"text":771,"default":772},"Suggestions",[773,775,779,781,785,789],{"text":449,"config":774},{"href":454,"dataGaName":449,"dataGaLocation":769},{"text":776,"config":777},"Code Suggestions (AI)",{"href":778,"dataGaName":776,"dataGaLocation":769},"/solutions/code-suggestions/",{"text":485,"config":780},{"href":487,"dataGaName":485,"dataGaLocation":769},{"text":782,"config":783},"GitLab on AWS",{"href":784,"dataGaName":782,"dataGaLocation":769},"/partners/technology-partners/aws/",{"text":786,"config":787},"GitLab on Google Cloud",{"href":788,"dataGaName":786,"dataGaLocation":769},"/partners/technology-partners/google-cloud-platform/",{"text":790,"config":791},"Why GitLab?",{"href":462,"dataGaName":790,"dataGaLocation":769},{"freeTrial":793,"mobileIcon":798,"desktopIcon":803,"secondaryButton":806},{"text":794,"config":795},"Start free trial",{"href":796,"dataGaName":423,"dataGaLocation":797},"https://gitlab.com/-/trials/new/","nav",{"altText":799,"config":800},"Gitlab Icon",{"src":801,"dataGaName":802,"dataGaLocation":797},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":799,"config":804},{"src":805,"dataGaName":802,"dataGaLocation":797},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":807,"config":808},"Get Started",{"href":809,"dataGaName":810,"dataGaLocation":797},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":812,"mobileIcon":816,"desktopIcon":818},{"text":813,"config":814},"Learn more about GitLab Duo",{"href":454,"dataGaName":815,"dataGaLocation":797},"gitlab duo",{"altText":799,"config":817},{"src":801,"dataGaName":802,"dataGaLocation":797},{"altText":799,"config":819},{"src":805,"dataGaName":802,"dataGaLocation":797},{"button":821,"mobileIcon":826,"desktopIcon":828},{"text":822,"config":823},"/switch",{"href":824,"dataGaName":825,"dataGaLocation":797},"#contact","switch",{"altText":799,"config":827},{"src":801,"dataGaName":802,"dataGaLocation":797},{"altText":799,"config":829},{"src":830,"dataGaName":802,"dataGaLocation":797},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":832,"mobileIcon":837,"desktopIcon":839},{"text":833,"config":834},"Back to pricing",{"href":567,"dataGaName":835,"dataGaLocation":797,"icon":836},"back to pricing","GoBack",{"altText":799,"config":838},{"src":801,"dataGaName":802,"dataGaLocation":797},{"altText":799,"config":840},{"src":805,"dataGaName":802,"dataGaLocation":797},{"title":842,"titleMobile":843,"button":844,"config":849},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":460,"config":845},{"href":846,"dataGaName":847,"dataGaLocation":848},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":850,"disabled":400},"release",{"data":852},{"text":853,"source":854,"edit":860,"contribute":865,"config":870,"items":875,"minimal":1085},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":855,"config":856},"View page source",{"href":857,"dataGaName":858,"dataGaLocation":859},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":861,"config":862},"Edit this page",{"href":863,"dataGaName":864,"dataGaLocation":859},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":866,"config":867},"Please contribute",{"href":868,"dataGaName":869,"dataGaLocation":859},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":871,"facebook":872,"youtube":873,"linkedin":874},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[876,923,977,1021,1053],{"title":565,"links":877,"subMenu":892},[878,882,887],{"text":879,"config":880},"View plans",{"href":567,"dataGaName":881,"dataGaLocation":859},"view plans",{"text":883,"config":884},"Why Premium?",{"href":885,"dataGaName":886,"dataGaLocation":859},"/pricing/premium/","why premium",{"text":888,"config":889},"Why Ultimate?",{"href":890,"dataGaName":891,"dataGaLocation":859},"/pricing/ultimate/","why ultimate",[893],{"title":894,"links":895},"Contact Us",[896,899,901,903,908,913,918],{"text":897,"config":898},"Contact sales",{"href":749,"dataGaName":428,"dataGaLocation":859},{"text":752,"config":900},{"href":754,"dataGaName":755,"dataGaLocation":859},{"text":757,"config":902},{"href":759,"dataGaName":760,"dataGaLocation":859},{"text":904,"config":905},"Status",{"href":906,"dataGaName":907,"dataGaLocation":859},"https://status.gitlab.com/","status",{"text":909,"config":910},"Terms of use",{"href":911,"dataGaName":912,"dataGaLocation":859},"/terms/","terms of use",{"text":914,"config":915},"Privacy statement",{"href":916,"dataGaName":917,"dataGaLocation":859},"/privacy/","privacy statement",{"text":919,"config":920},"Cookie preferences",{"dataGaName":921,"dataGaLocation":859,"id":922,"isOneTrustButton":403},"cookie preferences","ot-sdk-btn",{"title":465,"links":924,"subMenu":933},[925,929],{"text":926,"config":927},"DevSecOps platform",{"href":447,"dataGaName":928,"dataGaLocation":859},"devsecops platform",{"text":930,"config":931},"AI-Assisted Development",{"href":454,"dataGaName":932,"dataGaLocation":859},"ai-assisted development",[934],{"title":935,"links":936},"Topics",[937,942,947,952,957,962,967,972],{"text":938,"config":939},"CICD",{"href":940,"dataGaName":941,"dataGaLocation":859},"/topics/ci-cd/","cicd",{"text":943,"config":944},"GitOps",{"href":945,"dataGaName":946,"dataGaLocation":859},"/topics/gitops/","gitops",{"text":948,"config":949},"DevOps",{"href":950,"dataGaName":951,"dataGaLocation":859},"/topics/devops/","devops",{"text":953,"config":954},"Version Control",{"href":955,"dataGaName":956,"dataGaLocation":859},"/topics/version-control/","version control",{"text":958,"config":959},"DevSecOps",{"href":960,"dataGaName":961,"dataGaLocation":859},"/topics/devsecops/","devsecops",{"text":963,"config":964},"Cloud Native",{"href":965,"dataGaName":966,"dataGaLocation":859},"/topics/cloud-native/","cloud native",{"text":968,"config":969},"AI for Coding",{"href":970,"dataGaName":971,"dataGaLocation":859},"/topics/devops/ai-for-coding/","ai for coding",{"text":973,"config":974},"Agentic AI",{"href":975,"dataGaName":976,"dataGaLocation":859},"/topics/agentic-ai/","agentic ai",{"title":978,"links":979},"Solutions",[980,982,984,989,993,996,1000,1003,1005,1008,1011,1016],{"text":509,"config":981},{"href":504,"dataGaName":509,"dataGaLocation":859},{"text":498,"config":983},{"href":481,"dataGaName":482,"dataGaLocation":859},{"text":985,"config":986},"Agile development",{"href":987,"dataGaName":988,"dataGaLocation":859},"/solutions/agile-delivery/","agile delivery",{"text":990,"config":991},"SCM",{"href":494,"dataGaName":992,"dataGaLocation":859},"source code management",{"text":938,"config":994},{"href":487,"dataGaName":995,"dataGaLocation":859},"continuous integration & delivery",{"text":997,"config":998},"Value stream management",{"href":537,"dataGaName":999,"dataGaLocation":859},"value stream management",{"text":943,"config":1001},{"href":1002,"dataGaName":946,"dataGaLocation":859},"/solutions/gitops/",{"text":547,"config":1004},{"href":550,"dataGaName":551,"dataGaLocation":859},{"text":1006,"config":1007},"Small business",{"href":556,"dataGaName":557,"dataGaLocation":859},{"text":1009,"config":1010},"Public sector",{"href":562,"dataGaName":563,"dataGaLocation":859},{"text":1012,"config":1013},"Education",{"href":1014,"dataGaName":1015,"dataGaLocation":859},"/solutions/education/","education",{"text":1017,"config":1018},"Financial services",{"href":1019,"dataGaName":1020,"dataGaLocation":859},"/solutions/finance/","financial services",{"title":570,"links":1022},[1023,1025,1027,1029,1032,1034,1037,1039,1041,1043,1045,1047,1049,1051],{"text":583,"config":1024},{"href":585,"dataGaName":586,"dataGaLocation":859},{"text":588,"config":1026},{"href":590,"dataGaName":591,"dataGaLocation":859},{"text":593,"config":1028},{"href":595,"dataGaName":596,"dataGaLocation":859},{"text":598,"config":1030},{"href":600,"dataGaName":1031,"dataGaLocation":859},"docs",{"text":621,"config":1033},{"href":623,"dataGaName":624,"dataGaLocation":859},{"text":1035,"config":1036},"What's new",{"href":681,"dataGaName":682,"dataGaLocation":859},{"text":616,"config":1038},{"href":618,"dataGaName":619,"dataGaLocation":859},{"text":635,"config":1040},{"href":637,"dataGaName":638,"dataGaLocation":859},{"text":643,"config":1042},{"href":645,"dataGaName":646,"dataGaLocation":859},{"text":648,"config":1044},{"href":650,"dataGaName":651,"dataGaLocation":859},{"text":653,"config":1046},{"href":655,"dataGaName":656,"dataGaLocation":859},{"text":658,"config":1048},{"href":660,"dataGaName":661,"dataGaLocation":859},{"text":663,"config":1050},{"href":665,"dataGaName":666,"dataGaLocation":859},{"text":668,"config":1052},{"href":670,"dataGaName":671,"dataGaLocation":859},{"title":684,"links":1054},[1055,1057,1059,1061,1063,1065,1069,1074,1076,1078,1080],{"text":692,"config":1056},{"href":694,"dataGaName":686,"dataGaLocation":859},{"text":697,"config":1058},{"href":699,"dataGaName":700,"dataGaLocation":859},{"text":705,"config":1060},{"href":707,"dataGaName":708,"dataGaLocation":859},{"text":710,"config":1062},{"href":712,"dataGaName":713,"dataGaLocation":859},{"text":715,"config":1064},{"href":717,"dataGaName":718,"dataGaLocation":859},{"text":1066,"config":1067},"Sustainability",{"href":1068,"dataGaName":1066,"dataGaLocation":859},"/sustainability/",{"text":1070,"config":1071},"Diversity, inclusion and belonging (DIB)",{"href":1072,"dataGaName":1073,"dataGaLocation":859},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":720,"config":1075},{"href":722,"dataGaName":723,"dataGaLocation":859},{"text":730,"config":1077},{"href":732,"dataGaName":733,"dataGaLocation":859},{"text":735,"config":1079},{"href":737,"dataGaName":738,"dataGaLocation":859},{"text":1081,"config":1082},"Modern Slavery Transparency Statement",{"href":1083,"dataGaName":1084,"dataGaLocation":859},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1086},[1087,1090,1093],{"text":1088,"config":1089},"Terms",{"href":911,"dataGaName":912,"dataGaLocation":859},{"text":1091,"config":1092},"Cookies",{"dataGaName":921,"dataGaLocation":859,"id":922,"isOneTrustButton":403},{"text":1094,"config":1095},"Privacy",{"href":916,"dataGaName":917,"dataGaLocation":859},[1097],{"id":1098,"title":7,"body":399,"config":1099,"content":1101,"description":399,"extension":1105,"meta":1106,"navigation":403,"path":1107,"seo":1108,"stem":1109,"__hash__":1110},"blogAuthors/en-us/blog/authors/achilleas-pipinellis.yml",{"template":1100},"BlogAuthor",{"name":7,"config":1102},{"headshot":1103,"ctfId":1104},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749671703/Blog/Author%20Headshots/axil-headshot.jpg","Achilleas-Pipinellis","yml",{},"/en-us/blog/authors/achilleas-pipinellis",{},"en-us/blog/authors/achilleas-pipinellis","vSsnKACisBQ6cIWVfVkuQ4WeAp0ylxXfqK5oJMhxEEg",[1112,1121,1129],{"title":1113,"description":1114,"heroImage":1115,"category":395,"date":1116,"authors":1117,"slug":1120,"externalUrl":399},"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",[1118,1119],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1122,"description":1123,"heroImage":1124,"category":395,"date":1125,"authors":1126,"slug":1128,"externalUrl":399},"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",[1127],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1130,"description":1131,"heroImage":1132,"category":395,"date":1133,"authors":1134,"slug":1136,"externalUrl":399},"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",[1135],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1138},[1139,1153,1165,1177],{"id":1140,"categories":1141,"header":1143,"text":1144,"button":1145,"image":1150},"ai-modernization",[1142],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1146,"config":1147},"Get your AI maturity score",{"href":1148,"dataGaName":1149,"dataGaLocation":624},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1151},{"src":1152},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1154,"categories":1155,"header":1157,"text":1144,"button":1158,"image":1162},"devops-modernization",[1156,961],"product","Are you just managing tools or shipping innovation?",{"text":1159,"config":1160},"Get your DevOps maturity score",{"href":1161,"dataGaName":1149,"dataGaLocation":624},"/assessments/devops-modernization-assessment/",{"config":1163},{"src":1164},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1166,"categories":1167,"header":1169,"text":1144,"button":1170,"image":1174},"security-modernization",[1168],"security","Are you trading speed for security?",{"text":1171,"config":1172},"Get your security maturity score",{"href":1173,"dataGaName":1149,"dataGaLocation":624},"/assessments/security-modernization-assessment/",{"config":1175},{"src":1176},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1178,"paths":1179,"header":1182,"text":1183,"button":1184,"image":1189},"github-azure-migration",[1180,1181],"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":1185,"config":1186},"See how GitLab compares to GitHub",{"href":1187,"dataGaName":1188,"dataGaLocation":624},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1190},{"src":1164},{"header":1192,"blurb":1193,"button":1194,"secondaryButton":1199},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1195,"config":1196},"Get your free trial",{"href":1197,"dataGaName":423,"dataGaLocation":1198},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":897,"config":1200},{"href":749,"dataGaName":428,"dataGaLocation":1198},1786803749913]