[{"data":1,"prerenderedAt":755},["ShallowReactive",2],{"/en-us/topics/gitops/gitlab-enables-infrastructure-as-code/":3,"navigation-en-us":99,"banner-en-us":516,"footer-en-us":531,"next-steps-en-us":740},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":13,"_id":93,"_type":94,"title":7,"_source":95,"_file":96,"_stem":97,"_extension":98},"/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,91],{"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},"TopicsHero",{"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,66,71,76,81,86],{"type":62,"componentName":62,"componentContent":63},"TopicsCopy",{"text":64,"config":65},"When 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},{"type":62,"componentName":62,"componentContent":67},{"header":41,"text":68,"config":69},"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":70},"learn-how-git-lab-enables-infrastructure-as-code",{"type":62,"componentName":62,"componentContent":72},{"header":45,"text":73,"config":74},"### 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":75},"building-your-infrastructure-as-code-in-git-lab",{"type":62,"componentName":62,"componentContent":77},{"header":49,"text":78,"config":79},"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":80},"inside-the-infrastructure-subgroup",{"type":62,"componentName":62,"componentContent":82},{"header":53,"text":83,"config":84},"### 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":85},"deploying-code-using-git-lab-ci",{"type":62,"componentName":62,"componentContent":87},{"header":57,"text":88,"config":89},"* [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":90},"ready-to-learn-more-about-git-ops",{"type":92,"componentName":92},"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":100,"_dir":101,"_draft":6,"_partial":6,"_locale":7,"data":102,"_id":512,"_type":94,"title":513,"_source":95,"_file":514,"_stem":515,"_extension":98},"/shared/en-us/main-navigation","en-us",{"logo":103,"freeTrial":108,"sales":113,"login":118,"items":123,"search":453,"minimal":484,"duo":503},{"config":104},{"href":105,"dataGaName":106,"dataGaLocation":107},"/","gitlab logo","header",{"text":109,"config":110},"Get free trial",{"href":111,"dataGaName":112,"dataGaLocation":107},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":114,"config":115},"Talk to sales",{"href":116,"dataGaName":117,"dataGaLocation":107},"/sales/","sales",{"text":119,"config":120},"Sign in",{"href":121,"dataGaName":122,"dataGaLocation":107},"https://gitlab.com/users/sign_in/","sign in",[124,168,263,268,374,434],{"text":125,"config":126,"cards":128,"footer":151},"Platform",{"dataNavLevelOne":127},"platform",[129,135,143],{"title":125,"description":130,"link":131},"The most comprehensive AI-powered DevSecOps Platform",{"text":132,"config":133},"Explore our Platform",{"href":134,"dataGaName":127,"dataGaLocation":107},"/platform/",{"title":136,"description":137,"link":138},"GitLab Duo (AI)","Build software faster with AI at every stage of development",{"text":139,"config":140},"Meet GitLab Duo",{"href":141,"dataGaName":142,"dataGaLocation":107},"/gitlab-duo/","gitlab duo ai",{"title":144,"description":145,"link":146},"Why GitLab","10 reasons why Enterprises choose GitLab",{"text":147,"config":148},"Learn more",{"href":149,"dataGaName":150,"dataGaLocation":107},"/why-gitlab/","why gitlab",{"title":152,"items":153},"Get started with",[154,159,164],{"text":155,"config":156},"Platform Engineering",{"href":157,"dataGaName":158,"dataGaLocation":107},"/solutions/platform-engineering/","platform engineering",{"text":160,"config":161},"Developer Experience",{"href":162,"dataGaName":163,"dataGaLocation":107},"/developer-experience/","Developer experience",{"text":165,"config":166},"MLOps",{"href":167,"dataGaName":165,"dataGaLocation":107},"/topics/devops/the-role-of-ai-in-devops/",{"text":169,"left":12,"config":170,"link":172,"lists":176,"footer":245},"Product",{"dataNavLevelOne":171},"solutions",{"text":173,"config":174},"View all Solutions",{"href":175,"dataGaName":171,"dataGaLocation":107},"/solutions/",[177,202,224],{"title":178,"description":179,"link":180,"items":185},"Automation","CI/CD and automation to accelerate deployment",{"config":181},{"icon":182,"href":183,"dataGaName":184,"dataGaLocation":107},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[186,190,194,198],{"text":187,"config":188},"CI/CD",{"href":189,"dataGaLocation":107,"dataGaName":187},"/solutions/continuous-integration/",{"text":191,"config":192},"AI-Assisted Development",{"href":141,"dataGaLocation":107,"dataGaName":193},"AI assisted development",{"text":195,"config":196},"Source Code Management",{"href":197,"dataGaLocation":107,"dataGaName":195},"/solutions/source-code-management/",{"text":199,"config":200},"Automated Software Delivery",{"href":183,"dataGaLocation":107,"dataGaName":201},"Automated software delivery",{"title":203,"description":204,"link":205,"items":210},"Security","Deliver code faster without compromising security",{"config":206},{"href":207,"dataGaName":208,"dataGaLocation":107,"icon":209},"/solutions/security-compliance/","security and compliance","ShieldCheckLight",[211,214,219],{"text":212,"config":213},"Security & Compliance",{"href":207,"dataGaLocation":107,"dataGaName":212},{"text":215,"config":216},"Software Supply Chain Security",{"href":217,"dataGaLocation":107,"dataGaName":218},"/solutions/supply-chain/","Software supply chain security",{"text":220,"config":221},"Compliance & Governance",{"href":222,"dataGaLocation":107,"dataGaName":223},"/solutions/continuous-software-compliance/","Compliance and governance",{"title":225,"link":226,"items":231},"Measurement",{"config":227},{"icon":228,"href":229,"dataGaName":230,"dataGaLocation":107},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[232,236,240],{"text":233,"config":234},"Visibility & Measurement",{"href":229,"dataGaLocation":107,"dataGaName":235},"Visibility and Measurement",{"text":237,"config":238},"Value Stream Management",{"href":239,"dataGaLocation":107,"dataGaName":237},"/solutions/value-stream-management/",{"text":241,"config":242},"Analytics & Insights",{"href":243,"dataGaLocation":107,"dataGaName":244},"/solutions/analytics-and-insights/","Analytics and insights",{"title":246,"items":247},"GitLab for",[248,253,258],{"text":249,"config":250},"Enterprise",{"href":251,"dataGaLocation":107,"dataGaName":252},"/enterprise/","enterprise",{"text":254,"config":255},"Small Business",{"href":256,"dataGaLocation":107,"dataGaName":257},"/small-business/","small business",{"text":259,"config":260},"Public Sector",{"href":261,"dataGaLocation":107,"dataGaName":262},"/solutions/public-sector/","public sector",{"text":264,"config":265},"Pricing",{"href":266,"dataGaName":267,"dataGaLocation":107,"dataNavLevelOne":267},"/pricing/","pricing",{"text":269,"config":270,"link":272,"lists":276,"feature":361},"Resources",{"dataNavLevelOne":271},"resources",{"text":273,"config":274},"View all resources",{"href":275,"dataGaName":271,"dataGaLocation":107},"/resources/",[277,310,333],{"title":278,"items":279},"Getting started",[280,285,290,295,300,305],{"text":281,"config":282},"Install",{"href":283,"dataGaName":284,"dataGaLocation":107},"/install/","install",{"text":286,"config":287},"Quick start guides",{"href":288,"dataGaName":289,"dataGaLocation":107},"/get-started/","quick setup checklists",{"text":291,"config":292},"Learn",{"href":293,"dataGaLocation":107,"dataGaName":294},"https://university.gitlab.com/","learn",{"text":296,"config":297},"Product documentation",{"href":298,"dataGaName":299,"dataGaLocation":107},"https://docs.gitlab.com/","product documentation",{"text":301,"config":302},"Best practice videos",{"href":303,"dataGaName":304,"dataGaLocation":107},"/getting-started-videos/","best practice videos",{"text":306,"config":307},"Integrations",{"href":308,"dataGaName":309,"dataGaLocation":107},"/integrations/","integrations",{"title":311,"items":312},"Discover",[313,318,323,328],{"text":314,"config":315},"Customer success stories",{"href":316,"dataGaName":317,"dataGaLocation":107},"/customers/","customer success stories",{"text":319,"config":320},"Blog",{"href":321,"dataGaName":322,"dataGaLocation":107},"/blog/","blog",{"text":324,"config":325},"Remote",{"href":326,"dataGaName":327,"dataGaLocation":107},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":329,"config":330},"TeamOps",{"href":331,"dataGaName":332,"dataGaLocation":107},"/teamops/","teamops",{"title":334,"items":335},"Connect",[336,341,346,351,356],{"text":337,"config":338},"GitLab Services",{"href":339,"dataGaName":340,"dataGaLocation":107},"/services/","services",{"text":342,"config":343},"Community",{"href":344,"dataGaName":345,"dataGaLocation":107},"/community/","community",{"text":347,"config":348},"Forum",{"href":349,"dataGaName":350,"dataGaLocation":107},"https://forum.gitlab.com/","forum",{"text":352,"config":353},"Events",{"href":354,"dataGaName":355,"dataGaLocation":107},"/events/","events",{"text":357,"config":358},"Partners",{"href":359,"dataGaName":360,"dataGaLocation":107},"/partners/","partners",{"backgroundColor":362,"textColor":363,"text":364,"image":365,"link":369},"#2f2a6b","#fff","Insights for the future of software development",{"altText":366,"config":367},"the source promo card",{"src":368},"/images/navigation/the-source-promo-card.svg",{"text":370,"config":371},"Read the latest",{"href":372,"dataGaName":373,"dataGaLocation":107},"/the-source/","the source",{"text":375,"config":376,"lists":378},"Company",{"dataNavLevelOne":377},"company",[379],{"items":380},[381,386,392,394,399,404,409,414,419,424,429],{"text":382,"config":383},"About",{"href":384,"dataGaName":385,"dataGaLocation":107},"/company/","about",{"text":387,"config":388,"footerGa":391},"Jobs",{"href":389,"dataGaName":390,"dataGaLocation":107},"/jobs/","jobs",{"dataGaName":390},{"text":352,"config":393},{"href":354,"dataGaName":355,"dataGaLocation":107},{"text":395,"config":396},"Leadership",{"href":397,"dataGaName":398,"dataGaLocation":107},"/company/team/e-group/","leadership",{"text":400,"config":401},"Team",{"href":402,"dataGaName":403,"dataGaLocation":107},"/company/team/","team",{"text":405,"config":406},"Handbook",{"href":407,"dataGaName":408,"dataGaLocation":107},"https://handbook.gitlab.com/","handbook",{"text":410,"config":411},"Investor relations",{"href":412,"dataGaName":413,"dataGaLocation":107},"https://ir.gitlab.com/","investor relations",{"text":415,"config":416},"Trust Center",{"href":417,"dataGaName":418,"dataGaLocation":107},"/security/","trust center",{"text":420,"config":421},"AI Transparency Center",{"href":422,"dataGaName":423,"dataGaLocation":107},"/ai-transparency-center/","ai transparency center",{"text":425,"config":426},"Newsletter",{"href":427,"dataGaName":428,"dataGaLocation":107},"/company/contact/","newsletter",{"text":430,"config":431},"Press",{"href":432,"dataGaName":433,"dataGaLocation":107},"/press/","press",{"text":435,"config":436,"lists":437},"Contact us",{"dataNavLevelOne":377},[438],{"items":439},[440,443,448],{"text":114,"config":441},{"href":116,"dataGaName":442,"dataGaLocation":107},"talk to sales",{"text":444,"config":445},"Get help",{"href":446,"dataGaName":447,"dataGaLocation":107},"/support/","get help",{"text":449,"config":450},"Customer portal",{"href":451,"dataGaName":452,"dataGaLocation":107},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":454,"login":455,"suggestions":462},"Close",{"text":456,"link":457},"To search repositories and projects, login to",{"text":458,"config":459},"gitlab.com",{"href":121,"dataGaName":460,"dataGaLocation":461},"search login","search",{"text":463,"default":464},"Suggestions",[465,467,471,473,477,481],{"text":136,"config":466},{"href":141,"dataGaName":136,"dataGaLocation":461},{"text":468,"config":469},"Code Suggestions (AI)",{"href":470,"dataGaName":468,"dataGaLocation":461},"/solutions/code-suggestions/",{"text":187,"config":472},{"href":189,"dataGaName":187,"dataGaLocation":461},{"text":474,"config":475},"GitLab on AWS",{"href":476,"dataGaName":474,"dataGaLocation":461},"/partners/technology-partners/aws/",{"text":478,"config":479},"GitLab on Google Cloud",{"href":480,"dataGaName":478,"dataGaLocation":461},"/partners/technology-partners/google-cloud-platform/",{"text":482,"config":483},"Why GitLab?",{"href":149,"dataGaName":482,"dataGaLocation":461},{"freeTrial":485,"mobileIcon":490,"desktopIcon":495,"secondaryButton":498},{"text":486,"config":487},"Start free trial",{"href":488,"dataGaName":112,"dataGaLocation":489},"https://gitlab.com/-/trials/new/","nav",{"altText":491,"config":492},"Gitlab Icon",{"src":493,"dataGaName":494,"dataGaLocation":489},"/images/brand/gitlab-logo-tanuki.svg","gitlab icon",{"altText":491,"config":496},{"src":497,"dataGaName":494,"dataGaLocation":489},"/images/brand/gitlab-logo-type.svg",{"text":499,"config":500},"Get Started",{"href":501,"dataGaName":502,"dataGaLocation":489},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/compare/gitlab-vs-github/","get started",{"freeTrial":504,"mobileIcon":508,"desktopIcon":510},{"text":505,"config":506},"Learn more about GitLab Duo",{"href":141,"dataGaName":507,"dataGaLocation":489},"gitlab duo",{"altText":491,"config":509},{"src":493,"dataGaName":494,"dataGaLocation":489},{"altText":491,"config":511},{"src":497,"dataGaName":494,"dataGaLocation":489},"content:shared:en-us:main-navigation.yml","Main Navigation","shared/en-us/main-navigation.yml","shared/en-us/main-navigation",{"_path":517,"_dir":101,"_draft":6,"_partial":6,"_locale":7,"title":518,"button":519,"image":523,"config":526,"_id":528,"_type":94,"_source":95,"_file":529,"_stem":530,"_extension":98},"/shared/en-us/banner","is now in public beta!",{"text":147,"config":520},{"href":521,"dataGaName":522,"dataGaLocation":107},"/gitlab-duo/agent-platform/","duo banner",{"config":524},{"src":525},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1753720689/somrf9zaunk0xlt7ne4x.svg",{"layout":527},"release","content:shared:en-us:banner.yml","shared/en-us/banner.yml","shared/en-us/banner",{"_path":532,"_dir":101,"_draft":6,"_partial":6,"_locale":7,"data":533,"_id":736,"_type":94,"title":737,"_source":95,"_file":738,"_stem":739,"_extension":98},"/shared/en-us/main-footer",{"text":534,"source":535,"edit":541,"contribute":546,"config":551,"items":556,"minimal":728},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":536,"config":537},"View page source",{"href":538,"dataGaName":539,"dataGaLocation":540},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":542,"config":543},"Edit this page",{"href":544,"dataGaName":545,"dataGaLocation":540},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":547,"config":548},"Please contribute",{"href":549,"dataGaName":550,"dataGaLocation":540},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":552,"facebook":553,"youtube":554,"linkedin":555},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[557,580,635,664,698],{"title":125,"links":558,"subMenu":563},[559],{"text":560,"config":561},"DevSecOps platform",{"href":134,"dataGaName":562,"dataGaLocation":540},"devsecops platform",[564],{"title":264,"links":565},[566,570,575],{"text":567,"config":568},"View plans",{"href":266,"dataGaName":569,"dataGaLocation":540},"view plans",{"text":571,"config":572},"Why Premium?",{"href":573,"dataGaName":574,"dataGaLocation":540},"/pricing/premium/","why premium",{"text":576,"config":577},"Why Ultimate?",{"href":578,"dataGaName":579,"dataGaLocation":540},"/pricing/ultimate/","why ultimate",{"title":581,"links":582},"Solutions",[583,588,591,593,598,603,607,610,614,617,619,622,625,630],{"text":584,"config":585},"Digital transformation",{"href":586,"dataGaName":587,"dataGaLocation":540},"/topics/digital-transformation/","digital transformation",{"text":212,"config":589},{"href":207,"dataGaName":590,"dataGaLocation":540},"security & compliance",{"text":201,"config":592},{"href":183,"dataGaName":184,"dataGaLocation":540},{"text":594,"config":595},"Agile development",{"href":596,"dataGaName":597,"dataGaLocation":540},"/solutions/agile-delivery/","agile delivery",{"text":599,"config":600},"Cloud transformation",{"href":601,"dataGaName":602,"dataGaLocation":540},"/topics/cloud-native/","cloud transformation",{"text":604,"config":605},"SCM",{"href":197,"dataGaName":606,"dataGaLocation":540},"source code management",{"text":187,"config":608},{"href":189,"dataGaName":609,"dataGaLocation":540},"continuous integration & delivery",{"text":611,"config":612},"Value stream management",{"href":239,"dataGaName":613,"dataGaLocation":540},"value stream management",{"text":23,"config":615},{"href":616,"dataGaName":5,"dataGaLocation":540},"/solutions/gitops/",{"text":249,"config":618},{"href":251,"dataGaName":252,"dataGaLocation":540},{"text":620,"config":621},"Small business",{"href":256,"dataGaName":257,"dataGaLocation":540},{"text":623,"config":624},"Public sector",{"href":261,"dataGaName":262,"dataGaLocation":540},{"text":626,"config":627},"Education",{"href":628,"dataGaName":629,"dataGaLocation":540},"/solutions/education/","education",{"text":631,"config":632},"Financial services",{"href":633,"dataGaName":634,"dataGaLocation":540},"/solutions/finance/","financial services",{"title":269,"links":636},[637,639,641,643,646,648,650,652,654,656,658,660,662],{"text":281,"config":638},{"href":283,"dataGaName":284,"dataGaLocation":540},{"text":286,"config":640},{"href":288,"dataGaName":289,"dataGaLocation":540},{"text":291,"config":642},{"href":293,"dataGaName":294,"dataGaLocation":540},{"text":296,"config":644},{"href":298,"dataGaName":645,"dataGaLocation":540},"docs",{"text":319,"config":647},{"href":321,"dataGaName":322,"dataGaLocation":540},{"text":314,"config":649},{"href":316,"dataGaName":317,"dataGaLocation":540},{"text":324,"config":651},{"href":326,"dataGaName":327,"dataGaLocation":540},{"text":337,"config":653},{"href":339,"dataGaName":340,"dataGaLocation":540},{"text":329,"config":655},{"href":331,"dataGaName":332,"dataGaLocation":540},{"text":342,"config":657},{"href":344,"dataGaName":345,"dataGaLocation":540},{"text":347,"config":659},{"href":349,"dataGaName":350,"dataGaLocation":540},{"text":352,"config":661},{"href":354,"dataGaName":355,"dataGaLocation":540},{"text":357,"config":663},{"href":359,"dataGaName":360,"dataGaLocation":540},{"title":375,"links":665},[666,668,670,672,674,676,678,682,687,689,691,693],{"text":382,"config":667},{"href":384,"dataGaName":377,"dataGaLocation":540},{"text":387,"config":669},{"href":389,"dataGaName":390,"dataGaLocation":540},{"text":395,"config":671},{"href":397,"dataGaName":398,"dataGaLocation":540},{"text":400,"config":673},{"href":402,"dataGaName":403,"dataGaLocation":540},{"text":405,"config":675},{"href":407,"dataGaName":408,"dataGaLocation":540},{"text":410,"config":677},{"href":412,"dataGaName":413,"dataGaLocation":540},{"text":679,"config":680},"Sustainability",{"href":681,"dataGaName":679,"dataGaLocation":540},"/sustainability/",{"text":683,"config":684},"Diversity, inclusion and belonging (DIB)",{"href":685,"dataGaName":686,"dataGaLocation":540},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":415,"config":688},{"href":417,"dataGaName":418,"dataGaLocation":540},{"text":425,"config":690},{"href":427,"dataGaName":428,"dataGaLocation":540},{"text":430,"config":692},{"href":432,"dataGaName":433,"dataGaLocation":540},{"text":694,"config":695},"Modern Slavery Transparency Statement",{"href":696,"dataGaName":697,"dataGaLocation":540},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":699,"links":700},"Contact Us",[701,704,706,708,713,718,723],{"text":702,"config":703},"Contact an expert",{"href":116,"dataGaName":117,"dataGaLocation":540},{"text":444,"config":705},{"href":446,"dataGaName":447,"dataGaLocation":540},{"text":449,"config":707},{"href":451,"dataGaName":452,"dataGaLocation":540},{"text":709,"config":710},"Status",{"href":711,"dataGaName":712,"dataGaLocation":540},"https://status.gitlab.com/","status",{"text":714,"config":715},"Terms of use",{"href":716,"dataGaName":717,"dataGaLocation":540},"/terms/","terms of use",{"text":719,"config":720},"Privacy statement",{"href":721,"dataGaName":722,"dataGaLocation":540},"/privacy/","privacy statement",{"text":724,"config":725},"Cookie preferences",{"dataGaName":726,"dataGaLocation":540,"id":727,"isOneTrustButton":12},"cookie preferences","ot-sdk-btn",{"items":729},[730,732,734],{"text":714,"config":731},{"href":716,"dataGaName":717,"dataGaLocation":540},{"text":719,"config":733},{"href":721,"dataGaName":722,"dataGaLocation":540},{"text":724,"config":735},{"dataGaName":726,"dataGaLocation":540,"id":727,"isOneTrustButton":12},"content:shared:en-us:main-footer.yml","Main Footer","shared/en-us/main-footer.yml","shared/en-us/main-footer",{"_path":741,"_dir":101,"_draft":6,"_partial":6,"_locale":7,"header":742,"eyebrow":743,"blurb":744,"button":745,"secondaryButton":749,"_id":751,"_type":94,"title":752,"_source":95,"_file":753,"_stem":754,"_extension":98},"/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":109,"config":746},{"href":747,"dataGaName":112,"dataGaLocation":748},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":114,"config":750},{"href":116,"dataGaName":117,"dataGaLocation":748},"content:shared:en-us:next-steps.yml","Next Steps","shared/en-us/next-steps.yml","shared/en-us/next-steps",1753981654221]