[{"data":1,"prerenderedAt":1090},["ShallowReactive",2],{"/blog/a-beginners-guide-to-continuous-integration":3,"navigation-en-us":306,"banner-en-us":731,"footer-en-us":741,"blog-post-authors-en-us-Riccardo Padovani":985,"blog-related-posts-en-us-a-beginners-guide-to-continuous-integration":1000,"blog-promotions-en-us":1026,"next-steps-en-us":1080},{"id":4,"title":5,"authors":6,"body":8,"category":276,"date":277,"description":278,"extension":279,"externalUrl":280,"faq":280,"featured":281,"heroImage":282,"meta":283,"navigation":293,"path":294,"seo":295,"slug":299,"stem":300,"tags":301,"template":304,"updatedDate":280,"__hash__":305},"blogPosts/en-us/blog/a-beginners-guide-to-continuous-integration.md","A beginner's guide to continuous integration",[7],"Riccardo Padovani",{"type":9,"value":10,"toc":265},"minimark",[11,27,46,54,66,71,74,82,85,88,92,95,98,101,112,115,118,124,128,132,135,138,141,144,147,151,155,158,161,164,167,170,173,176,179,183,187,190,193,202,206,210,217,224,227,231,238,249],[12,13,14,15,21,22,26],"p",{},"At ",[16,17,20],"a",{"href":18,"rel":19},"https://www.fleetster.net/",[],"fleetster"," we have our own instance of GitLab and we rely a lot on ",[16,23,25],{"href":24},"/topics/ci-cd/","GitLab CI/CD",". Also our designers and QA guys use (and love) it, thanks to its advanced features.",[12,28,29,30,34,35,40,41,45],{},"GitLab CI/CD is a very powerful system of ",[16,31,33],{"href":32},"/solutions/continuous-integration/","continuous integration (CI)",", with a lot of different features, and with every new release, new features land. It has very rich ",[16,36,39],{"href":37,"rel":38},"https://docs.gitlab.com/ci/",[],"technical documentation",", but it lacks a generic introduction for people who want to use it in an existing setup. A designer or a tester doesn’t need to know how to autoscale it with ",[16,42,44],{"href":43},"/blog/how-to-create-a-ci-cd-pipeline-with-auto-deploy-to-kubernetes-using-gitlab/","Kubernetes"," or the difference between an image or a service.",[12,47,48,49,53],{},"But still, they need to ",[16,50,52],{"href":51},"/topics/ci-cd/cicd-pipeline/","know what a pipeline is",", and how to see a branch deployed to an environment. In this article therefore I will try to cover as many features as possible, highlighting how the end users can enjoy them; in the last months I explained such features to some members of our team, also developers: not everyone knows what continuous integration is or has used Gitlab CI/CD in a previous job.",[12,55,56,57,61,62,65],{},"If you want to know why continuous integration is important I suggest reading ",[16,58,60],{"href":59},"/blog/7-reasons-why-you-should-be-using-ci/","this article",", while for finding the reasons for using Gitlab CI/CD specifically, I leave the job to ",[16,63,64],{"href":32},"GitLab"," itself.",[67,68,70],"h2",{"id":69},"introduction","Introduction",[12,72,73],{},"Every time developers change some code they save their changes in a commit. They can then push that commit to GitLab, so other developers can review the code.",[12,75,76,77,81],{},"GitLab will also start some work on that commit, if GitLab CI/CD has been configured. This work is executed by a runner. A runner is basically a server (it can be a lot of different things, also your PC, but we can simplify it as a server) that executes instructions listed in the ",[78,79,80],"code",{},".gitlab-ci.yml"," file, and reports the result back to GitLab itself, which will show it in his graphical interface.",[12,83,84],{},"When developers have finished implementing a new feature or a bugfix (activity that usual requires multiple commits), they can open a merge request, where other members of the team can comment on the code and on the implementation.",[12,86,87],{},"As we will see, designers and testers can also (and really should!) join this process, giving feedback and suggesting improvements, especially thanks to two features of GitLab CI: environments and artifacts.",[67,89,91],{"id":90},"cicd-pipelines","CI/CD pipelines",[12,93,94],{},"Every commit that is pushed to GitLab generates a pipeline attached to that commit. If multiple commits are pushed together the pipeline will be created for the last one only. A pipeline is a collection of jobs split in different stages.",[12,96,97],{},"All the jobs in the same stage run concurrently (if there are enough runners) and the next stage begins only if all the jobs from the previous stage have finished with success.",[12,99,100],{},"As soon as a job fails, the entire pipeline fails. There is an exception for this, as we will see below: if a job is marked as manual, then a failure will not make the pipeline fail.",[12,102,103,104,107,108,111],{},"The stages are just a logical division between batches of jobs, where it doesn’t make sense to execute the next job if the previous failed. We can have a ",[78,105,106],{},"build"," stage, where all the jobs to build the application are executed, and a ",[78,109,110],{},"deploy"," stage, where the build application is deployed. Doesn’t make much sense to deploy something that failed to build, does it?",[12,113,114],{},"Every job shouldn’t have any dependency with any other job in the same stage, while they can expect results by jobs from a previous stage.",[12,116,117],{},"Let’s see how GitLab shows information about stages and stages’ status.",[119,120],"img",{"src":121,"alt":122,"style":123},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398828/blog/Content%20Images/pipeline-overview.png","Pipeline overview","width: 700px;",[119,125],{"src":126,"alt":127,"style":123},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398839/blog/Content%20Images/pipeline-status.png","Pipeline status",[67,129,131],{"id":130},"what-is-a-ci-job","What is a CI job?",[12,133,134],{},"A job is a collection of instructions that a runner has to execute. You can see in real time what the output of the job is, so developers can understand why a job fails.",[12,136,137],{},"A job can be automatic, so it starts automatically when a commit is pushed, or manual. A manual job has to be triggered by someone manually. This can be useful, for example, to automate a deploy, but still to deploy only when someone manually approves it. There is a way to limit who can run a job, so only trustworthy people can deploy, to continue the example before.",[12,139,140],{},"A job can also build artifacts that users can download, like it creates an APK you can download and test on your device; in this way both designers and testers can download an application and test it without having to ask for help to developers.",[12,142,143],{},"Other than creating artifacts, a job can deploy an environment, usually reachable by an URL, where users can test the commit.",[12,145,146],{},"Job status are the same as stages status: indeed stages inherit theirs status from the jobs.",[119,148],{"src":149,"alt":150,"style":123},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398972/blog/Content%20Images/running-job.png","Running job",[67,152,154],{"id":153},"artifacts","Artifacts",[12,156,157],{},"As we said, a job can create an artifact that users can download to test. It can be anything, like an application for Windows, an image generated by a PC, or an APK for Android.",[12,159,160],{},"So you are a designer, and the merge request has been assigned to you: you need to validate the implementation of the new design!",[12,162,163],{},"But how to do that?",[12,165,166],{},"You need to open the merge request, and download the artifact, as shown in the figure.",[12,168,169],{},"Every pipeline collects all the artifacts from all the jobs, and every job can have multiple artifacts. When you click on the download button, a dropdown will appear where you can select which artifact you want. After the review, you can leave a comment on the MR.",[12,171,172],{},"You can also always download the artifacts from pipelines that do not have a merge request open ;-)",[12,174,175],{},"I am focusing on merge requests because usually that is where testers, designers, and shareholders in general enter the workflow.",[12,177,178],{},"But merge requests are not linked to pipelines: while they integrate nicely with one another, they do not have any relation.",[119,180],{"src":181,"alt":182,"style":123},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398203/blog/Content%20Images/download-artifacts.png","Download artifacts",[67,184,186],{"id":185},"cicd-environments","CI/CD environments",[12,188,189],{},"In a similar way, a job can deploy something to an external server, so you can reach it through the merge request itself.",[12,191,192],{},"As you can see, the environment has a name and a link. Just by clicking the link you to go to a deployed version of your application (of course, if your team has set it up correctly).",[12,194,195,196,201],{},"You can also click on the name of the environment, because GitLab also has other cool features for environments, like ",[16,197,200],{"href":198,"rel":199},"https://gitlab.com/help/ci/environments.md",[],"monitoring",".",[119,203],{"src":204,"alt":205,"style":123},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398219/blog/Content%20Images/environment.png","environment",[67,207,209],{"id":208},"conclusion","Conclusion",[12,211,212,213,201],{},"This was a small introduction to some of the features of GitLab CI: it is very powerful, and using it in the right way allows all the team to use just one tool to go from planning to deploying. A lot of new features are introduced every month, so keep an eye on the ",[16,214,216],{"href":215},"/blog/","GitLab blog",[12,218,219,220,201],{},"For setting it up, or for more advanced features, take a look at the ",[16,221,223],{"href":37,"rel":222},[],"documentation",[12,225,226],{},"In fleetster we use it not only for running tests, but also for having automatic versioning of the software and automatic deploys to testing environments. We have automated other jobs as well (building apps and publishing them on the Play Store and so on).",[67,228,230],{"id":229},"about-the-guest-author","About the guest author",[12,232,233,234,237],{},"Riccardo is a university student and a part-time developer at ",[16,235,20],{"href":18,"rel":236},[],". When not busy with university or work, he likes to contribute to open source projects.",[12,239,240],{},[241,242,243,248],"em",{},[16,244,247],{"href":245,"rel":246},"https://rpadovani.com/introduction-gitlab-ci",[],"An introduction to continuous integration"," was originally published on rpadovani.com.",[12,250,251],{},[241,252,253,254,259,260],{},"Cover photo by ",[16,255,258],{"href":256,"rel":257},"https://unsplash.com/photos/3ym6i13Y9LU?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[],"Mike Tinnion"," on ",[16,261,264],{"href":262,"rel":263},"https://unsplash.com/",[],"Unsplash",{"title":266,"searchDepth":267,"depth":267,"links":268},"",2,[269,270,271,272,273,274,275],{"id":69,"depth":267,"text":70},{"id":90,"depth":267,"text":91},{"id":130,"depth":267,"text":131},{"id":153,"depth":267,"text":154},{"id":185,"depth":267,"text":186},{"id":208,"depth":267,"text":209},{"id":229,"depth":267,"text":230},"engineering","2018-01-22","Here's how to help everyone on your team, like designers and testers, get started with GitLab CI.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679800/Blog/Hero%20Images/beginners-guide-to-ci.jpg",{"excerpt":284},{"type":9,"value":285},[286],[12,287,14,288,21,291,26],{},[16,289,20],{"href":18,"rel":290},[],[16,292,25],{"href":24},true,"/en-us/blog/a-beginners-guide-to-continuous-integration",{"title":5,"description":278,"ogTitle":5,"ogDescription":278,"noIndex":281,"ogImage":282,"ogUrl":296,"ogSiteName":297,"ogType":298,"canonicalUrls":296},"https://about.gitlab.com/blog/a-beginners-guide-to-continuous-integration","https://about.gitlab.com","article","a-beginners-guide-to-continuous-integration","en-us/blog/a-beginners-guide-to-continuous-integration",[302,303],"CI/CD","user stories","BlogPost","9EirjEEgt3h4YbAmufyveJgWA8r22Iq0gXt-GE76pWA",{"logo":307,"freeTrial":312,"sales":317,"login":322,"items":327,"search":651,"minimal":682,"duo":701,"switchNav":710,"pricingDeployment":721},{"config":308},{"href":309,"dataGaName":310,"dataGaLocation":311},"/","gitlab logo","header",{"text":313,"config":314},"Get free trial",{"href":315,"dataGaName":316,"dataGaLocation":311},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":318,"config":319},"Request a demo",{"href":320,"dataGaName":321,"dataGaLocation":311},"/sales/?contact-topic=request-demo","sales",{"text":323,"config":324},"Sign in",{"href":325,"dataGaName":326,"dataGaLocation":311},"https://gitlab.com/users/sign_in/","sign in",[328,357,455,460,573,629],{"text":329,"config":330,"menu":332},"Platform",{"dataNavLevelOne":331},"platform",{"type":333,"columns":334},"cards",[335,341,349],{"title":329,"description":336,"link":337},"The intelligent orchestration platform for DevSecOps",{"text":338,"config":339},"Explore our Platform",{"href":340,"dataGaName":331,"dataGaLocation":311},"/platform/",{"title":342,"description":343,"link":344},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":345,"config":346},"Meet GitLab Duo",{"href":347,"dataGaName":348,"dataGaLocation":311},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":350,"description":351,"link":352},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":353,"config":354},"Learn more",{"href":355,"dataGaName":356,"dataGaLocation":311},"/why-gitlab/","why gitlab",{"text":358,"left":293,"config":359,"menu":361},"Product",{"dataNavLevelOne":360},"solutions",{"type":362,"link":363,"columns":367,"feature":434},"lists",{"text":364,"config":365},"View all Solutions",{"href":366,"dataGaName":360,"dataGaLocation":311},"/solutions/",[368,390,413],{"title":369,"description":370,"link":371,"items":376},"Automation","CI/CD and automation to accelerate deployment",{"config":372},{"icon":373,"href":374,"dataGaName":375,"dataGaLocation":311},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[377,379,382,386],{"text":302,"config":378},{"href":32,"dataGaLocation":311,"dataGaName":302},{"text":342,"config":380},{"href":347,"dataGaLocation":311,"dataGaName":381},"gitlab duo agent platform - product menu",{"text":383,"config":384},"Source Code Management",{"href":385,"dataGaLocation":311,"dataGaName":383},"/solutions/source-code-management/",{"text":387,"config":388},"Automated Software Delivery",{"href":374,"dataGaLocation":311,"dataGaName":389},"Automated software delivery",{"title":391,"description":392,"link":393,"items":398},"Security","Deliver code faster without compromising security",{"config":394},{"href":395,"dataGaName":396,"dataGaLocation":311,"icon":397},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[399,403,408],{"text":400,"config":401},"Application Security Testing",{"href":395,"dataGaName":402,"dataGaLocation":311},"Application security testing",{"text":404,"config":405},"Software Supply Chain Security",{"href":406,"dataGaLocation":311,"dataGaName":407},"/solutions/supply-chain/","Software supply chain security",{"text":409,"config":410},"Software Compliance",{"href":411,"dataGaName":412,"dataGaLocation":311},"/solutions/software-compliance/","software compliance",{"title":414,"link":415,"items":420},"Measurement",{"config":416},{"icon":417,"href":418,"dataGaName":419,"dataGaLocation":311},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[421,425,429],{"text":422,"config":423},"Visibility & Measurement",{"href":418,"dataGaLocation":311,"dataGaName":424},"Visibility and Measurement",{"text":426,"config":427},"Value Stream Management",{"href":428,"dataGaLocation":311,"dataGaName":426},"/solutions/value-stream-management/",{"text":430,"config":431},"Analytics & Insights",{"href":432,"dataGaLocation":311,"dataGaName":433},"/solutions/analytics-and-insights/","Analytics and insights",{"title":435,"type":362,"items":436},"GitLab for",[437,443,449],{"text":438,"config":439},"Enterprise",{"icon":440,"href":441,"dataGaLocation":311,"dataGaName":442},"Building","/enterprise/","enterprise",{"text":444,"config":445},"Small Business",{"icon":446,"href":447,"dataGaLocation":311,"dataGaName":448},"Work","/small-business/","small business",{"text":450,"config":451},"Public Sector",{"icon":452,"href":453,"dataGaLocation":311,"dataGaName":454},"Organization","/solutions/public-sector/","public sector",{"text":456,"config":457},"Pricing",{"href":458,"dataGaName":459,"dataGaLocation":311,"dataNavLevelOne":459},"/pricing/","pricing",{"text":461,"config":462,"menu":464},"Resources",{"dataNavLevelOne":463},"resources",{"type":362,"link":465,"columns":469,"feature":562},{"text":466,"config":467},"View all resources",{"href":468,"dataGaName":463,"dataGaLocation":311},"/resources/",[470,503,529],{"title":471,"items":472},"Getting started",[473,478,483,488,493,498],{"text":474,"config":475},"Install",{"href":476,"dataGaName":477,"dataGaLocation":311},"/install/","install",{"text":479,"config":480},"Quick start guides",{"href":481,"dataGaName":482,"dataGaLocation":311},"/get-started/","quick setup checklists",{"text":484,"config":485},"Learn",{"href":486,"dataGaLocation":311,"dataGaName":487},"https://university.gitlab.com/","learn",{"text":489,"config":490},"Product documentation",{"href":491,"dataGaName":492,"dataGaLocation":311},"https://docs.gitlab.com/","product documentation",{"text":494,"config":495},"Best practice videos",{"href":496,"dataGaName":497,"dataGaLocation":311},"/getting-started-videos/","best practice videos",{"text":499,"config":500},"Integrations",{"href":501,"dataGaName":502,"dataGaLocation":311},"/integrations/","integrations",{"title":504,"items":505},"Discover",[506,511,515,520,524],{"text":507,"config":508},"Customer success stories",{"href":509,"dataGaName":510,"dataGaLocation":311},"/customers/","customer success stories",{"text":512,"config":513},"Blog",{"href":215,"dataGaName":514,"dataGaLocation":311},"blog",{"text":516,"config":517},"Demo Hub",{"href":518,"dataGaName":519,"dataGaLocation":311},"/demo-hub/","demo hub",{"text":521,"config":522},"The Source",{"href":523,"dataGaName":514,"dataGaLocation":311},"/the-source/",{"text":525,"config":526},"Remote",{"href":527,"dataGaName":528,"dataGaLocation":311},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":530,"items":531},"Connect",[532,537,542,547,552,557],{"text":533,"config":534},"GitLab Services",{"href":535,"dataGaName":536,"dataGaLocation":311},"/services/","services",{"text":538,"config":539},"Contribute",{"href":540,"dataGaName":541,"dataGaLocation":311},"https://contributors.gitlab.com","contribute",{"text":543,"config":544},"Community",{"href":545,"dataGaName":546,"dataGaLocation":311},"/community/","community",{"text":548,"config":549},"Forum",{"href":550,"dataGaName":551,"dataGaLocation":311},"https://forum.gitlab.com/","forum",{"text":553,"config":554},"Events",{"href":555,"dataGaName":556,"dataGaLocation":311},"/events/","events",{"text":558,"config":559},"Partners",{"href":560,"dataGaName":561,"dataGaLocation":311},"/partners/","partners",{"config":563,"title":566,"text":567,"link":568},{"background":564,"textColor":565},"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":569,"config":570},"Read the latest",{"href":571,"dataGaName":572,"dataGaLocation":311},"/whats-new/","whats new",{"text":574,"config":575,"menu":577},"Company",{"dataNavLevelOne":576},"company",{"type":362,"columns":578},[579],{"items":580},[581,586,592,594,599,604,609,614,619,624],{"text":582,"config":583},"About",{"href":584,"dataGaName":585,"dataGaLocation":311},"/company/","about",{"text":587,"config":588,"footerGa":591},"Jobs",{"href":589,"dataGaName":590,"dataGaLocation":311},"/jobs/","jobs",{"dataGaName":590},{"text":553,"config":593},{"href":555,"dataGaName":556,"dataGaLocation":311},{"text":595,"config":596},"Leadership",{"href":597,"dataGaName":598,"dataGaLocation":311},"/company/team/e-group/","leadership",{"text":600,"config":601},"Handbook",{"href":602,"dataGaName":603,"dataGaLocation":311},"https://handbook.gitlab.com/","handbook",{"text":605,"config":606},"Investor relations",{"href":607,"dataGaName":608,"dataGaLocation":311},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":610,"config":611},"Trust Center",{"href":612,"dataGaName":613,"dataGaLocation":311},"/security/","trust center",{"text":615,"config":616},"AI Transparency Center",{"href":617,"dataGaName":618,"dataGaLocation":311},"/ai-transparency-center/","ai transparency center",{"text":620,"config":621},"Newsletter",{"href":622,"dataGaName":623,"dataGaLocation":311},"/company/contact/#contact-forms","newsletter",{"text":625,"config":626},"Press",{"href":627,"dataGaName":628,"dataGaLocation":311},"/press/","press",{"text":630,"config":631,"menu":632},"Contact us",{"dataNavLevelOne":576},{"type":362,"columns":633},[634],{"items":635},[636,641,646],{"text":637,"config":638},"Talk to sales",{"href":639,"dataGaName":640,"dataGaLocation":311},"/sales/","talk to sales",{"text":642,"config":643},"Support portal",{"href":644,"dataGaName":645,"dataGaLocation":311},"https://support.gitlab.com/hc/en-us","support portal",{"text":647,"config":648},"Customer portal",{"href":649,"dataGaName":650,"dataGaLocation":311},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":652,"login":653,"suggestions":660},"Close",{"text":654,"link":655},"To search repositories and projects, login to",{"text":656,"config":657},"gitlab.com",{"href":325,"dataGaName":658,"dataGaLocation":659},"search login","search",{"text":661,"default":662},"Suggestions",[663,665,669,671,675,679],{"text":342,"config":664},{"href":347,"dataGaName":342,"dataGaLocation":659},{"text":666,"config":667},"Code Suggestions (AI)",{"href":668,"dataGaName":666,"dataGaLocation":659},"/solutions/code-suggestions/",{"text":302,"config":670},{"href":32,"dataGaName":302,"dataGaLocation":659},{"text":672,"config":673},"GitLab on AWS",{"href":674,"dataGaName":672,"dataGaLocation":659},"/partners/technology-partners/aws/",{"text":676,"config":677},"GitLab on Google Cloud",{"href":678,"dataGaName":676,"dataGaLocation":659},"/partners/technology-partners/google-cloud-platform/",{"text":680,"config":681},"Why GitLab?",{"href":355,"dataGaName":680,"dataGaLocation":659},{"freeTrial":683,"mobileIcon":688,"desktopIcon":693,"secondaryButton":696},{"text":684,"config":685},"Start free trial",{"href":686,"dataGaName":316,"dataGaLocation":687},"https://gitlab.com/-/trials/new/","nav",{"altText":689,"config":690},"Gitlab Icon",{"src":691,"dataGaName":692,"dataGaLocation":687},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":689,"config":694},{"src":695,"dataGaName":692,"dataGaLocation":687},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":697,"config":698},"Get Started",{"href":699,"dataGaName":700,"dataGaLocation":687},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":702,"mobileIcon":706,"desktopIcon":708},{"text":703,"config":704},"Learn more about GitLab Duo",{"href":347,"dataGaName":705,"dataGaLocation":687},"gitlab duo",{"altText":689,"config":707},{"src":691,"dataGaName":692,"dataGaLocation":687},{"altText":689,"config":709},{"src":695,"dataGaName":692,"dataGaLocation":687},{"button":711,"mobileIcon":716,"desktopIcon":718},{"text":712,"config":713},"/switch",{"href":714,"dataGaName":715,"dataGaLocation":687},"#contact","switch",{"altText":689,"config":717},{"src":691,"dataGaName":692,"dataGaLocation":687},{"altText":689,"config":719},{"src":720,"dataGaName":692,"dataGaLocation":687},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":722,"mobileIcon":727,"desktopIcon":729},{"text":723,"config":724},"Back to pricing",{"href":458,"dataGaName":725,"dataGaLocation":687,"icon":726},"back to pricing","GoBack",{"altText":689,"config":728},{"src":691,"dataGaName":692,"dataGaLocation":687},{"altText":689,"config":730},{"src":695,"dataGaName":692,"dataGaLocation":687},{"title":732,"titleMobile":733,"button":734,"config":739},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":353,"config":735},{"href":736,"dataGaName":737,"dataGaLocation":738},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":740,"disabled":281},"release",{"data":742},{"text":743,"source":744,"edit":750,"contribute":755,"config":760,"items":765,"minimal":974},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":745,"config":746},"View page source",{"href":747,"dataGaName":748,"dataGaLocation":749},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":751,"config":752},"Edit this page",{"href":753,"dataGaName":754,"dataGaLocation":749},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":756,"config":757},"Please contribute",{"href":758,"dataGaName":759,"dataGaLocation":749},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":761,"facebook":762,"youtube":763,"linkedin":764},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[766,813,866,910,942],{"title":456,"links":767,"subMenu":782},[768,772,777],{"text":769,"config":770},"View plans",{"href":458,"dataGaName":771,"dataGaLocation":749},"view plans",{"text":773,"config":774},"Why Premium?",{"href":775,"dataGaName":776,"dataGaLocation":749},"/pricing/premium/","why premium",{"text":778,"config":779},"Why Ultimate?",{"href":780,"dataGaName":781,"dataGaLocation":749},"/pricing/ultimate/","why ultimate",[783],{"title":784,"links":785},"Contact Us",[786,789,791,793,798,803,808],{"text":787,"config":788},"Contact sales",{"href":639,"dataGaName":321,"dataGaLocation":749},{"text":642,"config":790},{"href":644,"dataGaName":645,"dataGaLocation":749},{"text":647,"config":792},{"href":649,"dataGaName":650,"dataGaLocation":749},{"text":794,"config":795},"Status",{"href":796,"dataGaName":797,"dataGaLocation":749},"https://status.gitlab.com/","status",{"text":799,"config":800},"Terms of use",{"href":801,"dataGaName":802,"dataGaLocation":749},"/terms/","terms of use",{"text":804,"config":805},"Privacy statement",{"href":806,"dataGaName":807,"dataGaLocation":749},"/privacy/","privacy statement",{"text":809,"config":810},"Cookie preferences",{"dataGaName":811,"dataGaLocation":749,"id":812,"isOneTrustButton":293},"cookie preferences","ot-sdk-btn",{"title":358,"links":814,"subMenu":823},[815,819],{"text":816,"config":817},"DevSecOps platform",{"href":340,"dataGaName":818,"dataGaLocation":749},"devsecops platform",{"text":820,"config":821},"AI-Assisted Development",{"href":347,"dataGaName":822,"dataGaLocation":749},"ai-assisted development",[824],{"title":825,"links":826},"Topics",[827,831,836,841,846,851,856,861],{"text":828,"config":829},"CICD",{"href":24,"dataGaName":830,"dataGaLocation":749},"cicd",{"text":832,"config":833},"GitOps",{"href":834,"dataGaName":835,"dataGaLocation":749},"/topics/gitops/","gitops",{"text":837,"config":838},"DevOps",{"href":839,"dataGaName":840,"dataGaLocation":749},"/topics/devops/","devops",{"text":842,"config":843},"Version Control",{"href":844,"dataGaName":845,"dataGaLocation":749},"/topics/version-control/","version control",{"text":847,"config":848},"DevSecOps",{"href":849,"dataGaName":850,"dataGaLocation":749},"/topics/devsecops/","devsecops",{"text":852,"config":853},"Cloud Native",{"href":854,"dataGaName":855,"dataGaLocation":749},"/topics/cloud-native/","cloud native",{"text":857,"config":858},"AI for Coding",{"href":859,"dataGaName":860,"dataGaLocation":749},"/topics/devops/ai-for-coding/","ai for coding",{"text":862,"config":863},"Agentic AI",{"href":864,"dataGaName":865,"dataGaLocation":749},"/topics/agentic-ai/","agentic ai",{"title":867,"links":868},"Solutions",[869,871,873,878,882,885,889,892,894,897,900,905],{"text":400,"config":870},{"href":395,"dataGaName":400,"dataGaLocation":749},{"text":389,"config":872},{"href":374,"dataGaName":375,"dataGaLocation":749},{"text":874,"config":875},"Agile development",{"href":876,"dataGaName":877,"dataGaLocation":749},"/solutions/agile-delivery/","agile delivery",{"text":879,"config":880},"SCM",{"href":385,"dataGaName":881,"dataGaLocation":749},"source code management",{"text":828,"config":883},{"href":32,"dataGaName":884,"dataGaLocation":749},"continuous integration & delivery",{"text":886,"config":887},"Value stream management",{"href":428,"dataGaName":888,"dataGaLocation":749},"value stream management",{"text":832,"config":890},{"href":891,"dataGaName":835,"dataGaLocation":749},"/solutions/gitops/",{"text":438,"config":893},{"href":441,"dataGaName":442,"dataGaLocation":749},{"text":895,"config":896},"Small business",{"href":447,"dataGaName":448,"dataGaLocation":749},{"text":898,"config":899},"Public sector",{"href":453,"dataGaName":454,"dataGaLocation":749},{"text":901,"config":902},"Education",{"href":903,"dataGaName":904,"dataGaLocation":749},"/solutions/education/","education",{"text":906,"config":907},"Financial services",{"href":908,"dataGaName":909,"dataGaLocation":749},"/solutions/finance/","financial services",{"title":461,"links":911},[912,914,916,918,921,923,926,928,930,932,934,936,938,940],{"text":474,"config":913},{"href":476,"dataGaName":477,"dataGaLocation":749},{"text":479,"config":915},{"href":481,"dataGaName":482,"dataGaLocation":749},{"text":484,"config":917},{"href":486,"dataGaName":487,"dataGaLocation":749},{"text":489,"config":919},{"href":491,"dataGaName":920,"dataGaLocation":749},"docs",{"text":512,"config":922},{"href":215,"dataGaName":514,"dataGaLocation":749},{"text":924,"config":925},"What's new",{"href":571,"dataGaName":572,"dataGaLocation":749},{"text":507,"config":927},{"href":509,"dataGaName":510,"dataGaLocation":749},{"text":525,"config":929},{"href":527,"dataGaName":528,"dataGaLocation":749},{"text":533,"config":931},{"href":535,"dataGaName":536,"dataGaLocation":749},{"text":538,"config":933},{"href":540,"dataGaName":541,"dataGaLocation":749},{"text":543,"config":935},{"href":545,"dataGaName":546,"dataGaLocation":749},{"text":548,"config":937},{"href":550,"dataGaName":551,"dataGaLocation":749},{"text":553,"config":939},{"href":555,"dataGaName":556,"dataGaLocation":749},{"text":558,"config":941},{"href":560,"dataGaName":561,"dataGaLocation":749},{"title":574,"links":943},[944,946,948,950,952,954,958,963,965,967,969],{"text":582,"config":945},{"href":584,"dataGaName":576,"dataGaLocation":749},{"text":587,"config":947},{"href":589,"dataGaName":590,"dataGaLocation":749},{"text":595,"config":949},{"href":597,"dataGaName":598,"dataGaLocation":749},{"text":600,"config":951},{"href":602,"dataGaName":603,"dataGaLocation":749},{"text":605,"config":953},{"href":607,"dataGaName":608,"dataGaLocation":749},{"text":955,"config":956},"Sustainability",{"href":957,"dataGaName":955,"dataGaLocation":749},"/sustainability/",{"text":959,"config":960},"Diversity, inclusion and belonging (DIB)",{"href":961,"dataGaName":962,"dataGaLocation":749},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":610,"config":964},{"href":612,"dataGaName":613,"dataGaLocation":749},{"text":620,"config":966},{"href":622,"dataGaName":623,"dataGaLocation":749},{"text":625,"config":968},{"href":627,"dataGaName":628,"dataGaLocation":749},{"text":970,"config":971},"Modern Slavery Transparency Statement",{"href":972,"dataGaName":973,"dataGaLocation":749},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":975},[976,979,982],{"text":977,"config":978},"Terms",{"href":801,"dataGaName":802,"dataGaLocation":749},{"text":980,"config":981},"Cookies",{"dataGaName":811,"dataGaLocation":749,"id":812,"isOneTrustButton":293},{"text":983,"config":984},"Privacy",{"href":806,"dataGaName":807,"dataGaLocation":749},[986],{"id":987,"title":7,"body":280,"config":988,"content":990,"description":280,"extension":994,"meta":995,"navigation":293,"path":996,"seo":997,"stem":998,"__hash__":999},"blogAuthors/en-us/blog/authors/riccardo-padovani.yml",{"template":989},"BlogAuthor",{"name":7,"config":991},{"headshot":992,"ctfId":993},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Riccardo-Padovani","yml",{},"/en-us/blog/authors/riccardo-padovani",{},"en-us/blog/authors/riccardo-padovani","T-wtYATHMXc45-YIVJc6pk7jItpWUbE44wCUfv7YeVY",[1001,1010,1018],{"title":1002,"description":1003,"heroImage":1004,"category":276,"date":1005,"authors":1006,"slug":1009,"externalUrl":280},"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",[1007,1008],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1011,"description":1012,"heroImage":1013,"category":276,"date":1014,"authors":1015,"slug":1017,"externalUrl":280},"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",[1016],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1019,"description":1020,"heroImage":1021,"category":276,"date":1022,"authors":1023,"slug":1025,"externalUrl":280},"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",[1024],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1027},[1028,1042,1054,1066],{"id":1029,"categories":1030,"header":1032,"text":1033,"button":1034,"image":1039},"ai-modernization",[1031],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1035,"config":1036},"Get your AI maturity score",{"href":1037,"dataGaName":1038,"dataGaLocation":514},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1040},{"src":1041},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1043,"categories":1044,"header":1046,"text":1033,"button":1047,"image":1051},"devops-modernization",[1045,850],"product","Are you just managing tools or shipping innovation?",{"text":1048,"config":1049},"Get your DevOps maturity score",{"href":1050,"dataGaName":1038,"dataGaLocation":514},"/assessments/devops-modernization-assessment/",{"config":1052},{"src":1053},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1055,"categories":1056,"header":1058,"text":1033,"button":1059,"image":1063},"security-modernization",[1057],"security","Are you trading speed for security?",{"text":1060,"config":1061},"Get your security maturity score",{"href":1062,"dataGaName":1038,"dataGaLocation":514},"/assessments/security-modernization-assessment/",{"config":1064},{"src":1065},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1067,"paths":1068,"header":1071,"text":1072,"button":1073,"image":1078},"github-azure-migration",[1069,1070],"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":1074,"config":1075},"See how GitLab compares to GitHub",{"href":1076,"dataGaName":1077,"dataGaLocation":514},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1079},{"src":1053},{"header":1081,"blurb":1082,"button":1083,"secondaryButton":1088},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1084,"config":1085},"Get your free trial",{"href":1086,"dataGaName":316,"dataGaLocation":1087},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":787,"config":1089},{"href":639,"dataGaName":321,"dataGaLocation":1087},1786803741791]