[{"data":1,"prerenderedAt":1257},["ShallowReactive",2],{"/blog/implementing-gitlab-ci-dot-yml":3,"navigation-en-us":470,"banner-en-us":896,"footer-en-us":906,"blog-post-authors-en-us-Job van der Voort":1151,"blog-related-posts-en-us-implementing-gitlab-ci-dot-yml":1167,"blog-promotions-en-us":1193,"next-steps-en-us":1247},{"id":4,"title":5,"authors":6,"body":8,"category":445,"date":446,"description":447,"extension":448,"externalUrl":449,"faq":449,"featured":450,"heroImage":451,"meta":452,"navigation":156,"path":461,"seo":462,"slug":466,"stem":467,"tags":449,"template":468,"updatedDate":449,"__hash__":469},"blogPosts/en-us/blog/implementing-gitlab-ci-dot-yml.md","Implementing .gitlab-ci.yml",[7],"Job van der Voort",{"type":9,"value":10,"toc":437},"minimark",[11,25,35,40,43,53,57,60,63,69,72,78,84,94,100,103,106,422,426,433],[12,13,14,15,19,20,24],"p",{},"We ",[16,17,18],"span",{},"wrote"," about why we're replacing GitLab CI jobs with a ",[21,22,23],"code",{},".gitlab-ci.yml"," file.\nAs we've started on implementing this large change, we wanted to share the details\nof that process with you and would love to hear what you think.",[12,26,27,28,31,32,34],{},"To recap the ",[16,29,30],{},"previous article",":\ncurrently you are required to write out your CI jobs in GitLab CI's interface.\nWe're replacing this with a single file ",[21,33,23],{},", that you place in the root\nof your repository.",[36,37,39],"h2",{"id":38},"schema-change","Schema change",[12,41,42],{},"Currently, on a push to GitLab, GitLab sends a web-hook to the CI Coordinator.\nThe coordinator creates a build based on the jobs that are defined in its UI,\nwhich can then be executed by the connected Runners.",[12,44,45,46,52],{},"In the new schema, GitLab sends the web-hook ",[47,48,49,50],"em",{},"and the ",[21,51,23],{}," contents\nto the CI Coordinator, which creates builds based on the yml file. In turn,\nthese builds are executed by the Runners as before.",[36,54,56],{"id":55},"migrating-to-new-style","Migrating to new style",[12,58,59],{},"Keeping two different ways of doing things would be a strain on development and\nsupport, not to mention confusing. So we're not just deprecating the old style\nof defining jobs, we're removing it entirely and will migrate existing jobs.",[12,61,62],{},"Upon upgrading your existing jobs defined in the GitLab CI Coordinator will be\nconverted into a YAML file with the new syntax. You can download this file at any\ntime from the project settings.",[12,64,65,66,68],{},"When the GitLab webhook triggers and doesn't transmit the content from ",[21,67,23],{},",\nthe coordinator will use the converted YAML file instead.",[12,70,71],{},"This makes migrating to the new style very easy. You can start by simply copy-pasting\nthe contents of the converted YAML file to the root of your repository. Existing projects\nwill continue to build successfully, yet new projects do not have the option to\nuse anything else.",[36,73,75,76],{"id":74},"an-example-gitlab-ciyml","An example ",[21,77,23],{},[12,79,80,81,83],{},"To get an idea of how the ",[21,82,23],{}," will look, we've prepared an example\nfor a Ruby on Rails project (such as GitLab itself). Of course, this is due to\nchange as we're still working on this.",[85,86,92],"pre",{"className":87,"code":89,"language":90,"meta":91},[88],"language-text","# Refs to skip\nskip_refs: “deploy*”\n\n# Run before each script\n\n# Refs to skip\nskip_refs: “deploy*”\n\n# Run before each script\nbefore_script:\n  - export PATH=$HOME/bin:/usr/local/bin:/usr/bin:/bin\n  - gem install bundler\n  - cp config/database.yml.mysql config/database.yml\n  - cp config/gitlab.yml.example config/gitlab.yml\n  - touch log/application.log\n  - touch log/test.log\n  - bundle install --without postgres production --jobs $(nproc)\n  - “bundle exec rake db:create RAILS_ENV=test”\n\n# Parallel jobs, each line is a parallel build\njobs:\n  - script: “rake spec”\n    runner: “ruby,postgres”\n    name: “Rspec”\n  - script: “rake spinach”\n    runner: “ruby,mysql”\n    name: “Spinach”\n    tags: true\n    branches: false\n\n# Parallel deploy jobs\non_success:\n  - “cap deploy production”\n  - “cap deploy staging”\n\n","text","",[21,93,89],{"__ignoreMap":91},[12,95,96],{},[97,98],"a",{"id":99},"update",[36,101,102],{"id":99},"UPDATE",[12,104,105],{},"Dmitriy and Sytse spend some time thinking about file syntax.\nScripting should be simple and memorable. Thats why we come with better proposal:",[85,107,111],{"className":108,"code":109,"language":110,"meta":91,"style":91},"language-yaml shiki shiki-themes github-light","before_script:\n  - gem install bundler\n  - bundle install\n  - bundle exec rake db:create\n\nrspec:\n  test: \"rake spec\"\n  tags:\n    - ruby\n    - postgres\n  only:\n    - branches\n\nspinach:\n  test: \"rake spinach\"\n  tags:\n    - ruby\n    - mysql\n  except:\n    - tags\n\nstaging:\n  deploy: \"cap deploy stating\"\n  tags:\n    - capistrano\n    - debian\n  except:\n    - stable\n\nproduction:\n  deploy:\n    - cap deploy production\n    - cap notify\n  tags:\n    - capistrano\n    - debian\n  only:\n    - master\n    - /^deploy-.*$/\n\n","yaml",[21,112,113,125,135,143,151,158,166,178,186,195,203,211,219,224,232,242,249,256,264,272,280,285,293,304,311,319,327,334,342,347,355,362,370,378,385,392,399,406,414],{"__ignoreMap":91},[16,114,117,121],{"class":115,"line":116},"line",1,[16,118,120],{"class":119},"shJU0","before_script",[16,122,124],{"class":123},"sgsFI",":\n",[16,126,128,131],{"class":115,"line":127},2,[16,129,130],{"class":123},"  - ",[16,132,134],{"class":133},"sYBdl","gem install bundler\n",[16,136,138,140],{"class":115,"line":137},3,[16,139,130],{"class":123},[16,141,142],{"class":133},"bundle install\n",[16,144,146,148],{"class":115,"line":145},4,[16,147,130],{"class":123},[16,149,150],{"class":133},"bundle exec rake db:create\n",[16,152,154],{"class":115,"line":153},5,[16,155,157],{"emptyLinePlaceholder":156},true,"\n",[16,159,161,164],{"class":115,"line":160},6,[16,162,163],{"class":119},"rspec",[16,165,124],{"class":123},[16,167,169,172,175],{"class":115,"line":168},7,[16,170,171],{"class":119},"  test",[16,173,174],{"class":123},": ",[16,176,177],{"class":133},"\"rake spec\"\n",[16,179,181,184],{"class":115,"line":180},8,[16,182,183],{"class":119},"  tags",[16,185,124],{"class":123},[16,187,189,192],{"class":115,"line":188},9,[16,190,191],{"class":123},"    - ",[16,193,194],{"class":133},"ruby\n",[16,196,198,200],{"class":115,"line":197},10,[16,199,191],{"class":123},[16,201,202],{"class":133},"postgres\n",[16,204,206,209],{"class":115,"line":205},11,[16,207,208],{"class":119},"  only",[16,210,124],{"class":123},[16,212,214,216],{"class":115,"line":213},12,[16,215,191],{"class":123},[16,217,218],{"class":133},"branches\n",[16,220,222],{"class":115,"line":221},13,[16,223,157],{"emptyLinePlaceholder":156},[16,225,227,230],{"class":115,"line":226},14,[16,228,229],{"class":119},"spinach",[16,231,124],{"class":123},[16,233,235,237,239],{"class":115,"line":234},15,[16,236,171],{"class":119},[16,238,174],{"class":123},[16,240,241],{"class":133},"\"rake spinach\"\n",[16,243,245,247],{"class":115,"line":244},16,[16,246,183],{"class":119},[16,248,124],{"class":123},[16,250,252,254],{"class":115,"line":251},17,[16,253,191],{"class":123},[16,255,194],{"class":133},[16,257,259,261],{"class":115,"line":258},18,[16,260,191],{"class":123},[16,262,263],{"class":133},"mysql\n",[16,265,267,270],{"class":115,"line":266},19,[16,268,269],{"class":119},"  except",[16,271,124],{"class":123},[16,273,275,277],{"class":115,"line":274},20,[16,276,191],{"class":123},[16,278,279],{"class":133},"tags\n",[16,281,283],{"class":115,"line":282},21,[16,284,157],{"emptyLinePlaceholder":156},[16,286,288,291],{"class":115,"line":287},22,[16,289,290],{"class":119},"staging",[16,292,124],{"class":123},[16,294,296,299,301],{"class":115,"line":295},23,[16,297,298],{"class":119},"  deploy",[16,300,174],{"class":123},[16,302,303],{"class":133},"\"cap deploy stating\"\n",[16,305,307,309],{"class":115,"line":306},24,[16,308,183],{"class":119},[16,310,124],{"class":123},[16,312,314,316],{"class":115,"line":313},25,[16,315,191],{"class":123},[16,317,318],{"class":133},"capistrano\n",[16,320,322,324],{"class":115,"line":321},26,[16,323,191],{"class":123},[16,325,326],{"class":133},"debian\n",[16,328,330,332],{"class":115,"line":329},27,[16,331,269],{"class":119},[16,333,124],{"class":123},[16,335,337,339],{"class":115,"line":336},28,[16,338,191],{"class":123},[16,340,341],{"class":133},"stable\n",[16,343,345],{"class":115,"line":344},29,[16,346,157],{"emptyLinePlaceholder":156},[16,348,350,353],{"class":115,"line":349},30,[16,351,352],{"class":119},"production",[16,354,124],{"class":123},[16,356,358,360],{"class":115,"line":357},31,[16,359,298],{"class":119},[16,361,124],{"class":123},[16,363,365,367],{"class":115,"line":364},32,[16,366,191],{"class":123},[16,368,369],{"class":133},"cap deploy production\n",[16,371,373,375],{"class":115,"line":372},33,[16,374,191],{"class":123},[16,376,377],{"class":133},"cap notify\n",[16,379,381,383],{"class":115,"line":380},34,[16,382,183],{"class":119},[16,384,124],{"class":123},[16,386,388,390],{"class":115,"line":387},35,[16,389,191],{"class":123},[16,391,318],{"class":133},[16,393,395,397],{"class":115,"line":394},36,[16,396,191],{"class":123},[16,398,326],{"class":133},[16,400,402,404],{"class":115,"line":401},37,[16,403,208],{"class":119},[16,405,124],{"class":123},[16,407,409,411],{"class":115,"line":408},38,[16,410,191],{"class":123},[16,412,413],{"class":133},"master\n",[16,415,417,419],{"class":115,"line":416},39,[16,418,191],{"class":123},[16,420,421],{"class":133},"/^deploy-.*$/\n",[36,423,425],{"id":424},"contribute","Contribute",[12,427,428,429,432],{},"GitLab is nothing without its community.\nContribute or follow the development in the ",[16,430,431],{},"GitLab CI repository",".",[434,435,436],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":91,"searchDepth":127,"depth":127,"links":438},[439,440,441,443,444],{"id":38,"depth":127,"text":39},{"id":55,"depth":127,"text":56},{"id":74,"depth":127,"text":442},"An example .gitlab-ci.yml",{"id":99,"depth":127,"text":102},{"id":424,"depth":127,"text":425},"engineering","2015-06-08","We replacing GitLab CI jobs with a .gitlab-ci.yml and wanted to share the details of that process with you and would love to hear what you think.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663397/Blog/Hero%20Images/logoforblogpost.jpg",{"excerpt":453},{"type":9,"value":454},[455],[12,456,14,457,19,459,24],{},[16,458,18],{},[21,460,23],{},"/en-us/blog/implementing-gitlab-ci-dot-yml",{"title":5,"description":447,"ogTitle":5,"ogDescription":447,"noIndex":450,"ogImage":451,"ogUrl":463,"ogSiteName":464,"ogType":465,"canonicalUrls":463},"https://about.gitlab.com/blog/implementing-gitlab-ci-dot-yml","https://about.gitlab.com","article","implementing-gitlab-ci-dot-yml","en-us/blog/implementing-gitlab-ci-dot-yml","BlogPost","yt6mOUDOOixjcF1O1urQ7NKhcPX3FfNAITK4QxsJ6ZY",{"logo":471,"freeTrial":476,"sales":481,"login":486,"items":491,"search":816,"minimal":847,"duo":866,"switchNav":875,"pricingDeployment":886},{"config":472},{"href":473,"dataGaName":474,"dataGaLocation":475},"/","gitlab logo","header",{"text":477,"config":478},"Get free trial",{"href":479,"dataGaName":480,"dataGaLocation":475},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":482,"config":483},"Request a demo",{"href":484,"dataGaName":485,"dataGaLocation":475},"/sales/?contact-topic=request-demo","sales",{"text":487,"config":488},"Sign in",{"href":489,"dataGaName":490,"dataGaLocation":475},"https://gitlab.com/users/sign_in/","sign in",[492,521,621,626,738,794],{"text":493,"config":494,"menu":496},"Platform",{"dataNavLevelOne":495},"platform",{"type":497,"columns":498},"cards",[499,505,513],{"title":493,"description":500,"link":501},"The intelligent orchestration platform for DevSecOps",{"text":502,"config":503},"Explore our Platform",{"href":504,"dataGaName":495,"dataGaLocation":475},"/platform/",{"title":506,"description":507,"link":508},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":509,"config":510},"Meet GitLab Duo",{"href":511,"dataGaName":512,"dataGaLocation":475},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":514,"description":515,"link":516},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":517,"config":518},"Learn more",{"href":519,"dataGaName":520,"dataGaLocation":475},"/why-gitlab/","why gitlab",{"text":522,"left":156,"config":523,"menu":525},"Product",{"dataNavLevelOne":524},"solutions",{"type":526,"link":527,"columns":531,"feature":600},"lists",{"text":528,"config":529},"View all Solutions",{"href":530,"dataGaName":524,"dataGaLocation":475},"/solutions/",[532,556,579],{"title":533,"description":534,"link":535,"items":540},"Automation","CI/CD and automation to accelerate deployment",{"config":536},{"icon":537,"href":538,"dataGaName":539,"dataGaLocation":475},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[541,545,548,552],{"text":542,"config":543},"CI/CD",{"href":544,"dataGaLocation":475,"dataGaName":542},"/solutions/continuous-integration/",{"text":506,"config":546},{"href":511,"dataGaLocation":475,"dataGaName":547},"gitlab duo agent platform - product menu",{"text":549,"config":550},"Source Code Management",{"href":551,"dataGaLocation":475,"dataGaName":549},"/solutions/source-code-management/",{"text":553,"config":554},"Automated Software Delivery",{"href":538,"dataGaLocation":475,"dataGaName":555},"Automated software delivery",{"title":557,"description":558,"link":559,"items":564},"Security","Deliver code faster without compromising security",{"config":560},{"href":561,"dataGaName":562,"dataGaLocation":475,"icon":563},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[565,569,574],{"text":566,"config":567},"Application Security Testing",{"href":561,"dataGaName":568,"dataGaLocation":475},"Application security testing",{"text":570,"config":571},"Software Supply Chain Security",{"href":572,"dataGaLocation":475,"dataGaName":573},"/solutions/supply-chain/","Software supply chain security",{"text":575,"config":576},"Software Compliance",{"href":577,"dataGaName":578,"dataGaLocation":475},"/solutions/software-compliance/","software compliance",{"title":580,"link":581,"items":586},"Measurement",{"config":582},{"icon":583,"href":584,"dataGaName":585,"dataGaLocation":475},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[587,591,595],{"text":588,"config":589},"Visibility & Measurement",{"href":584,"dataGaLocation":475,"dataGaName":590},"Visibility and Measurement",{"text":592,"config":593},"Value Stream Management",{"href":594,"dataGaLocation":475,"dataGaName":592},"/solutions/value-stream-management/",{"text":596,"config":597},"Analytics & Insights",{"href":598,"dataGaLocation":475,"dataGaName":599},"/solutions/analytics-and-insights/","Analytics and insights",{"title":601,"type":526,"items":602},"GitLab for",[603,609,615],{"text":604,"config":605},"Enterprise",{"icon":606,"href":607,"dataGaLocation":475,"dataGaName":608},"Building","/enterprise/","enterprise",{"text":610,"config":611},"Small Business",{"icon":612,"href":613,"dataGaLocation":475,"dataGaName":614},"Work","/small-business/","small business",{"text":616,"config":617},"Public Sector",{"icon":618,"href":619,"dataGaLocation":475,"dataGaName":620},"Organization","/solutions/public-sector/","public sector",{"text":622,"config":623},"Pricing",{"href":624,"dataGaName":625,"dataGaLocation":475,"dataNavLevelOne":625},"/pricing/","pricing",{"text":627,"config":628,"menu":630},"Resources",{"dataNavLevelOne":629},"resources",{"type":526,"link":631,"columns":635,"feature":727},{"text":632,"config":633},"View all resources",{"href":634,"dataGaName":629,"dataGaLocation":475},"/resources/",[636,669,696],{"title":637,"items":638},"Getting started",[639,644,649,654,659,664],{"text":640,"config":641},"Install",{"href":642,"dataGaName":643,"dataGaLocation":475},"/install/","install",{"text":645,"config":646},"Quick start guides",{"href":647,"dataGaName":648,"dataGaLocation":475},"/get-started/","quick setup checklists",{"text":650,"config":651},"Learn",{"href":652,"dataGaLocation":475,"dataGaName":653},"https://university.gitlab.com/","learn",{"text":655,"config":656},"Product documentation",{"href":657,"dataGaName":658,"dataGaLocation":475},"https://docs.gitlab.com/","product documentation",{"text":660,"config":661},"Best practice videos",{"href":662,"dataGaName":663,"dataGaLocation":475},"/getting-started-videos/","best practice videos",{"text":665,"config":666},"Integrations",{"href":667,"dataGaName":668,"dataGaLocation":475},"/integrations/","integrations",{"title":670,"items":671},"Discover",[672,677,682,687,691],{"text":673,"config":674},"Customer success stories",{"href":675,"dataGaName":676,"dataGaLocation":475},"/customers/","customer success stories",{"text":678,"config":679},"Blog",{"href":680,"dataGaName":681,"dataGaLocation":475},"/blog/","blog",{"text":683,"config":684},"Demo Hub",{"href":685,"dataGaName":686,"dataGaLocation":475},"/demo-hub/","demo hub",{"text":688,"config":689},"The Source",{"href":690,"dataGaName":681,"dataGaLocation":475},"/the-source/",{"text":692,"config":693},"Remote",{"href":694,"dataGaName":695,"dataGaLocation":475},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":697,"items":698},"Connect",[699,704,707,712,717,722],{"text":700,"config":701},"GitLab Services",{"href":702,"dataGaName":703,"dataGaLocation":475},"/services/","services",{"text":425,"config":705},{"href":706,"dataGaName":424,"dataGaLocation":475},"https://contributors.gitlab.com",{"text":708,"config":709},"Community",{"href":710,"dataGaName":711,"dataGaLocation":475},"/community/","community",{"text":713,"config":714},"Forum",{"href":715,"dataGaName":716,"dataGaLocation":475},"https://forum.gitlab.com/","forum",{"text":718,"config":719},"Events",{"href":720,"dataGaName":721,"dataGaLocation":475},"/events/","events",{"text":723,"config":724},"Partners",{"href":725,"dataGaName":726,"dataGaLocation":475},"/partners/","partners",{"config":728,"title":731,"text":732,"link":733},{"background":729,"textColor":730},"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":734,"config":735},"Read the latest",{"href":736,"dataGaName":737,"dataGaLocation":475},"/whats-new/","whats new",{"text":739,"config":740,"menu":742},"Company",{"dataNavLevelOne":741},"company",{"type":526,"columns":743},[744],{"items":745},[746,751,757,759,764,769,774,779,784,789],{"text":747,"config":748},"About",{"href":749,"dataGaName":750,"dataGaLocation":475},"/company/","about",{"text":752,"config":753,"footerGa":756},"Jobs",{"href":754,"dataGaName":755,"dataGaLocation":475},"/jobs/","jobs",{"dataGaName":755},{"text":718,"config":758},{"href":720,"dataGaName":721,"dataGaLocation":475},{"text":760,"config":761},"Leadership",{"href":762,"dataGaName":763,"dataGaLocation":475},"/company/team/e-group/","leadership",{"text":765,"config":766},"Handbook",{"href":767,"dataGaName":768,"dataGaLocation":475},"https://handbook.gitlab.com/","handbook",{"text":770,"config":771},"Investor relations",{"href":772,"dataGaName":773,"dataGaLocation":475},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":775,"config":776},"Trust Center",{"href":777,"dataGaName":778,"dataGaLocation":475},"/security/","trust center",{"text":780,"config":781},"AI Transparency Center",{"href":782,"dataGaName":783,"dataGaLocation":475},"/ai-transparency-center/","ai transparency center",{"text":785,"config":786},"Newsletter",{"href":787,"dataGaName":788,"dataGaLocation":475},"/company/contact/#contact-forms","newsletter",{"text":790,"config":791},"Press",{"href":792,"dataGaName":793,"dataGaLocation":475},"/press/","press",{"text":795,"config":796,"menu":797},"Contact us",{"dataNavLevelOne":741},{"type":526,"columns":798},[799],{"items":800},[801,806,811],{"text":802,"config":803},"Talk to sales",{"href":804,"dataGaName":805,"dataGaLocation":475},"/sales/","talk to sales",{"text":807,"config":808},"Support portal",{"href":809,"dataGaName":810,"dataGaLocation":475},"https://support.gitlab.com/hc/en-us","support portal",{"text":812,"config":813},"Customer portal",{"href":814,"dataGaName":815,"dataGaLocation":475},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":817,"login":818,"suggestions":825},"Close",{"text":819,"link":820},"To search repositories and projects, login to",{"text":821,"config":822},"gitlab.com",{"href":489,"dataGaName":823,"dataGaLocation":824},"search login","search",{"text":826,"default":827},"Suggestions",[828,830,834,836,840,844],{"text":506,"config":829},{"href":511,"dataGaName":506,"dataGaLocation":824},{"text":831,"config":832},"Code Suggestions (AI)",{"href":833,"dataGaName":831,"dataGaLocation":824},"/solutions/code-suggestions/",{"text":542,"config":835},{"href":544,"dataGaName":542,"dataGaLocation":824},{"text":837,"config":838},"GitLab on AWS",{"href":839,"dataGaName":837,"dataGaLocation":824},"/partners/technology-partners/aws/",{"text":841,"config":842},"GitLab on Google Cloud",{"href":843,"dataGaName":841,"dataGaLocation":824},"/partners/technology-partners/google-cloud-platform/",{"text":845,"config":846},"Why GitLab?",{"href":519,"dataGaName":845,"dataGaLocation":824},{"freeTrial":848,"mobileIcon":853,"desktopIcon":858,"secondaryButton":861},{"text":849,"config":850},"Start free trial",{"href":851,"dataGaName":480,"dataGaLocation":852},"https://gitlab.com/-/trials/new/","nav",{"altText":854,"config":855},"Gitlab Icon",{"src":856,"dataGaName":857,"dataGaLocation":852},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":854,"config":859},{"src":860,"dataGaName":857,"dataGaLocation":852},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":862,"config":863},"Get Started",{"href":864,"dataGaName":865,"dataGaLocation":852},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":867,"mobileIcon":871,"desktopIcon":873},{"text":868,"config":869},"Learn more about GitLab Duo",{"href":511,"dataGaName":870,"dataGaLocation":852},"gitlab duo",{"altText":854,"config":872},{"src":856,"dataGaName":857,"dataGaLocation":852},{"altText":854,"config":874},{"src":860,"dataGaName":857,"dataGaLocation":852},{"button":876,"mobileIcon":881,"desktopIcon":883},{"text":877,"config":878},"/switch",{"href":879,"dataGaName":880,"dataGaLocation":852},"#contact","switch",{"altText":854,"config":882},{"src":856,"dataGaName":857,"dataGaLocation":852},{"altText":854,"config":884},{"src":885,"dataGaName":857,"dataGaLocation":852},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":887,"mobileIcon":892,"desktopIcon":894},{"text":888,"config":889},"Back to pricing",{"href":624,"dataGaName":890,"dataGaLocation":852,"icon":891},"back to pricing","GoBack",{"altText":854,"config":893},{"src":856,"dataGaName":857,"dataGaLocation":852},{"altText":854,"config":895},{"src":860,"dataGaName":857,"dataGaLocation":852},{"title":897,"titleMobile":898,"button":899,"config":904},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":517,"config":900},{"href":901,"dataGaName":902,"dataGaLocation":903},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":905,"disabled":450},"release",{"data":907},{"text":908,"source":909,"edit":915,"contribute":920,"config":925,"items":930,"minimal":1140},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":910,"config":911},"View page source",{"href":912,"dataGaName":913,"dataGaLocation":914},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":916,"config":917},"Edit this page",{"href":918,"dataGaName":919,"dataGaLocation":914},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":921,"config":922},"Please contribute",{"href":923,"dataGaName":924,"dataGaLocation":914},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":926,"facebook":927,"youtube":928,"linkedin":929},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[931,978,1032,1076,1108],{"title":622,"links":932,"subMenu":947},[933,937,942],{"text":934,"config":935},"View plans",{"href":624,"dataGaName":936,"dataGaLocation":914},"view plans",{"text":938,"config":939},"Why Premium?",{"href":940,"dataGaName":941,"dataGaLocation":914},"/pricing/premium/","why premium",{"text":943,"config":944},"Why Ultimate?",{"href":945,"dataGaName":946,"dataGaLocation":914},"/pricing/ultimate/","why ultimate",[948],{"title":949,"links":950},"Contact Us",[951,954,956,958,963,968,973],{"text":952,"config":953},"Contact sales",{"href":804,"dataGaName":485,"dataGaLocation":914},{"text":807,"config":955},{"href":809,"dataGaName":810,"dataGaLocation":914},{"text":812,"config":957},{"href":814,"dataGaName":815,"dataGaLocation":914},{"text":959,"config":960},"Status",{"href":961,"dataGaName":962,"dataGaLocation":914},"https://status.gitlab.com/","status",{"text":964,"config":965},"Terms of use",{"href":966,"dataGaName":967,"dataGaLocation":914},"/terms/","terms of use",{"text":969,"config":970},"Privacy statement",{"href":971,"dataGaName":972,"dataGaLocation":914},"/privacy/","privacy statement",{"text":974,"config":975},"Cookie preferences",{"dataGaName":976,"dataGaLocation":914,"id":977,"isOneTrustButton":156},"cookie preferences","ot-sdk-btn",{"title":522,"links":979,"subMenu":988},[980,984],{"text":981,"config":982},"DevSecOps platform",{"href":504,"dataGaName":983,"dataGaLocation":914},"devsecops platform",{"text":985,"config":986},"AI-Assisted Development",{"href":511,"dataGaName":987,"dataGaLocation":914},"ai-assisted development",[989],{"title":990,"links":991},"Topics",[992,997,1002,1007,1012,1017,1022,1027],{"text":993,"config":994},"CICD",{"href":995,"dataGaName":996,"dataGaLocation":914},"/topics/ci-cd/","cicd",{"text":998,"config":999},"GitOps",{"href":1000,"dataGaName":1001,"dataGaLocation":914},"/topics/gitops/","gitops",{"text":1003,"config":1004},"DevOps",{"href":1005,"dataGaName":1006,"dataGaLocation":914},"/topics/devops/","devops",{"text":1008,"config":1009},"Version Control",{"href":1010,"dataGaName":1011,"dataGaLocation":914},"/topics/version-control/","version control",{"text":1013,"config":1014},"DevSecOps",{"href":1015,"dataGaName":1016,"dataGaLocation":914},"/topics/devsecops/","devsecops",{"text":1018,"config":1019},"Cloud Native",{"href":1020,"dataGaName":1021,"dataGaLocation":914},"/topics/cloud-native/","cloud native",{"text":1023,"config":1024},"AI for Coding",{"href":1025,"dataGaName":1026,"dataGaLocation":914},"/topics/devops/ai-for-coding/","ai for coding",{"text":1028,"config":1029},"Agentic AI",{"href":1030,"dataGaName":1031,"dataGaLocation":914},"/topics/agentic-ai/","agentic ai",{"title":1033,"links":1034},"Solutions",[1035,1037,1039,1044,1048,1051,1055,1058,1060,1063,1066,1071],{"text":566,"config":1036},{"href":561,"dataGaName":566,"dataGaLocation":914},{"text":555,"config":1038},{"href":538,"dataGaName":539,"dataGaLocation":914},{"text":1040,"config":1041},"Agile development",{"href":1042,"dataGaName":1043,"dataGaLocation":914},"/solutions/agile-delivery/","agile delivery",{"text":1045,"config":1046},"SCM",{"href":551,"dataGaName":1047,"dataGaLocation":914},"source code management",{"text":993,"config":1049},{"href":544,"dataGaName":1050,"dataGaLocation":914},"continuous integration & delivery",{"text":1052,"config":1053},"Value stream management",{"href":594,"dataGaName":1054,"dataGaLocation":914},"value stream management",{"text":998,"config":1056},{"href":1057,"dataGaName":1001,"dataGaLocation":914},"/solutions/gitops/",{"text":604,"config":1059},{"href":607,"dataGaName":608,"dataGaLocation":914},{"text":1061,"config":1062},"Small business",{"href":613,"dataGaName":614,"dataGaLocation":914},{"text":1064,"config":1065},"Public sector",{"href":619,"dataGaName":620,"dataGaLocation":914},{"text":1067,"config":1068},"Education",{"href":1069,"dataGaName":1070,"dataGaLocation":914},"/solutions/education/","education",{"text":1072,"config":1073},"Financial services",{"href":1074,"dataGaName":1075,"dataGaLocation":914},"/solutions/finance/","financial services",{"title":627,"links":1077},[1078,1080,1082,1084,1087,1089,1092,1094,1096,1098,1100,1102,1104,1106],{"text":640,"config":1079},{"href":642,"dataGaName":643,"dataGaLocation":914},{"text":645,"config":1081},{"href":647,"dataGaName":648,"dataGaLocation":914},{"text":650,"config":1083},{"href":652,"dataGaName":653,"dataGaLocation":914},{"text":655,"config":1085},{"href":657,"dataGaName":1086,"dataGaLocation":914},"docs",{"text":678,"config":1088},{"href":680,"dataGaName":681,"dataGaLocation":914},{"text":1090,"config":1091},"What's new",{"href":736,"dataGaName":737,"dataGaLocation":914},{"text":673,"config":1093},{"href":675,"dataGaName":676,"dataGaLocation":914},{"text":692,"config":1095},{"href":694,"dataGaName":695,"dataGaLocation":914},{"text":700,"config":1097},{"href":702,"dataGaName":703,"dataGaLocation":914},{"text":425,"config":1099},{"href":706,"dataGaName":424,"dataGaLocation":914},{"text":708,"config":1101},{"href":710,"dataGaName":711,"dataGaLocation":914},{"text":713,"config":1103},{"href":715,"dataGaName":716,"dataGaLocation":914},{"text":718,"config":1105},{"href":720,"dataGaName":721,"dataGaLocation":914},{"text":723,"config":1107},{"href":725,"dataGaName":726,"dataGaLocation":914},{"title":739,"links":1109},[1110,1112,1114,1116,1118,1120,1124,1129,1131,1133,1135],{"text":747,"config":1111},{"href":749,"dataGaName":741,"dataGaLocation":914},{"text":752,"config":1113},{"href":754,"dataGaName":755,"dataGaLocation":914},{"text":760,"config":1115},{"href":762,"dataGaName":763,"dataGaLocation":914},{"text":765,"config":1117},{"href":767,"dataGaName":768,"dataGaLocation":914},{"text":770,"config":1119},{"href":772,"dataGaName":773,"dataGaLocation":914},{"text":1121,"config":1122},"Sustainability",{"href":1123,"dataGaName":1121,"dataGaLocation":914},"/sustainability/",{"text":1125,"config":1126},"Diversity, inclusion and belonging (DIB)",{"href":1127,"dataGaName":1128,"dataGaLocation":914},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":775,"config":1130},{"href":777,"dataGaName":778,"dataGaLocation":914},{"text":785,"config":1132},{"href":787,"dataGaName":788,"dataGaLocation":914},{"text":790,"config":1134},{"href":792,"dataGaName":793,"dataGaLocation":914},{"text":1136,"config":1137},"Modern Slavery Transparency Statement",{"href":1138,"dataGaName":1139,"dataGaLocation":914},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1141},[1142,1145,1148],{"text":1143,"config":1144},"Terms",{"href":966,"dataGaName":967,"dataGaLocation":914},{"text":1146,"config":1147},"Cookies",{"dataGaName":976,"dataGaLocation":914,"id":977,"isOneTrustButton":156},{"text":1149,"config":1150},"Privacy",{"href":971,"dataGaName":972,"dataGaLocation":914},[1152],{"id":1153,"title":1154,"body":449,"config":1155,"content":1157,"description":449,"extension":1161,"meta":1162,"navigation":156,"path":1163,"seo":1164,"stem":1165,"__hash__":1166},"blogAuthors/en-us/blog/authors/job-van-der-voort.yml","Job Van Der Voort",{"template":1156},"BlogAuthor",{"name":7,"config":1158},{"headshot":1159,"ctfId":1160},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Job-van-der-Voort","yml",{},"/en-us/blog/authors/job-van-der-voort",{},"en-us/blog/authors/job-van-der-voort","w8TOn_hGFgQQOv35VnObjxoMM-hviRbwtijFETooJCM",[1168,1177,1185],{"title":1169,"description":1170,"heroImage":1171,"category":445,"date":1172,"authors":1173,"slug":1176,"externalUrl":449},"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",[1174,1175],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1178,"description":1179,"heroImage":1180,"category":445,"date":1181,"authors":1182,"slug":1184,"externalUrl":449},"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",[1183],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1186,"description":1187,"heroImage":1188,"category":445,"date":1189,"authors":1190,"slug":1192,"externalUrl":449},"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",[1191],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1194},[1195,1209,1221,1233],{"id":1196,"categories":1197,"header":1199,"text":1200,"button":1201,"image":1206},"ai-modernization",[1198],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1202,"config":1203},"Get your AI maturity score",{"href":1204,"dataGaName":1205,"dataGaLocation":681},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1207},{"src":1208},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1210,"categories":1211,"header":1213,"text":1200,"button":1214,"image":1218},"devops-modernization",[1212,1016],"product","Are you just managing tools or shipping innovation?",{"text":1215,"config":1216},"Get your DevOps maturity score",{"href":1217,"dataGaName":1205,"dataGaLocation":681},"/assessments/devops-modernization-assessment/",{"config":1219},{"src":1220},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1222,"categories":1223,"header":1225,"text":1200,"button":1226,"image":1230},"security-modernization",[1224],"security","Are you trading speed for security?",{"text":1227,"config":1228},"Get your security maturity score",{"href":1229,"dataGaName":1205,"dataGaLocation":681},"/assessments/security-modernization-assessment/",{"config":1231},{"src":1232},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1234,"paths":1235,"header":1238,"text":1239,"button":1240,"image":1245},"github-azure-migration",[1236,1237],"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":1241,"config":1242},"See how GitLab compares to GitHub",{"href":1243,"dataGaName":1244,"dataGaLocation":681},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1246},{"src":1220},{"header":1248,"blurb":1249,"button":1250,"secondaryButton":1255},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1251,"config":1252},"Get your free trial",{"href":1253,"dataGaName":480,"dataGaLocation":1254},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":952,"config":1256},{"href":804,"dataGaName":485,"dataGaLocation":1254},1786803752497]