[{"data":1,"prerenderedAt":791},["ShallowReactive",2],{"/en-us/topics/gitops/gitlab-enables-infrastructure-as-code/":3,"navigation-en-us":122,"banner-en-us":551,"footer-en-us":568,"next-steps-en-us":776},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":13,"_id":116,"_type":117,"title":7,"_source":118,"_file":119,"_stem":120,"_extension":121},"/en-us/topics/gitops/gitlab-enables-infrastructure-as-code","gitops",false,"",{"title":9,"ogTitle":6,"description":10,"ogDescription":10,"config":11},"How teams use GitLab and Terraform for infrastructure as code: A demo","Learn how to follow GitOps proceedure and deploy infrastructure as code using Terraform automation and GitLab as your single source of truth. Watch the demo!",{"ignoreTitleCharLimit":12},true,[14,28,34,92,114],{"type":15,"componentName":15,"componentContent":16},"CommonBreadcrumbs",{"crumbs":17},[18,22,26],{"title":19,"config":20},"Topics",{"href":21},"/topics/",{"title":23,"config":24},"GitOps",{"href":25},"/topics/gitops/",{"title":27},"Gitlab enables infrastructure as code",{"type":29,"componentName":29,"componentContent":30},"CommonArticleHero",{"title":9,"text":31,"config":32},"This demo demonstrates how to follow good GitOps procedure to deploy infrastructure as code using Terraform for automation and GitLab as the single source of truth.\n",{"id":33,"twoColumns":6},"how-teams-use-gitlab-and-terraform-for-infrastructure-as-code:-a-demo",{"type":35,"componentName":35,"componentContent":36},"CommonSideNavigationWithTree",{"anchors":37,"components":60},{"text":38,"data":39},"More on this topic",[40,44,48,52,56],{"text":41,"config":42},"Learn how GitLab enables infrastructure as code",{"href":43},"#learn-how-git-lab-enables-infrastructure-as-code",{"text":45,"config":46},"Building your infrastructure as code in GitLab",{"href":47},"#building-your-infrastructure-as-code-in-git-lab",{"text":49,"config":50},"Inside the infrastructure subgroup",{"href":51},"#inside-the-infrastructure-subgroup",{"text":53,"config":54},"Deploying code using GitLab CI",{"href":55},"#deploying-code-using-git-lab-ci",{"text":57,"config":58},"Ready to learn more about GitOps?",{"href":59},"#ready-to-learn-more-about-git-ops",[61,67,72,77,82,87],{"type":62,"componentName":62,"componentContent":63},"TopicsCopy",{"text":64,"config":65,"header":66},"Infrastructure as Code (IaC) is the practice of managing and provisioning computing infrastructure—such as servers, databases, and networking—through machine-readable configuration files, rather than manual processes. By defining infrastructure in code, teams can version control, test, and automate deployments in a consistent and repeatable way, just like they do with application code.\n\nIaC enables faster delivery, reduces configuration drift, and improves collaboration across development, operations, and security teams. When paired with Git-based workflows like GitOps, IaC becomes a foundation for scalable and secure cloud infrastructure automation.\n\nWhen multiple teams use a Git repository as the single source of truth for all [infrastructure](/blog/using-ansible-and-gitlab-as-infrastructure-for-code/){data-ga-name=\"infrastructure\" data-ga-location=\"body\"} and application deployment code, they’re performing a good GitOps procedure. Infrastructure teams can collaborate and deploy code to multiple cloud services using Terraform for automation. This article demonstrates how teams can create a Kubernetes cluster by collaborating with teammates within GitLab.\n",{"id":7},"What is infrastructure as code?",{"type":62,"componentName":62,"componentContent":68},{"header":41,"text":69,"config":70},"This demo demonstrates how to follow good GitOps procedure to deploy infrastructure as code using Terraform for automation and GitLab as the single source of truth (and CI).\n",{"id":71},"learn-how-git-lab-enables-infrastructure-as-code",{"type":62,"componentName":62,"componentContent":73},{"header":45,"text":74,"config":75},"### Getting started\n\n_This [gitops-demo group](https://gitlab.com/gitops-demo) illustrates the steps infra teams can follow._\n\nBegin by logging into the group where the project lives within GitLab. The next step is to open the [README.md](https://gitlab.com/gitops-demo/readme/blob/master/README.md) file, which shows the underlying structure of the gitops-demo group. There are a few individual projects and two subgroups: **[infrastructure](https://gitlab.com/gitops-demo/infra)** and **[applications](https://gitlab.com/gitops-demo/apps)**.\n",{"id":76},"building-your-infrastructure-as-code-in-git-lab",{"type":62,"componentName":62,"componentContent":78},{"header":49,"text":79,"config":80},"There is a separate repository for each cloud: Azure, GCP, and AWS, and a repository for templates.\nSimilar files can be found in all three [cloud](/blog/gitlab-ci-cd-is-for-multi-cloud/){data-ga-name=\"cloud\" data-ga-location=\"body\"} repositories. All of the files are written in Terraform to automate the deployment process, while a `gitlab-ci.yml` file is also stored in the repository to provide instructions for automation.\n\n### The backend file\n\nUsing HashiCorp's [Terraform Cloud Service](https://www.hashicorp.com/blog/announcing-terraform-cloud) as a remote location for the state file keeps the state file safe and in a central location so it can be accessed by any process. One advantage of using Terraform Cloud is it has the ability to lock the state to ensure only one job can run at a time, preventing multiple jobs from making conflicting changes. The code stores the state files in the [Terraform Cloud](https://app.terraform.io) in an organization called `gitops-demo` in a workspace called `aws`. This keeps the running state in the cloud provider, so any team member has access at any time.\n\n```\nterraform {\n  backend \"remote\" {\n    hostname     = \"app.terraform.io\"\n    organization = \"gitops-demo\"\n    workspaces {\n      name = \"aws\"\n    }\n  }\n}\n\n```\n{: .language-ruby}\n\n### EKS.tf file\n\nThe EKS is another Terraform file that leverages the EKS module for the Terraform cluster. Teams can define parameters such as the type of subnets and the number of nodes in the EKS terraform file.\n\n```\nmodule \"eks\" {\n  source           = \"terraform-aws-modules/eks/aws\"\n  cluster_name     = \"gitops-demo-eks\"\n  subnets          = \"${module.vpc.public_subnets}\"\n  write_kubeconfig = \"false\"\n  tags = {\n    Terraform   = \"true\"\n    Environment = \"dev\"\n  }\n  vpc_id = \"${module.vpc.vpc_id}\"\n  worker_groups = [\n    {\n      instance_type = \"m4.large\"\n      asg_max_size  = 5\n      tags = [{\n        key                 = \"Terraform\"\n        value               = \"true\"\n        propagate_at_launch = true\n      }]\n    }\n  ]\n}\n```\n{: .language-ruby}\n\n### Define the GitLab admin\n\nThe Kubernetes provider can be used to create a GitLab admin user and set up [automatically as code and managed by Terraform](https://gitlab.com/gitops-demo/infra/aws/blob/master/gitlab-admin.tf).\n\n### Register the cluster with GitLab\n\nNow that a Kubernetes cluster has been created, it's time to register it with GitLab in order to deploy more code to the cluster in the future. The first step is to use the GitLab provider to create a group cluster named AWS cluster.\n\n```\ndata \"gitlab_group\" \"gitops-demo-apps\" {\n  full_path = \"gitops-demo/apps\"\n}\nprovider \"gitlab\" {\n  alias   = \"use-pre-release-plugin\"\n  version = \"v2.99.0\"\n}\nresource \"gitlab_group_cluster\" \"aws_cluster\" {\n  provider           = \"gitlab.use-pre-release-plugin\"\n  group              = \"${data.gitlab_group.gitops-demo-apps.id}\"\n  name               = \"${module.eks.cluster_id}\"\n  domain             = \"eks.gitops-demo.com\"\n  environment_scope  = \"eks/*\"\n  kubernetes_api_url = \"${module.eks.cluster_endpoint}\"\n  kubernetes_token   = \"${data.kubernetes_secret.gitlab-admin-token.data.token}\"\n  kubernetes_ca_cert = \"${trimspace(base64decode(module.eks.cluster_certificate_authority_data))}\"\n}\n```\n{: .language-ruby}\n\nThe code contains the domain name, environment scope, and Kubernetes credentials.\n\nAfter this runs, the cluster will be created in AWS and automatically registered to the [gitops-demo/apps](https://gitlab.com/gitops-demo/apps) group.\n",{"id":81},"inside-the-infrastructure-subgroup",{"type":62,"componentName":62,"componentContent":83},{"header":53,"text":84,"config":85},"### Terraform template\n\nReturn to the infrastructure group and open the Templates folder. When looking at the [terraform.gitlab-ci.yml file](https://gitlab.com/gitops-demo/infra/templates/blob/master/terraform.gitlab-ci.yml), it's possible to see how the CI works to deploy infrastructure code to the cloud using Terraform.\n\nInside the CI file, teams can see a few different stages: validate, plan, apply, and destroy. Using Hashicorp's Terraform base image, users can run different tasks.\n\nThe first step is to initialize Terraform.\n\n```\nbefore_script:\n  - terraform --version\n  - terraform init\n  - apk add --update curl\n  - curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.13.7/2019-06-11/bin/linux/amd64/kubectl\n  - install kubectl /usr/local/bin/ && rm kubectl\n  - curl -o aws-iam-authenticator https://amazon-eks.s3-us-west-2.amazonaws.com/1.13.7/2019-06-11/bin/linux/amd64/aws-iam-authenticator\n  - install aws-iam-authenticator /usr/local/bin/ && rm aws-iam-authenticator\n```\n{: .language-ruby}\n\nThe next step is to validate that everything is correct.\n\n```\nvalidate:\n  stage: validate\n  script:\n    - terraform validate\n    - terraform fmt -check=true\n  only:\n    - branches\n```\n{: .language-ruby}\n\nIt's important to remember that good GitOps workflows incorporate creating a [merge request](/blog/mr-reviews-with-vs-code/){data-ga-name=\"merge request\" data-ga-location=\"body\"} for the changes.\n\n```\nmerge review:\n  stage: plan\n  script:\n    - terraform plan -out=$PLAN\n    - echo \\`\\`\\`diff > plan.txt\n    - terraform show -no-color ${PLAN} | tee -a plan.txt\n    - echo \\`\\`\\` >> plan.txt\n    - sed -i -e 's/  +/+/g' plan.txt\n    - sed -i -e 's/  ~/~/g' plan.txt\n    - sed -i -e 's/  -/-/g' plan.txt\n    - MESSAGE=$(cat plan.txt)\n    - >-\n      curl -X POST -g -H \"PRIVATE-TOKEN: ${GITLAB_TOKEN}\"\n      --data-urlencode \"body=${MESSAGE}\"\n      \"${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}/discussions\"\n  artifacts:\n    name: plan\n    paths:\n      - $PLAN\n  only:\n    - merge_requests\n```\n{: .language-ruby}\n\n### The merge request\n\nThe [merge request (MR)](https://gitlab.com/gitops-demo/infra/aws/merge_requests/6){data-ga-name=\"MR\" data-ga-location=\"body\"} is the most important step in GitOps. This is the process to review all changes and see the impact of those changes. The MR is also a [collaboration tool](/blog/merge-request-reviewers/){data-ga-name=\"collaboration tool\" data-ga-location=\"body\"} where team members can discuss changes and stakeholders can approve changes before the final merge into the main branch.\n\nThe merge request defines what will happen when running the infrastructure as code. After the MR is created, the Terraform plan is uploaded to the MR. After all changes have been reviewed and approved, the code can be merged to the main branch. Once the code changes are merged, all the changes will be deployed into production.\n",{"id":86},"deploying-code-using-git-lab-ci",{"type":62,"componentName":62,"componentContent":88},{"header":57,"text":89,"config":90},"* [What does infrastructure as code mean?](/topics/gitops/infrastructure-as-code/){data-ga-name=\"infrastructure as code\" data-ga-location=\"body\"}\n* [What is GitOps](/topics/gitops/){data-ga-name=\"what is gitops\" data-ga-location=\"body\"}\n* [Learn how GitLab streamlines GitOps workflows](/solutions/gitops/){data-ga-name=\"streamlines workflows\" data-ga-location=\"body\"}\n* [Discover the future of GitOps from industry leaders](/why/gitops-infrastructure-automation/){data-ga-name=\"industry leaders\" data-ga-location=\"body\"}\n* [Read the beginner's guide to GitOps](https://page.gitlab.com/resources-ebook-beginner-guide-gitops.html)\n",{"id":91},"ready-to-learn-more-about-git-ops",{"type":93,"componentName":93,"componentContent":94},"CommonFaq",{"header":95,"groups":96},"Frequently Asked Questions",[97],{"questions":98},[99,102,105,108,111],{"question":100,"answer":101},"What is infrastructure as code and how does it work with GitLab and Terraform?","Infrastructure as code automates IT infrastructure provisioning by using configuration files instead of manual server management. Teams use Terraform for automation while GitLab serves as the single source of truth for version control. This approach ensures the same infrastructure environment deploys each time, eliminating inconsistent configurations across machines.",{"answer":103,"question":104},"Teams collaborate through merge requests where they can review, comment, and suggest changes to infrastructure code. Merge requests serve as the change mechanism for infrastructure updates, providing collaboration tools for discussion and stakeholder approval. Once approved, code merges to the main branch and acts as an audit log for all changes.","How do teams collaborate on infrastructure changes using GitLab and Terraform workflows?",{"question":106,"answer":107},"What are the main benefits of using GitOps workflows for infrastructure management?","GitOps workflows increase efficiency, collaboration, and stability by replacing manual processes with automated configuration file deployment. Teams gain increased visibility into infrastructure changes, consistent deployments across environments, improved stability through version control, and better scalability compared to traditional manual server management approaches.",{"answer":109,"question":110},"CI/CD pipelines automate infrastructure management using Git workflows with continuous integration and deployment. After code merges to the main branch, pipelines initiate changes in the environment using Terraform. The automation overwrites manual changes and prevents configuration drift, ensuring environments always deploy the consistent desired state defined in code.","How do CI/CD pipelines work with Terraform to deploy infrastructure changes?",{"question":112,"answer":113},"What is the role of merge requests in GitOps infrastructure workflows?","Merge requests are the most important step in GitOps, serving as the process to review all infrastructure changes and see their impact. They provide collaboration tools where team members can discuss modifications and stakeholders can approve changes before final merge. Merge requests define what happens when running infrastructure as code and include built-in rollback features.",{"type":115,"componentName":115},"CommonNextSteps","content:en-us:topics:gitops:gitlab-enables-infrastructure-as-code:index.yml","yaml","content","en-us/topics/gitops/gitlab-enables-infrastructure-as-code/index.yml","en-us/topics/gitops/gitlab-enables-infrastructure-as-code/index","yml",{"_path":123,"_dir":124,"_draft":6,"_partial":6,"_locale":7,"data":125,"_id":547,"_type":117,"title":548,"_source":118,"_file":549,"_stem":550,"_extension":121},"/shared/en-us/main-navigation","en-us",{"logo":126,"freeTrial":131,"sales":136,"login":141,"items":146,"search":478,"minimal":509,"duo":528,"pricingDeployment":537},{"config":127},{"href":128,"dataGaName":129,"dataGaLocation":130},"/","gitlab logo","header",{"text":132,"config":133},"Get free trial",{"href":134,"dataGaName":135,"dataGaLocation":130},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":137,"config":138},"Talk to sales",{"href":139,"dataGaName":140,"dataGaLocation":130},"/sales/","sales",{"text":142,"config":143},"Sign in",{"href":144,"dataGaName":145,"dataGaLocation":130},"https://gitlab.com/users/sign_in/","sign in",[147,191,288,293,399,459],{"text":148,"config":149,"cards":151,"footer":174},"Platform",{"dataNavLevelOne":150},"platform",[152,158,166],{"title":148,"description":153,"link":154},"The most comprehensive AI-powered DevSecOps Platform",{"text":155,"config":156},"Explore our Platform",{"href":157,"dataGaName":150,"dataGaLocation":130},"/platform/",{"title":159,"description":160,"link":161},"GitLab Duo (AI)","Build software faster with AI at every stage of development",{"text":162,"config":163},"Meet GitLab Duo",{"href":164,"dataGaName":165,"dataGaLocation":130},"/gitlab-duo/","gitlab duo ai",{"title":167,"description":168,"link":169},"Why GitLab","10 reasons why Enterprises choose GitLab",{"text":170,"config":171},"Learn more",{"href":172,"dataGaName":173,"dataGaLocation":130},"/why-gitlab/","why gitlab",{"title":175,"items":176},"Get started with",[177,182,187],{"text":178,"config":179},"Platform Engineering",{"href":180,"dataGaName":181,"dataGaLocation":130},"/solutions/platform-engineering/","platform engineering",{"text":183,"config":184},"Developer Experience",{"href":185,"dataGaName":186,"dataGaLocation":130},"/developer-experience/","Developer experience",{"text":188,"config":189},"MLOps",{"href":190,"dataGaName":188,"dataGaLocation":130},"/topics/devops/the-role-of-ai-in-devops/",{"text":192,"left":12,"config":193,"link":195,"lists":199,"footer":270},"Product",{"dataNavLevelOne":194},"solutions",{"text":196,"config":197},"View all Solutions",{"href":198,"dataGaName":194,"dataGaLocation":130},"/solutions/",[200,225,249],{"title":201,"description":202,"link":203,"items":208},"Automation","CI/CD and automation to accelerate deployment",{"config":204},{"icon":205,"href":206,"dataGaName":207,"dataGaLocation":130},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[209,213,217,221],{"text":210,"config":211},"CI/CD",{"href":212,"dataGaLocation":130,"dataGaName":210},"/solutions/continuous-integration/",{"text":214,"config":215},"AI-Assisted Development",{"href":164,"dataGaLocation":130,"dataGaName":216},"AI assisted development",{"text":218,"config":219},"Source Code Management",{"href":220,"dataGaLocation":130,"dataGaName":218},"/solutions/source-code-management/",{"text":222,"config":223},"Automated Software Delivery",{"href":206,"dataGaLocation":130,"dataGaName":224},"Automated software delivery",{"title":226,"description":227,"link":228,"items":233},"Security","Deliver code faster without compromising security",{"config":229},{"href":230,"dataGaName":231,"dataGaLocation":130,"icon":232},"/solutions/security-compliance/","security and compliance","ShieldCheckLight",[234,239,244],{"text":235,"config":236},"Application Security Testing",{"href":237,"dataGaName":238,"dataGaLocation":130},"/solutions/application-security-testing/","Application security testing",{"text":240,"config":241},"Software Supply Chain Security",{"href":242,"dataGaLocation":130,"dataGaName":243},"/solutions/supply-chain/","Software supply chain security",{"text":245,"config":246},"Software Compliance",{"href":247,"dataGaName":248,"dataGaLocation":130},"/solutions/software-compliance/","software compliance",{"title":250,"link":251,"items":256},"Measurement",{"config":252},{"icon":253,"href":254,"dataGaName":255,"dataGaLocation":130},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[257,261,265],{"text":258,"config":259},"Visibility & Measurement",{"href":254,"dataGaLocation":130,"dataGaName":260},"Visibility and Measurement",{"text":262,"config":263},"Value Stream Management",{"href":264,"dataGaLocation":130,"dataGaName":262},"/solutions/value-stream-management/",{"text":266,"config":267},"Analytics & Insights",{"href":268,"dataGaLocation":130,"dataGaName":269},"/solutions/analytics-and-insights/","Analytics and insights",{"title":271,"items":272},"GitLab for",[273,278,283],{"text":274,"config":275},"Enterprise",{"href":276,"dataGaLocation":130,"dataGaName":277},"/enterprise/","enterprise",{"text":279,"config":280},"Small Business",{"href":281,"dataGaLocation":130,"dataGaName":282},"/small-business/","small business",{"text":284,"config":285},"Public Sector",{"href":286,"dataGaLocation":130,"dataGaName":287},"/solutions/public-sector/","public sector",{"text":289,"config":290},"Pricing",{"href":291,"dataGaName":292,"dataGaLocation":130,"dataNavLevelOne":292},"/pricing/","pricing",{"text":294,"config":295,"link":297,"lists":301,"feature":386},"Resources",{"dataNavLevelOne":296},"resources",{"text":298,"config":299},"View all resources",{"href":300,"dataGaName":296,"dataGaLocation":130},"/resources/",[302,335,358],{"title":303,"items":304},"Getting started",[305,310,315,320,325,330],{"text":306,"config":307},"Install",{"href":308,"dataGaName":309,"dataGaLocation":130},"/install/","install",{"text":311,"config":312},"Quick start guides",{"href":313,"dataGaName":314,"dataGaLocation":130},"/get-started/","quick setup checklists",{"text":316,"config":317},"Learn",{"href":318,"dataGaLocation":130,"dataGaName":319},"https://university.gitlab.com/","learn",{"text":321,"config":322},"Product documentation",{"href":323,"dataGaName":324,"dataGaLocation":130},"https://docs.gitlab.com/","product documentation",{"text":326,"config":327},"Best practice videos",{"href":328,"dataGaName":329,"dataGaLocation":130},"/getting-started-videos/","best practice videos",{"text":331,"config":332},"Integrations",{"href":333,"dataGaName":334,"dataGaLocation":130},"/integrations/","integrations",{"title":336,"items":337},"Discover",[338,343,348,353],{"text":339,"config":340},"Customer success stories",{"href":341,"dataGaName":342,"dataGaLocation":130},"/customers/","customer success stories",{"text":344,"config":345},"Blog",{"href":346,"dataGaName":347,"dataGaLocation":130},"/blog/","blog",{"text":349,"config":350},"Remote",{"href":351,"dataGaName":352,"dataGaLocation":130},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":354,"config":355},"TeamOps",{"href":356,"dataGaName":357,"dataGaLocation":130},"/teamops/","teamops",{"title":359,"items":360},"Connect",[361,366,371,376,381],{"text":362,"config":363},"GitLab Services",{"href":364,"dataGaName":365,"dataGaLocation":130},"/services/","services",{"text":367,"config":368},"Community",{"href":369,"dataGaName":370,"dataGaLocation":130},"/community/","community",{"text":372,"config":373},"Forum",{"href":374,"dataGaName":375,"dataGaLocation":130},"https://forum.gitlab.com/","forum",{"text":377,"config":378},"Events",{"href":379,"dataGaName":380,"dataGaLocation":130},"/events/","events",{"text":382,"config":383},"Partners",{"href":384,"dataGaName":385,"dataGaLocation":130},"/partners/","partners",{"backgroundColor":387,"textColor":388,"text":389,"image":390,"link":394},"#2f2a6b","#fff","Insights for the future of software development",{"altText":391,"config":392},"the source promo card",{"src":393},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":395,"config":396},"Read the latest",{"href":397,"dataGaName":398,"dataGaLocation":130},"/the-source/","the source",{"text":400,"config":401,"lists":403},"Company",{"dataNavLevelOne":402},"company",[404],{"items":405},[406,411,417,419,424,429,434,439,444,449,454],{"text":407,"config":408},"About",{"href":409,"dataGaName":410,"dataGaLocation":130},"/company/","about",{"text":412,"config":413,"footerGa":416},"Jobs",{"href":414,"dataGaName":415,"dataGaLocation":130},"/jobs/","jobs",{"dataGaName":415},{"text":377,"config":418},{"href":379,"dataGaName":380,"dataGaLocation":130},{"text":420,"config":421},"Leadership",{"href":422,"dataGaName":423,"dataGaLocation":130},"/company/team/e-group/","leadership",{"text":425,"config":426},"Team",{"href":427,"dataGaName":428,"dataGaLocation":130},"/company/team/","team",{"text":430,"config":431},"Handbook",{"href":432,"dataGaName":433,"dataGaLocation":130},"https://handbook.gitlab.com/","handbook",{"text":435,"config":436},"Investor relations",{"href":437,"dataGaName":438,"dataGaLocation":130},"https://ir.gitlab.com/","investor relations",{"text":440,"config":441},"Trust Center",{"href":442,"dataGaName":443,"dataGaLocation":130},"/security/","trust center",{"text":445,"config":446},"AI Transparency Center",{"href":447,"dataGaName":448,"dataGaLocation":130},"/ai-transparency-center/","ai transparency center",{"text":450,"config":451},"Newsletter",{"href":452,"dataGaName":453,"dataGaLocation":130},"/company/contact/","newsletter",{"text":455,"config":456},"Press",{"href":457,"dataGaName":458,"dataGaLocation":130},"/press/","press",{"text":460,"config":461,"lists":462},"Contact us",{"dataNavLevelOne":402},[463],{"items":464},[465,468,473],{"text":137,"config":466},{"href":139,"dataGaName":467,"dataGaLocation":130},"talk to sales",{"text":469,"config":470},"Get help",{"href":471,"dataGaName":472,"dataGaLocation":130},"/support/","get help",{"text":474,"config":475},"Customer portal",{"href":476,"dataGaName":477,"dataGaLocation":130},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":479,"login":480,"suggestions":487},"Close",{"text":481,"link":482},"To search repositories and projects, login to",{"text":483,"config":484},"gitlab.com",{"href":144,"dataGaName":485,"dataGaLocation":486},"search login","search",{"text":488,"default":489},"Suggestions",[490,492,496,498,502,506],{"text":159,"config":491},{"href":164,"dataGaName":159,"dataGaLocation":486},{"text":493,"config":494},"Code Suggestions (AI)",{"href":495,"dataGaName":493,"dataGaLocation":486},"/solutions/code-suggestions/",{"text":210,"config":497},{"href":212,"dataGaName":210,"dataGaLocation":486},{"text":499,"config":500},"GitLab on AWS",{"href":501,"dataGaName":499,"dataGaLocation":486},"/partners/technology-partners/aws/",{"text":503,"config":504},"GitLab on Google Cloud",{"href":505,"dataGaName":503,"dataGaLocation":486},"/partners/technology-partners/google-cloud-platform/",{"text":507,"config":508},"Why GitLab?",{"href":172,"dataGaName":507,"dataGaLocation":486},{"freeTrial":510,"mobileIcon":515,"desktopIcon":520,"secondaryButton":523},{"text":511,"config":512},"Start free trial",{"href":513,"dataGaName":135,"dataGaLocation":514},"https://gitlab.com/-/trials/new/","nav",{"altText":516,"config":517},"Gitlab Icon",{"src":518,"dataGaName":519,"dataGaLocation":514},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":516,"config":521},{"src":522,"dataGaName":519,"dataGaLocation":514},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":524,"config":525},"Get Started",{"href":526,"dataGaName":527,"dataGaLocation":514},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/compare/gitlab-vs-github/","get started",{"freeTrial":529,"mobileIcon":533,"desktopIcon":535},{"text":530,"config":531},"Learn more about GitLab Duo",{"href":164,"dataGaName":532,"dataGaLocation":514},"gitlab duo",{"altText":516,"config":534},{"src":518,"dataGaName":519,"dataGaLocation":514},{"altText":516,"config":536},{"src":522,"dataGaName":519,"dataGaLocation":514},{"freeTrial":538,"mobileIcon":543,"desktopIcon":545},{"text":539,"config":540},"Back to pricing",{"href":291,"dataGaName":541,"dataGaLocation":514,"icon":542},"back to pricing","GoBack",{"altText":516,"config":544},{"src":518,"dataGaName":519,"dataGaLocation":514},{"altText":516,"config":546},{"src":522,"dataGaName":519,"dataGaLocation":514},"content:shared:en-us:main-navigation.yml","Main Navigation","shared/en-us/main-navigation.yml","shared/en-us/main-navigation",{"_path":552,"_dir":124,"_draft":6,"_partial":6,"_locale":7,"title":553,"button":554,"image":559,"config":563,"_id":565,"_type":117,"_source":118,"_file":566,"_stem":567,"_extension":121},"/shared/en-us/banner","is now in public beta!",{"text":555,"config":556},"Try the Beta",{"href":557,"dataGaName":558,"dataGaLocation":130},"/gitlab-duo/agent-platform/","duo banner",{"altText":560,"config":561},"GitLab Duo Agent Platform",{"src":562},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1753720689/somrf9zaunk0xlt7ne4x.svg",{"layout":564},"release","content:shared:en-us:banner.yml","shared/en-us/banner.yml","shared/en-us/banner",{"_path":569,"_dir":124,"_draft":6,"_partial":6,"_locale":7,"data":570,"_id":772,"_type":117,"title":773,"_source":118,"_file":774,"_stem":775,"_extension":121},"/shared/en-us/main-footer",{"text":571,"source":572,"edit":578,"contribute":583,"config":588,"items":593,"minimal":764},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":573,"config":574},"View page source",{"href":575,"dataGaName":576,"dataGaLocation":577},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":579,"config":580},"Edit this page",{"href":581,"dataGaName":582,"dataGaLocation":577},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":584,"config":585},"Please contribute",{"href":586,"dataGaName":587,"dataGaLocation":577},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":589,"facebook":590,"youtube":591,"linkedin":592},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[594,617,671,700,734],{"title":148,"links":595,"subMenu":600},[596],{"text":597,"config":598},"DevSecOps platform",{"href":157,"dataGaName":599,"dataGaLocation":577},"devsecops platform",[601],{"title":289,"links":602},[603,607,612],{"text":604,"config":605},"View plans",{"href":291,"dataGaName":606,"dataGaLocation":577},"view plans",{"text":608,"config":609},"Why Premium?",{"href":610,"dataGaName":611,"dataGaLocation":577},"/pricing/premium/","why premium",{"text":613,"config":614},"Why Ultimate?",{"href":615,"dataGaName":616,"dataGaLocation":577},"/pricing/ultimate/","why ultimate",{"title":618,"links":619},"Solutions",[620,625,627,629,634,639,643,646,650,653,655,658,661,666],{"text":621,"config":622},"Digital transformation",{"href":623,"dataGaName":624,"dataGaLocation":577},"/topics/digital-transformation/","digital transformation",{"text":235,"config":626},{"href":237,"dataGaName":235,"dataGaLocation":577},{"text":224,"config":628},{"href":206,"dataGaName":207,"dataGaLocation":577},{"text":630,"config":631},"Agile development",{"href":632,"dataGaName":633,"dataGaLocation":577},"/solutions/agile-delivery/","agile delivery",{"text":635,"config":636},"Cloud transformation",{"href":637,"dataGaName":638,"dataGaLocation":577},"/topics/cloud-native/","cloud transformation",{"text":640,"config":641},"SCM",{"href":220,"dataGaName":642,"dataGaLocation":577},"source code management",{"text":210,"config":644},{"href":212,"dataGaName":645,"dataGaLocation":577},"continuous integration & delivery",{"text":647,"config":648},"Value stream management",{"href":264,"dataGaName":649,"dataGaLocation":577},"value stream management",{"text":23,"config":651},{"href":652,"dataGaName":5,"dataGaLocation":577},"/solutions/gitops/",{"text":274,"config":654},{"href":276,"dataGaName":277,"dataGaLocation":577},{"text":656,"config":657},"Small business",{"href":281,"dataGaName":282,"dataGaLocation":577},{"text":659,"config":660},"Public sector",{"href":286,"dataGaName":287,"dataGaLocation":577},{"text":662,"config":663},"Education",{"href":664,"dataGaName":665,"dataGaLocation":577},"/solutions/education/","education",{"text":667,"config":668},"Financial services",{"href":669,"dataGaName":670,"dataGaLocation":577},"/solutions/finance/","financial services",{"title":294,"links":672},[673,675,677,679,682,684,686,688,690,692,694,696,698],{"text":306,"config":674},{"href":308,"dataGaName":309,"dataGaLocation":577},{"text":311,"config":676},{"href":313,"dataGaName":314,"dataGaLocation":577},{"text":316,"config":678},{"href":318,"dataGaName":319,"dataGaLocation":577},{"text":321,"config":680},{"href":323,"dataGaName":681,"dataGaLocation":577},"docs",{"text":344,"config":683},{"href":346,"dataGaName":347,"dataGaLocation":577},{"text":339,"config":685},{"href":341,"dataGaName":342,"dataGaLocation":577},{"text":349,"config":687},{"href":351,"dataGaName":352,"dataGaLocation":577},{"text":362,"config":689},{"href":364,"dataGaName":365,"dataGaLocation":577},{"text":354,"config":691},{"href":356,"dataGaName":357,"dataGaLocation":577},{"text":367,"config":693},{"href":369,"dataGaName":370,"dataGaLocation":577},{"text":372,"config":695},{"href":374,"dataGaName":375,"dataGaLocation":577},{"text":377,"config":697},{"href":379,"dataGaName":380,"dataGaLocation":577},{"text":382,"config":699},{"href":384,"dataGaName":385,"dataGaLocation":577},{"title":400,"links":701},[702,704,706,708,710,712,714,718,723,725,727,729],{"text":407,"config":703},{"href":409,"dataGaName":402,"dataGaLocation":577},{"text":412,"config":705},{"href":414,"dataGaName":415,"dataGaLocation":577},{"text":420,"config":707},{"href":422,"dataGaName":423,"dataGaLocation":577},{"text":425,"config":709},{"href":427,"dataGaName":428,"dataGaLocation":577},{"text":430,"config":711},{"href":432,"dataGaName":433,"dataGaLocation":577},{"text":435,"config":713},{"href":437,"dataGaName":438,"dataGaLocation":577},{"text":715,"config":716},"Sustainability",{"href":717,"dataGaName":715,"dataGaLocation":577},"/sustainability/",{"text":719,"config":720},"Diversity, inclusion and belonging (DIB)",{"href":721,"dataGaName":722,"dataGaLocation":577},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":440,"config":724},{"href":442,"dataGaName":443,"dataGaLocation":577},{"text":450,"config":726},{"href":452,"dataGaName":453,"dataGaLocation":577},{"text":455,"config":728},{"href":457,"dataGaName":458,"dataGaLocation":577},{"text":730,"config":731},"Modern Slavery Transparency Statement",{"href":732,"dataGaName":733,"dataGaLocation":577},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":735,"links":736},"Contact Us",[737,740,742,744,749,754,759],{"text":738,"config":739},"Contact an expert",{"href":139,"dataGaName":140,"dataGaLocation":577},{"text":469,"config":741},{"href":471,"dataGaName":472,"dataGaLocation":577},{"text":474,"config":743},{"href":476,"dataGaName":477,"dataGaLocation":577},{"text":745,"config":746},"Status",{"href":747,"dataGaName":748,"dataGaLocation":577},"https://status.gitlab.com/","status",{"text":750,"config":751},"Terms of use",{"href":752,"dataGaName":753,"dataGaLocation":577},"/terms/","terms of use",{"text":755,"config":756},"Privacy statement",{"href":757,"dataGaName":758,"dataGaLocation":577},"/privacy/","privacy statement",{"text":760,"config":761},"Cookie preferences",{"dataGaName":762,"dataGaLocation":577,"id":763,"isOneTrustButton":12},"cookie preferences","ot-sdk-btn",{"items":765},[766,768,770],{"text":750,"config":767},{"href":752,"dataGaName":753,"dataGaLocation":577},{"text":755,"config":769},{"href":757,"dataGaName":758,"dataGaLocation":577},{"text":760,"config":771},{"dataGaName":762,"dataGaLocation":577,"id":763,"isOneTrustButton":12},"content:shared:en-us:main-footer.yml","Main Footer","shared/en-us/main-footer.yml","shared/en-us/main-footer",{"_path":777,"_dir":124,"_draft":6,"_partial":6,"_locale":7,"header":778,"eyebrow":779,"blurb":780,"button":781,"secondaryButton":785,"_id":787,"_type":117,"title":788,"_source":118,"_file":789,"_stem":790,"_extension":121},"/shared/en-us/next-steps","Start shipping better software faster","50%+ of the Fortune 100 trust GitLab","See what your team can do with the intelligent\n\n\nDevSecOps platform.\n",{"text":132,"config":782},{"href":783,"dataGaName":135,"dataGaLocation":784},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":137,"config":786},{"href":139,"dataGaName":140,"dataGaLocation":784},"content:shared:en-us:next-steps.yml","Next Steps","shared/en-us/next-steps.yml","shared/en-us/next-steps",1758662343421]