[{"data":1,"prerenderedAt":1447},["ShallowReactive",2],{"/blog/simple-kubernetes-management-with-gitlab":3,"navigation-en-us":661,"banner-en-us":1089,"footer-en-us":1099,"blog-post-authors-en-us-Noah Ing":1342,"blog-related-posts-en-us-simple-kubernetes-management-with-gitlab":1357,"blog-promotions-en-us":1383,"next-steps-en-us":1437},{"id":4,"title":5,"authors":6,"body":8,"category":636,"date":637,"description":638,"extension":639,"externalUrl":640,"faq":640,"featured":641,"heroImage":642,"meta":643,"navigation":644,"path":645,"seo":646,"slug":650,"stem":651,"tags":652,"template":659,"updatedDate":640,"__hash__":660},"blogPosts/en-us/blog/simple-kubernetes-management-with-gitlab.md","Simple Kubernetes management with GitLab",[7],"Noah Ing",{"type":9,"value":10,"toc":617},"minimark",[11,15,21,42,49,54,69,73,90,95,102,105,134,159,168,172,178,216,262,268,272,279,284,311,317,324,342,350,359,376,380,386,389,394,398,402,409,452,458,470,476,483,489,496,502,506,510,517,549,559,563,586,590,613],[12,13,14],"p",{},"Kubernetes can be very complex and has dozens of tutorials out there on how to provision and manage a cluster. This tutorial aims to provide a simple, lightweight solution to provision a Kubernetes cluster and manage it with infrastructure as code (IaC) using Terraform and Helm in 20 minutes or less.",[12,16,17],{},[18,19,20],"strong",{},"The final product of this tutorial will be two IaC repositories with fully functional CI/CD pipelines:",[22,23,24,34],"ol",{},[25,26,27,33],"li",{},[28,29,32],"a",{"href":30,"rel":31},"https://gitlab.com/gitlab-org/configure/examples/gitlab-terraform-eks",[],"gitlab-terraform-k8s"," - A single source of truth to provision, configure, and manage your Kubernetes infrastructure using Terraform",[25,35,36,41],{},[28,37,40],{"href":38,"rel":39},"https://gitlab.com/gitlab-org/project-templates/cluster-management",[],"cluster-management"," - A single source of truth to define the desired state of your Kubernetes cluster using the GitLab Agent for Kubernetes and Helm",[12,43,44],{},[45,46],"img",{"alt":47,"src":48},"Final Product","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397732/blog/Content%20Images/2022-11-11-simple-kubernetes-management-with-gitlab/final-product.png",[50,51,53],"h3",{"id":52},"prerequisites","Prerequisites",[55,56,57,60,63,66],"ul",{},[25,58,59],{},"AWS or GCP account with permissions to provision resources",[25,61,62],{},"GitLab account",[25,64,65],{},"Access to a GitLab Runner",[25,67,68],{},"20 minutes",[50,70,72],{"id":71},"an-overview-of-this-tutorial-is-as-follows","An overview of this tutorial is as follows:",[22,74,75,78,81,84,87],{},[25,76,77],{},"Set up the GitLab Terraform Kubernetes Template 🏗️",[25,79,80],{},"Register the GitLab Agent 🕵️",[25,82,83],{},"Add in Cloud Credentials ☁️🔑",[25,85,86],{},"Set up the Kubernetes Cluster Management Template 🚧",[25,88,89],{},"Enjoy your Kubernetes Cluster completely managed in code! 👏",[91,92,94],"h2",{"id":93},"set-up-the-gitlab-terraform-kubernetes-template","Set up the GitLab Terraform Kubernetes Template",[12,96,97,98],{},"Start by importing the example project by URL - ",[28,99,100],{"href":100,"rel":101},"https://gitlab.com/projects/new#import_project",[],[12,103,104],{},"To import the project:",[22,106,107,114,120,126,131],{},[25,108,109,110,113],{},"In GitLab, on the top bar, select ",[18,111,112],{},"Main menu > Projects > View all projects",".",[25,115,116,117,113],{},"On the right of the page, select ",[18,118,119],{},"New project",[25,121,122,123,113],{},"Select ",[18,124,125],{},"Import project",[25,127,122,128,113],{},[18,129,130],{},"Repository by URL",[25,132,133],{},"For the Git repository URL:",[55,135,136,148],{},[25,137,138,143,144],{},[28,139,142],{"href":140,"rel":141},"https://cloud.google.com/kubernetes-engine",[],"GCP Google Kubernetes Engine",": ",[28,145,146],{"href":146,"rel":147},"https://gitlab.com/gitlab-org/configure/examples/gitlab-terraform-gke.git",[],[25,149,150,143,155],{},[28,151,154],{"href":152,"rel":153},"https://aws.amazon.com/eks/",[],"AWS Elastic Kubernetes Service",[28,156,157],{"href":157,"rel":158},"https://gitlab.com/gitlab-org/configure/examples/gitlab-terraform-eks.git",[],[22,160,162],{"start":161},6,[25,163,164,165,113],{},"Complete the fields and select ",[18,166,167],{},"Create project",[91,169,171],{"id":170},"register-the-gitlab-agent","Register the GitLab Agent",[12,173,174,175,177],{},"With your newly created ",[18,176,32],{}," repo, create a GitLab Agent for Kubernetes:",[22,179,180,190,200,206,209],{},[25,181,182,183,186,187],{},"On the left sidebar, select ",[18,184,185],{},"Infrastructure > Kubernetes clusters",". Select ",[18,188,189],{},"Connect a cluster (agent).",[25,191,192,193,196,197,113],{},"From the ",[18,194,195],{},"Select an agent"," dropdown list, select **eks-agent/gke-agent and select ",[18,198,199],{},"Register an agent",[25,201,202,203],{},"GitLab generates a registration token for the agent. ",[18,204,205],{},"Securely store this secret token, as you will need it later.",[25,207,208],{},"GitLab provides an address for the agent server (KAS). Securely store this as you will also need it later.",[25,210,211,212,215],{},"Add this to the ",[18,213,214],{},"gitlab-terraform-eks/.gitlab/agents/eks-agent/config.yaml"," in order to allow the GitLab Agent to have access to your entire group.",[217,218,223],"pre",{"className":219,"code":220,"language":221,"meta":222,"style":222},"language-yaml shiki shiki-themes github-light","ci_access:\n  groups:\n    - id: your-namespace-here\n\n","yaml","",[224,225,226,239,247],"code",{"__ignoreMap":222},[227,228,231,235],"span",{"class":229,"line":230},"line",1,[227,232,234],{"class":233},"shJU0","ci_access",[227,236,238],{"class":237},"sgsFI",":\n",[227,240,242,245],{"class":229,"line":241},2,[227,243,244],{"class":233},"  groups",[227,246,238],{"class":237},[227,248,250,253,256,258],{"class":229,"line":249},3,[227,251,252],{"class":237},"    - ",[227,254,255],{"class":233},"id",[227,257,143],{"class":237},[227,259,261],{"class":260},"sYBdl","your-namespace-here\n",[12,263,264],{},[45,265],{"alt":266,"src":267},"Register GitLab Agent","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397733/blog/Content%20Images/2022-11-11-simple-kubernetes-management-with-gitlab/register-gitlab-agent.png",[91,269,271],{"id":270},"add-in-your-cloud-credentials-to-cicd-variables","Add in your Cloud Credentials to CI/CD variables",[50,273,275],{"id":274},"aws-eks",[28,276,278],{"href":152,"rel":277},[],"AWS EKS",[12,280,182,281,113],{},[18,282,283],{},"Settings > CI/CD. Expand Variables",[22,285,286,293,299,305],{},[25,287,288,289,292],{},"Set the variable ",[18,290,291],{},"AWS_ACCESS_KEY_ID"," to your AWS access key ID.",[25,294,288,295,298],{},[18,296,297],{},"AWS_SECRET_ACCESS_KEY"," to your AWS secret access key.",[25,300,288,301,304],{},[18,302,303],{},"TF_VAR_agent_token"," to the agent token displayed in the previous task.",[25,306,288,307,310],{},[18,308,309],{},"TF_VAR_kas_address"," to the agent server address displayed in the previous task.",[12,312,313],{},[45,314],{"alt":315,"src":316},"Add in CI/CD variables","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397732/blog/Content%20Images/2022-11-11-simple-kubernetes-management-with-gitlab/cicd-variables.png",[50,318,320],{"id":319},"gcp-gke",[28,321,323],{"href":140,"rel":322},[],"GCP GKE",[22,325,326,333,339],{},[25,327,328,329,332],{},"To authenticate GCP with GitLab, create a GCP service account with the following roles: ",[18,330,331],{},"Compute Network Viewer, Kubernetes Engine Admin, Service Account User, and Service Account Admin",". Both User and Admin service accounts are necessary. The User role impersonates the default service account when creating the node pool. The Admin role creates a service account in the kube-system namespace.",[25,334,335,338],{},[18,336,337],{},"Download the JSON file"," with the service account key you created in the previous step.",[25,340,341],{},"On your computer, encode the JSON file to base64 (replace /path/to/sa-key.json to the path to your key):",[217,343,348],{"className":344,"code":346,"language":347,"meta":222},[345],"language-text","base64 -i /path/to/sa-key.json | tr -d\n","text",[224,349,346],{"__ignoreMap":222},[55,351,352],{},[25,353,354,355,358],{},"Use the output of this command as the ",[18,356,357],{},"BASE64_GOOGLE_CREDENTIALS"," environment variable in the next step.",[12,360,182,361,363,364,366,367,370,371,373,374,310],{},[18,362,283],{},".\n5. Set the variable ",[18,365,357],{}," to the base64 encoded JSON file you just created.\n6. Set the variable ",[18,368,369],{},"TF_VAR_gcp_project"," to your GCP’s project name.\n7. Set the variable ",[18,372,303],{}," to the agent token displayed in the previous task.\n8. Set the variable ",[18,375,309],{},[91,377,379],{"id":378},"run-gitlab-ci-to-deploy-your-kubernetes-cluster","Run GitLab CI to deploy your Kubernetes cluster!",[12,381,382],{},[45,383],{"alt":384,"src":385},"Deploy Kubernetes cluster","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397733/blog/Content%20Images/2022-11-11-simple-kubernetes-management-with-gitlab/pipeline-view.png",[12,387,388],{},"When successfully completed, view the cluster in the AWS/GCP console!",[12,390,391],{},[45,392],{"alt":278,"src":393},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397731/blog/Content%20Images/2022-11-11-simple-kubernetes-management-with-gitlab/aws-eks.png",[50,395,397],{"id":396},"you-are-halfway-done-keep-it-up","You are halfway done! 👏 Keep it up!",[91,399,401],{"id":400},"set-up-the-kubernetes-cluster-management-project","Set up the Kubernetes Cluster Management Project",[12,403,404,405],{},"Create a project from the cluster management project template - ",[28,406,407],{"href":407,"rel":408},"https://gitlab.com/projects/new#create_from_template",[],[22,410,411,415,419,424,434,437,441,446],{},[25,412,109,413,113],{},[18,414,112],{},[25,416,116,417,113],{},[18,418,119],{},[25,420,122,421,113],{},[18,422,423],{},"Create from template",[25,425,426,427,430,431,113],{},"From the list of templates, next to ",[18,428,429],{},"GitLab Cluster Management",", select ",[18,432,433],{},"Use template",[25,435,436],{},"Enter the project details. Ensure this project is created in the same namespace as the gitlab-terraform-k8s project.",[25,438,122,439,113],{},[18,440,167],{},[25,442,443,444,113],{},"Once the project is created on the left sidebar, select ",[18,445,283],{},[25,447,448,449,113],{},"Set the variable KUBE_CONTEXT to point to the GitLab Agent. For example, ",[224,450,451],{},"noah-ing-demos/infrastructure/gitlab-terraform-eks:eks-agent",[12,453,454],{},[45,455],{"alt":456,"src":457},"Set Kube Context","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397733/blog/Content%20Images/2022-11-11-simple-kubernetes-management-with-gitlab/kube-config.png",[55,459,460],{},[25,461,462,465,466,469],{},[18,463,464],{},"Uncomment the applications you'd like to be installed"," into your Kubernetes cluster in the ",[18,467,468],{},"helmfile.yaml",". In this instance I chose ingress, cert-manager, prometheus, and Vault.",[12,471,472],{},[45,473],{"alt":474,"src":475},"Uncomment Applications in helmfile","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397733/blog/Content%20Images/2022-11-11-simple-kubernetes-management-with-gitlab/helmfile.png",[12,477,478,479,482],{},"That will trigger your ",[18,480,481],{},"CI/CD pipeline"," and it should look like this.",[12,484,485],{},[45,486],{"alt":487,"src":488},"Cluster Management CI/CD","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397732/blog/Content%20Images/2022-11-11-simple-kubernetes-management-with-gitlab/cluster-management-cicd.png",[12,490,491,492,495],{},"Once completed, ",[18,493,494],{},"go to the AWS/GCP console"," and check out all the deployed resources!",[12,497,498],{},[45,499],{"alt":500,"src":501},"Deployed EKS applications","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397732/blog/Content%20Images/2022-11-11-simple-kubernetes-management-with-gitlab/deployed-eks-applications.png",[50,503,505],{"id":504},"voila","Voila! 🎉",[91,507,509],{"id":508},"enjoy-your-kubernetes-cluster-completely-defined-in-code","Enjoy your Kubernetes cluster completely defined in code! 👏👏👏",[12,511,512,513,516],{},"Now with these two repositories you can ",[18,514,515],{},"manage a Kubernetes cluster entirely through code",":",[55,518,519,535],{},[25,520,521,522,526,527,530,531,534],{},"For managing the Kubernetes cluster's infrastructure and configuring its resources you can make changes to the ",[28,523,525],{"href":30,"rel":524},[],"gitlab-terraform-eks"," repository you have setup. This project has a ",[18,528,529],{},"Terraform CI/CD pipeline"," that will allow you to ",[18,532,533],{},"review, provision, configure, and manage your Kubernetes"," infrastructure with ease.",[25,536,537,538,541,542,545,546,113],{},"For managing the desired state of the Kubernetes cluster, the ",[28,539,40],{"href":38,"rel":540},[]," repository has a ",[18,543,544],{},"GitLab Agent"," set up and will ",[18,547,548],{},"deploy any Kubernetes objects defined in the helm files",[12,550,551,552,554,555,558],{},"➡️ Bonus: If you'd like to deploy your own application to the Kubernetes cluster, then add to your ",[18,553,40],{}," ",[224,556,557],{},"helmfile"," and see the GitLab Agent for Kubernetes roll it out with ease!",[91,560,562],{"id":561},"references","References",[55,564,565,572,579],{},[25,566,567],{},[28,568,571],{"href":569,"rel":570},"https://docs.gitlab.com/user/infrastructure/clusters/connect/new_gke_cluster/",[],"Create a New GKE Cluster",[25,573,574],{},[28,575,578],{"href":576,"rel":577},"https://docs.gitlab.com/user/infrastructure/clusters/connect/new_eks_cluster/",[],"Create a New EKS Cluster",[25,580,581],{},[28,582,585],{"href":583,"rel":584},"https://docs.gitlab.com/user/clusters/management_project/",[],"Cluster Management Project",[91,587,589],{"id":588},"related-posts","Related posts",[55,591,592,599,606],{},[25,593,594],{},[28,595,598],{"href":596,"rel":597},"https://about.gitlab.com/blog/the-ultimate-guide-to-gitops-with-gitlab/",[],"The ultimate guide to GitOps with GitLab",[25,600,601],{},[28,602,605],{"href":603,"rel":604},"https://about.gitlab.com/blog/gitops-with-gitlab-infrastructure-provisioning/",[],"GitOps with GitLab: Infrastructure provisioning with GitLab and Terraform",[25,607,608],{},[28,609,612],{"href":610,"rel":611},"https://about.gitlab.com/blog/gitops-with-gitlab-connecting-the-cluster/",[],"GitOps with GitLab: Connect with a Kubernetes cluster",[614,615,616],"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":222,"searchDepth":241,"depth":241,"links":618},[619,620,621,622,623,627,630,633,634,635],{"id":52,"depth":249,"text":53},{"id":71,"depth":249,"text":72},{"id":93,"depth":241,"text":94},{"id":170,"depth":241,"text":171},{"id":270,"depth":241,"text":271,"children":624},[625,626],{"id":274,"depth":249,"text":278},{"id":319,"depth":249,"text":323},{"id":378,"depth":241,"text":379,"children":628},[629],{"id":396,"depth":249,"text":397},{"id":400,"depth":241,"text":401,"children":631},[632],{"id":504,"depth":249,"text":505},{"id":508,"depth":241,"text":509},{"id":561,"depth":241,"text":562},{"id":588,"depth":241,"text":589},"engineering","2022-11-15","Follow our tutorial to provision a Kubernetes cluster and manage it with IAC using Terraform and Helm in 20 minutes or less.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749670037/Blog/Hero%20Images/auto-deploy-google-cloud.jpg",{},true,"/en-us/blog/simple-kubernetes-management-with-gitlab",{"title":5,"description":638,"ogTitle":5,"ogDescription":638,"noIndex":641,"ogImage":642,"ogUrl":647,"ogSiteName":648,"ogType":649,"canonicalUrls":647},"https://about.gitlab.com/blog/simple-kubernetes-management-with-gitlab","https://about.gitlab.com","article","simple-kubernetes-management-with-gitlab","en-us/blog/simple-kubernetes-management-with-gitlab",[653,654,655,656,657,658],"tutorial","kubernetes","GitOps","CI","CD","DevOps","BlogPost","0BMOZKrayA9gRz74e9SjBLHkiZEh9NVUxYFlsi6gSzs",{"logo":662,"freeTrial":667,"sales":672,"login":677,"items":682,"search":1009,"minimal":1040,"duo":1059,"switchNav":1068,"pricingDeployment":1079},{"config":663},{"href":664,"dataGaName":665,"dataGaLocation":666},"/","gitlab logo","header",{"text":668,"config":669},"Get free trial",{"href":670,"dataGaName":671,"dataGaLocation":666},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":673,"config":674},"Request a demo",{"href":675,"dataGaName":676,"dataGaLocation":666},"/sales/?contact-topic=request-demo","sales",{"text":678,"config":679},"Sign in",{"href":680,"dataGaName":681,"dataGaLocation":666},"https://gitlab.com/users/sign_in/","sign in",[683,712,812,817,931,987],{"text":684,"config":685,"menu":687},"Platform",{"dataNavLevelOne":686},"platform",{"type":688,"columns":689},"cards",[690,696,704],{"title":684,"description":691,"link":692},"The intelligent orchestration platform for DevSecOps",{"text":693,"config":694},"Explore our Platform",{"href":695,"dataGaName":686,"dataGaLocation":666},"/platform/",{"title":697,"description":698,"link":699},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":700,"config":701},"Meet GitLab Duo",{"href":702,"dataGaName":703,"dataGaLocation":666},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":705,"description":706,"link":707},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":708,"config":709},"Learn more",{"href":710,"dataGaName":711,"dataGaLocation":666},"/why-gitlab/","why gitlab",{"text":713,"left":644,"config":714,"menu":716},"Product",{"dataNavLevelOne":715},"solutions",{"type":717,"link":718,"columns":722,"feature":791},"lists",{"text":719,"config":720},"View all Solutions",{"href":721,"dataGaName":715,"dataGaLocation":666},"/solutions/",[723,747,770],{"title":724,"description":725,"link":726,"items":731},"Automation","CI/CD and automation to accelerate deployment",{"config":727},{"icon":728,"href":729,"dataGaName":730,"dataGaLocation":666},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[732,736,739,743],{"text":733,"config":734},"CI/CD",{"href":735,"dataGaLocation":666,"dataGaName":733},"/solutions/continuous-integration/",{"text":697,"config":737},{"href":702,"dataGaLocation":666,"dataGaName":738},"gitlab duo agent platform - product menu",{"text":740,"config":741},"Source Code Management",{"href":742,"dataGaLocation":666,"dataGaName":740},"/solutions/source-code-management/",{"text":744,"config":745},"Automated Software Delivery",{"href":729,"dataGaLocation":666,"dataGaName":746},"Automated software delivery",{"title":748,"description":749,"link":750,"items":755},"Security","Deliver code faster without compromising security",{"config":751},{"href":752,"dataGaName":753,"dataGaLocation":666,"icon":754},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[756,760,765],{"text":757,"config":758},"Application Security Testing",{"href":752,"dataGaName":759,"dataGaLocation":666},"Application security testing",{"text":761,"config":762},"Software Supply Chain Security",{"href":763,"dataGaLocation":666,"dataGaName":764},"/solutions/supply-chain/","Software supply chain security",{"text":766,"config":767},"Software Compliance",{"href":768,"dataGaName":769,"dataGaLocation":666},"/solutions/software-compliance/","software compliance",{"title":771,"link":772,"items":777},"Measurement",{"config":773},{"icon":774,"href":775,"dataGaName":776,"dataGaLocation":666},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[778,782,786],{"text":779,"config":780},"Visibility & Measurement",{"href":775,"dataGaLocation":666,"dataGaName":781},"Visibility and Measurement",{"text":783,"config":784},"Value Stream Management",{"href":785,"dataGaLocation":666,"dataGaName":783},"/solutions/value-stream-management/",{"text":787,"config":788},"Analytics & Insights",{"href":789,"dataGaLocation":666,"dataGaName":790},"/solutions/analytics-and-insights/","Analytics and insights",{"title":792,"type":717,"items":793},"GitLab for",[794,800,806],{"text":795,"config":796},"Enterprise",{"icon":797,"href":798,"dataGaLocation":666,"dataGaName":799},"Building","/enterprise/","enterprise",{"text":801,"config":802},"Small Business",{"icon":803,"href":804,"dataGaLocation":666,"dataGaName":805},"Work","/small-business/","small business",{"text":807,"config":808},"Public Sector",{"icon":809,"href":810,"dataGaLocation":666,"dataGaName":811},"Organization","/solutions/public-sector/","public sector",{"text":813,"config":814},"Pricing",{"href":815,"dataGaName":816,"dataGaLocation":666,"dataNavLevelOne":816},"/pricing/","pricing",{"text":818,"config":819,"menu":821},"Resources",{"dataNavLevelOne":820},"resources",{"type":717,"link":822,"columns":826,"feature":920},{"text":823,"config":824},"View all resources",{"href":825,"dataGaName":820,"dataGaLocation":666},"/resources/",[827,860,887],{"title":828,"items":829},"Getting started",[830,835,840,845,850,855],{"text":831,"config":832},"Install",{"href":833,"dataGaName":834,"dataGaLocation":666},"/install/","install",{"text":836,"config":837},"Quick start guides",{"href":838,"dataGaName":839,"dataGaLocation":666},"/get-started/","quick setup checklists",{"text":841,"config":842},"Learn",{"href":843,"dataGaLocation":666,"dataGaName":844},"https://university.gitlab.com/","learn",{"text":846,"config":847},"Product documentation",{"href":848,"dataGaName":849,"dataGaLocation":666},"https://docs.gitlab.com/","product documentation",{"text":851,"config":852},"Best practice videos",{"href":853,"dataGaName":854,"dataGaLocation":666},"/getting-started-videos/","best practice videos",{"text":856,"config":857},"Integrations",{"href":858,"dataGaName":859,"dataGaLocation":666},"/integrations/","integrations",{"title":861,"items":862},"Discover",[863,868,873,878,882],{"text":864,"config":865},"Customer success stories",{"href":866,"dataGaName":867,"dataGaLocation":666},"/customers/","customer success stories",{"text":869,"config":870},"Blog",{"href":871,"dataGaName":872,"dataGaLocation":666},"/blog/","blog",{"text":874,"config":875},"Demo Hub",{"href":876,"dataGaName":877,"dataGaLocation":666},"/demo-hub/","demo hub",{"text":879,"config":880},"The Source",{"href":881,"dataGaName":872,"dataGaLocation":666},"/the-source/",{"text":883,"config":884},"Remote",{"href":885,"dataGaName":886,"dataGaLocation":666},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":888,"items":889},"Connect",[890,895,900,905,910,915],{"text":891,"config":892},"GitLab Services",{"href":893,"dataGaName":894,"dataGaLocation":666},"/services/","services",{"text":896,"config":897},"Contribute",{"href":898,"dataGaName":899,"dataGaLocation":666},"https://contributors.gitlab.com","contribute",{"text":901,"config":902},"Community",{"href":903,"dataGaName":904,"dataGaLocation":666},"/community/","community",{"text":906,"config":907},"Forum",{"href":908,"dataGaName":909,"dataGaLocation":666},"https://forum.gitlab.com/","forum",{"text":911,"config":912},"Events",{"href":913,"dataGaName":914,"dataGaLocation":666},"/events/","events",{"text":916,"config":917},"Partners",{"href":918,"dataGaName":919,"dataGaLocation":666},"/partners/","partners",{"config":921,"title":924,"text":925,"link":926},{"background":922,"textColor":923},"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":927,"config":928},"Read the latest",{"href":929,"dataGaName":930,"dataGaLocation":666},"/whats-new/","whats new",{"text":932,"config":933,"menu":935},"Company",{"dataNavLevelOne":934},"company",{"type":717,"columns":936},[937],{"items":938},[939,944,950,952,957,962,967,972,977,982],{"text":940,"config":941},"About",{"href":942,"dataGaName":943,"dataGaLocation":666},"/company/","about",{"text":945,"config":946,"footerGa":949},"Jobs",{"href":947,"dataGaName":948,"dataGaLocation":666},"/jobs/","jobs",{"dataGaName":948},{"text":911,"config":951},{"href":913,"dataGaName":914,"dataGaLocation":666},{"text":953,"config":954},"Leadership",{"href":955,"dataGaName":956,"dataGaLocation":666},"/company/team/e-group/","leadership",{"text":958,"config":959},"Handbook",{"href":960,"dataGaName":961,"dataGaLocation":666},"https://handbook.gitlab.com/","handbook",{"text":963,"config":964},"Investor relations",{"href":965,"dataGaName":966,"dataGaLocation":666},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":968,"config":969},"Trust Center",{"href":970,"dataGaName":971,"dataGaLocation":666},"/security/","trust center",{"text":973,"config":974},"AI Transparency Center",{"href":975,"dataGaName":976,"dataGaLocation":666},"/ai-transparency-center/","ai transparency center",{"text":978,"config":979},"Newsletter",{"href":980,"dataGaName":981,"dataGaLocation":666},"/company/contact/#contact-forms","newsletter",{"text":983,"config":984},"Press",{"href":985,"dataGaName":986,"dataGaLocation":666},"/press/","press",{"text":988,"config":989,"menu":990},"Contact us",{"dataNavLevelOne":934},{"type":717,"columns":991},[992],{"items":993},[994,999,1004],{"text":995,"config":996},"Talk to sales",{"href":997,"dataGaName":998,"dataGaLocation":666},"/sales/","talk to sales",{"text":1000,"config":1001},"Support portal",{"href":1002,"dataGaName":1003,"dataGaLocation":666},"https://support.gitlab.com/hc/en-us","support portal",{"text":1005,"config":1006},"Customer portal",{"href":1007,"dataGaName":1008,"dataGaLocation":666},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1010,"login":1011,"suggestions":1018},"Close",{"text":1012,"link":1013},"To search repositories and projects, login to",{"text":1014,"config":1015},"gitlab.com",{"href":680,"dataGaName":1016,"dataGaLocation":1017},"search login","search",{"text":1019,"default":1020},"Suggestions",[1021,1023,1027,1029,1033,1037],{"text":697,"config":1022},{"href":702,"dataGaName":697,"dataGaLocation":1017},{"text":1024,"config":1025},"Code Suggestions (AI)",{"href":1026,"dataGaName":1024,"dataGaLocation":1017},"/solutions/code-suggestions/",{"text":733,"config":1028},{"href":735,"dataGaName":733,"dataGaLocation":1017},{"text":1030,"config":1031},"GitLab on AWS",{"href":1032,"dataGaName":1030,"dataGaLocation":1017},"/partners/technology-partners/aws/",{"text":1034,"config":1035},"GitLab on Google Cloud",{"href":1036,"dataGaName":1034,"dataGaLocation":1017},"/partners/technology-partners/google-cloud-platform/",{"text":1038,"config":1039},"Why GitLab?",{"href":710,"dataGaName":1038,"dataGaLocation":1017},{"freeTrial":1041,"mobileIcon":1046,"desktopIcon":1051,"secondaryButton":1054},{"text":1042,"config":1043},"Start free trial",{"href":1044,"dataGaName":671,"dataGaLocation":1045},"https://gitlab.com/-/trials/new/","nav",{"altText":1047,"config":1048},"Gitlab Icon",{"src":1049,"dataGaName":1050,"dataGaLocation":1045},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1047,"config":1052},{"src":1053,"dataGaName":1050,"dataGaLocation":1045},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1055,"config":1056},"Get Started",{"href":1057,"dataGaName":1058,"dataGaLocation":1045},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1060,"mobileIcon":1064,"desktopIcon":1066},{"text":1061,"config":1062},"Learn more about GitLab Duo",{"href":702,"dataGaName":1063,"dataGaLocation":1045},"gitlab duo",{"altText":1047,"config":1065},{"src":1049,"dataGaName":1050,"dataGaLocation":1045},{"altText":1047,"config":1067},{"src":1053,"dataGaName":1050,"dataGaLocation":1045},{"button":1069,"mobileIcon":1074,"desktopIcon":1076},{"text":1070,"config":1071},"/switch",{"href":1072,"dataGaName":1073,"dataGaLocation":1045},"#contact","switch",{"altText":1047,"config":1075},{"src":1049,"dataGaName":1050,"dataGaLocation":1045},{"altText":1047,"config":1077},{"src":1078,"dataGaName":1050,"dataGaLocation":1045},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1080,"mobileIcon":1085,"desktopIcon":1087},{"text":1081,"config":1082},"Back to pricing",{"href":815,"dataGaName":1083,"dataGaLocation":1045,"icon":1084},"back to pricing","GoBack",{"altText":1047,"config":1086},{"src":1049,"dataGaName":1050,"dataGaLocation":1045},{"altText":1047,"config":1088},{"src":1053,"dataGaName":1050,"dataGaLocation":1045},{"title":1090,"titleMobile":1091,"button":1092,"config":1097},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":708,"config":1093},{"href":1094,"dataGaName":1095,"dataGaLocation":1096},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1098,"disabled":641},"release",{"data":1100},{"text":1101,"source":1102,"edit":1108,"contribute":1113,"config":1118,"items":1123,"minimal":1331},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1103,"config":1104},"View page source",{"href":1105,"dataGaName":1106,"dataGaLocation":1107},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1109,"config":1110},"Edit this page",{"href":1111,"dataGaName":1112,"dataGaLocation":1107},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1114,"config":1115},"Please contribute",{"href":1116,"dataGaName":1117,"dataGaLocation":1107},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1119,"facebook":1120,"youtube":1121,"linkedin":1122},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1124,1171,1223,1267,1299],{"title":813,"links":1125,"subMenu":1140},[1126,1130,1135],{"text":1127,"config":1128},"View plans",{"href":815,"dataGaName":1129,"dataGaLocation":1107},"view plans",{"text":1131,"config":1132},"Why Premium?",{"href":1133,"dataGaName":1134,"dataGaLocation":1107},"/pricing/premium/","why premium",{"text":1136,"config":1137},"Why Ultimate?",{"href":1138,"dataGaName":1139,"dataGaLocation":1107},"/pricing/ultimate/","why ultimate",[1141],{"title":1142,"links":1143},"Contact Us",[1144,1147,1149,1151,1156,1161,1166],{"text":1145,"config":1146},"Contact sales",{"href":997,"dataGaName":676,"dataGaLocation":1107},{"text":1000,"config":1148},{"href":1002,"dataGaName":1003,"dataGaLocation":1107},{"text":1005,"config":1150},{"href":1007,"dataGaName":1008,"dataGaLocation":1107},{"text":1152,"config":1153},"Status",{"href":1154,"dataGaName":1155,"dataGaLocation":1107},"https://status.gitlab.com/","status",{"text":1157,"config":1158},"Terms of use",{"href":1159,"dataGaName":1160,"dataGaLocation":1107},"/terms/","terms of use",{"text":1162,"config":1163},"Privacy statement",{"href":1164,"dataGaName":1165,"dataGaLocation":1107},"/privacy/","privacy statement",{"text":1167,"config":1168},"Cookie preferences",{"dataGaName":1169,"dataGaLocation":1107,"id":1170,"isOneTrustButton":644},"cookie preferences","ot-sdk-btn",{"title":713,"links":1172,"subMenu":1181},[1173,1177],{"text":1174,"config":1175},"DevSecOps platform",{"href":695,"dataGaName":1176,"dataGaLocation":1107},"devsecops platform",{"text":1178,"config":1179},"AI-Assisted Development",{"href":702,"dataGaName":1180,"dataGaLocation":1107},"ai-assisted development",[1182],{"title":1183,"links":1184},"Topics",[1185,1190,1194,1198,1203,1208,1213,1218],{"text":1186,"config":1187},"CICD",{"href":1188,"dataGaName":1189,"dataGaLocation":1107},"/topics/ci-cd/","cicd",{"text":655,"config":1191},{"href":1192,"dataGaName":1193,"dataGaLocation":1107},"/topics/gitops/","gitops",{"text":658,"config":1195},{"href":1196,"dataGaName":1197,"dataGaLocation":1107},"/topics/devops/","devops",{"text":1199,"config":1200},"Version Control",{"href":1201,"dataGaName":1202,"dataGaLocation":1107},"/topics/version-control/","version control",{"text":1204,"config":1205},"DevSecOps",{"href":1206,"dataGaName":1207,"dataGaLocation":1107},"/topics/devsecops/","devsecops",{"text":1209,"config":1210},"Cloud Native",{"href":1211,"dataGaName":1212,"dataGaLocation":1107},"/topics/cloud-native/","cloud native",{"text":1214,"config":1215},"AI for Coding",{"href":1216,"dataGaName":1217,"dataGaLocation":1107},"/topics/devops/ai-for-coding/","ai for coding",{"text":1219,"config":1220},"Agentic AI",{"href":1221,"dataGaName":1222,"dataGaLocation":1107},"/topics/agentic-ai/","agentic ai",{"title":1224,"links":1225},"Solutions",[1226,1228,1230,1235,1239,1242,1246,1249,1251,1254,1257,1262],{"text":757,"config":1227},{"href":752,"dataGaName":757,"dataGaLocation":1107},{"text":746,"config":1229},{"href":729,"dataGaName":730,"dataGaLocation":1107},{"text":1231,"config":1232},"Agile development",{"href":1233,"dataGaName":1234,"dataGaLocation":1107},"/solutions/agile-delivery/","agile delivery",{"text":1236,"config":1237},"SCM",{"href":742,"dataGaName":1238,"dataGaLocation":1107},"source code management",{"text":1186,"config":1240},{"href":735,"dataGaName":1241,"dataGaLocation":1107},"continuous integration & delivery",{"text":1243,"config":1244},"Value stream management",{"href":785,"dataGaName":1245,"dataGaLocation":1107},"value stream management",{"text":655,"config":1247},{"href":1248,"dataGaName":1193,"dataGaLocation":1107},"/solutions/gitops/",{"text":795,"config":1250},{"href":798,"dataGaName":799,"dataGaLocation":1107},{"text":1252,"config":1253},"Small business",{"href":804,"dataGaName":805,"dataGaLocation":1107},{"text":1255,"config":1256},"Public sector",{"href":810,"dataGaName":811,"dataGaLocation":1107},{"text":1258,"config":1259},"Education",{"href":1260,"dataGaName":1261,"dataGaLocation":1107},"/solutions/education/","education",{"text":1263,"config":1264},"Financial services",{"href":1265,"dataGaName":1266,"dataGaLocation":1107},"/solutions/finance/","financial services",{"title":818,"links":1268},[1269,1271,1273,1275,1278,1280,1283,1285,1287,1289,1291,1293,1295,1297],{"text":831,"config":1270},{"href":833,"dataGaName":834,"dataGaLocation":1107},{"text":836,"config":1272},{"href":838,"dataGaName":839,"dataGaLocation":1107},{"text":841,"config":1274},{"href":843,"dataGaName":844,"dataGaLocation":1107},{"text":846,"config":1276},{"href":848,"dataGaName":1277,"dataGaLocation":1107},"docs",{"text":869,"config":1279},{"href":871,"dataGaName":872,"dataGaLocation":1107},{"text":1281,"config":1282},"What's new",{"href":929,"dataGaName":930,"dataGaLocation":1107},{"text":864,"config":1284},{"href":866,"dataGaName":867,"dataGaLocation":1107},{"text":883,"config":1286},{"href":885,"dataGaName":886,"dataGaLocation":1107},{"text":891,"config":1288},{"href":893,"dataGaName":894,"dataGaLocation":1107},{"text":896,"config":1290},{"href":898,"dataGaName":899,"dataGaLocation":1107},{"text":901,"config":1292},{"href":903,"dataGaName":904,"dataGaLocation":1107},{"text":906,"config":1294},{"href":908,"dataGaName":909,"dataGaLocation":1107},{"text":911,"config":1296},{"href":913,"dataGaName":914,"dataGaLocation":1107},{"text":916,"config":1298},{"href":918,"dataGaName":919,"dataGaLocation":1107},{"title":932,"links":1300},[1301,1303,1305,1307,1309,1311,1315,1320,1322,1324,1326],{"text":940,"config":1302},{"href":942,"dataGaName":934,"dataGaLocation":1107},{"text":945,"config":1304},{"href":947,"dataGaName":948,"dataGaLocation":1107},{"text":953,"config":1306},{"href":955,"dataGaName":956,"dataGaLocation":1107},{"text":958,"config":1308},{"href":960,"dataGaName":961,"dataGaLocation":1107},{"text":963,"config":1310},{"href":965,"dataGaName":966,"dataGaLocation":1107},{"text":1312,"config":1313},"Sustainability",{"href":1314,"dataGaName":1312,"dataGaLocation":1107},"/sustainability/",{"text":1316,"config":1317},"Diversity, inclusion and belonging (DIB)",{"href":1318,"dataGaName":1319,"dataGaLocation":1107},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":968,"config":1321},{"href":970,"dataGaName":971,"dataGaLocation":1107},{"text":978,"config":1323},{"href":980,"dataGaName":981,"dataGaLocation":1107},{"text":983,"config":1325},{"href":985,"dataGaName":986,"dataGaLocation":1107},{"text":1327,"config":1328},"Modern Slavery Transparency Statement",{"href":1329,"dataGaName":1330,"dataGaLocation":1107},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1332},[1333,1336,1339],{"text":1334,"config":1335},"Terms",{"href":1159,"dataGaName":1160,"dataGaLocation":1107},{"text":1337,"config":1338},"Cookies",{"dataGaName":1169,"dataGaLocation":1107,"id":1170,"isOneTrustButton":644},{"text":1340,"config":1341},"Privacy",{"href":1164,"dataGaName":1165,"dataGaLocation":1107},[1343],{"id":1344,"title":7,"body":640,"config":1345,"content":1347,"description":640,"extension":1351,"meta":1352,"navigation":644,"path":1353,"seo":1354,"stem":1355,"__hash__":1356},"blogAuthors/en-us/blog/authors/noah-ing.yml",{"template":1346},"BlogAuthor",{"name":7,"config":1348},{"headshot":1349,"ctfId":1350},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664410/Blog/Author%20Headshots/noahing.png","noahing","yml",{},"/en-us/blog/authors/noah-ing",{},"en-us/blog/authors/noah-ing","NHgV_yTX8kHX01mE2SSxC6hcOMw3BCWiblr8m6csLkw",[1358,1367,1375],{"title":1359,"description":1360,"heroImage":1361,"category":636,"date":1362,"authors":1363,"slug":1366,"externalUrl":640},"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",[1364,1365],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1368,"description":1369,"heroImage":1370,"category":636,"date":1371,"authors":1372,"slug":1374,"externalUrl":640},"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",[1373],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1376,"description":1377,"heroImage":1378,"category":636,"date":1379,"authors":1380,"slug":1382,"externalUrl":640},"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",[1381],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1384},[1385,1399,1411,1423],{"id":1386,"categories":1387,"header":1389,"text":1390,"button":1391,"image":1396},"ai-modernization",[1388],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1392,"config":1393},"Get your AI maturity score",{"href":1394,"dataGaName":1395,"dataGaLocation":872},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1397},{"src":1398},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1400,"categories":1401,"header":1403,"text":1390,"button":1404,"image":1408},"devops-modernization",[1402,1207],"product","Are you just managing tools or shipping innovation?",{"text":1405,"config":1406},"Get your DevOps maturity score",{"href":1407,"dataGaName":1395,"dataGaLocation":872},"/assessments/devops-modernization-assessment/",{"config":1409},{"src":1410},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1412,"categories":1413,"header":1415,"text":1390,"button":1416,"image":1420},"security-modernization",[1414],"security","Are you trading speed for security?",{"text":1417,"config":1418},"Get your security maturity score",{"href":1419,"dataGaName":1395,"dataGaLocation":872},"/assessments/security-modernization-assessment/",{"config":1421},{"src":1422},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1424,"paths":1425,"header":1428,"text":1429,"button":1430,"image":1435},"github-azure-migration",[1426,1427],"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":1431,"config":1432},"See how GitLab compares to GitHub",{"href":1433,"dataGaName":1434,"dataGaLocation":872},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1436},{"src":1410},{"header":1438,"blurb":1439,"button":1440,"secondaryButton":1445},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1441,"config":1442},"Get your free trial",{"href":1443,"dataGaName":671,"dataGaLocation":1444},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1145,"config":1446},{"href":997,"dataGaName":676,"dataGaLocation":1444},1786803752668]