[{"data":1,"prerenderedAt":1173},["ShallowReactive",2],{"/blog/how-to-stream-logs-through-the-gitlab-dashboard-for-kubernetes":3,"navigation-en-us":386,"banner-en-us":814,"footer-en-us":824,"blog-post-authors-en-us-Daniel Helfand":1068,"blog-related-posts-en-us-how-to-stream-logs-through-the-gitlab-dashboard-for-kubernetes":1083,"blog-promotions-en-us":1109,"next-steps-en-us":1163},{"id":4,"title":5,"authors":6,"body":8,"category":363,"date":364,"description":365,"extension":366,"externalUrl":367,"faq":367,"featured":368,"heroImage":369,"meta":370,"navigation":368,"path":371,"seo":372,"slug":377,"stem":378,"tags":379,"template":384,"updatedDate":367,"__hash__":385},"blogPosts/en-us/blog/how-to-stream-logs-through-the-gitlab-dashboard-for-kubernetes.md","How to stream logs through the GitLab Dashboard for Kubernetes",[7],"Daniel Helfand",{"type":9,"value":10,"toc":356},"minimark",[11,15,25,44,47,50,62,67,70,92,95,113,176,179,183,203,206,209,238,242,245,263,266,270,280,293,296,303,310,316,320,334,342,352],[12,13,14],"p",{},"Developers are context-switching more frequently, needing to understand and use multiple tools to accomplish complex tasks. These tools all have different user experiences and often do not present all the information needed to successfully develop, troubleshoot, and ship critical features. It is challenging enough to release and monitor software changes without also needing to understand so many tools.",[12,16,17,18,24],{},"With the addition of ",[19,20,23],"a",{"href":21,"rel":22},"https://docs.gitlab.com/releases/17/gitlab-17-2-released/#log-streaming-for-kubernetes-pods-and-containers",[],"pod log streaming through the GitLab Dashboard for Kubernetes in v17.2",", developers can go straight from a merge request review to watching a deployment rolled out to Kubernetes. This new feature will:",[26,27,28,32,35],"ul",{},[29,30,31],"li",{},"allow developers to avoid switching tooling",[29,33,34],{},"ease the process of troubleshooting and monitoring deployments and post-deployment application health",[29,36,37,38,43],{},"strengthen ",[19,39,42],{"href":40,"rel":41},"https://docs.gitlab.com/user/clusters/agent/gitops/",[],"GitOps workflows"," to easily manage application and infrastructure changes",[12,45,46],{},"The new feature allows GitLab users to view the logs of pods and containers directly via the GitLab UI. In previous versions of GitLab, users could configure a GitLab project to view pods deployed to certain namespaces on an associated cluster. This new feature allows users to further monitor workloads running on Kubernetes without needing to switch to another tool.",[12,48,49],{},"In the sections below, you will learn how to use this new feature by adding a Kubernetes cluster to a GitLab project, deploying a sample workload to a cluster, and viewing the logs of this workload running on a cluster.",[51,52,53],"blockquote",{},[12,54,55,56,61],{},"Need to know the basics of Kubernetes? ",[19,57,60],{"href":58,"rel":59},"https://about.gitlab.com/blog/kubernetes-the-container-orchestration-solution/",[],"Read this quick introductory blog",".",[63,64,66],"h2",{"id":65},"configure-a-gitlab-project-to-view-kubernetes-resources","Configure a GitLab project to view Kubernetes resources",[12,68,69],{},"Before proceeding with this section, the following prerequisites are required:",[26,71,72,75,78,86,89],{},[29,73,74],{},"a remote Kubernetes cluster (i.e., not running locally on your machine)",[29,76,77],{},"access to a GitLab v17.2 account",[29,79,80,85],{},[19,81,84],{"href":82,"rel":83},"https://gitlab.com/gitlab-da/tutorials/cloud-native/gitlab-k8s-log-streaming-example",[],"this repository"," forked to a GitLab group to which you have access",[29,87,88],{},"Helm CLI",[29,90,91],{},"kubectl CLI",[12,93,94],{},"Once you have satisfied the prerequisites involved, add an agent configuration file to the GitLab project you forked. The configuration file allows users to control permissions around how GitLab users may interact with the associated Kubernetes cluster.",[12,96,97,98,102,103,106,107,112],{},"You can use the configuration file included in this GitLab project by changing the following file: ",[99,100,101],"code",{},".gitlab/agents/k8s-agent/config.yaml",". Replace the ",[99,104,105],{},"\u003CGitLab group>"," in the id property shown below with the group where you have forked the example project. This config file will allow ",[19,108,111],{"href":109,"rel":110},"https://docs.gitlab.com/user/clusters/agent/user_access/",[],"GitLab to access your cluster via an agent"," that can be installed on your cluster.",[114,115,120],"pre",{"className":116,"code":117,"language":118,"meta":119,"style":119},"language-yaml shiki shiki-themes github-light","user_access:\n  access_as:\n    agent: {}\n  projects:\n    - id: \u003CGitLab group>/gitlab-k8s-log-streaming-example\n\n","yaml","",[99,121,122,135,143,152,160],{"__ignoreMap":119},[123,124,127,131],"span",{"class":125,"line":126},"line",1,[123,128,130],{"class":129},"shJU0","user_access",[123,132,134],{"class":133},"sgsFI",":\n",[123,136,138,141],{"class":125,"line":137},2,[123,139,140],{"class":129},"  access_as",[123,142,134],{"class":133},[123,144,146,149],{"class":125,"line":145},3,[123,147,148],{"class":129},"    agent",[123,150,151],{"class":133},": {}\n",[123,153,155,158],{"class":125,"line":154},4,[123,156,157],{"class":129},"  projects",[123,159,134],{"class":133},[123,161,163,166,169,172],{"class":125,"line":162},5,[123,164,165],{"class":133},"    - ",[123,167,168],{"class":129},"id",[123,170,171],{"class":133},": ",[123,173,175],{"class":174},"sYBdl","\u003CGitLab group>/gitlab-k8s-log-streaming-example\n",[12,177,178],{},"Once the above file is edited, you can commit and push these changes to the main branch of the project.",[63,180,182],{"id":181},"add-gitlab-kubernetes-agent-to-cluster","Add GitLab Kubernetes agent to cluster",[12,184,185,186,190,191,194,195,198,199,202],{},"With the agent configuration file added, now add the cluster to GitLab by installing an agent on your cluster. In the GitLab UI, go to your project and, on the left side of the screen, select ",[187,188,189],"strong",{},"Operate > Kubernetes clusters",". Once on this page, select the ",[187,192,193],{},"Connect a cluster"," button on the right side of the screen. From the dropdown menu, you can then select the agent, which should be ",[99,196,197],{},"k8s-agent",". Click ",[187,200,201],{},"Register"," to get instructions for how to install the agent on your cluster.",[12,204,205],{},"The instructions presented to you after registering the agent will be to run a helm command that will install the GitLab agent on your cluster. Before running the command locally, you will want to ensure your Kubernetes context is targeting the cluster you want to work with. Once you have verified you are using the correct kubeconfig locally, you can run the helm command to install the agent on your cluster.",[12,207,208],{},"Once both pods are running, GitLab should be able to connect to the agent. Run the following command to wait for the pods to start up:",[114,210,214],{"className":211,"code":212,"language":213,"meta":119,"style":119},"language-shell shiki shiki-themes github-light","kubectl get pods -n gitlab-agent-k8s-agent -w\n","shell",[99,215,216],{"__ignoreMap":119},[123,217,218,222,225,228,232,235],{"class":125,"line":126},[123,219,221],{"class":220},"s7eDp","kubectl",[123,223,224],{"class":174}," get",[123,226,227],{"class":174}," pods",[123,229,231],{"class":230},"sYu0t"," -n",[123,233,234],{"class":174}," gitlab-agent-k8s-agent",[123,236,237],{"class":230}," -w\n",[63,239,241],{"id":240},"deploy-sample-application-to-your-cluster","Deploy sample application to your cluster",[12,243,244],{},"Before you can view logs of a workload through GitLab, you first need to have something running on your cluster. To do this, you can run the following kubectl command locally.",[114,246,248],{"className":211,"code":247,"language":213,"meta":119,"style":119},"kubectl apply -f https://gitlab.com/gitlab-da/tutorials/cloud-native/gitlab-k8s-log-streaming-example/-/raw/main/k8s-manifests/k8s.yaml\n",[99,249,250],{"__ignoreMap":119},[123,251,252,254,257,260],{"class":125,"line":126},[123,253,221],{"class":220},[123,255,256],{"class":174}," apply",[123,258,259],{"class":230}," -f",[123,261,262],{"class":174}," https://gitlab.com/gitlab-da/tutorials/cloud-native/gitlab-k8s-log-streaming-example/-/raw/main/k8s-manifests/k8s.yaml\n",[12,264,265],{},"After the command runs successfully, you are now ready to complete the final step to set up a Kubernetes dashboard via GitLab.",[63,267,269],{"id":268},"view-pod-logs-through-the-gitlab-ui","View pod logs through the GitLab UI",[12,271,272,273,276,277,61],{},"To add the Kubernetes dashboard via the GitLab UI, go to your project and, on the left side of the screen, select ",[187,274,275],{},"Operate > Environments",". On the top right side of the screen, select the ",[187,278,279],{},"Create an environment",[12,281,282,283,285,286,289,290,61],{},"Next, you can give your environment a name, select the GitLab agent (i.e. ",[99,284,197],{},"), and pick a namespace for the Kubernetes dashboard to focus on. Since the application is running in the ",[99,287,288],{},"gitlab-k8s-log-streaming-example-dev"," namespace, select this option from the namespace dropdown. After naming the environment and selecting the agent and namespace, click ",[187,291,292],{},"Save",[12,294,295],{},"After creating the environment, you should now see information about the application’s pods displayed via the GitLab UI.",[12,297,298],{},[299,300],"img",{"alt":301,"src":302},"Kubernetes logs - image 2","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749676402/Blog/Content%20Images/Screenshot_2024-08-20_at_12.15.08_PM.png",[12,304,305,306,309],{},"Go to the right side of the screen and click ",[187,307,308],{},"View Logs"," to see logs for one of the pods associated with the application.",[12,311,312],{},[299,313],{"alt":314,"src":315},"Kubernetes dashboard - image 1","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749676402/Blog/Content%20Images/Screenshot_2024-08-20_at_12.16.56_PM.png",[63,317,319],{"id":318},"try-it-out-and-share-feedback","Try it out and share feedback",[12,321,322,323,327,328,333],{},"The introduction of pod log streaming in GitLab v17.2 will help GitLab users get one step closer to managing complex deployments to Kubernetes, as well as monitoring and troubleshooting issues post deployment via a common user experience. We are excited to hear more about users’ experiences with this new enhancement and how it helps improve DevOps workflows around Kubernetes. To share your experience with us, you can open an issue to the ",[19,324,326],{"href":82,"rel":325},[],"project associated with this tutorial",". Or, ",[19,329,332],{"href":330,"rel":331},"https://gitlab.com/gitlab-org/gitlab/-/issues/478379",[],"comment directly in the Kubernetes log streaming feedback issue"," to report information to the GitLab engineering team.",[12,335,336,337,61],{},"More information on getting started with the GitLab Dashboard for Kubernetes can be found in the documentation ",[19,338,341],{"href":339,"rel":340},"https://docs.gitlab.com/ci/environments/kubernetes_dashboard/",[],"here",[51,343,344],{},[12,345,346,347,61],{},"To explore the GitLab Dashboard for Kubernetes as well as other more advanced features of GitLab, sign up for ",[19,348,351],{"href":349,"rel":350},"https://about.gitlab.com/free-trial/",[],"our free trial of GitLab Ultimate",[353,354,355],"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);}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":119,"searchDepth":137,"depth":137,"links":357},[358,359,360,361,362],{"id":65,"depth":137,"text":66},{"id":181,"depth":137,"text":182},{"id":240,"depth":137,"text":241},{"id":268,"depth":137,"text":269},{"id":318,"depth":137,"text":319},"engineering","2024-08-19","In GitLab 17.2, users can now view Kubernetes pod and container logs directly via the GitLab UI. This tutorial shows how to use this new feature to simplify monitoring Kubernetes infrastructure.","md",null,true,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662245/Blog/Hero%20Images/blog-image-template-1800x945__16_.png",{},"/en-us/blog/how-to-stream-logs-through-the-gitlab-dashboard-for-kubernetes",{"title":5,"description":365,"ogTitle":5,"ogDescription":365,"noIndex":373,"ogImage":369,"ogUrl":374,"ogSiteName":375,"ogType":376,"canonicalUrls":374},false,"https://about.gitlab.com/blog/how-to-stream-logs-through-the-gitlab-dashboard-for-kubernetes","https://about.gitlab.com","article","how-to-stream-logs-through-the-gitlab-dashboard-for-kubernetes","en-us/blog/how-to-stream-logs-through-the-gitlab-dashboard-for-kubernetes",[380,381,382,383],"features","GitOps","kubernetes","tutorial","BlogPost","sKYPUh6mm73SkYeO7jD6JFfrxfzACVeLMbH94sHyKkI",{"logo":387,"freeTrial":392,"sales":397,"login":402,"items":407,"search":734,"minimal":765,"duo":784,"switchNav":793,"pricingDeployment":804},{"config":388},{"href":389,"dataGaName":390,"dataGaLocation":391},"/","gitlab logo","header",{"text":393,"config":394},"Get free trial",{"href":395,"dataGaName":396,"dataGaLocation":391},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":398,"config":399},"Request a demo",{"href":400,"dataGaName":401,"dataGaLocation":391},"/sales/?contact-topic=request-demo","sales",{"text":403,"config":404},"Sign in",{"href":405,"dataGaName":406,"dataGaLocation":391},"https://gitlab.com/users/sign_in/","sign in",[408,437,537,542,656,712],{"text":409,"config":410,"menu":412},"Platform",{"dataNavLevelOne":411},"platform",{"type":413,"columns":414},"cards",[415,421,429],{"title":409,"description":416,"link":417},"The intelligent orchestration platform for DevSecOps",{"text":418,"config":419},"Explore our Platform",{"href":420,"dataGaName":411,"dataGaLocation":391},"/platform/",{"title":422,"description":423,"link":424},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":425,"config":426},"Meet GitLab Duo",{"href":427,"dataGaName":428,"dataGaLocation":391},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":430,"description":431,"link":432},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":433,"config":434},"Learn more",{"href":435,"dataGaName":436,"dataGaLocation":391},"/why-gitlab/","why gitlab",{"text":438,"left":368,"config":439,"menu":441},"Product",{"dataNavLevelOne":440},"solutions",{"type":442,"link":443,"columns":447,"feature":516},"lists",{"text":444,"config":445},"View all Solutions",{"href":446,"dataGaName":440,"dataGaLocation":391},"/solutions/",[448,472,495],{"title":449,"description":450,"link":451,"items":456},"Automation","CI/CD and automation to accelerate deployment",{"config":452},{"icon":453,"href":454,"dataGaName":455,"dataGaLocation":391},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[457,461,464,468],{"text":458,"config":459},"CI/CD",{"href":460,"dataGaLocation":391,"dataGaName":458},"/solutions/continuous-integration/",{"text":422,"config":462},{"href":427,"dataGaLocation":391,"dataGaName":463},"gitlab duo agent platform - product menu",{"text":465,"config":466},"Source Code Management",{"href":467,"dataGaLocation":391,"dataGaName":465},"/solutions/source-code-management/",{"text":469,"config":470},"Automated Software Delivery",{"href":454,"dataGaLocation":391,"dataGaName":471},"Automated software delivery",{"title":473,"description":474,"link":475,"items":480},"Security","Deliver code faster without compromising security",{"config":476},{"href":477,"dataGaName":478,"dataGaLocation":391,"icon":479},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[481,485,490],{"text":482,"config":483},"Application Security Testing",{"href":477,"dataGaName":484,"dataGaLocation":391},"Application security testing",{"text":486,"config":487},"Software Supply Chain Security",{"href":488,"dataGaLocation":391,"dataGaName":489},"/solutions/supply-chain/","Software supply chain security",{"text":491,"config":492},"Software Compliance",{"href":493,"dataGaName":494,"dataGaLocation":391},"/solutions/software-compliance/","software compliance",{"title":496,"link":497,"items":502},"Measurement",{"config":498},{"icon":499,"href":500,"dataGaName":501,"dataGaLocation":391},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[503,507,511],{"text":504,"config":505},"Visibility & Measurement",{"href":500,"dataGaLocation":391,"dataGaName":506},"Visibility and Measurement",{"text":508,"config":509},"Value Stream Management",{"href":510,"dataGaLocation":391,"dataGaName":508},"/solutions/value-stream-management/",{"text":512,"config":513},"Analytics & Insights",{"href":514,"dataGaLocation":391,"dataGaName":515},"/solutions/analytics-and-insights/","Analytics and insights",{"title":517,"type":442,"items":518},"GitLab for",[519,525,531],{"text":520,"config":521},"Enterprise",{"icon":522,"href":523,"dataGaLocation":391,"dataGaName":524},"Building","/enterprise/","enterprise",{"text":526,"config":527},"Small Business",{"icon":528,"href":529,"dataGaLocation":391,"dataGaName":530},"Work","/small-business/","small business",{"text":532,"config":533},"Public Sector",{"icon":534,"href":535,"dataGaLocation":391,"dataGaName":536},"Organization","/solutions/public-sector/","public sector",{"text":538,"config":539},"Pricing",{"href":540,"dataGaName":541,"dataGaLocation":391,"dataNavLevelOne":541},"/pricing/","pricing",{"text":543,"config":544,"menu":546},"Resources",{"dataNavLevelOne":545},"resources",{"type":442,"link":547,"columns":551,"feature":645},{"text":548,"config":549},"View all resources",{"href":550,"dataGaName":545,"dataGaLocation":391},"/resources/",[552,585,612],{"title":553,"items":554},"Getting started",[555,560,565,570,575,580],{"text":556,"config":557},"Install",{"href":558,"dataGaName":559,"dataGaLocation":391},"/install/","install",{"text":561,"config":562},"Quick start guides",{"href":563,"dataGaName":564,"dataGaLocation":391},"/get-started/","quick setup checklists",{"text":566,"config":567},"Learn",{"href":568,"dataGaLocation":391,"dataGaName":569},"https://university.gitlab.com/","learn",{"text":571,"config":572},"Product documentation",{"href":573,"dataGaName":574,"dataGaLocation":391},"https://docs.gitlab.com/","product documentation",{"text":576,"config":577},"Best practice videos",{"href":578,"dataGaName":579,"dataGaLocation":391},"/getting-started-videos/","best practice videos",{"text":581,"config":582},"Integrations",{"href":583,"dataGaName":584,"dataGaLocation":391},"/integrations/","integrations",{"title":586,"items":587},"Discover",[588,593,598,603,607],{"text":589,"config":590},"Customer success stories",{"href":591,"dataGaName":592,"dataGaLocation":391},"/customers/","customer success stories",{"text":594,"config":595},"Blog",{"href":596,"dataGaName":597,"dataGaLocation":391},"/blog/","blog",{"text":599,"config":600},"Demo Hub",{"href":601,"dataGaName":602,"dataGaLocation":391},"/demo-hub/","demo hub",{"text":604,"config":605},"The Source",{"href":606,"dataGaName":597,"dataGaLocation":391},"/the-source/",{"text":608,"config":609},"Remote",{"href":610,"dataGaName":611,"dataGaLocation":391},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":613,"items":614},"Connect",[615,620,625,630,635,640],{"text":616,"config":617},"GitLab Services",{"href":618,"dataGaName":619,"dataGaLocation":391},"/services/","services",{"text":621,"config":622},"Contribute",{"href":623,"dataGaName":624,"dataGaLocation":391},"https://contributors.gitlab.com","contribute",{"text":626,"config":627},"Community",{"href":628,"dataGaName":629,"dataGaLocation":391},"/community/","community",{"text":631,"config":632},"Forum",{"href":633,"dataGaName":634,"dataGaLocation":391},"https://forum.gitlab.com/","forum",{"text":636,"config":637},"Events",{"href":638,"dataGaName":639,"dataGaLocation":391},"/events/","events",{"text":641,"config":642},"Partners",{"href":643,"dataGaName":644,"dataGaLocation":391},"/partners/","partners",{"config":646,"title":649,"text":650,"link":651},{"background":647,"textColor":648},"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":652,"config":653},"Read the latest",{"href":654,"dataGaName":655,"dataGaLocation":391},"/whats-new/","whats new",{"text":657,"config":658,"menu":660},"Company",{"dataNavLevelOne":659},"company",{"type":442,"columns":661},[662],{"items":663},[664,669,675,677,682,687,692,697,702,707],{"text":665,"config":666},"About",{"href":667,"dataGaName":668,"dataGaLocation":391},"/company/","about",{"text":670,"config":671,"footerGa":674},"Jobs",{"href":672,"dataGaName":673,"dataGaLocation":391},"/jobs/","jobs",{"dataGaName":673},{"text":636,"config":676},{"href":638,"dataGaName":639,"dataGaLocation":391},{"text":678,"config":679},"Leadership",{"href":680,"dataGaName":681,"dataGaLocation":391},"/company/team/e-group/","leadership",{"text":683,"config":684},"Handbook",{"href":685,"dataGaName":686,"dataGaLocation":391},"https://handbook.gitlab.com/","handbook",{"text":688,"config":689},"Investor relations",{"href":690,"dataGaName":691,"dataGaLocation":391},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":693,"config":694},"Trust Center",{"href":695,"dataGaName":696,"dataGaLocation":391},"/security/","trust center",{"text":698,"config":699},"AI Transparency Center",{"href":700,"dataGaName":701,"dataGaLocation":391},"/ai-transparency-center/","ai transparency center",{"text":703,"config":704},"Newsletter",{"href":705,"dataGaName":706,"dataGaLocation":391},"/company/contact/#contact-forms","newsletter",{"text":708,"config":709},"Press",{"href":710,"dataGaName":711,"dataGaLocation":391},"/press/","press",{"text":713,"config":714,"menu":715},"Contact us",{"dataNavLevelOne":659},{"type":442,"columns":716},[717],{"items":718},[719,724,729],{"text":720,"config":721},"Talk to sales",{"href":722,"dataGaName":723,"dataGaLocation":391},"/sales/","talk to sales",{"text":725,"config":726},"Support portal",{"href":727,"dataGaName":728,"dataGaLocation":391},"https://support.gitlab.com/hc/en-us","support portal",{"text":730,"config":731},"Customer portal",{"href":732,"dataGaName":733,"dataGaLocation":391},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":735,"login":736,"suggestions":743},"Close",{"text":737,"link":738},"To search repositories and projects, login to",{"text":739,"config":740},"gitlab.com",{"href":405,"dataGaName":741,"dataGaLocation":742},"search login","search",{"text":744,"default":745},"Suggestions",[746,748,752,754,758,762],{"text":422,"config":747},{"href":427,"dataGaName":422,"dataGaLocation":742},{"text":749,"config":750},"Code Suggestions (AI)",{"href":751,"dataGaName":749,"dataGaLocation":742},"/solutions/code-suggestions/",{"text":458,"config":753},{"href":460,"dataGaName":458,"dataGaLocation":742},{"text":755,"config":756},"GitLab on AWS",{"href":757,"dataGaName":755,"dataGaLocation":742},"/partners/technology-partners/aws/",{"text":759,"config":760},"GitLab on Google Cloud",{"href":761,"dataGaName":759,"dataGaLocation":742},"/partners/technology-partners/google-cloud-platform/",{"text":763,"config":764},"Why GitLab?",{"href":435,"dataGaName":763,"dataGaLocation":742},{"freeTrial":766,"mobileIcon":771,"desktopIcon":776,"secondaryButton":779},{"text":767,"config":768},"Start free trial",{"href":769,"dataGaName":396,"dataGaLocation":770},"https://gitlab.com/-/trials/new/","nav",{"altText":772,"config":773},"Gitlab Icon",{"src":774,"dataGaName":775,"dataGaLocation":770},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":772,"config":777},{"src":778,"dataGaName":775,"dataGaLocation":770},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":780,"config":781},"Get Started",{"href":782,"dataGaName":783,"dataGaLocation":770},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":785,"mobileIcon":789,"desktopIcon":791},{"text":786,"config":787},"Learn more about GitLab Duo",{"href":427,"dataGaName":788,"dataGaLocation":770},"gitlab duo",{"altText":772,"config":790},{"src":774,"dataGaName":775,"dataGaLocation":770},{"altText":772,"config":792},{"src":778,"dataGaName":775,"dataGaLocation":770},{"button":794,"mobileIcon":799,"desktopIcon":801},{"text":795,"config":796},"/switch",{"href":797,"dataGaName":798,"dataGaLocation":770},"#contact","switch",{"altText":772,"config":800},{"src":774,"dataGaName":775,"dataGaLocation":770},{"altText":772,"config":802},{"src":803,"dataGaName":775,"dataGaLocation":770},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":805,"mobileIcon":810,"desktopIcon":812},{"text":806,"config":807},"Back to pricing",{"href":540,"dataGaName":808,"dataGaLocation":770,"icon":809},"back to pricing","GoBack",{"altText":772,"config":811},{"src":774,"dataGaName":775,"dataGaLocation":770},{"altText":772,"config":813},{"src":778,"dataGaName":775,"dataGaLocation":770},{"title":815,"titleMobile":816,"button":817,"config":822},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":433,"config":818},{"href":819,"dataGaName":820,"dataGaLocation":821},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":823,"disabled":373},"release",{"data":825},{"text":826,"source":827,"edit":833,"contribute":838,"config":843,"items":848,"minimal":1057},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":828,"config":829},"View page source",{"href":830,"dataGaName":831,"dataGaLocation":832},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":834,"config":835},"Edit this page",{"href":836,"dataGaName":837,"dataGaLocation":832},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":839,"config":840},"Please contribute",{"href":841,"dataGaName":842,"dataGaLocation":832},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":844,"facebook":845,"youtube":846,"linkedin":847},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[849,896,949,993,1025],{"title":538,"links":850,"subMenu":865},[851,855,860],{"text":852,"config":853},"View plans",{"href":540,"dataGaName":854,"dataGaLocation":832},"view plans",{"text":856,"config":857},"Why Premium?",{"href":858,"dataGaName":859,"dataGaLocation":832},"/pricing/premium/","why premium",{"text":861,"config":862},"Why Ultimate?",{"href":863,"dataGaName":864,"dataGaLocation":832},"/pricing/ultimate/","why ultimate",[866],{"title":867,"links":868},"Contact Us",[869,872,874,876,881,886,891],{"text":870,"config":871},"Contact sales",{"href":722,"dataGaName":401,"dataGaLocation":832},{"text":725,"config":873},{"href":727,"dataGaName":728,"dataGaLocation":832},{"text":730,"config":875},{"href":732,"dataGaName":733,"dataGaLocation":832},{"text":877,"config":878},"Status",{"href":879,"dataGaName":880,"dataGaLocation":832},"https://status.gitlab.com/","status",{"text":882,"config":883},"Terms of use",{"href":884,"dataGaName":885,"dataGaLocation":832},"/terms/","terms of use",{"text":887,"config":888},"Privacy statement",{"href":889,"dataGaName":890,"dataGaLocation":832},"/privacy/","privacy statement",{"text":892,"config":893},"Cookie preferences",{"dataGaName":894,"dataGaLocation":832,"id":895,"isOneTrustButton":368},"cookie preferences","ot-sdk-btn",{"title":438,"links":897,"subMenu":906},[898,902],{"text":899,"config":900},"DevSecOps platform",{"href":420,"dataGaName":901,"dataGaLocation":832},"devsecops platform",{"text":903,"config":904},"AI-Assisted Development",{"href":427,"dataGaName":905,"dataGaLocation":832},"ai-assisted development",[907],{"title":908,"links":909},"Topics",[910,915,919,924,929,934,939,944],{"text":911,"config":912},"CICD",{"href":913,"dataGaName":914,"dataGaLocation":832},"/topics/ci-cd/","cicd",{"text":381,"config":916},{"href":917,"dataGaName":918,"dataGaLocation":832},"/topics/gitops/","gitops",{"text":920,"config":921},"DevOps",{"href":922,"dataGaName":923,"dataGaLocation":832},"/topics/devops/","devops",{"text":925,"config":926},"Version Control",{"href":927,"dataGaName":928,"dataGaLocation":832},"/topics/version-control/","version control",{"text":930,"config":931},"DevSecOps",{"href":932,"dataGaName":933,"dataGaLocation":832},"/topics/devsecops/","devsecops",{"text":935,"config":936},"Cloud Native",{"href":937,"dataGaName":938,"dataGaLocation":832},"/topics/cloud-native/","cloud native",{"text":940,"config":941},"AI for Coding",{"href":942,"dataGaName":943,"dataGaLocation":832},"/topics/devops/ai-for-coding/","ai for coding",{"text":945,"config":946},"Agentic AI",{"href":947,"dataGaName":948,"dataGaLocation":832},"/topics/agentic-ai/","agentic ai",{"title":950,"links":951},"Solutions",[952,954,956,961,965,968,972,975,977,980,983,988],{"text":482,"config":953},{"href":477,"dataGaName":482,"dataGaLocation":832},{"text":471,"config":955},{"href":454,"dataGaName":455,"dataGaLocation":832},{"text":957,"config":958},"Agile development",{"href":959,"dataGaName":960,"dataGaLocation":832},"/solutions/agile-delivery/","agile delivery",{"text":962,"config":963},"SCM",{"href":467,"dataGaName":964,"dataGaLocation":832},"source code management",{"text":911,"config":966},{"href":460,"dataGaName":967,"dataGaLocation":832},"continuous integration & delivery",{"text":969,"config":970},"Value stream management",{"href":510,"dataGaName":971,"dataGaLocation":832},"value stream management",{"text":381,"config":973},{"href":974,"dataGaName":918,"dataGaLocation":832},"/solutions/gitops/",{"text":520,"config":976},{"href":523,"dataGaName":524,"dataGaLocation":832},{"text":978,"config":979},"Small business",{"href":529,"dataGaName":530,"dataGaLocation":832},{"text":981,"config":982},"Public sector",{"href":535,"dataGaName":536,"dataGaLocation":832},{"text":984,"config":985},"Education",{"href":986,"dataGaName":987,"dataGaLocation":832},"/solutions/education/","education",{"text":989,"config":990},"Financial services",{"href":991,"dataGaName":992,"dataGaLocation":832},"/solutions/finance/","financial services",{"title":543,"links":994},[995,997,999,1001,1004,1006,1009,1011,1013,1015,1017,1019,1021,1023],{"text":556,"config":996},{"href":558,"dataGaName":559,"dataGaLocation":832},{"text":561,"config":998},{"href":563,"dataGaName":564,"dataGaLocation":832},{"text":566,"config":1000},{"href":568,"dataGaName":569,"dataGaLocation":832},{"text":571,"config":1002},{"href":573,"dataGaName":1003,"dataGaLocation":832},"docs",{"text":594,"config":1005},{"href":596,"dataGaName":597,"dataGaLocation":832},{"text":1007,"config":1008},"What's new",{"href":654,"dataGaName":655,"dataGaLocation":832},{"text":589,"config":1010},{"href":591,"dataGaName":592,"dataGaLocation":832},{"text":608,"config":1012},{"href":610,"dataGaName":611,"dataGaLocation":832},{"text":616,"config":1014},{"href":618,"dataGaName":619,"dataGaLocation":832},{"text":621,"config":1016},{"href":623,"dataGaName":624,"dataGaLocation":832},{"text":626,"config":1018},{"href":628,"dataGaName":629,"dataGaLocation":832},{"text":631,"config":1020},{"href":633,"dataGaName":634,"dataGaLocation":832},{"text":636,"config":1022},{"href":638,"dataGaName":639,"dataGaLocation":832},{"text":641,"config":1024},{"href":643,"dataGaName":644,"dataGaLocation":832},{"title":657,"links":1026},[1027,1029,1031,1033,1035,1037,1041,1046,1048,1050,1052],{"text":665,"config":1028},{"href":667,"dataGaName":659,"dataGaLocation":832},{"text":670,"config":1030},{"href":672,"dataGaName":673,"dataGaLocation":832},{"text":678,"config":1032},{"href":680,"dataGaName":681,"dataGaLocation":832},{"text":683,"config":1034},{"href":685,"dataGaName":686,"dataGaLocation":832},{"text":688,"config":1036},{"href":690,"dataGaName":691,"dataGaLocation":832},{"text":1038,"config":1039},"Sustainability",{"href":1040,"dataGaName":1038,"dataGaLocation":832},"/sustainability/",{"text":1042,"config":1043},"Diversity, inclusion and belonging (DIB)",{"href":1044,"dataGaName":1045,"dataGaLocation":832},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":693,"config":1047},{"href":695,"dataGaName":696,"dataGaLocation":832},{"text":703,"config":1049},{"href":705,"dataGaName":706,"dataGaLocation":832},{"text":708,"config":1051},{"href":710,"dataGaName":711,"dataGaLocation":832},{"text":1053,"config":1054},"Modern Slavery Transparency Statement",{"href":1055,"dataGaName":1056,"dataGaLocation":832},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1058},[1059,1062,1065],{"text":1060,"config":1061},"Terms",{"href":884,"dataGaName":885,"dataGaLocation":832},{"text":1063,"config":1064},"Cookies",{"dataGaName":894,"dataGaLocation":832,"id":895,"isOneTrustButton":368},{"text":1066,"config":1067},"Privacy",{"href":889,"dataGaName":890,"dataGaLocation":832},[1069],{"id":1070,"title":7,"body":367,"config":1071,"content":1073,"description":367,"extension":1077,"meta":1078,"navigation":368,"path":1079,"seo":1080,"stem":1081,"__hash__":1082},"blogAuthors/en-us/blog/authors/daniel-helfand.yml",{"template":1072},"BlogAuthor",{"name":7,"config":1074},{"headshot":1075,"ctfId":1076},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662418/Blog/Author%20Headshots/dhelfand.png","b9sRP0HJhdPsOEruWUfih","yml",{},"/en-us/blog/authors/daniel-helfand",{},"en-us/blog/authors/daniel-helfand","U_csW5bNItyLp5wX6zV8xvC4yi-USG4wFxbnBMasIFw",[1084,1093,1101],{"title":1085,"description":1086,"heroImage":1087,"category":363,"date":1088,"authors":1089,"slug":1092,"externalUrl":367},"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",[1090,1091],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1094,"description":1095,"heroImage":1096,"category":363,"date":1097,"authors":1098,"slug":1100,"externalUrl":367},"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",[1099],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1102,"description":1103,"heroImage":1104,"category":363,"date":1105,"authors":1106,"slug":1108,"externalUrl":367},"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",[1107],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1110},[1111,1125,1137,1149],{"id":1112,"categories":1113,"header":1115,"text":1116,"button":1117,"image":1122},"ai-modernization",[1114],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1118,"config":1119},"Get your AI maturity score",{"href":1120,"dataGaName":1121,"dataGaLocation":597},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1123},{"src":1124},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1126,"categories":1127,"header":1129,"text":1116,"button":1130,"image":1134},"devops-modernization",[1128,933],"product","Are you just managing tools or shipping innovation?",{"text":1131,"config":1132},"Get your DevOps maturity score",{"href":1133,"dataGaName":1121,"dataGaLocation":597},"/assessments/devops-modernization-assessment/",{"config":1135},{"src":1136},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1138,"categories":1139,"header":1141,"text":1116,"button":1142,"image":1146},"security-modernization",[1140],"security","Are you trading speed for security?",{"text":1143,"config":1144},"Get your security maturity score",{"href":1145,"dataGaName":1121,"dataGaLocation":597},"/assessments/security-modernization-assessment/",{"config":1147},{"src":1148},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1150,"paths":1151,"header":1154,"text":1155,"button":1156,"image":1161},"github-azure-migration",[1152,1153],"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":1157,"config":1158},"See how GitLab compares to GitHub",{"href":1159,"dataGaName":1160,"dataGaLocation":597},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1162},{"src":1136},{"header":1164,"blurb":1165,"button":1166,"secondaryButton":1171},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1167,"config":1168},"Get your free trial",{"href":1169,"dataGaName":396,"dataGaLocation":1170},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":870,"config":1172},{"href":722,"dataGaName":401,"dataGaLocation":1170},1786803771709]