[{"data":1,"prerenderedAt":1128},["ShallowReactive",2],{"/blog/production-grade-infra-devsecops-with-five-minute-production":3,"navigation-en-us":343,"banner-en-us":771,"footer-en-us":781,"blog-post-authors-en-us-Sri Rangan":1023,"blog-related-posts-en-us-production-grade-infra-devsecops-with-five-minute-production":1038,"blog-promotions-en-us":1064,"next-steps-en-us":1118},{"id":4,"title":5,"authors":6,"body":8,"category":317,"date":318,"description":319,"extension":320,"externalUrl":321,"faq":321,"featured":322,"heroImage":323,"meta":324,"navigation":325,"path":326,"seo":327,"slug":332,"stem":333,"tags":334,"template":341,"updatedDate":321,"__hash__":342},"blogPosts/en-us/blog/production-grade-infra-devsecops-with-five-minute-production.md","Production-grade infrastructure, GitOps convergence, and DevSecOps in under 5 minutes",[7],"Sri Rangan",{"type":9,"value":10,"toc":306},"minimark",[11,15,18,21,24,31,34,37,47,52,55,58,61,64,67,80,88,123,126,133,137,146,149,160,163,166,170,173,176,193,196,199,202,209,213,216,219,224,231,235,238,241,244,264,267,272,289,293,302],[12,13,14],"p",{},"This blog post was originally published on the GitLab Unfiltered blog. It was reviewed and republished on 2021-03-10.",[12,16,17],{},"This is a story about achieving production-grade infrastructure in under five minutes.\\\nThis is a story about achieving production-grade DevSecOps in under five minutes.\\\nThis is a story about achieving total convergence of GitOps in under five minutes.",[12,19,20],{},"My name is Sri and over the last three months and I worked closely with GitLab co-founder DZ in building \"Five Minute Production App.\"",[12,22,23],{},"The app blends solutions offered by AWS, Hashicorp Terraform, and GitLab, and offers production-grade infrastructure and development workflows in under five minutes.",[12,25,26],{},[27,28],"img",{"alt":29,"src":30},"Five Minute Production App Diagram","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398280/blog/Content%20Images/five-min-prod-01-complete-flow.png",[12,32,33],{},"Apart from the efficiencies gained from using Five Minute Production App, you benefit by achieving stateful, production-ready infrastructure on the AWS hypercloud.",[12,35,36],{},"We started with AWS first, as it is the hypercoud leader today. Support for Azure and Google Cloud is on the roadmap.",[12,38,39,40,46],{},"Our vision and design decisions are explained in the ",[41,42,45],"a",{"href":43,"rel":44},"https://gitlab.com/gitlab-org/5-minute-production-app/deploy-template#quickly",[],"README",".",[48,49,51],"h2",{"id":50},"quickstart","Quickstart",[12,53,54],{},"We start with your GitLab project which has the source code of your web application. Regardless of which language or framework you use, your web application is packaged as a container image and stored within your GitLab project's Container Registry.\nThis is the Build stage.",[12,56,57],{},"This is followed by the Provision stage where Terraform scripts connect to AWS and create a secure environment for your web application.\nThe environments provisioned relate to your Git branching workflow.\nLong-lived Git branches create long-lived environments, and short-lived Git branches correspond to short-lived environments.",[12,59,60],{},"Resources provisioned include an Ubuntu VM, scalable PostgreSQL database, a Redis cluster, and S3 object storage.\nWe consider these elements as the building blocks for majority of web applications, and many of these fall under AWS free tier.",[12,62,63],{},"The infra state and credentials are stored within your GitLab project's managed Terraform state.",[12,65,66],{},"Finally, we reach the Deploy stage which:",[68,69,70,74,77],"ol",{},[71,72,73],"li",{},"Retrieves the deployable image from the GitLab Container Registry",[71,75,76],{},"Retrieves the infrastructure credentials from the Gitlab Managed Terraform State, and",[71,78,79],{},"Proceeds to deploy your web application",[12,81,82,83,87],{},"Everything is achieved by including these two lines in your ",[84,85,86],"code",{},".gitlab-ci.yml"," file.",[89,90,95],"pre",{"className":91,"code":92,"language":93,"meta":94,"style":94},"language-yaml shiki shiki-themes github-light","include:\n  remote: https://gitlab.com/gitlab-org/5-minute-production-app/deploy-template/-/raw/stable/deploy.yml\n\n","yaml","",[84,96,97,110],{"__ignoreMap":94},[98,99,102,106],"span",{"class":100,"line":101},"line",1,[98,103,105],{"class":104},"shJU0","include",[98,107,109],{"class":108},"sgsFI",":\n",[98,111,113,116,119],{"class":100,"line":112},2,[98,114,115],{"class":104},"  remote",[98,117,118],{"class":108},": ",[98,120,122],{"class":121},"sYBdl","https://gitlab.com/gitlab-org/5-minute-production-app/deploy-template/-/raw/stable/deploy.yml\n",[12,124,125],{},"Let's look at the complete process in more detail.",[12,127,128,132],{},[27,129],{"alt":130,"src":131},"Three stages of Five Minute Production App","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398281/blog/Content%20Images/five-min-prod-02-pipeline.png","\nThe three stages of Five Minute Production App",[48,134,136],{"id":135},"build-and-package","Build and package",[12,138,139,140,145],{},"The Build stage is where it all begins. Five Minute Production App reuses the ",[41,141,144],{"href":142,"rel":143},"https://docs.gitlab.com/topics/autodevops/stages/#auto-build",[],"Auto Build stage"," from the GitLab Auto DevOps pipeline.",[12,147,148],{},"Auto Build builds and packages web applications that are:",[68,150,151,154,157],{},[71,152,153],{},"Containerized with a Dockerfile, or",[71,155,156],{},"Compatible with the Cloud Native buildpack, or",[71,158,159],{},"Compatible with the Heroku buildpack",[12,161,162],{},"Thus, web applications across multitudes of technologies are supported, including web frameworks such as Rails, Django, Express, Next.js, Spring, etc.\nand programming languages including Python, Java, Node.js, Ruby, Clojure, etc.",[12,164,165],{},"Once the Auto Build job has finished execution, the newly created container image is stored as an artifact in your GitLab project's Container Registry.",[48,167,169],{"id":168},"provision-the-infrastructure","Provision the infrastructure",[12,171,172],{},"The next step, Provision, prepares infrastructure resources in AWS.\nThe first requirement here is the presence of AWS credentials stored as CI/CD variables at the project or group level.\nOnce valid AWS credentials are found, a Terraform script is executed to generate resources in AWS.",[12,174,175],{},"These resources include:",[68,177,178,181,184,187,190],{},[71,179,180],{},"EC2 VM based on Ubuntu 20.04 LTS",[71,182,183],{},"PostgreSQL database managed by AWS RDS",[71,185,186],{},"Redis cluster managed by AWS ElastiCache",[71,188,189],{},"S3 bucket for file storage",[71,191,192],{},"Email Service credentials managed by AWS SES",[12,194,195],{},"The most critical resource is the PostgreSQL service which has daily backups enabled.\nPostgreSQL data is snapshotted if the infrastructure resource is \"destroyed\" through a manual user action via the Five Minute Production App pipeline.",[12,197,198],{},"The EC2 VM is the only service accessible publicly. Ports 22, 80 and 443 are exposed.\nEvery other resource described above is part of a secure, private network, hidden from the public web, accessible ony via the EC2 instance and your web applicable deployed there.",[12,200,201],{},"The stateful services and environments are tied to your Git branches.\\\nThis means every Git branch creates a new environment with these resource sets.\\\nWe don't have a preference on your Git branching and environments lifecycle.\\\nUse long-lived or short-lived branches as you see fit, just keep in mind that long-lived branches leads to long-lived environments and short-lived branches leads to short-lived environments.",[12,203,204,208],{},[27,205],{"alt":206,"src":207},"Infrastructure resources provisioned on AWS","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398282/blog/Content%20Images/five-min-prod-03-infra-resources.png","\nInfrastructure resources provisioned on AWS",[48,210,212],{"id":211},"deploy-your-web-application","Deploy your web application",[12,214,215],{},"Finally comes the Deploy stage.",[12,217,218],{},"This is where the deploy script retrieves your web application package (container image) from the GitLab Container Registry, then retrieves the EC2 instance\ncredentials from the GitLab Managed Terraform State, and proceeds to deploy the relevant version of your web application in its environment.",[12,220,221,222,87],{},"Modern web applications might require additional commands being executed after each deployment or after the initial deployment,\nand these commands can be defined as variables in your ",[84,223,86],{},[12,225,226,227,230],{},"Finally, with the help of Certbot from Letsencrypt, SSL certificates are generated and configured for your web application.\nIf you have defined the ",[84,228,229],{},"CERT_DOMAIN"," CI/CD variable the SSL certificate will be generated for your custom domain name.\nOtherwise the generated SSL certificate uses a dynamic URL that Five Minute Production App prepares for you.",[48,232,234],{"id":233},"conclusion","Conclusion",[12,236,237],{},"There we have it. A simple yet production-ready setup for your web application. If you are looking for an AWS-based setup, this is ready for usage.",[12,239,240],{},"If you are looking for something similar but not quite Five Minute Production App, this serves as an example of how to converge infrastructure-as-code with software development and provide seamless continuous deployment workflows.",[12,242,243],{},"In my personal experience, this is one of the most complete examples of GitOps:",[68,245,246,249,252,255,258,261],{},[71,247,248],{},"Your application source code lives in your GitLab project",[71,250,251],{},"Your infrastructure defined as code lives in your GitLab project",[71,253,254],{},"Your CI/CD pipeline lives in your GitLab project",[71,256,257],{},"Your infrastructure state lives in your GitLab project",[71,259,260],{},"Your infrastructure secrets and credentials live in your GitLab project",[71,262,263],{},"Your environments configuration lives in your GitLab project",[12,265,266],{},"This complete GitOps convergence is not specifically configured for one project. It can be included as a template from multiple projects.\nThere is no reason why the GitLab project in your organization cannot be the single source of truth for everything.",[268,269,271],"h3",{"id":270},"links","Links",[273,274,275,282],"ul",{},[71,276,277],{},[41,278,281],{"href":279,"rel":280},"https://gitlab.com/gitlab-org/5-minute-production-app/deploy-template/-/blob/master/README.md",[],"Five Minute Production App",[71,283,284],{},[41,285,288],{"href":286,"rel":287},"https://gitlab.com/gitlab-org/5-minute-production-app/examples",[],"Reference Examples",[268,290,292],{"id":291},"about-the-author","About the author",[12,294,295,298,299,46],{},[41,296,7],{"href":297},"mailto:sri@gitlab.com",", an Enterprise Solutions Architect with GitLab, is a core-contributor and maintainer\nof ",[41,300,281],{"href":279,"rel":301},[],[303,304,305],"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":94,"searchDepth":112,"depth":112,"links":307},[308,309,310,311,312],{"id":50,"depth":112,"text":51},{"id":135,"depth":112,"text":136},{"id":168,"depth":112,"text":169},{"id":211,"depth":112,"text":212},{"id":233,"depth":112,"text":234,"children":313},[314,316],{"id":270,"depth":315,"text":271},3,{"id":291,"depth":315,"text":292},"engineering","2021-02-24","Unlock production-grade infrastructure and development workflows in under five minutes with Five Minute Production App: a blend of solutions offered by AWS, Hashicorp Terraform, and GitLab.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749665839/Blog/Hero%20Images/devops.png",{},true,"/en-us/blog/production-grade-infra-devsecops-with-five-minute-production",{"title":328,"description":319,"ogTitle":328,"ogDescription":319,"noIndex":322,"ogImage":323,"ogUrl":329,"ogSiteName":330,"ogType":331,"canonicalUrls":329},"GitOps & DevSecOps for production infrastructure in minutes","https://about.gitlab.com/blog/production-grade-infra-devsecops-with-five-minute-production","https://about.gitlab.com","article","production-grade-infra-devsecops-with-five-minute-production","en-us/blog/production-grade-infra-devsecops-with-five-minute-production",[335,336,337,338,339,340],"CI","CD","DevOps","cloud native","GitOps","production","BlogPost","y6N0i50Z6hRLtOJ8p3iCQpNOvvrTiyS5zEpHxwRBu5A",{"logo":344,"freeTrial":349,"sales":354,"login":359,"items":364,"search":691,"minimal":722,"duo":741,"switchNav":750,"pricingDeployment":761},{"config":345},{"href":346,"dataGaName":347,"dataGaLocation":348},"/","gitlab logo","header",{"text":350,"config":351},"Get free trial",{"href":352,"dataGaName":353,"dataGaLocation":348},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":355,"config":356},"Request a demo",{"href":357,"dataGaName":358,"dataGaLocation":348},"/sales/?contact-topic=request-demo","sales",{"text":360,"config":361},"Sign in",{"href":362,"dataGaName":363,"dataGaLocation":348},"https://gitlab.com/users/sign_in/","sign in",[365,394,494,499,613,669],{"text":366,"config":367,"menu":369},"Platform",{"dataNavLevelOne":368},"platform",{"type":370,"columns":371},"cards",[372,378,386],{"title":366,"description":373,"link":374},"The intelligent orchestration platform for DevSecOps",{"text":375,"config":376},"Explore our Platform",{"href":377,"dataGaName":368,"dataGaLocation":348},"/platform/",{"title":379,"description":380,"link":381},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":382,"config":383},"Meet GitLab Duo",{"href":384,"dataGaName":385,"dataGaLocation":348},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":387,"description":388,"link":389},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":390,"config":391},"Learn more",{"href":392,"dataGaName":393,"dataGaLocation":348},"/why-gitlab/","why gitlab",{"text":395,"left":325,"config":396,"menu":398},"Product",{"dataNavLevelOne":397},"solutions",{"type":399,"link":400,"columns":404,"feature":473},"lists",{"text":401,"config":402},"View all Solutions",{"href":403,"dataGaName":397,"dataGaLocation":348},"/solutions/",[405,429,452],{"title":406,"description":407,"link":408,"items":413},"Automation","CI/CD and automation to accelerate deployment",{"config":409},{"icon":410,"href":411,"dataGaName":412,"dataGaLocation":348},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[414,418,421,425],{"text":415,"config":416},"CI/CD",{"href":417,"dataGaLocation":348,"dataGaName":415},"/solutions/continuous-integration/",{"text":379,"config":419},{"href":384,"dataGaLocation":348,"dataGaName":420},"gitlab duo agent platform - product menu",{"text":422,"config":423},"Source Code Management",{"href":424,"dataGaLocation":348,"dataGaName":422},"/solutions/source-code-management/",{"text":426,"config":427},"Automated Software Delivery",{"href":411,"dataGaLocation":348,"dataGaName":428},"Automated software delivery",{"title":430,"description":431,"link":432,"items":437},"Security","Deliver code faster without compromising security",{"config":433},{"href":434,"dataGaName":435,"dataGaLocation":348,"icon":436},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[438,442,447],{"text":439,"config":440},"Application Security Testing",{"href":434,"dataGaName":441,"dataGaLocation":348},"Application security testing",{"text":443,"config":444},"Software Supply Chain Security",{"href":445,"dataGaLocation":348,"dataGaName":446},"/solutions/supply-chain/","Software supply chain security",{"text":448,"config":449},"Software Compliance",{"href":450,"dataGaName":451,"dataGaLocation":348},"/solutions/software-compliance/","software compliance",{"title":453,"link":454,"items":459},"Measurement",{"config":455},{"icon":456,"href":457,"dataGaName":458,"dataGaLocation":348},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[460,464,468],{"text":461,"config":462},"Visibility & Measurement",{"href":457,"dataGaLocation":348,"dataGaName":463},"Visibility and Measurement",{"text":465,"config":466},"Value Stream Management",{"href":467,"dataGaLocation":348,"dataGaName":465},"/solutions/value-stream-management/",{"text":469,"config":470},"Analytics & Insights",{"href":471,"dataGaLocation":348,"dataGaName":472},"/solutions/analytics-and-insights/","Analytics and insights",{"title":474,"type":399,"items":475},"GitLab for",[476,482,488],{"text":477,"config":478},"Enterprise",{"icon":479,"href":480,"dataGaLocation":348,"dataGaName":481},"Building","/enterprise/","enterprise",{"text":483,"config":484},"Small Business",{"icon":485,"href":486,"dataGaLocation":348,"dataGaName":487},"Work","/small-business/","small business",{"text":489,"config":490},"Public Sector",{"icon":491,"href":492,"dataGaLocation":348,"dataGaName":493},"Organization","/solutions/public-sector/","public sector",{"text":495,"config":496},"Pricing",{"href":497,"dataGaName":498,"dataGaLocation":348,"dataNavLevelOne":498},"/pricing/","pricing",{"text":500,"config":501,"menu":503},"Resources",{"dataNavLevelOne":502},"resources",{"type":399,"link":504,"columns":508,"feature":602},{"text":505,"config":506},"View all resources",{"href":507,"dataGaName":502,"dataGaLocation":348},"/resources/",[509,542,569],{"title":510,"items":511},"Getting started",[512,517,522,527,532,537],{"text":513,"config":514},"Install",{"href":515,"dataGaName":516,"dataGaLocation":348},"/install/","install",{"text":518,"config":519},"Quick start guides",{"href":520,"dataGaName":521,"dataGaLocation":348},"/get-started/","quick setup checklists",{"text":523,"config":524},"Learn",{"href":525,"dataGaLocation":348,"dataGaName":526},"https://university.gitlab.com/","learn",{"text":528,"config":529},"Product documentation",{"href":530,"dataGaName":531,"dataGaLocation":348},"https://docs.gitlab.com/","product documentation",{"text":533,"config":534},"Best practice videos",{"href":535,"dataGaName":536,"dataGaLocation":348},"/getting-started-videos/","best practice videos",{"text":538,"config":539},"Integrations",{"href":540,"dataGaName":541,"dataGaLocation":348},"/integrations/","integrations",{"title":543,"items":544},"Discover",[545,550,555,560,564],{"text":546,"config":547},"Customer success stories",{"href":548,"dataGaName":549,"dataGaLocation":348},"/customers/","customer success stories",{"text":551,"config":552},"Blog",{"href":553,"dataGaName":554,"dataGaLocation":348},"/blog/","blog",{"text":556,"config":557},"Demo Hub",{"href":558,"dataGaName":559,"dataGaLocation":348},"/demo-hub/","demo hub",{"text":561,"config":562},"The Source",{"href":563,"dataGaName":554,"dataGaLocation":348},"/the-source/",{"text":565,"config":566},"Remote",{"href":567,"dataGaName":568,"dataGaLocation":348},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":570,"items":571},"Connect",[572,577,582,587,592,597],{"text":573,"config":574},"GitLab Services",{"href":575,"dataGaName":576,"dataGaLocation":348},"/services/","services",{"text":578,"config":579},"Contribute",{"href":580,"dataGaName":581,"dataGaLocation":348},"https://contributors.gitlab.com","contribute",{"text":583,"config":584},"Community",{"href":585,"dataGaName":586,"dataGaLocation":348},"/community/","community",{"text":588,"config":589},"Forum",{"href":590,"dataGaName":591,"dataGaLocation":348},"https://forum.gitlab.com/","forum",{"text":593,"config":594},"Events",{"href":595,"dataGaName":596,"dataGaLocation":348},"/events/","events",{"text":598,"config":599},"Partners",{"href":600,"dataGaName":601,"dataGaLocation":348},"/partners/","partners",{"config":603,"title":606,"text":607,"link":608},{"background":604,"textColor":605},"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":609,"config":610},"Read the latest",{"href":611,"dataGaName":612,"dataGaLocation":348},"/whats-new/","whats new",{"text":614,"config":615,"menu":617},"Company",{"dataNavLevelOne":616},"company",{"type":399,"columns":618},[619],{"items":620},[621,626,632,634,639,644,649,654,659,664],{"text":622,"config":623},"About",{"href":624,"dataGaName":625,"dataGaLocation":348},"/company/","about",{"text":627,"config":628,"footerGa":631},"Jobs",{"href":629,"dataGaName":630,"dataGaLocation":348},"/jobs/","jobs",{"dataGaName":630},{"text":593,"config":633},{"href":595,"dataGaName":596,"dataGaLocation":348},{"text":635,"config":636},"Leadership",{"href":637,"dataGaName":638,"dataGaLocation":348},"/company/team/e-group/","leadership",{"text":640,"config":641},"Handbook",{"href":642,"dataGaName":643,"dataGaLocation":348},"https://handbook.gitlab.com/","handbook",{"text":645,"config":646},"Investor relations",{"href":647,"dataGaName":648,"dataGaLocation":348},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":650,"config":651},"Trust Center",{"href":652,"dataGaName":653,"dataGaLocation":348},"/security/","trust center",{"text":655,"config":656},"AI Transparency Center",{"href":657,"dataGaName":658,"dataGaLocation":348},"/ai-transparency-center/","ai transparency center",{"text":660,"config":661},"Newsletter",{"href":662,"dataGaName":663,"dataGaLocation":348},"/company/contact/#contact-forms","newsletter",{"text":665,"config":666},"Press",{"href":667,"dataGaName":668,"dataGaLocation":348},"/press/","press",{"text":670,"config":671,"menu":672},"Contact us",{"dataNavLevelOne":616},{"type":399,"columns":673},[674],{"items":675},[676,681,686],{"text":677,"config":678},"Talk to sales",{"href":679,"dataGaName":680,"dataGaLocation":348},"/sales/","talk to sales",{"text":682,"config":683},"Support portal",{"href":684,"dataGaName":685,"dataGaLocation":348},"https://support.gitlab.com/hc/en-us","support portal",{"text":687,"config":688},"Customer portal",{"href":689,"dataGaName":690,"dataGaLocation":348},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":692,"login":693,"suggestions":700},"Close",{"text":694,"link":695},"To search repositories and projects, login to",{"text":696,"config":697},"gitlab.com",{"href":362,"dataGaName":698,"dataGaLocation":699},"search login","search",{"text":701,"default":702},"Suggestions",[703,705,709,711,715,719],{"text":379,"config":704},{"href":384,"dataGaName":379,"dataGaLocation":699},{"text":706,"config":707},"Code Suggestions (AI)",{"href":708,"dataGaName":706,"dataGaLocation":699},"/solutions/code-suggestions/",{"text":415,"config":710},{"href":417,"dataGaName":415,"dataGaLocation":699},{"text":712,"config":713},"GitLab on AWS",{"href":714,"dataGaName":712,"dataGaLocation":699},"/partners/technology-partners/aws/",{"text":716,"config":717},"GitLab on Google Cloud",{"href":718,"dataGaName":716,"dataGaLocation":699},"/partners/technology-partners/google-cloud-platform/",{"text":720,"config":721},"Why GitLab?",{"href":392,"dataGaName":720,"dataGaLocation":699},{"freeTrial":723,"mobileIcon":728,"desktopIcon":733,"secondaryButton":736},{"text":724,"config":725},"Start free trial",{"href":726,"dataGaName":353,"dataGaLocation":727},"https://gitlab.com/-/trials/new/","nav",{"altText":729,"config":730},"Gitlab Icon",{"src":731,"dataGaName":732,"dataGaLocation":727},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":729,"config":734},{"src":735,"dataGaName":732,"dataGaLocation":727},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":737,"config":738},"Get Started",{"href":739,"dataGaName":740,"dataGaLocation":727},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":742,"mobileIcon":746,"desktopIcon":748},{"text":743,"config":744},"Learn more about GitLab Duo",{"href":384,"dataGaName":745,"dataGaLocation":727},"gitlab duo",{"altText":729,"config":747},{"src":731,"dataGaName":732,"dataGaLocation":727},{"altText":729,"config":749},{"src":735,"dataGaName":732,"dataGaLocation":727},{"button":751,"mobileIcon":756,"desktopIcon":758},{"text":752,"config":753},"/switch",{"href":754,"dataGaName":755,"dataGaLocation":727},"#contact","switch",{"altText":729,"config":757},{"src":731,"dataGaName":732,"dataGaLocation":727},{"altText":729,"config":759},{"src":760,"dataGaName":732,"dataGaLocation":727},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":762,"mobileIcon":767,"desktopIcon":769},{"text":763,"config":764},"Back to pricing",{"href":497,"dataGaName":765,"dataGaLocation":727,"icon":766},"back to pricing","GoBack",{"altText":729,"config":768},{"src":731,"dataGaName":732,"dataGaLocation":727},{"altText":729,"config":770},{"src":735,"dataGaName":732,"dataGaLocation":727},{"title":772,"titleMobile":773,"button":774,"config":779},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":390,"config":775},{"href":776,"dataGaName":777,"dataGaLocation":778},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":780,"disabled":322},"release",{"data":782},{"text":783,"source":784,"edit":790,"contribute":795,"config":800,"items":805,"minimal":1012},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":785,"config":786},"View page source",{"href":787,"dataGaName":788,"dataGaLocation":789},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":791,"config":792},"Edit this page",{"href":793,"dataGaName":794,"dataGaLocation":789},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":796,"config":797},"Please contribute",{"href":798,"dataGaName":799,"dataGaLocation":789},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":801,"facebook":802,"youtube":803,"linkedin":804},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[806,853,904,948,980],{"title":495,"links":807,"subMenu":822},[808,812,817],{"text":809,"config":810},"View plans",{"href":497,"dataGaName":811,"dataGaLocation":789},"view plans",{"text":813,"config":814},"Why Premium?",{"href":815,"dataGaName":816,"dataGaLocation":789},"/pricing/premium/","why premium",{"text":818,"config":819},"Why Ultimate?",{"href":820,"dataGaName":821,"dataGaLocation":789},"/pricing/ultimate/","why ultimate",[823],{"title":824,"links":825},"Contact Us",[826,829,831,833,838,843,848],{"text":827,"config":828},"Contact sales",{"href":679,"dataGaName":358,"dataGaLocation":789},{"text":682,"config":830},{"href":684,"dataGaName":685,"dataGaLocation":789},{"text":687,"config":832},{"href":689,"dataGaName":690,"dataGaLocation":789},{"text":834,"config":835},"Status",{"href":836,"dataGaName":837,"dataGaLocation":789},"https://status.gitlab.com/","status",{"text":839,"config":840},"Terms of use",{"href":841,"dataGaName":842,"dataGaLocation":789},"/terms/","terms of use",{"text":844,"config":845},"Privacy statement",{"href":846,"dataGaName":847,"dataGaLocation":789},"/privacy/","privacy statement",{"text":849,"config":850},"Cookie preferences",{"dataGaName":851,"dataGaLocation":789,"id":852,"isOneTrustButton":325},"cookie preferences","ot-sdk-btn",{"title":395,"links":854,"subMenu":863},[855,859],{"text":856,"config":857},"DevSecOps platform",{"href":377,"dataGaName":858,"dataGaLocation":789},"devsecops platform",{"text":860,"config":861},"AI-Assisted Development",{"href":384,"dataGaName":862,"dataGaLocation":789},"ai-assisted development",[864],{"title":865,"links":866},"Topics",[867,872,876,880,885,890,894,899],{"text":868,"config":869},"CICD",{"href":870,"dataGaName":871,"dataGaLocation":789},"/topics/ci-cd/","cicd",{"text":339,"config":873},{"href":874,"dataGaName":875,"dataGaLocation":789},"/topics/gitops/","gitops",{"text":337,"config":877},{"href":878,"dataGaName":879,"dataGaLocation":789},"/topics/devops/","devops",{"text":881,"config":882},"Version Control",{"href":883,"dataGaName":884,"dataGaLocation":789},"/topics/version-control/","version control",{"text":886,"config":887},"DevSecOps",{"href":888,"dataGaName":889,"dataGaLocation":789},"/topics/devsecops/","devsecops",{"text":891,"config":892},"Cloud Native",{"href":893,"dataGaName":338,"dataGaLocation":789},"/topics/cloud-native/",{"text":895,"config":896},"AI for Coding",{"href":897,"dataGaName":898,"dataGaLocation":789},"/topics/devops/ai-for-coding/","ai for coding",{"text":900,"config":901},"Agentic AI",{"href":902,"dataGaName":903,"dataGaLocation":789},"/topics/agentic-ai/","agentic ai",{"title":905,"links":906},"Solutions",[907,909,911,916,920,923,927,930,932,935,938,943],{"text":439,"config":908},{"href":434,"dataGaName":439,"dataGaLocation":789},{"text":428,"config":910},{"href":411,"dataGaName":412,"dataGaLocation":789},{"text":912,"config":913},"Agile development",{"href":914,"dataGaName":915,"dataGaLocation":789},"/solutions/agile-delivery/","agile delivery",{"text":917,"config":918},"SCM",{"href":424,"dataGaName":919,"dataGaLocation":789},"source code management",{"text":868,"config":921},{"href":417,"dataGaName":922,"dataGaLocation":789},"continuous integration & delivery",{"text":924,"config":925},"Value stream management",{"href":467,"dataGaName":926,"dataGaLocation":789},"value stream management",{"text":339,"config":928},{"href":929,"dataGaName":875,"dataGaLocation":789},"/solutions/gitops/",{"text":477,"config":931},{"href":480,"dataGaName":481,"dataGaLocation":789},{"text":933,"config":934},"Small business",{"href":486,"dataGaName":487,"dataGaLocation":789},{"text":936,"config":937},"Public sector",{"href":492,"dataGaName":493,"dataGaLocation":789},{"text":939,"config":940},"Education",{"href":941,"dataGaName":942,"dataGaLocation":789},"/solutions/education/","education",{"text":944,"config":945},"Financial services",{"href":946,"dataGaName":947,"dataGaLocation":789},"/solutions/finance/","financial services",{"title":500,"links":949},[950,952,954,956,959,961,964,966,968,970,972,974,976,978],{"text":513,"config":951},{"href":515,"dataGaName":516,"dataGaLocation":789},{"text":518,"config":953},{"href":520,"dataGaName":521,"dataGaLocation":789},{"text":523,"config":955},{"href":525,"dataGaName":526,"dataGaLocation":789},{"text":528,"config":957},{"href":530,"dataGaName":958,"dataGaLocation":789},"docs",{"text":551,"config":960},{"href":553,"dataGaName":554,"dataGaLocation":789},{"text":962,"config":963},"What's new",{"href":611,"dataGaName":612,"dataGaLocation":789},{"text":546,"config":965},{"href":548,"dataGaName":549,"dataGaLocation":789},{"text":565,"config":967},{"href":567,"dataGaName":568,"dataGaLocation":789},{"text":573,"config":969},{"href":575,"dataGaName":576,"dataGaLocation":789},{"text":578,"config":971},{"href":580,"dataGaName":581,"dataGaLocation":789},{"text":583,"config":973},{"href":585,"dataGaName":586,"dataGaLocation":789},{"text":588,"config":975},{"href":590,"dataGaName":591,"dataGaLocation":789},{"text":593,"config":977},{"href":595,"dataGaName":596,"dataGaLocation":789},{"text":598,"config":979},{"href":600,"dataGaName":601,"dataGaLocation":789},{"title":614,"links":981},[982,984,986,988,990,992,996,1001,1003,1005,1007],{"text":622,"config":983},{"href":624,"dataGaName":616,"dataGaLocation":789},{"text":627,"config":985},{"href":629,"dataGaName":630,"dataGaLocation":789},{"text":635,"config":987},{"href":637,"dataGaName":638,"dataGaLocation":789},{"text":640,"config":989},{"href":642,"dataGaName":643,"dataGaLocation":789},{"text":645,"config":991},{"href":647,"dataGaName":648,"dataGaLocation":789},{"text":993,"config":994},"Sustainability",{"href":995,"dataGaName":993,"dataGaLocation":789},"/sustainability/",{"text":997,"config":998},"Diversity, inclusion and belonging (DIB)",{"href":999,"dataGaName":1000,"dataGaLocation":789},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":650,"config":1002},{"href":652,"dataGaName":653,"dataGaLocation":789},{"text":660,"config":1004},{"href":662,"dataGaName":663,"dataGaLocation":789},{"text":665,"config":1006},{"href":667,"dataGaName":668,"dataGaLocation":789},{"text":1008,"config":1009},"Modern Slavery Transparency Statement",{"href":1010,"dataGaName":1011,"dataGaLocation":789},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1013},[1014,1017,1020],{"text":1015,"config":1016},"Terms",{"href":841,"dataGaName":842,"dataGaLocation":789},{"text":1018,"config":1019},"Cookies",{"dataGaName":851,"dataGaLocation":789,"id":852,"isOneTrustButton":325},{"text":1021,"config":1022},"Privacy",{"href":846,"dataGaName":847,"dataGaLocation":789},[1024],{"id":1025,"title":7,"body":321,"config":1026,"content":1028,"description":321,"extension":1032,"meta":1033,"navigation":325,"path":1034,"seo":1035,"stem":1036,"__hash__":1037},"blogAuthors/en-us/blog/authors/sri-rangan.yml",{"template":1027},"BlogAuthor",{"name":7,"config":1029},{"headshot":1030,"ctfId":1031},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749665808/Blog/Author%20Headshots/sri19-headshot.jpg","sri19","yml",{},"/en-us/blog/authors/sri-rangan",{},"en-us/blog/authors/sri-rangan","8W_SpY7jE_vA0lcEMcbOoIkJ6ZG5S1rVtrkXj5NdXv0",[1039,1048,1056],{"title":1040,"description":1041,"heroImage":1042,"category":317,"date":1043,"authors":1044,"slug":1047,"externalUrl":321},"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",[1045,1046],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1049,"description":1050,"heroImage":1051,"category":317,"date":1052,"authors":1053,"slug":1055,"externalUrl":321},"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",[1054],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1057,"description":1058,"heroImage":1059,"category":317,"date":1060,"authors":1061,"slug":1063,"externalUrl":321},"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",[1062],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1065},[1066,1080,1092,1104],{"id":1067,"categories":1068,"header":1070,"text":1071,"button":1072,"image":1077},"ai-modernization",[1069],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1073,"config":1074},"Get your AI maturity score",{"href":1075,"dataGaName":1076,"dataGaLocation":554},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1078},{"src":1079},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1081,"categories":1082,"header":1084,"text":1071,"button":1085,"image":1089},"devops-modernization",[1083,889],"product","Are you just managing tools or shipping innovation?",{"text":1086,"config":1087},"Get your DevOps maturity score",{"href":1088,"dataGaName":1076,"dataGaLocation":554},"/assessments/devops-modernization-assessment/",{"config":1090},{"src":1091},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1093,"categories":1094,"header":1096,"text":1071,"button":1097,"image":1101},"security-modernization",[1095],"security","Are you trading speed for security?",{"text":1098,"config":1099},"Get your security maturity score",{"href":1100,"dataGaName":1076,"dataGaLocation":554},"/assessments/security-modernization-assessment/",{"config":1102},{"src":1103},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1105,"paths":1106,"header":1109,"text":1110,"button":1111,"image":1116},"github-azure-migration",[1107,1108],"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":1112,"config":1113},"See how GitLab compares to GitHub",{"href":1114,"dataGaName":1115,"dataGaLocation":554},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1117},{"src":1091},{"header":1119,"blurb":1120,"button":1121,"secondaryButton":1126},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1122,"config":1123},"Get your free trial",{"href":1124,"dataGaName":353,"dataGaLocation":1125},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":827,"config":1127},{"href":679,"dataGaName":358,"dataGaLocation":1125},1786803764634]