[{"data":1,"prerenderedAt":1246},["ShallowReactive",2],{"/blog/getting-started-with-gitlab-development-kit":3,"navigation-en-us":458,"banner-en-us":886,"footer-en-us":896,"blog-post-authors-en-us-Drew Blessing":1141,"blog-related-posts-en-us-getting-started-with-gitlab-development-kit":1156,"blog-promotions-en-us":1182,"next-steps-en-us":1236},{"id":4,"title":5,"authors":6,"body":8,"category":423,"date":424,"description":425,"extension":426,"externalUrl":427,"faq":427,"featured":428,"heroImage":429,"meta":430,"navigation":448,"path":449,"seo":450,"slug":454,"stem":455,"tags":427,"template":456,"updatedDate":427,"__hash__":457},"blogPosts/en-us/blog/getting-started-with-gitlab-development-kit.md","Getting Started with GitLab Development Kit",[7],"Drew Blessing",{"type":9,"value":10,"toc":416},"minimark",[11,23,26,40,49,54,63,173,177,180,213,224,266,276,294,308,323,327,334,343,347,350,370,373,387,391,394,401,404,412],[12,13,14],"blockquote",{},[15,16,17,18],"p",{},"This post is part of a series ",[19,20,22],"a",{"href":21},"/blog/1k-contributors/","Celebrating 1,000 Contributors",[15,24,25],{},"GitLab is built on open-source and has a thriving community. We appreciate all\nof our existing contributors and we look forward to welcoming new contributors,\nas well. This post is helpful if you've considered developing a feature or fix\nfor GitLab but are unsure how to set up a development environment.",[15,27,28,29,33,34,39],{},"As with any Rails application, GitLab has a few moving parts: a database, Redis,\nSidekiq, the Rails application server, GitLab Workhorse, and GitLab Shell. It\ncan be a challenge to configure each of these components on your own. That's why\nwe created the GitLab Omnibus packages for users, recently highlighted in\n",[19,30,32],{"href":31},"/blog/using-omnibus-gitlab-to-ship-gitlab/","another blog post",". Perhaps not as well known is that we\nalso have the ",[19,35,38],{"href":36,"rel":37},"https://gitlab.com/gitlab-org/gitlab-development-kit/",[],"GitLab Development Kit (GDK)"," to improve the experience for\ndevelopers. In this post we'll go through the steps necessary to get GDK set up\non your workstation.",[15,41,42,43,48],{},"All of the details here were obtained from the GDK ",[19,44,47],{"href":45,"rel":46},"https://gitlab.com/gitlab-org/gitlab-development-kit/blob/master/README.md",[],"README file",",\nwhich is comprehensive and should be your first resource when you have\nquestions.",[50,51,53],"h2",{"id":52},"installing-prerequisites","Installing Prerequisites",[15,55,56,57,62],{},"First, you need to install some prerequisite items. Every platform has\ndifferent requirements and we've outlined the steps for each in the\n",[19,58,61],{"href":59,"rel":60},"https://gitlab.com/gitlab-org/gitlab-development-kit/tree/master#prerequisites-for-all-platforms",[],"'Prerequisites for all platforms'"," section of the README. We have\ninstructions for Mac, Ubuntu, Arch Linux, Debian, Fedora, and CentOS/Red Hat.\nFor example, to install prerequisites for a Mac, run the following commands in\nTerminal:",[64,65,70],"pre",{"className":66,"code":67,"language":68,"meta":69,"style":69},"language-bash shiki shiki-themes github-light","brew tap homebrew/dupes\nbrew tap homebrew/versions\nbrew install git redis postgresql libiconv icu4c pkg-config cmake nodejs go openssl node npm\nbundle config build.eventmachine --with-cppflags=-I/usr/local/opt/openssl/include\nnpm install phantomjs@1.9.8 -g\n","bash","",[71,72,73,89,99,143,159],"code",{"__ignoreMap":69},[74,75,78,82,86],"span",{"class":76,"line":77},"line",1,[74,79,81],{"class":80},"s7eDp","brew",[74,83,85],{"class":84},"sYBdl"," tap",[74,87,88],{"class":84}," homebrew/dupes\n",[74,90,92,94,96],{"class":76,"line":91},2,[74,93,81],{"class":80},[74,95,85],{"class":84},[74,97,98],{"class":84}," homebrew/versions\n",[74,100,102,104,107,110,113,116,119,122,125,128,131,134,137,140],{"class":76,"line":101},3,[74,103,81],{"class":80},[74,105,106],{"class":84}," install",[74,108,109],{"class":84}," git",[74,111,112],{"class":84}," redis",[74,114,115],{"class":84}," postgresql",[74,117,118],{"class":84}," libiconv",[74,120,121],{"class":84}," icu4c",[74,123,124],{"class":84}," pkg-config",[74,126,127],{"class":84}," cmake",[74,129,130],{"class":84}," nodejs",[74,132,133],{"class":84}," go",[74,135,136],{"class":84}," openssl",[74,138,139],{"class":84}," node",[74,141,142],{"class":84}," npm\n",[74,144,146,149,152,155],{"class":76,"line":145},4,[74,147,148],{"class":80},"bundle",[74,150,151],{"class":84}," config",[74,153,154],{"class":84}," build.eventmachine",[74,156,158],{"class":157},"sYu0t"," --with-cppflags=-I/usr/local/opt/openssl/include\n",[74,160,162,165,167,170],{"class":76,"line":161},5,[74,163,164],{"class":80},"npm",[74,166,106],{"class":84},[74,168,169],{"class":84}," phantomjs@1.9.8",[74,171,172],{"class":157}," -g\n",[50,174,176],{"id":175},"installation","Installation",[15,178,179],{},"Next, clone the GDK repository:",[64,181,185],{"className":182,"code":183,"language":184,"meta":69,"style":69},"language-shell shiki shiki-themes github-light","cd /path/to/your/workspace\ngit clone git@gitlab.com:gitlab-org/gitlab-development-kit.git\ncd gitlab-development-kit\n","shell",[71,186,187,195,206],{"__ignoreMap":69},[74,188,189,192],{"class":76,"line":77},[74,190,191],{"class":157},"cd",[74,193,194],{"class":84}," /path/to/your/workspace\n",[74,196,197,200,203],{"class":76,"line":91},[74,198,199],{"class":80},"git",[74,201,202],{"class":84}," clone",[74,204,205],{"class":84}," git@gitlab.com:gitlab-org/gitlab-development-kit.git\n",[74,207,208,210],{"class":76,"line":101},[74,209,191],{"class":157},[74,211,212],{"class":84}," gitlab-development-kit\n",[15,214,215,216,219,220,223],{},"Before configuring GDK, fork any GitLab repositories that you plan\nto contribute to. By default, GDK will install using the source repositories,\nsuch as ",[71,217,218],{},"https://gitlab.com/gitlab-org/gitlab-ce.git",". Community members do not\nhave privileges in the main ",[71,221,222],{},"gitlab-ce"," project so you will need a fork to\nsubmit merge requests. Here is a list of various GitLab repositories you may\nwant to fork:",[225,226,227,239,248,257],"ul",{},[228,229,230,234,235],"li",{},[231,232,233],"strong",{},"GitLab CE"," - ",[19,236,237],{"href":237,"rel":238},"https://gitlab.com/gitlab-org/gitlab-ce",[],[228,240,241,234,244],{},[231,242,243],{},"GitLab EE",[19,245,246],{"href":246,"rel":247},"https://gitlab.com/gitlab-org/gitlab-ee",[],[228,249,250,234,253],{},[231,251,252],{},"GitLab Shell",[19,254,255],{"href":255,"rel":256},"https://gitlab.com/gitlab-org/gitlab-shell",[],[228,258,259,234,262],{},[231,260,261],{},"GitLab Workhorse",[19,263,264],{"href":264,"rel":265},"https://gitlab.com/gitlab-org/gitlab-workhorse",[],[15,267,268,269,272,273,275],{},"After forking any of the above repositories, you are ready to run the ",[71,270,271],{},"make","\ncommand to install all components. Be sure to tell ",[71,274,271],{}," about your forks.\nIf you chose not to fork one or more repositories you can leave off the\ncorresponding argument and GDK will use the source repository.",[64,277,279],{"className":66,"code":278,"language":68,"meta":69,"style":69},"make gitlab_repo=git@gitlab.com:example/gitlab-ce.git gitlab_shell_repo=git@gitlab.com:example/gitlab-shell.git gitlab_workhorse_repo=git@gitlab.com:example/gitlab-workhorse.git\n",[71,280,281],{"__ignoreMap":69},[74,282,283,285,288,291],{"class":76,"line":77},[74,284,271],{"class":80},[74,286,287],{"class":84}," gitlab_repo=git@gitlab.com:example/gitlab-ce.git",[74,289,290],{"class":84}," gitlab_shell_repo=git@gitlab.com:example/gitlab-shell.git",[74,292,293],{"class":84}," gitlab_workhorse_repo=git@gitlab.com:example/gitlab-workhorse.git\n",[15,295,296,297,299,300,303,304,307],{},"The above ",[71,298,271],{}," command installs and configures all components.\nThen, run ",[71,301,302],{},"support/set-gitlab-upstream"," to automatically add an upstream remote\nin each cloned GitLab component. This will ensure that upstream changes are\npulled in later when you run ",[71,305,306],{},"make update",".",[15,309,310,311,314,315,318,319,322],{},"Start GDK by executing ",[71,312,313],{},"./run",". All components will be started and output will\nbe logged to the console. You can access GitLab in your browser at\n",[71,316,317],{},"http://localhost:3000"," or press ",[71,320,321],{},"Ctrl-C"," to stop all processes.",[50,324,326],{"id":325},"making-changes","Making changes",[15,328,329,330,333],{},"The various component repositories are all cloned inside the GDK directory.\nFor example, GitLab code is checked out in ",[71,331,332],{},"$GDK_HOME/gitlab",". Change in to\nthis directory and check out a new feature branch.",[15,335,336,337,339,340,342],{},"As you make changes you can refresh your browser to see the effects. In some\ncases, you may need to restart GDK to load the change. Restart by pressing\n",[71,338,321],{}," and then execute ",[71,341,313],{}," again.",[50,344,346],{"id":345},"running-tests","Running tests",[15,348,349],{},"Some changes will require writing tests, or running existing tests to ensure\nyou didn't break anything. GDK makes this very easy using the following commands:",[225,351,352,358,364],{},[228,353,354,357],{},[71,355,356],{},"rake spinach"," to run the spinach suite",[228,359,360,363],{},[71,361,362],{},"rake spec"," to run the rspec suite",[228,365,366,369],{},[71,367,368],{},"rake gitlab:test"," to run all the tests",[15,371,372],{},"GitLab has a lot of tests and it can take a long time to run the full suite.\nUse the following command format to run tests in a single file:",[225,374,375,381],{},[228,376,377,380],{},[71,378,379],{},"bundle exec rspec spec/controllers/commit_controller_spec.rb"," for a rspec test",[228,382,383,386],{},[71,384,385],{},"bundle exec spinach features/project/issues/milestones.feature"," for a spinach test",[50,388,390],{"id":389},"opening-a-merge-request","Opening a merge request",[15,392,393],{},"If all tests pass and you're ready to submit for review, commit the changes and\npush them to your fork. Then, visit GitLab.com and you should notice a banner\nnear the top. Click the blue 'Create Merge Request' button to initiate a merge\nrequest. This will create a merge request from your fork to the GitLab source\nproject so our team can review your contribution.",[15,395,396],{},[397,398],"img",{"alt":399,"src":400},"Last push widget","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782404870/site/Content%20Images/gdk/last_push_widget.png",[15,402,403],{},"Congratulations! After installing the GitLab Development Kit you are\nwell-equipped to contribute to GitLab. We're happy to welcome you to our\ncommunity and look forward to your future contributions.",[15,405,406,407,307],{},"For more information on contributing to GitLab, please see our\n",[19,408,411],{"href":409,"rel":410},"https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md",[],"Contributing Guide",[413,414,415],"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 pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":69,"searchDepth":91,"depth":91,"links":417},[418,419,420,421,422],{"id":52,"depth":91,"text":53},{"id":175,"depth":91,"text":176},{"id":325,"depth":91,"text":326},{"id":345,"depth":91,"text":346},{"id":389,"depth":91,"text":390},"engineering","2016-06-08","This post is helpful if you've considered developing a feature or fix for GitLab but are unsure how to set up a development environment.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749684698/Blog/Hero%20Images/getting-started-with-gitlab-development-kit.jpg",{"excerpt":431},{"type":9,"value":432},[433,439,441],[12,434,435],{},[15,436,17,437],{},[19,438,22],{"href":21},[15,440,25],{},[15,442,28,443,33,445,39],{},[19,444,32],{"href":31},[19,446,38],{"href":36,"rel":447},[],true,"/en-us/blog/getting-started-with-gitlab-development-kit",{"title":5,"description":425,"ogTitle":5,"ogDescription":425,"noIndex":428,"ogImage":429,"ogUrl":451,"ogSiteName":452,"ogType":453,"canonicalUrls":451},"https://about.gitlab.com/blog/getting-started-with-gitlab-development-kit","https://about.gitlab.com","article","getting-started-with-gitlab-development-kit","en-us/blog/getting-started-with-gitlab-development-kit","BlogPost","9zohTooLEyvDAtiMWOOh4qB6cDCs-9zU4fr6Jj4n3eA",{"logo":459,"freeTrial":464,"sales":469,"login":474,"items":479,"search":806,"minimal":837,"duo":856,"switchNav":865,"pricingDeployment":876},{"config":460},{"href":461,"dataGaName":462,"dataGaLocation":463},"/","gitlab logo","header",{"text":465,"config":466},"Get free trial",{"href":467,"dataGaName":468,"dataGaLocation":463},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":470,"config":471},"Request a demo",{"href":472,"dataGaName":473,"dataGaLocation":463},"/sales/?contact-topic=request-demo","sales",{"text":475,"config":476},"Sign in",{"href":477,"dataGaName":478,"dataGaLocation":463},"https://gitlab.com/users/sign_in/","sign in",[480,509,609,614,728,784],{"text":481,"config":482,"menu":484},"Platform",{"dataNavLevelOne":483},"platform",{"type":485,"columns":486},"cards",[487,493,501],{"title":481,"description":488,"link":489},"The intelligent orchestration platform for DevSecOps",{"text":490,"config":491},"Explore our Platform",{"href":492,"dataGaName":483,"dataGaLocation":463},"/platform/",{"title":494,"description":495,"link":496},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":497,"config":498},"Meet GitLab Duo",{"href":499,"dataGaName":500,"dataGaLocation":463},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":502,"description":503,"link":504},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":505,"config":506},"Learn more",{"href":507,"dataGaName":508,"dataGaLocation":463},"/why-gitlab/","why gitlab",{"text":510,"left":448,"config":511,"menu":513},"Product",{"dataNavLevelOne":512},"solutions",{"type":514,"link":515,"columns":519,"feature":588},"lists",{"text":516,"config":517},"View all Solutions",{"href":518,"dataGaName":512,"dataGaLocation":463},"/solutions/",[520,544,567],{"title":521,"description":522,"link":523,"items":528},"Automation","CI/CD and automation to accelerate deployment",{"config":524},{"icon":525,"href":526,"dataGaName":527,"dataGaLocation":463},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[529,533,536,540],{"text":530,"config":531},"CI/CD",{"href":532,"dataGaLocation":463,"dataGaName":530},"/solutions/continuous-integration/",{"text":494,"config":534},{"href":499,"dataGaLocation":463,"dataGaName":535},"gitlab duo agent platform - product menu",{"text":537,"config":538},"Source Code Management",{"href":539,"dataGaLocation":463,"dataGaName":537},"/solutions/source-code-management/",{"text":541,"config":542},"Automated Software Delivery",{"href":526,"dataGaLocation":463,"dataGaName":543},"Automated software delivery",{"title":545,"description":546,"link":547,"items":552},"Security","Deliver code faster without compromising security",{"config":548},{"href":549,"dataGaName":550,"dataGaLocation":463,"icon":551},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[553,557,562],{"text":554,"config":555},"Application Security Testing",{"href":549,"dataGaName":556,"dataGaLocation":463},"Application security testing",{"text":558,"config":559},"Software Supply Chain Security",{"href":560,"dataGaLocation":463,"dataGaName":561},"/solutions/supply-chain/","Software supply chain security",{"text":563,"config":564},"Software Compliance",{"href":565,"dataGaName":566,"dataGaLocation":463},"/solutions/software-compliance/","software compliance",{"title":568,"link":569,"items":574},"Measurement",{"config":570},{"icon":571,"href":572,"dataGaName":573,"dataGaLocation":463},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[575,579,583],{"text":576,"config":577},"Visibility & Measurement",{"href":572,"dataGaLocation":463,"dataGaName":578},"Visibility and Measurement",{"text":580,"config":581},"Value Stream Management",{"href":582,"dataGaLocation":463,"dataGaName":580},"/solutions/value-stream-management/",{"text":584,"config":585},"Analytics & Insights",{"href":586,"dataGaLocation":463,"dataGaName":587},"/solutions/analytics-and-insights/","Analytics and insights",{"title":589,"type":514,"items":590},"GitLab for",[591,597,603],{"text":592,"config":593},"Enterprise",{"icon":594,"href":595,"dataGaLocation":463,"dataGaName":596},"Building","/enterprise/","enterprise",{"text":598,"config":599},"Small Business",{"icon":600,"href":601,"dataGaLocation":463,"dataGaName":602},"Work","/small-business/","small business",{"text":604,"config":605},"Public Sector",{"icon":606,"href":607,"dataGaLocation":463,"dataGaName":608},"Organization","/solutions/public-sector/","public sector",{"text":610,"config":611},"Pricing",{"href":612,"dataGaName":613,"dataGaLocation":463,"dataNavLevelOne":613},"/pricing/","pricing",{"text":615,"config":616,"menu":618},"Resources",{"dataNavLevelOne":617},"resources",{"type":514,"link":619,"columns":623,"feature":717},{"text":620,"config":621},"View all resources",{"href":622,"dataGaName":617,"dataGaLocation":463},"/resources/",[624,657,684],{"title":625,"items":626},"Getting started",[627,632,637,642,647,652],{"text":628,"config":629},"Install",{"href":630,"dataGaName":631,"dataGaLocation":463},"/install/","install",{"text":633,"config":634},"Quick start guides",{"href":635,"dataGaName":636,"dataGaLocation":463},"/get-started/","quick setup checklists",{"text":638,"config":639},"Learn",{"href":640,"dataGaLocation":463,"dataGaName":641},"https://university.gitlab.com/","learn",{"text":643,"config":644},"Product documentation",{"href":645,"dataGaName":646,"dataGaLocation":463},"https://docs.gitlab.com/","product documentation",{"text":648,"config":649},"Best practice videos",{"href":650,"dataGaName":651,"dataGaLocation":463},"/getting-started-videos/","best practice videos",{"text":653,"config":654},"Integrations",{"href":655,"dataGaName":656,"dataGaLocation":463},"/integrations/","integrations",{"title":658,"items":659},"Discover",[660,665,670,675,679],{"text":661,"config":662},"Customer success stories",{"href":663,"dataGaName":664,"dataGaLocation":463},"/customers/","customer success stories",{"text":666,"config":667},"Blog",{"href":668,"dataGaName":669,"dataGaLocation":463},"/blog/","blog",{"text":671,"config":672},"Demo Hub",{"href":673,"dataGaName":674,"dataGaLocation":463},"/demo-hub/","demo hub",{"text":676,"config":677},"The Source",{"href":678,"dataGaName":669,"dataGaLocation":463},"/the-source/",{"text":680,"config":681},"Remote",{"href":682,"dataGaName":683,"dataGaLocation":463},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":685,"items":686},"Connect",[687,692,697,702,707,712],{"text":688,"config":689},"GitLab Services",{"href":690,"dataGaName":691,"dataGaLocation":463},"/services/","services",{"text":693,"config":694},"Contribute",{"href":695,"dataGaName":696,"dataGaLocation":463},"https://contributors.gitlab.com","contribute",{"text":698,"config":699},"Community",{"href":700,"dataGaName":701,"dataGaLocation":463},"/community/","community",{"text":703,"config":704},"Forum",{"href":705,"dataGaName":706,"dataGaLocation":463},"https://forum.gitlab.com/","forum",{"text":708,"config":709},"Events",{"href":710,"dataGaName":711,"dataGaLocation":463},"/events/","events",{"text":713,"config":714},"Partners",{"href":715,"dataGaName":716,"dataGaLocation":463},"/partners/","partners",{"config":718,"title":721,"text":722,"link":723},{"background":719,"textColor":720},"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":724,"config":725},"Read the latest",{"href":726,"dataGaName":727,"dataGaLocation":463},"/whats-new/","whats new",{"text":729,"config":730,"menu":732},"Company",{"dataNavLevelOne":731},"company",{"type":514,"columns":733},[734],{"items":735},[736,741,747,749,754,759,764,769,774,779],{"text":737,"config":738},"About",{"href":739,"dataGaName":740,"dataGaLocation":463},"/company/","about",{"text":742,"config":743,"footerGa":746},"Jobs",{"href":744,"dataGaName":745,"dataGaLocation":463},"/jobs/","jobs",{"dataGaName":745},{"text":708,"config":748},{"href":710,"dataGaName":711,"dataGaLocation":463},{"text":750,"config":751},"Leadership",{"href":752,"dataGaName":753,"dataGaLocation":463},"/company/team/e-group/","leadership",{"text":755,"config":756},"Handbook",{"href":757,"dataGaName":758,"dataGaLocation":463},"https://handbook.gitlab.com/","handbook",{"text":760,"config":761},"Investor relations",{"href":762,"dataGaName":763,"dataGaLocation":463},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":765,"config":766},"Trust Center",{"href":767,"dataGaName":768,"dataGaLocation":463},"/security/","trust center",{"text":770,"config":771},"AI Transparency Center",{"href":772,"dataGaName":773,"dataGaLocation":463},"/ai-transparency-center/","ai transparency center",{"text":775,"config":776},"Newsletter",{"href":777,"dataGaName":778,"dataGaLocation":463},"/company/contact/#contact-forms","newsletter",{"text":780,"config":781},"Press",{"href":782,"dataGaName":783,"dataGaLocation":463},"/press/","press",{"text":785,"config":786,"menu":787},"Contact us",{"dataNavLevelOne":731},{"type":514,"columns":788},[789],{"items":790},[791,796,801],{"text":792,"config":793},"Talk to sales",{"href":794,"dataGaName":795,"dataGaLocation":463},"/sales/","talk to sales",{"text":797,"config":798},"Support portal",{"href":799,"dataGaName":800,"dataGaLocation":463},"https://support.gitlab.com/hc/en-us","support portal",{"text":802,"config":803},"Customer portal",{"href":804,"dataGaName":805,"dataGaLocation":463},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":807,"login":808,"suggestions":815},"Close",{"text":809,"link":810},"To search repositories and projects, login to",{"text":811,"config":812},"gitlab.com",{"href":477,"dataGaName":813,"dataGaLocation":814},"search login","search",{"text":816,"default":817},"Suggestions",[818,820,824,826,830,834],{"text":494,"config":819},{"href":499,"dataGaName":494,"dataGaLocation":814},{"text":821,"config":822},"Code Suggestions (AI)",{"href":823,"dataGaName":821,"dataGaLocation":814},"/solutions/code-suggestions/",{"text":530,"config":825},{"href":532,"dataGaName":530,"dataGaLocation":814},{"text":827,"config":828},"GitLab on AWS",{"href":829,"dataGaName":827,"dataGaLocation":814},"/partners/technology-partners/aws/",{"text":831,"config":832},"GitLab on Google Cloud",{"href":833,"dataGaName":831,"dataGaLocation":814},"/partners/technology-partners/google-cloud-platform/",{"text":835,"config":836},"Why GitLab?",{"href":507,"dataGaName":835,"dataGaLocation":814},{"freeTrial":838,"mobileIcon":843,"desktopIcon":848,"secondaryButton":851},{"text":839,"config":840},"Start free trial",{"href":841,"dataGaName":468,"dataGaLocation":842},"https://gitlab.com/-/trials/new/","nav",{"altText":844,"config":845},"Gitlab Icon",{"src":846,"dataGaName":847,"dataGaLocation":842},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":844,"config":849},{"src":850,"dataGaName":847,"dataGaLocation":842},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":852,"config":853},"Get Started",{"href":854,"dataGaName":855,"dataGaLocation":842},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":857,"mobileIcon":861,"desktopIcon":863},{"text":858,"config":859},"Learn more about GitLab Duo",{"href":499,"dataGaName":860,"dataGaLocation":842},"gitlab duo",{"altText":844,"config":862},{"src":846,"dataGaName":847,"dataGaLocation":842},{"altText":844,"config":864},{"src":850,"dataGaName":847,"dataGaLocation":842},{"button":866,"mobileIcon":871,"desktopIcon":873},{"text":867,"config":868},"/switch",{"href":869,"dataGaName":870,"dataGaLocation":842},"#contact","switch",{"altText":844,"config":872},{"src":846,"dataGaName":847,"dataGaLocation":842},{"altText":844,"config":874},{"src":875,"dataGaName":847,"dataGaLocation":842},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":877,"mobileIcon":882,"desktopIcon":884},{"text":878,"config":879},"Back to pricing",{"href":612,"dataGaName":880,"dataGaLocation":842,"icon":881},"back to pricing","GoBack",{"altText":844,"config":883},{"src":846,"dataGaName":847,"dataGaLocation":842},{"altText":844,"config":885},{"src":850,"dataGaName":847,"dataGaLocation":842},{"title":887,"titleMobile":888,"button":889,"config":894},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":505,"config":890},{"href":891,"dataGaName":892,"dataGaLocation":893},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":895,"disabled":428},"release",{"data":897},{"text":898,"source":899,"edit":905,"contribute":910,"config":915,"items":920,"minimal":1130},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":900,"config":901},"View page source",{"href":902,"dataGaName":903,"dataGaLocation":904},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":906,"config":907},"Edit this page",{"href":908,"dataGaName":909,"dataGaLocation":904},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":911,"config":912},"Please contribute",{"href":913,"dataGaName":914,"dataGaLocation":904},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":916,"facebook":917,"youtube":918,"linkedin":919},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[921,968,1022,1066,1098],{"title":610,"links":922,"subMenu":937},[923,927,932],{"text":924,"config":925},"View plans",{"href":612,"dataGaName":926,"dataGaLocation":904},"view plans",{"text":928,"config":929},"Why Premium?",{"href":930,"dataGaName":931,"dataGaLocation":904},"/pricing/premium/","why premium",{"text":933,"config":934},"Why Ultimate?",{"href":935,"dataGaName":936,"dataGaLocation":904},"/pricing/ultimate/","why ultimate",[938],{"title":939,"links":940},"Contact Us",[941,944,946,948,953,958,963],{"text":942,"config":943},"Contact sales",{"href":794,"dataGaName":473,"dataGaLocation":904},{"text":797,"config":945},{"href":799,"dataGaName":800,"dataGaLocation":904},{"text":802,"config":947},{"href":804,"dataGaName":805,"dataGaLocation":904},{"text":949,"config":950},"Status",{"href":951,"dataGaName":952,"dataGaLocation":904},"https://status.gitlab.com/","status",{"text":954,"config":955},"Terms of use",{"href":956,"dataGaName":957,"dataGaLocation":904},"/terms/","terms of use",{"text":959,"config":960},"Privacy statement",{"href":961,"dataGaName":962,"dataGaLocation":904},"/privacy/","privacy statement",{"text":964,"config":965},"Cookie preferences",{"dataGaName":966,"dataGaLocation":904,"id":967,"isOneTrustButton":448},"cookie preferences","ot-sdk-btn",{"title":510,"links":969,"subMenu":978},[970,974],{"text":971,"config":972},"DevSecOps platform",{"href":492,"dataGaName":973,"dataGaLocation":904},"devsecops platform",{"text":975,"config":976},"AI-Assisted Development",{"href":499,"dataGaName":977,"dataGaLocation":904},"ai-assisted development",[979],{"title":980,"links":981},"Topics",[982,987,992,997,1002,1007,1012,1017],{"text":983,"config":984},"CICD",{"href":985,"dataGaName":986,"dataGaLocation":904},"/topics/ci-cd/","cicd",{"text":988,"config":989},"GitOps",{"href":990,"dataGaName":991,"dataGaLocation":904},"/topics/gitops/","gitops",{"text":993,"config":994},"DevOps",{"href":995,"dataGaName":996,"dataGaLocation":904},"/topics/devops/","devops",{"text":998,"config":999},"Version Control",{"href":1000,"dataGaName":1001,"dataGaLocation":904},"/topics/version-control/","version control",{"text":1003,"config":1004},"DevSecOps",{"href":1005,"dataGaName":1006,"dataGaLocation":904},"/topics/devsecops/","devsecops",{"text":1008,"config":1009},"Cloud Native",{"href":1010,"dataGaName":1011,"dataGaLocation":904},"/topics/cloud-native/","cloud native",{"text":1013,"config":1014},"AI for Coding",{"href":1015,"dataGaName":1016,"dataGaLocation":904},"/topics/devops/ai-for-coding/","ai for coding",{"text":1018,"config":1019},"Agentic AI",{"href":1020,"dataGaName":1021,"dataGaLocation":904},"/topics/agentic-ai/","agentic ai",{"title":1023,"links":1024},"Solutions",[1025,1027,1029,1034,1038,1041,1045,1048,1050,1053,1056,1061],{"text":554,"config":1026},{"href":549,"dataGaName":554,"dataGaLocation":904},{"text":543,"config":1028},{"href":526,"dataGaName":527,"dataGaLocation":904},{"text":1030,"config":1031},"Agile development",{"href":1032,"dataGaName":1033,"dataGaLocation":904},"/solutions/agile-delivery/","agile delivery",{"text":1035,"config":1036},"SCM",{"href":539,"dataGaName":1037,"dataGaLocation":904},"source code management",{"text":983,"config":1039},{"href":532,"dataGaName":1040,"dataGaLocation":904},"continuous integration & delivery",{"text":1042,"config":1043},"Value stream management",{"href":582,"dataGaName":1044,"dataGaLocation":904},"value stream management",{"text":988,"config":1046},{"href":1047,"dataGaName":991,"dataGaLocation":904},"/solutions/gitops/",{"text":592,"config":1049},{"href":595,"dataGaName":596,"dataGaLocation":904},{"text":1051,"config":1052},"Small business",{"href":601,"dataGaName":602,"dataGaLocation":904},{"text":1054,"config":1055},"Public sector",{"href":607,"dataGaName":608,"dataGaLocation":904},{"text":1057,"config":1058},"Education",{"href":1059,"dataGaName":1060,"dataGaLocation":904},"/solutions/education/","education",{"text":1062,"config":1063},"Financial services",{"href":1064,"dataGaName":1065,"dataGaLocation":904},"/solutions/finance/","financial services",{"title":615,"links":1067},[1068,1070,1072,1074,1077,1079,1082,1084,1086,1088,1090,1092,1094,1096],{"text":628,"config":1069},{"href":630,"dataGaName":631,"dataGaLocation":904},{"text":633,"config":1071},{"href":635,"dataGaName":636,"dataGaLocation":904},{"text":638,"config":1073},{"href":640,"dataGaName":641,"dataGaLocation":904},{"text":643,"config":1075},{"href":645,"dataGaName":1076,"dataGaLocation":904},"docs",{"text":666,"config":1078},{"href":668,"dataGaName":669,"dataGaLocation":904},{"text":1080,"config":1081},"What's new",{"href":726,"dataGaName":727,"dataGaLocation":904},{"text":661,"config":1083},{"href":663,"dataGaName":664,"dataGaLocation":904},{"text":680,"config":1085},{"href":682,"dataGaName":683,"dataGaLocation":904},{"text":688,"config":1087},{"href":690,"dataGaName":691,"dataGaLocation":904},{"text":693,"config":1089},{"href":695,"dataGaName":696,"dataGaLocation":904},{"text":698,"config":1091},{"href":700,"dataGaName":701,"dataGaLocation":904},{"text":703,"config":1093},{"href":705,"dataGaName":706,"dataGaLocation":904},{"text":708,"config":1095},{"href":710,"dataGaName":711,"dataGaLocation":904},{"text":713,"config":1097},{"href":715,"dataGaName":716,"dataGaLocation":904},{"title":729,"links":1099},[1100,1102,1104,1106,1108,1110,1114,1119,1121,1123,1125],{"text":737,"config":1101},{"href":739,"dataGaName":731,"dataGaLocation":904},{"text":742,"config":1103},{"href":744,"dataGaName":745,"dataGaLocation":904},{"text":750,"config":1105},{"href":752,"dataGaName":753,"dataGaLocation":904},{"text":755,"config":1107},{"href":757,"dataGaName":758,"dataGaLocation":904},{"text":760,"config":1109},{"href":762,"dataGaName":763,"dataGaLocation":904},{"text":1111,"config":1112},"Sustainability",{"href":1113,"dataGaName":1111,"dataGaLocation":904},"/sustainability/",{"text":1115,"config":1116},"Diversity, inclusion and belonging (DIB)",{"href":1117,"dataGaName":1118,"dataGaLocation":904},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":765,"config":1120},{"href":767,"dataGaName":768,"dataGaLocation":904},{"text":775,"config":1122},{"href":777,"dataGaName":778,"dataGaLocation":904},{"text":780,"config":1124},{"href":782,"dataGaName":783,"dataGaLocation":904},{"text":1126,"config":1127},"Modern Slavery Transparency Statement",{"href":1128,"dataGaName":1129,"dataGaLocation":904},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1131},[1132,1135,1138],{"text":1133,"config":1134},"Terms",{"href":956,"dataGaName":957,"dataGaLocation":904},{"text":1136,"config":1137},"Cookies",{"dataGaName":966,"dataGaLocation":904,"id":967,"isOneTrustButton":448},{"text":1139,"config":1140},"Privacy",{"href":961,"dataGaName":962,"dataGaLocation":904},[1142],{"id":1143,"title":7,"body":427,"config":1144,"content":1146,"description":427,"extension":1150,"meta":1151,"navigation":448,"path":1152,"seo":1153,"stem":1154,"__hash__":1155},"blogAuthors/en-us/blog/authors/drew-blessing.yml",{"template":1145},"BlogAuthor",{"name":7,"config":1147},{"headshot":1148,"ctfId":1149},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Drew-Blessing","yml",{},"/en-us/blog/authors/drew-blessing",{},"en-us/blog/authors/drew-blessing","aJqiXJcAS0OIQUBAm79ZUXyTlzHnUJxp8AFtIAOqJgo",[1157,1166,1174],{"title":1158,"description":1159,"heroImage":1160,"category":423,"date":1161,"authors":1162,"slug":1165,"externalUrl":427},"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",[1163,1164],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1167,"description":1168,"heroImage":1169,"category":423,"date":1170,"authors":1171,"slug":1173,"externalUrl":427},"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",[1172],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1175,"description":1176,"heroImage":1177,"category":423,"date":1178,"authors":1179,"slug":1181,"externalUrl":427},"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",[1180],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1183},[1184,1198,1210,1222],{"id":1185,"categories":1186,"header":1188,"text":1189,"button":1190,"image":1195},"ai-modernization",[1187],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1191,"config":1192},"Get your AI maturity score",{"href":1193,"dataGaName":1194,"dataGaLocation":669},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1196},{"src":1197},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1199,"categories":1200,"header":1202,"text":1189,"button":1203,"image":1207},"devops-modernization",[1201,1006],"product","Are you just managing tools or shipping innovation?",{"text":1204,"config":1205},"Get your DevOps maturity score",{"href":1206,"dataGaName":1194,"dataGaLocation":669},"/assessments/devops-modernization-assessment/",{"config":1208},{"src":1209},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1211,"categories":1212,"header":1214,"text":1189,"button":1215,"image":1219},"security-modernization",[1213],"security","Are you trading speed for security?",{"text":1216,"config":1217},"Get your security maturity score",{"href":1218,"dataGaName":1194,"dataGaLocation":669},"/assessments/security-modernization-assessment/",{"config":1220},{"src":1221},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1223,"paths":1224,"header":1227,"text":1228,"button":1229,"image":1234},"github-azure-migration",[1225,1226],"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":1230,"config":1231},"See how GitLab compares to GitHub",{"href":1232,"dataGaName":1233,"dataGaLocation":669},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1235},{"src":1209},{"header":1237,"blurb":1238,"button":1239,"secondaryButton":1244},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1240,"config":1241},"Get your free trial",{"href":1242,"dataGaName":468,"dataGaLocation":1243},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":942,"config":1245},{"href":794,"dataGaName":473,"dataGaLocation":1243},1786803768998]