[{"data":1,"prerenderedAt":1265},["ShallowReactive",2],{"/blog/unofficial-gitlab-ci-runner":3,"navigation-en-us":476,"banner-en-us":904,"footer-en-us":914,"blog-post-authors-en-us-Kamil Trzciński":1159,"blog-related-posts-en-us-unofficial-gitlab-ci-runner":1175,"blog-promotions-en-us":1201,"next-steps-en-us":1255},{"id":4,"title":5,"authors":6,"body":8,"category":452,"date":453,"description":454,"extension":455,"externalUrl":456,"faq":456,"featured":457,"heroImage":458,"meta":459,"navigation":247,"path":467,"seo":468,"slug":472,"stem":473,"tags":456,"template":474,"updatedDate":456,"__hash__":475},"blogPosts/en-us/blog/unofficial-gitlab-ci-runner.md","Unofficial GitLab CI Runner",[7],"Kamil Trzciński",{"type":9,"value":10,"toc":441},"minimark",[11,21,26,35,54,58,61,65,68,98,102,139,142,146,149,316,319,335,339,342,346,351,362,367,384,413,417,424,428,437],[12,13,14,20],"p",{},[15,16,19],"a",{"href":17,"rel":18},"https://gitlab.com/gitlab-org/gitlab-runner",[],"GitLab CI Multi-purpose Runner"," is yet another CI runner, but this time written in Go with a vast number of features that leverage all the latest technologies. It's an unofficial project made by me, Kamil Trzciński, with love for GitLab CI to help aid some problems with current runner and make the use of CI really simple and secure.",[22,23,25],"h2",{"id":24},"why-it-was-created","Why it was created?",[12,27,28,29,34],{},"I created that project, because I needed a runner that allows to use virtualization technology (Docker and Parallels for macOS) to build our (",[15,30,33],{"href":31,"rel":32},"https://www.polidea.com/",[],"Polidea",") projects. The main reason is that the official GitLab-CI-Runner is a very simple application written in Ruby, but works well in quite basic setups. You can think of it as a reference implementation of what a bare runner can look like. It's distributed as source code or as a simple omnibus package to install on one of the supported Linux distributions. However, there are some areas where that makes it quite hard to use:",[36,37,38,42,45,48,51],"ul",{},[39,40,41],"li",{},"The runner can only run one concurrent at a time. If you want to run more either you set up a new server or create an additional user to build the jobs.",[39,43,44],{},"What is important is that the official runner always runs projects on the server shell. This makes it really hard to test projects using different versions of Ruby or any other dependencies. It also makes the build environment dirty and builds are not really 100% reliable. This collides with a recent approach to always have a clean build environment.",[39,46,47],{},"The runner works only on Linux-based platforms and it's not really an easy task to make the runner a service that is run at system start. Additional hacks are required to make it run on macOS. There is no support for Windows.",[39,49,50],{},"It's quite hard to set up the next server with all dependencies required to build project.",[39,52,53],{},"It's quite hard to perform some administrative tasks with the official runner.",[22,55,57],{"id":56},"why-do-i-need-it","Why do I need it?",[12,59,60],{},"The Gitlab-CI Multi-purpose Runner is one binary that you can put on your machine of any kind. It is really easy to set up as a service and can work with multiple projects and multiple GitLab CI coordinators. With support for Docker it makes it really easy to set up build environment with different versions of packages.",[22,62,64],{"id":63},"how-to-install","How to install?",[12,66,67],{},"It's really simple. There's a multiple ways to install GitLab-CI Multi-purpose Runner:",[36,69,70,77,84,91],{},[39,71,72],{},[15,73,76],{"href":74,"rel":75},"https://gitlab.com/gitlab-org/gitlab-runner/blob/master/docs/install/linux-repository.md",[],"Install using Debian/Ubuntu/CentOS/RedHat package",[39,78,79],{},[15,80,83],{"href":81,"rel":82},"https://gitlab.com/gitlab-org/gitlab-runner/blob/master/docs/install/osx.md",[],"Install on macOS",[39,85,86],{},[15,87,90],{"href":88,"rel":89},"https://gitlab.com/gitlab-org/gitlab-runner/blob/master/docs/install/windows.md",[],"Install on Windows",[39,92,93],{},[15,94,97],{"href":95,"rel":96},"https://gitlab.com/gitlab-org/gitlab-runner/blob/master/docs/install/docker.md",[],"Install as Docker Service",[22,99,101],{"id":100},"how-to-use-it","How to use it?",[103,104,109],"pre",{"className":105,"code":106,"language":107,"meta":108,"style":108},"language-bash shiki shiki-themes github-light","$ cd ~gitlab_ci_multi_runner\n$ gitlab-ci-multi-runner register\n","bash","",[110,111,112,128],"code",{"__ignoreMap":108},[113,114,117,121,125],"span",{"class":115,"line":116},"line",1,[113,118,120],{"class":119},"s7eDp","$",[113,122,124],{"class":123},"sYBdl"," cd",[113,126,127],{"class":123}," ~gitlab_ci_multi_runner\n",[113,129,131,133,136],{"class":115,"line":130},2,[113,132,120],{"class":119},[113,134,135],{"class":123}," gitlab-ci-multi-runner",[113,137,138],{"class":123}," register\n",[12,140,141],{},"You will be asked about how it should be configured. Once you do it you are pretty much ready to build projects.",[22,143,145],{"id":144},"maybe-use-docker","Maybe use Docker?",[12,147,148],{},"You can also use Docker to create runner with specific dependencies. What is important that every time your project is built it will be run in clean environment without any leftovers from previous builds. With this simple commands below you don't have to install any dependencies, because Docker will download everything required to run your tests.",[103,150,152],{"className":105,"code":151,"language":107,"meta":108,"style":108},"$ cd ~gitlab_ci_multi_runner\n$ gitlab-ci-multi-runner register \\\n  --non-interactive \\\n  --url \"https://ci.gitlab.com/\" \\\n  --registration-token \"REGISTRATION_TOKEN\" \\\n  --description \"Ruby 2.1 with MySQL\" \\\n  --executor \"docker\" \\\n  --docker-image ruby:2.1 --docker-mysql latest\n\n$ gitlab-ci-multi-runner register \\\n  --non-interactive \\\n  --url \"https://ci.gitlab.com/\" \\\n  --registration-token \"REGISTRATION_TOKEN\" \\\n  --description \"Python 3.4 with MySQL\" \\\n  --executor \"docker\" \\\n  --docker-image python:3.4 --docker-mysql latest\n\n",[110,153,154,162,175,183,194,205,216,227,242,249,260,267,276,285,295,304],{"__ignoreMap":108},[113,155,156,158,160],{"class":115,"line":116},[113,157,120],{"class":119},[113,159,124],{"class":123},[113,161,127],{"class":123},[113,163,164,166,168,171],{"class":115,"line":130},[113,165,120],{"class":119},[113,167,135],{"class":123},[113,169,170],{"class":123}," register",[113,172,174],{"class":173},"sYu0t"," \\\n",[113,176,178,181],{"class":115,"line":177},3,[113,179,180],{"class":173},"  --non-interactive",[113,182,174],{"class":173},[113,184,186,189,192],{"class":115,"line":185},4,[113,187,188],{"class":173},"  --url",[113,190,191],{"class":123}," \"https://ci.gitlab.com/\"",[113,193,174],{"class":173},[113,195,197,200,203],{"class":115,"line":196},5,[113,198,199],{"class":173},"  --registration-token",[113,201,202],{"class":123}," \"REGISTRATION_TOKEN\"",[113,204,174],{"class":173},[113,206,208,211,214],{"class":115,"line":207},6,[113,209,210],{"class":173},"  --description",[113,212,213],{"class":123}," \"Ruby 2.1 with MySQL\"",[113,215,174],{"class":173},[113,217,219,222,225],{"class":115,"line":218},7,[113,220,221],{"class":173},"  --executor",[113,223,224],{"class":123}," \"docker\"",[113,226,174],{"class":173},[113,228,230,233,236,239],{"class":115,"line":229},8,[113,231,232],{"class":173},"  --docker-image",[113,234,235],{"class":123}," ruby:2.1",[113,237,238],{"class":173}," --docker-mysql",[113,240,241],{"class":123}," latest\n",[113,243,245],{"class":115,"line":244},9,[113,246,248],{"emptyLinePlaceholder":247},true,"\n",[113,250,252,254,256,258],{"class":115,"line":251},10,[113,253,120],{"class":119},[113,255,135],{"class":123},[113,257,170],{"class":123},[113,259,174],{"class":173},[113,261,263,265],{"class":115,"line":262},11,[113,264,180],{"class":173},[113,266,174],{"class":173},[113,268,270,272,274],{"class":115,"line":269},12,[113,271,188],{"class":173},[113,273,191],{"class":123},[113,275,174],{"class":173},[113,277,279,281,283],{"class":115,"line":278},13,[113,280,199],{"class":173},[113,282,202],{"class":123},[113,284,174],{"class":173},[113,286,288,290,293],{"class":115,"line":287},14,[113,289,210],{"class":173},[113,291,292],{"class":123}," \"Python 3.4 with MySQL\"",[113,294,174],{"class":173},[113,296,298,300,302],{"class":115,"line":297},15,[113,299,221],{"class":173},[113,301,224],{"class":123},[113,303,174],{"class":173},[113,305,307,309,312,314],{"class":115,"line":306},16,[113,308,232],{"class":173},[113,310,311],{"class":123}," python:3.4",[113,313,238],{"class":173},[113,315,241],{"class":123},[12,317,318],{},"The exemplary integrations for GitLab CE and GitLab CI can be found here:",[36,320,321,328],{},[39,322,323],{},[15,324,327],{"href":325,"rel":326},"https://gitlab.com/gitlab-org/gitlab-runner/blob/master/docs/examples/gitlab.md",[],"Integrate GitLab CE",[39,329,330],{},[15,331,334],{"href":332,"rel":333},"https://gitlab.com/gitlab-org/gitlab-runner/blob/master/docs/examples/gitlab-ci.md",[],"Integrate GitLab CI",[22,336,338],{"id":337},"why-go","Why Go?",[12,340,341],{},"Go is pretty young language already used by same major brands (Docker). It's proven to be stable, well supported with pretty rich library. However the most important thing is that Go compiler can produce single binary without any dependencies for Linux, macOS, FreeBSD, NetBSD, OpenBSD, Plan 9 and Microsoft Windows and the i386, amd64, ARM and IBM POWER processor architectures. The binary is of reasonable size (around 10MB in case of GitLab-CI-Multi-Runner).\nWhat is important is that this is the one project to rule them all. With Go's multiplatform approach it is really simple to build projects than can run on all platforms and in most cases it's sufficient to distribute the application binary only, because it has all required bits to run the project.",[22,343,345],{"id":344},"features","Features",[36,347,348],{},[39,349,350],{},"Allows to run:",[36,352,353,356,359],{},[39,354,355],{},"multiple jobs concurrently",[39,357,358],{},"use multiple tokens with multiple server (even per-project)",[39,360,361],{},"limit number of concurrent jobs per-token",[36,363,364],{},[39,365,366],{},"Jobs can be run:",[36,368,369,372,375,378,381],{},[39,370,371],{},"locally",[39,373,374],{},"using a Docker container",[39,376,377],{},"using a Docker container and executing jobs over SSH",[39,379,380],{},"using dynamically provisioned Parallels VM machines",[39,382,383],{},"connecting to a remote SSH server",[36,385,386,389,392,395,398,401,404,407,410],{},[39,387,388],{},"Is written in Go and is also distributed as single binary without any other requirements",[39,390,391],{},"Supports Bash, Windows Batch and Windows PowerShell",[39,393,394],{},"Works on Ubuntu, Debian, macOS and Windows (and anywhere you can run Docker)",[39,396,397],{},"Allows to customize job running environment",[39,399,400],{},"Automatic configuration reload without restart",[39,402,403],{},"Easy to use setup with support for all running environments",[39,405,406],{},"Support for caching when using Docker containers",[39,408,409],{},"Support to make runner a Service on Linux, macOS and Windows",[39,411,412],{},"Current jobs are aborted when service receives interrupt signal - ex. when shutting down the server.",[22,414,416],{"id":415},"is-it-stable","Is it stable?",[12,418,419,420,423],{},"This runner has been in use for quite some time already to build our mobile projects at ",[15,421,33],{"href":31,"rel":422},[],". Polidea is a mobile software house that creates and develops apps for a variety of clients. We like customizing and improving our processes as much as possible to make the development process as smooth as it gets – and to create great tools for everyone. We will soon be publishing series of posts how we use GitLab CI to build projects for Android and iOS devices.",[22,425,427],{"id":426},"this-project-needs-your-help","This project needs your help",[12,429,430,431,436],{},"I think that you got interested. Please try to run it and post some comments on how it works for you. You can also join discussion on ",[15,432,435],{"href":433,"rel":434},"https://gitlab.com/gitlab-org/omnibus-gitlab-runner/issues/7#note_1074777",[],"GitLab.com"," whether this runners should become the official one. Thanks!",[438,439,440],"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}",{"title":108,"searchDepth":130,"depth":130,"links":442},[443,444,445,446,447,448,449,450,451],{"id":24,"depth":130,"text":25},{"id":56,"depth":130,"text":57},{"id":63,"depth":130,"text":64},{"id":100,"depth":130,"text":101},{"id":144,"depth":130,"text":145},{"id":337,"depth":130,"text":338},{"id":344,"depth":130,"text":345},{"id":415,"depth":130,"text":416},{"id":426,"depth":130,"text":427},"engineering","2015-04-17","GitLab CI Multi-purpose Runner is yet another CI runner, but this time written in Go with a vast number of features that leverage all the latest technologies.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663397/Blog/Hero%20Images/logoforblogpost.jpg",{"excerpt":460},{"type":9,"value":461},[462],[12,463,464,20],{},[15,465,19],{"href":17,"rel":466},[],"/en-us/blog/unofficial-gitlab-ci-runner",{"title":5,"description":454,"ogTitle":5,"ogDescription":454,"noIndex":457,"ogImage":458,"ogUrl":469,"ogSiteName":470,"ogType":471,"canonicalUrls":469},"https://about.gitlab.com/blog/unofficial-gitlab-ci-runner","https://about.gitlab.com","article","unofficial-gitlab-ci-runner","en-us/blog/unofficial-gitlab-ci-runner","BlogPost","nnalBN7jQHE4P-llD2Re8tewRdIRhJn7FWlvBNHhv_w",{"logo":477,"freeTrial":482,"sales":487,"login":492,"items":497,"search":824,"minimal":855,"duo":874,"switchNav":883,"pricingDeployment":894},{"config":478},{"href":479,"dataGaName":480,"dataGaLocation":481},"/","gitlab logo","header",{"text":483,"config":484},"Get free trial",{"href":485,"dataGaName":486,"dataGaLocation":481},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":488,"config":489},"Request a demo",{"href":490,"dataGaName":491,"dataGaLocation":481},"/sales/?contact-topic=request-demo","sales",{"text":493,"config":494},"Sign in",{"href":495,"dataGaName":496,"dataGaLocation":481},"https://gitlab.com/users/sign_in/","sign in",[498,527,627,632,746,802],{"text":499,"config":500,"menu":502},"Platform",{"dataNavLevelOne":501},"platform",{"type":503,"columns":504},"cards",[505,511,519],{"title":499,"description":506,"link":507},"The intelligent orchestration platform for DevSecOps",{"text":508,"config":509},"Explore our Platform",{"href":510,"dataGaName":501,"dataGaLocation":481},"/platform/",{"title":512,"description":513,"link":514},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":515,"config":516},"Meet GitLab Duo",{"href":517,"dataGaName":518,"dataGaLocation":481},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":520,"description":521,"link":522},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":523,"config":524},"Learn more",{"href":525,"dataGaName":526,"dataGaLocation":481},"/why-gitlab/","why gitlab",{"text":528,"left":247,"config":529,"menu":531},"Product",{"dataNavLevelOne":530},"solutions",{"type":532,"link":533,"columns":537,"feature":606},"lists",{"text":534,"config":535},"View all Solutions",{"href":536,"dataGaName":530,"dataGaLocation":481},"/solutions/",[538,562,585],{"title":539,"description":540,"link":541,"items":546},"Automation","CI/CD and automation to accelerate deployment",{"config":542},{"icon":543,"href":544,"dataGaName":545,"dataGaLocation":481},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[547,551,554,558],{"text":548,"config":549},"CI/CD",{"href":550,"dataGaLocation":481,"dataGaName":548},"/solutions/continuous-integration/",{"text":512,"config":552},{"href":517,"dataGaLocation":481,"dataGaName":553},"gitlab duo agent platform - product menu",{"text":555,"config":556},"Source Code Management",{"href":557,"dataGaLocation":481,"dataGaName":555},"/solutions/source-code-management/",{"text":559,"config":560},"Automated Software Delivery",{"href":544,"dataGaLocation":481,"dataGaName":561},"Automated software delivery",{"title":563,"description":564,"link":565,"items":570},"Security","Deliver code faster without compromising security",{"config":566},{"href":567,"dataGaName":568,"dataGaLocation":481,"icon":569},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[571,575,580],{"text":572,"config":573},"Application Security Testing",{"href":567,"dataGaName":574,"dataGaLocation":481},"Application security testing",{"text":576,"config":577},"Software Supply Chain Security",{"href":578,"dataGaLocation":481,"dataGaName":579},"/solutions/supply-chain/","Software supply chain security",{"text":581,"config":582},"Software Compliance",{"href":583,"dataGaName":584,"dataGaLocation":481},"/solutions/software-compliance/","software compliance",{"title":586,"link":587,"items":592},"Measurement",{"config":588},{"icon":589,"href":590,"dataGaName":591,"dataGaLocation":481},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[593,597,601],{"text":594,"config":595},"Visibility & Measurement",{"href":590,"dataGaLocation":481,"dataGaName":596},"Visibility and Measurement",{"text":598,"config":599},"Value Stream Management",{"href":600,"dataGaLocation":481,"dataGaName":598},"/solutions/value-stream-management/",{"text":602,"config":603},"Analytics & Insights",{"href":604,"dataGaLocation":481,"dataGaName":605},"/solutions/analytics-and-insights/","Analytics and insights",{"title":607,"type":532,"items":608},"GitLab for",[609,615,621],{"text":610,"config":611},"Enterprise",{"icon":612,"href":613,"dataGaLocation":481,"dataGaName":614},"Building","/enterprise/","enterprise",{"text":616,"config":617},"Small Business",{"icon":618,"href":619,"dataGaLocation":481,"dataGaName":620},"Work","/small-business/","small business",{"text":622,"config":623},"Public Sector",{"icon":624,"href":625,"dataGaLocation":481,"dataGaName":626},"Organization","/solutions/public-sector/","public sector",{"text":628,"config":629},"Pricing",{"href":630,"dataGaName":631,"dataGaLocation":481,"dataNavLevelOne":631},"/pricing/","pricing",{"text":633,"config":634,"menu":636},"Resources",{"dataNavLevelOne":635},"resources",{"type":532,"link":637,"columns":641,"feature":735},{"text":638,"config":639},"View all resources",{"href":640,"dataGaName":635,"dataGaLocation":481},"/resources/",[642,675,702],{"title":643,"items":644},"Getting started",[645,650,655,660,665,670],{"text":646,"config":647},"Install",{"href":648,"dataGaName":649,"dataGaLocation":481},"/install/","install",{"text":651,"config":652},"Quick start guides",{"href":653,"dataGaName":654,"dataGaLocation":481},"/get-started/","quick setup checklists",{"text":656,"config":657},"Learn",{"href":658,"dataGaLocation":481,"dataGaName":659},"https://university.gitlab.com/","learn",{"text":661,"config":662},"Product documentation",{"href":663,"dataGaName":664,"dataGaLocation":481},"https://docs.gitlab.com/","product documentation",{"text":666,"config":667},"Best practice videos",{"href":668,"dataGaName":669,"dataGaLocation":481},"/getting-started-videos/","best practice videos",{"text":671,"config":672},"Integrations",{"href":673,"dataGaName":674,"dataGaLocation":481},"/integrations/","integrations",{"title":676,"items":677},"Discover",[678,683,688,693,697],{"text":679,"config":680},"Customer success stories",{"href":681,"dataGaName":682,"dataGaLocation":481},"/customers/","customer success stories",{"text":684,"config":685},"Blog",{"href":686,"dataGaName":687,"dataGaLocation":481},"/blog/","blog",{"text":689,"config":690},"Demo Hub",{"href":691,"dataGaName":692,"dataGaLocation":481},"/demo-hub/","demo hub",{"text":694,"config":695},"The Source",{"href":696,"dataGaName":687,"dataGaLocation":481},"/the-source/",{"text":698,"config":699},"Remote",{"href":700,"dataGaName":701,"dataGaLocation":481},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":703,"items":704},"Connect",[705,710,715,720,725,730],{"text":706,"config":707},"GitLab Services",{"href":708,"dataGaName":709,"dataGaLocation":481},"/services/","services",{"text":711,"config":712},"Contribute",{"href":713,"dataGaName":714,"dataGaLocation":481},"https://contributors.gitlab.com","contribute",{"text":716,"config":717},"Community",{"href":718,"dataGaName":719,"dataGaLocation":481},"/community/","community",{"text":721,"config":722},"Forum",{"href":723,"dataGaName":724,"dataGaLocation":481},"https://forum.gitlab.com/","forum",{"text":726,"config":727},"Events",{"href":728,"dataGaName":729,"dataGaLocation":481},"/events/","events",{"text":731,"config":732},"Partners",{"href":733,"dataGaName":734,"dataGaLocation":481},"/partners/","partners",{"config":736,"title":739,"text":740,"link":741},{"background":737,"textColor":738},"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":742,"config":743},"Read the latest",{"href":744,"dataGaName":745,"dataGaLocation":481},"/whats-new/","whats new",{"text":747,"config":748,"menu":750},"Company",{"dataNavLevelOne":749},"company",{"type":532,"columns":751},[752],{"items":753},[754,759,765,767,772,777,782,787,792,797],{"text":755,"config":756},"About",{"href":757,"dataGaName":758,"dataGaLocation":481},"/company/","about",{"text":760,"config":761,"footerGa":764},"Jobs",{"href":762,"dataGaName":763,"dataGaLocation":481},"/jobs/","jobs",{"dataGaName":763},{"text":726,"config":766},{"href":728,"dataGaName":729,"dataGaLocation":481},{"text":768,"config":769},"Leadership",{"href":770,"dataGaName":771,"dataGaLocation":481},"/company/team/e-group/","leadership",{"text":773,"config":774},"Handbook",{"href":775,"dataGaName":776,"dataGaLocation":481},"https://handbook.gitlab.com/","handbook",{"text":778,"config":779},"Investor relations",{"href":780,"dataGaName":781,"dataGaLocation":481},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":783,"config":784},"Trust Center",{"href":785,"dataGaName":786,"dataGaLocation":481},"/security/","trust center",{"text":788,"config":789},"AI Transparency Center",{"href":790,"dataGaName":791,"dataGaLocation":481},"/ai-transparency-center/","ai transparency center",{"text":793,"config":794},"Newsletter",{"href":795,"dataGaName":796,"dataGaLocation":481},"/company/contact/#contact-forms","newsletter",{"text":798,"config":799},"Press",{"href":800,"dataGaName":801,"dataGaLocation":481},"/press/","press",{"text":803,"config":804,"menu":805},"Contact us",{"dataNavLevelOne":749},{"type":532,"columns":806},[807],{"items":808},[809,814,819],{"text":810,"config":811},"Talk to sales",{"href":812,"dataGaName":813,"dataGaLocation":481},"/sales/","talk to sales",{"text":815,"config":816},"Support portal",{"href":817,"dataGaName":818,"dataGaLocation":481},"https://support.gitlab.com/hc/en-us","support portal",{"text":820,"config":821},"Customer portal",{"href":822,"dataGaName":823,"dataGaLocation":481},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":825,"login":826,"suggestions":833},"Close",{"text":827,"link":828},"To search repositories and projects, login to",{"text":829,"config":830},"gitlab.com",{"href":495,"dataGaName":831,"dataGaLocation":832},"search login","search",{"text":834,"default":835},"Suggestions",[836,838,842,844,848,852],{"text":512,"config":837},{"href":517,"dataGaName":512,"dataGaLocation":832},{"text":839,"config":840},"Code Suggestions (AI)",{"href":841,"dataGaName":839,"dataGaLocation":832},"/solutions/code-suggestions/",{"text":548,"config":843},{"href":550,"dataGaName":548,"dataGaLocation":832},{"text":845,"config":846},"GitLab on AWS",{"href":847,"dataGaName":845,"dataGaLocation":832},"/partners/technology-partners/aws/",{"text":849,"config":850},"GitLab on Google Cloud",{"href":851,"dataGaName":849,"dataGaLocation":832},"/partners/technology-partners/google-cloud-platform/",{"text":853,"config":854},"Why GitLab?",{"href":525,"dataGaName":853,"dataGaLocation":832},{"freeTrial":856,"mobileIcon":861,"desktopIcon":866,"secondaryButton":869},{"text":857,"config":858},"Start free trial",{"href":859,"dataGaName":486,"dataGaLocation":860},"https://gitlab.com/-/trials/new/","nav",{"altText":862,"config":863},"Gitlab Icon",{"src":864,"dataGaName":865,"dataGaLocation":860},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":862,"config":867},{"src":868,"dataGaName":865,"dataGaLocation":860},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":870,"config":871},"Get Started",{"href":872,"dataGaName":873,"dataGaLocation":860},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":875,"mobileIcon":879,"desktopIcon":881},{"text":876,"config":877},"Learn more about GitLab Duo",{"href":517,"dataGaName":878,"dataGaLocation":860},"gitlab duo",{"altText":862,"config":880},{"src":864,"dataGaName":865,"dataGaLocation":860},{"altText":862,"config":882},{"src":868,"dataGaName":865,"dataGaLocation":860},{"button":884,"mobileIcon":889,"desktopIcon":891},{"text":885,"config":886},"/switch",{"href":887,"dataGaName":888,"dataGaLocation":860},"#contact","switch",{"altText":862,"config":890},{"src":864,"dataGaName":865,"dataGaLocation":860},{"altText":862,"config":892},{"src":893,"dataGaName":865,"dataGaLocation":860},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":895,"mobileIcon":900,"desktopIcon":902},{"text":896,"config":897},"Back to pricing",{"href":630,"dataGaName":898,"dataGaLocation":860,"icon":899},"back to pricing","GoBack",{"altText":862,"config":901},{"src":864,"dataGaName":865,"dataGaLocation":860},{"altText":862,"config":903},{"src":868,"dataGaName":865,"dataGaLocation":860},{"title":905,"titleMobile":906,"button":907,"config":912},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":523,"config":908},{"href":909,"dataGaName":910,"dataGaLocation":911},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":913,"disabled":457},"release",{"data":915},{"text":916,"source":917,"edit":923,"contribute":928,"config":933,"items":938,"minimal":1148},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":918,"config":919},"View page source",{"href":920,"dataGaName":921,"dataGaLocation":922},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":924,"config":925},"Edit this page",{"href":926,"dataGaName":927,"dataGaLocation":922},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":929,"config":930},"Please contribute",{"href":931,"dataGaName":932,"dataGaLocation":922},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":934,"facebook":935,"youtube":936,"linkedin":937},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[939,986,1040,1084,1116],{"title":628,"links":940,"subMenu":955},[941,945,950],{"text":942,"config":943},"View plans",{"href":630,"dataGaName":944,"dataGaLocation":922},"view plans",{"text":946,"config":947},"Why Premium?",{"href":948,"dataGaName":949,"dataGaLocation":922},"/pricing/premium/","why premium",{"text":951,"config":952},"Why Ultimate?",{"href":953,"dataGaName":954,"dataGaLocation":922},"/pricing/ultimate/","why ultimate",[956],{"title":957,"links":958},"Contact Us",[959,962,964,966,971,976,981],{"text":960,"config":961},"Contact sales",{"href":812,"dataGaName":491,"dataGaLocation":922},{"text":815,"config":963},{"href":817,"dataGaName":818,"dataGaLocation":922},{"text":820,"config":965},{"href":822,"dataGaName":823,"dataGaLocation":922},{"text":967,"config":968},"Status",{"href":969,"dataGaName":970,"dataGaLocation":922},"https://status.gitlab.com/","status",{"text":972,"config":973},"Terms of use",{"href":974,"dataGaName":975,"dataGaLocation":922},"/terms/","terms of use",{"text":977,"config":978},"Privacy statement",{"href":979,"dataGaName":980,"dataGaLocation":922},"/privacy/","privacy statement",{"text":982,"config":983},"Cookie preferences",{"dataGaName":984,"dataGaLocation":922,"id":985,"isOneTrustButton":247},"cookie preferences","ot-sdk-btn",{"title":528,"links":987,"subMenu":996},[988,992],{"text":989,"config":990},"DevSecOps platform",{"href":510,"dataGaName":991,"dataGaLocation":922},"devsecops platform",{"text":993,"config":994},"AI-Assisted Development",{"href":517,"dataGaName":995,"dataGaLocation":922},"ai-assisted development",[997],{"title":998,"links":999},"Topics",[1000,1005,1010,1015,1020,1025,1030,1035],{"text":1001,"config":1002},"CICD",{"href":1003,"dataGaName":1004,"dataGaLocation":922},"/topics/ci-cd/","cicd",{"text":1006,"config":1007},"GitOps",{"href":1008,"dataGaName":1009,"dataGaLocation":922},"/topics/gitops/","gitops",{"text":1011,"config":1012},"DevOps",{"href":1013,"dataGaName":1014,"dataGaLocation":922},"/topics/devops/","devops",{"text":1016,"config":1017},"Version Control",{"href":1018,"dataGaName":1019,"dataGaLocation":922},"/topics/version-control/","version control",{"text":1021,"config":1022},"DevSecOps",{"href":1023,"dataGaName":1024,"dataGaLocation":922},"/topics/devsecops/","devsecops",{"text":1026,"config":1027},"Cloud Native",{"href":1028,"dataGaName":1029,"dataGaLocation":922},"/topics/cloud-native/","cloud native",{"text":1031,"config":1032},"AI for Coding",{"href":1033,"dataGaName":1034,"dataGaLocation":922},"/topics/devops/ai-for-coding/","ai for coding",{"text":1036,"config":1037},"Agentic AI",{"href":1038,"dataGaName":1039,"dataGaLocation":922},"/topics/agentic-ai/","agentic ai",{"title":1041,"links":1042},"Solutions",[1043,1045,1047,1052,1056,1059,1063,1066,1068,1071,1074,1079],{"text":572,"config":1044},{"href":567,"dataGaName":572,"dataGaLocation":922},{"text":561,"config":1046},{"href":544,"dataGaName":545,"dataGaLocation":922},{"text":1048,"config":1049},"Agile development",{"href":1050,"dataGaName":1051,"dataGaLocation":922},"/solutions/agile-delivery/","agile delivery",{"text":1053,"config":1054},"SCM",{"href":557,"dataGaName":1055,"dataGaLocation":922},"source code management",{"text":1001,"config":1057},{"href":550,"dataGaName":1058,"dataGaLocation":922},"continuous integration & delivery",{"text":1060,"config":1061},"Value stream management",{"href":600,"dataGaName":1062,"dataGaLocation":922},"value stream management",{"text":1006,"config":1064},{"href":1065,"dataGaName":1009,"dataGaLocation":922},"/solutions/gitops/",{"text":610,"config":1067},{"href":613,"dataGaName":614,"dataGaLocation":922},{"text":1069,"config":1070},"Small business",{"href":619,"dataGaName":620,"dataGaLocation":922},{"text":1072,"config":1073},"Public sector",{"href":625,"dataGaName":626,"dataGaLocation":922},{"text":1075,"config":1076},"Education",{"href":1077,"dataGaName":1078,"dataGaLocation":922},"/solutions/education/","education",{"text":1080,"config":1081},"Financial services",{"href":1082,"dataGaName":1083,"dataGaLocation":922},"/solutions/finance/","financial services",{"title":633,"links":1085},[1086,1088,1090,1092,1095,1097,1100,1102,1104,1106,1108,1110,1112,1114],{"text":646,"config":1087},{"href":648,"dataGaName":649,"dataGaLocation":922},{"text":651,"config":1089},{"href":653,"dataGaName":654,"dataGaLocation":922},{"text":656,"config":1091},{"href":658,"dataGaName":659,"dataGaLocation":922},{"text":661,"config":1093},{"href":663,"dataGaName":1094,"dataGaLocation":922},"docs",{"text":684,"config":1096},{"href":686,"dataGaName":687,"dataGaLocation":922},{"text":1098,"config":1099},"What's new",{"href":744,"dataGaName":745,"dataGaLocation":922},{"text":679,"config":1101},{"href":681,"dataGaName":682,"dataGaLocation":922},{"text":698,"config":1103},{"href":700,"dataGaName":701,"dataGaLocation":922},{"text":706,"config":1105},{"href":708,"dataGaName":709,"dataGaLocation":922},{"text":711,"config":1107},{"href":713,"dataGaName":714,"dataGaLocation":922},{"text":716,"config":1109},{"href":718,"dataGaName":719,"dataGaLocation":922},{"text":721,"config":1111},{"href":723,"dataGaName":724,"dataGaLocation":922},{"text":726,"config":1113},{"href":728,"dataGaName":729,"dataGaLocation":922},{"text":731,"config":1115},{"href":733,"dataGaName":734,"dataGaLocation":922},{"title":747,"links":1117},[1118,1120,1122,1124,1126,1128,1132,1137,1139,1141,1143],{"text":755,"config":1119},{"href":757,"dataGaName":749,"dataGaLocation":922},{"text":760,"config":1121},{"href":762,"dataGaName":763,"dataGaLocation":922},{"text":768,"config":1123},{"href":770,"dataGaName":771,"dataGaLocation":922},{"text":773,"config":1125},{"href":775,"dataGaName":776,"dataGaLocation":922},{"text":778,"config":1127},{"href":780,"dataGaName":781,"dataGaLocation":922},{"text":1129,"config":1130},"Sustainability",{"href":1131,"dataGaName":1129,"dataGaLocation":922},"/sustainability/",{"text":1133,"config":1134},"Diversity, inclusion and belonging (DIB)",{"href":1135,"dataGaName":1136,"dataGaLocation":922},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":783,"config":1138},{"href":785,"dataGaName":786,"dataGaLocation":922},{"text":793,"config":1140},{"href":795,"dataGaName":796,"dataGaLocation":922},{"text":798,"config":1142},{"href":800,"dataGaName":801,"dataGaLocation":922},{"text":1144,"config":1145},"Modern Slavery Transparency Statement",{"href":1146,"dataGaName":1147,"dataGaLocation":922},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1149},[1150,1153,1156],{"text":1151,"config":1152},"Terms",{"href":974,"dataGaName":975,"dataGaLocation":922},{"text":1154,"config":1155},"Cookies",{"dataGaName":984,"dataGaLocation":922,"id":985,"isOneTrustButton":247},{"text":1157,"config":1158},"Privacy",{"href":979,"dataGaName":980,"dataGaLocation":922},[1160],{"id":1161,"title":1162,"body":456,"config":1163,"content":1165,"description":456,"extension":1169,"meta":1170,"navigation":247,"path":1171,"seo":1172,"stem":1173,"__hash__":1174},"blogAuthors/en-us/blog/authors/kamil-trzciski.yml","Kamil Trzciski",{"template":1164},"BlogAuthor",{"name":7,"config":1166},{"headshot":1167,"ctfId":1168},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Kamil-Trzciski","yml",{},"/en-us/blog/authors/kamil-trzciski",{},"en-us/blog/authors/kamil-trzciski","0OWP0PQhw_gA506CcPOOIEVsbyW_ZxV3muYLqF0iFoQ",[1176,1185,1193],{"title":1177,"description":1178,"heroImage":1179,"category":452,"date":1180,"authors":1181,"slug":1184,"externalUrl":456},"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",[1182,1183],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1186,"description":1187,"heroImage":1188,"category":452,"date":1189,"authors":1190,"slug":1192,"externalUrl":456},"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",[1191],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1194,"description":1195,"heroImage":1196,"category":452,"date":1197,"authors":1198,"slug":1200,"externalUrl":456},"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",[1199],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1202},[1203,1217,1229,1241],{"id":1204,"categories":1205,"header":1207,"text":1208,"button":1209,"image":1214},"ai-modernization",[1206],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1210,"config":1211},"Get your AI maturity score",{"href":1212,"dataGaName":1213,"dataGaLocation":687},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1215},{"src":1216},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1218,"categories":1219,"header":1221,"text":1208,"button":1222,"image":1226},"devops-modernization",[1220,1024],"product","Are you just managing tools or shipping innovation?",{"text":1223,"config":1224},"Get your DevOps maturity score",{"href":1225,"dataGaName":1213,"dataGaLocation":687},"/assessments/devops-modernization-assessment/",{"config":1227},{"src":1228},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1230,"categories":1231,"header":1233,"text":1208,"button":1234,"image":1238},"security-modernization",[1232],"security","Are you trading speed for security?",{"text":1235,"config":1236},"Get your security maturity score",{"href":1237,"dataGaName":1213,"dataGaLocation":687},"/assessments/security-modernization-assessment/",{"config":1239},{"src":1240},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1242,"paths":1243,"header":1246,"text":1247,"button":1248,"image":1253},"github-azure-migration",[1244,1245],"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":1249,"config":1250},"See how GitLab compares to GitHub",{"href":1251,"dataGaName":1252,"dataGaLocation":687},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1254},{"src":1228},{"header":1256,"blurb":1257,"button":1258,"secondaryButton":1263},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1259,"config":1260},"Get your free trial",{"href":1261,"dataGaName":486,"dataGaLocation":1262},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":960,"config":1264},{"href":812,"dataGaName":491,"dataGaLocation":1262},1786803766706]