[{"data":1,"prerenderedAt":1352},["ShallowReactive",2],{"/blog/threat-modeling-kubernetes-agent":3,"navigation-en-us":566,"banner-en-us":994,"footer-en-us":1004,"blog-post-authors-en-us-Vitor Meireles De Sousa":1249,"blog-related-posts-en-us-threat-modeling-kubernetes-agent":1264,"blog-promotions-en-us":1289,"next-steps-en-us":1342},{"id":4,"title":5,"authors":6,"body":8,"category":548,"date":549,"description":550,"extension":551,"externalUrl":552,"faq":552,"featured":553,"heroImage":554,"meta":555,"navigation":72,"path":556,"seo":557,"slug":561,"stem":562,"tags":563,"template":564,"updatedDate":552,"__hash__":565},"blogPosts/en-us/blog/threat-modeling-kubernetes-agent.md","Threat modeling the Kubernetes Agent: from MVC to continuous improvement",[7],"Vitor Meireles De Sousa",{"type":9,"value":10,"toc":537},"minimark",[11,15,27,32,35,40,55,150,164,168,185,257,260,269,278,294,298,301,307,312,329,337,340,345,349,363,369,372,375,413,417,420,429,438,442,457,461,464,467,475,480,483,497,501,533],[12,13,14],"p",{},"Threat modeling is more common in people’s everyday lives than they might think.  Each of us performs some level of threat modeling every time we’re in a situation where we’re evaluating threats. An everyday example I really like: crossing the street. Before we cross the street we look both ways, we evaluate the speed of each oncoming vehicle and verify the driver has seen us. Finally, if the lights are green, we cross the street. This is threat modeling!",[12,16,17],{},[18,19,20,21,26],"em",{},"If you’re interested in learning more about what threat modeling is and how we’re developing our threat model here at GitLab, you can read about ",[22,23,25],"a",{"href":24},"/blog/creating-a-threat-model-that-works-for-gitlab/","“How we’re creating a threat model framework that works for\nGitLab“"," by my teammate Mark Loveless.",[28,29,31],"h2",{"id":30},"threat-modeling-irl","Threat modeling IRL",[12,33,34],{},"In this blog post I’ll talk about how we put our threat modeling process into action iteratively with an in-depth look into how we developed the process from a security assessment with a side of threat modeling to a full-fledged standalone activity.",[36,37,39],"h3",{"id":38},"our-threat-modeling-mvc","Our threat modeling MVC",[12,41,42,43,48,49,54],{},"We rolled out the initial iteration of the GitLab threat model in November of 2020. One of the first projects we assessed through that new process was\nGitLab’s ",[22,44,47],{"href":45,"rel":46},"https://docs.gitlab.com/user/clusters/agent/",[],"Kubernetes Agent","\nbeta. At that time, my colleague Joern\nSchneeweisz performed an initial threat model, which was actually more of a security assessment in which threat modeling activities were incorporated. In this data flow diagram from our initial threat model, you can see how the ",[22,50,53],{"href":51,"rel":52},"https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/f374356751aec8cb65b9dea4de3ba618805c2414/docs/architecture.md",[],"architecture for the Kubernetes\nAgent looked in May 2020",":",[56,57,62],"pre",{"className":58,"code":59,"language":60,"meta":61,"style":61},"language-mermaid shiki shiki-themes github-light","\ngraph TB\n  agentk -- gRPC bidirectional streaming --> kgb\n\n  subgraph \"GitLab\"\n  kgb[kgb]\n  GitLabRoR[GitLab RoR] -- gRPC --> kgb\n  kgb -- gRPC --> Gitaly[Gitaly]\n  kgb -- REST API --> GitLabRoR\n  end\n\n  subgraph \"Kubernetes cluster\"\n  agentk[agentk]\n  end\n","mermaid","",[63,64,65,74,81,87,92,98,104,110,116,122,128,133,139,145],"code",{"__ignoreMap":61},[66,67,70],"span",{"class":68,"line":69},"line",1,[66,71,73],{"emptyLinePlaceholder":72},true,"\n",[66,75,77],{"class":68,"line":76},2,[66,78,80],{"class":79},"sgsFI","graph TB\n",[66,82,84],{"class":68,"line":83},3,[66,85,86],{"class":79},"  agentk -- gRPC bidirectional streaming --> kgb\n",[66,88,90],{"class":68,"line":89},4,[66,91,73],{"emptyLinePlaceholder":72},[66,93,95],{"class":68,"line":94},5,[66,96,97],{"class":79},"  subgraph \"GitLab\"\n",[66,99,101],{"class":68,"line":100},6,[66,102,103],{"class":79},"  kgb[kgb]\n",[66,105,107],{"class":68,"line":106},7,[66,108,109],{"class":79},"  GitLabRoR[GitLab RoR] -- gRPC --> kgb\n",[66,111,113],{"class":68,"line":112},8,[66,114,115],{"class":79},"  kgb -- gRPC --> Gitaly[Gitaly]\n",[66,117,119],{"class":68,"line":118},9,[66,120,121],{"class":79},"  kgb -- REST API --> GitLabRoR\n",[66,123,125],{"class":68,"line":124},10,[66,126,127],{"class":79},"  end\n",[66,129,131],{"class":68,"line":130},11,[66,132,73],{"emptyLinePlaceholder":72},[66,134,136],{"class":68,"line":135},12,[66,137,138],{"class":79},"  subgraph \"Kubernetes cluster\"\n",[66,140,142],{"class":68,"line":141},13,[66,143,144],{"class":79},"  agentk[agentk]\n",[66,146,148],{"class":68,"line":147},14,[66,149,127],{"class":79},[12,151,152,153,158,159,163],{},"This first review, despite our threat model being early stage, still allowed us to identify issues and findings (like the Agent exposing public projects with private repositories ",[22,154,157],{"href":155,"rel":156},"https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48314",[],"(fixed with this merge request)"," or the Agent name being vulnerable to path traversal attacks ",[22,160,157],{"href":161,"rel":162},"https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37564",[],") that benefited our security and the broader engineering teams. Plus, the cross-organizational feedback we received during this iteration was key to improving our threat model integration and templates.",[36,165,167],{"id":166},"increasing-capabilities-expand-the-threats","Increasing capabilities expand the threats",[12,169,170,171,176,177,180,181,184],{},"Four months had passed since the initial assessment; it was time to revisit our previous findings and to review the expanded capabilities of the\nKubernetes Agent feature. The ",[22,172,175],{"href":173,"rel":174},"https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/154f538c997b4064294a54695846092c348bada8/doc/architecture.md#high-level-architecture",[],"architecture had also evolved",", and at a high level we can see the product is changing names (",[63,178,179],{},"kgb"," changed to ",[63,182,183],{},"kas",", for Kubernetes Agent Server (KAS)).",[56,186,188],{"className":58,"code":187,"language":60,"meta":61,"style":61},"\ngraph TB\n  agentk -- gRPC bidirectional streaming --> nginx\n\n  subgraph \"GitLab\"\n  nginx -- proxy pass port 5005 --> kas\n  kas[kas]\n  GitLabRoR[GitLab RoR] -- gRPC --> kas\n  kas -- gRPC --> Gitaly[Gitaly]\n  kas -- REST API --> GitLabRoR\n  end\n\n  subgraph \"Kubernetes cluster\"\n  agentk[agentk]\n  end\n",[63,189,190,194,198,203,207,211,216,221,226,231,236,240,244,248,252],{"__ignoreMap":61},[66,191,192],{"class":68,"line":69},[66,193,73],{"emptyLinePlaceholder":72},[66,195,196],{"class":68,"line":76},[66,197,80],{"class":79},[66,199,200],{"class":68,"line":83},[66,201,202],{"class":79},"  agentk -- gRPC bidirectional streaming --> nginx\n",[66,204,205],{"class":68,"line":89},[66,206,73],{"emptyLinePlaceholder":72},[66,208,209],{"class":68,"line":94},[66,210,97],{"class":79},[66,212,213],{"class":68,"line":100},[66,214,215],{"class":79},"  nginx -- proxy pass port 5005 --> kas\n",[66,217,218],{"class":68,"line":106},[66,219,220],{"class":79},"  kas[kas]\n",[66,222,223],{"class":68,"line":112},[66,224,225],{"class":79},"  GitLabRoR[GitLab RoR] -- gRPC --> kas\n",[66,227,228],{"class":68,"line":118},[66,229,230],{"class":79},"  kas -- gRPC --> Gitaly[Gitaly]\n",[66,232,233],{"class":68,"line":124},[66,234,235],{"class":79},"  kas -- REST API --> GitLabRoR\n",[66,237,238],{"class":68,"line":130},[66,239,127],{"class":79},[66,241,242],{"class":68,"line":135},[66,243,73],{"emptyLinePlaceholder":72},[66,245,246],{"class":68,"line":141},[66,247,138],{"class":79},[66,249,250],{"class":68,"line":147},[66,251,144],{"class":79},[66,253,255],{"class":68,"line":254},15,[66,256,127],{"class":79},[12,258,259],{},"By this time the threat modeling template we were using had evolved, and our Application Security team had used it in several other reviews.",[12,261,262,263,268],{},"GitLab’s practice of ",[22,264,267],{"href":265,"rel":266},"https://handbook.gitlab.com/handbook/values/#dogfooding",[],"dogfooding"," means we use issues to track our reviews. At the time of this second review, our threat modeling template now had a more structured approach where reviewers had sections that would 1) guide them throughout the review 2) require them to provide specific information.",[12,270,271,272,277],{},"Because our process was more robust now we moved the threat modeling activity of our security assessments into a dedicated repository, giving us a single source of truth. ",[22,273,276],{"href":274,"rel":275},"https://gitlab.com/gitlab-com/gl-security/security-research/threat-modeling-template/-/blob/3486ca53baf13d4aaba28dd340df153b2b83ea05/threat_model.md",[],"The template","\nhad evolved to also include:",[279,280,281,285,288,291],"ul",{},[282,283,284],"li",{},"An “Application decomposition” section where the reviewer must enter\ndetails such as use case, external entry points, trust levels, data flow diagram, previous security issues and known references and best practices.",[282,286,287],{},"A dedicated threat analysis section.",[282,289,290],{},"The use of issue comments to detail each section of the threat modeling\nallowing us to easily reference sections individually via direct link.",[282,292,293],{},"The conversion and merge of the completed issue to an MD file, saved into\nthe dedicated repository for future use.",[36,295,297],{"id":296},"what-is-better-than-iteration-more-iteration","What is better than iteration? More iteration",[12,299,300],{},"Since our second review in October 2020, the Kubernetes Agent feature had evolved significantly, so we performed another assessment in February 2021.\nThe difference this time was that we now had a formal threat modeling process in place.",[12,302,303],{},[304,305,306],"strong",{},"To better understand the Kubernetes Agent feature, we added more details to our architectural diagram:",[12,308,309],{},[18,310,311],{},"Legend:",[279,313,314,317,320,323,326],{},[282,315,316],{},"Dotted arrows/flow: out of scope of the Architecture or TM",[282,318,319],{},"grpc: Google Remote Procedure Call",[282,321,322],{},"grpcs: grpc over SSL/TLS",[282,324,325],{},"ws: WebSocket",[282,327,328],{},"wss: ws over SSL/TLS",[12,330,331,336],{},[332,333],"img",{"alt":334,"src":335},"Detailed architectural diagram of the Kubernetes\nAgent","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399225/blog/Content%20Images/threat-modeling-KA/ka-architectural-diagram.png","{:\n.shadow.medium.center}",[12,338,339],{},"Detailed architectural diagram of the Kubernetes Agent.",[12,341,342],{},[304,343,344],{},"The data flow diagram we were using also evolved:",[12,346,347],{},[18,348,311],{},[279,350,351,354,357,359,361],{},[282,352,353],{},"Dotted arrows/flow: out of scope of the architecture or threat model",[282,355,356],{},"grpc: Google remote procedure call",[282,358,322],{},[282,360,325],{},[282,362,328],{},[12,364,365,336],{},[332,366],{"alt":367,"src":368},"file name","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399225/blog/Content%20Images/threat-modeling-KA/ka-data-flow.png",[12,370,371],{},"An evolved data flow diagram for the Kubernetes Agent.",[12,373,374],{},"And, naturally, as the features evolved, the threats evolved. Through our latest threat modeling we discovered that:",[279,376,377,380,383,410],{},[282,378,379],{},"Listeners are used by the Agent and the KAS for observability and health\nchecking. These listeners are unrestricted but they do listen on localhost by default.",[282,381,382],{},"On GitLab’s side, developers would be able to deploy an application to\nanother cluster on another corporate network. This is limited by Kubernetes' own authorisations defined for each cluster.",[282,384,385,386,391,392,397,398,403,404,409],{},"While brainstorming for threats, we thought about whether a user would be\nable to access unauthorised projects through indirect access on Gitaly.\nThankfully, this is well mitigated since a few conditions are necessary:\n* A user must have access to the Agent's pod\n* A user must be able to modify and reply to requests from the Agent pod\n* However, each Agent also needs to submit a secret token, otherwise the ",[22,387,390],{"href":388,"rel":389},"https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/5b7ca0b9fbc8daba28ca552dc26aab45e482cf0c/internal/module/agent_configuration/server/server.go#L55",[],"request is denied"," (using ",[22,393,396],{"href":394,"rel":395},"https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/5b7ca0b9fbc8daba28ca552dc26aab45e482cf0c/internal/gitlab/client.go",[],"GitLab's client",") GetAgentInfo implementation. That implementation ",[22,399,402],{"href":400,"rel":401},"https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/5b7ca0b9fbc8daba28ca552dc26aab45e482cf0c/internal/gitlab/client.go#L108-123",[],"generates and passes a JWT token",", along with the ",[22,405,408],{"href":406,"rel":407},"https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/5b7ca0b9fbc8daba28ca552dc26aab45e482cf0c/internal/gitlab/do_options.go#L103-109",[],"Agent token",". The Agent must also be configured to consult only authorised repositories, which makes it impossible for a user to access other repositories from the Agent.",[282,411,412],{},"On local installations, it’s possible to use unencrypted communications\nbetween the Kubernetes Agent and the KAS. However, on gitlab.com we have enforced secure communications.",[28,414,416],{"id":415},"continuous-improvement-and-iteration","Continuous improvement and iteration",[12,418,419],{},"Threat modeling, just like anything in security, isn’t something you do once and are done with it. As we’ve seen with the reviews we’ve performed on the\nKubernetes Agent, threat modeling involves iteration and constant adoption of ever-changing features and attack surfaces of a product.",[12,421,422,423,428],{},"Our threat model is now mature enough that it's an established process, performed as a separate review and merged into a dedicated repository at completion. In the future, we hope to be able to publicly share those threat models to help customers, the community and to continue strengthening our ",[22,424,427],{"href":425,"rel":426},"https://hackerone.com/gitlab",[],"hackerone program",".",[12,430,431,432,437],{},"For the next iterations we’re looking for broad adoption of threat modeling across GitLab's engineering teams and beyond. We plan to use our threat model as a way to improve  ",[22,433,436],{"href":434,"rel":435},"https://handbook.gitlab.com/handbook/company/culture/all-remote/asynchronous/",[],"asynchronous communication"," between the different security stable counterparts\nthat operate across the organization. These stable counterparts ensure security practices are integrated early on in the development process and also allow us to ensure better coverage across vacations and time zones.",[28,439,441],{"id":440},"about-kubernetes","About Kubernetes",[12,443,444,445,450,451,456],{},"Until then, if you’re interested in more threat modeling details specific to\nKubernetes itself, I highly recommend the ",[22,446,449],{"href":447,"rel":448},"https://github.com/kubernetes/community/tree/d538271e3f5eed22429ded165aeb2557c6277967/wg-security-audit",[],"Kubernetes Security Audit Working\nGroup Kubernetes threat model",".\nOne of my fellow GitLab teammates, Marco Lancini\nhas published a great post, ",[22,452,455],{"href":453,"rel":454},"https://www.marcolancini.it/2020/blog-kubernetes-threat-modelling/",[],"“The Current State of Kubernetes Threat\nModelling”","\non his personal blog which contains useful information on different methods used to perform a threat model for Kubernetes.",[28,458,460],{"id":459},"how-to-threat-model","How to threat model",[12,462,463],{},"And, if you’re interested in how we’re rolling out threat modeling across\nGitLab, to teams beyond Security and Engineering, we’ve been tweaking our how to threat model guide to help as many team members as possible understand what threat modeling is and how and where to get started. Perhaps you’ll find some helpful tips and tricks there.",[12,465,466],{},"And, keep an eye on this space, we’re planning to revisit threat modeling in blog posts where we’ll dive deeper into the PASTA methodology we’re using and take a closer look at what threat modeling looks like in practice here at GitLab.",[12,468,469,470,428],{},"Have something to share? Comment below or find me on twitter at ",[22,471,474],{"href":472,"rel":473},"https://twitter.com/Muffinbox33",[],"@muffinbox33",[12,476,477],{},[18,478,479],{},"Also, I would like to take a moment to thank the Configure team and Mikhail for their awesome collaboration during the various threat models we have performed.",[12,481,482],{},"Happy threat modeling!",[12,484,485,486,491,492],{},"Cover image by ",[22,487,490],{"href":488,"rel":489},"https://www.pexels.com/@jesus-miron-garcia-1583477?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels",[],"Jesús Mirón\nGarcía","\non ",[22,493,496],{"href":494,"rel":495},"https://www.pexels.com/photo/timelapse-photography-of-vehicles-on-road-3043592/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels",[],"Pexels",[28,498,500],{"id":499},"read-more-on-kubernetes","Read more on Kubernetes:",[279,502,503,509,515,521,527],{},[282,504,505],{},[22,506,508],{"href":507},"/blog/gko-on-ocp/","How to install and use the GitLab Kubernetes\nOperator",[282,510,511],{},[22,512,514],{"href":513},"/blog/setting-up-the-k-agent/","How to deploy the GitLab Agent for Kubernetes with limited\npermissions",[282,516,517],{},[22,518,520],{"href":519},"/blog/gitlab-kubernetes-agent-on-gitlab-com/","A new era of Kubernetes integrations on\nGitLab.com",[282,522,523],{},[22,524,526],{"href":525},"/blog/kubernetes-terminology/","Understand Kubernetes terminology from namespaces to\npods",[282,528,529],{},[22,530,532],{"href":531},"/blog/year-of-kubernetes/","What we learned after a year of GitLab.com on\nKubernetes",[534,535,536],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}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":61,"searchDepth":76,"depth":76,"links":538},[539,544,545,546,547],{"id":30,"depth":76,"text":31,"children":540},[541,542,543],{"id":38,"depth":83,"text":39},{"id":166,"depth":83,"text":167},{"id":296,"depth":83,"text":297},{"id":415,"depth":76,"text":416},{"id":440,"depth":76,"text":441},{"id":459,"depth":76,"text":460},{"id":499,"depth":76,"text":500},"security","2021-10-11","Learn how we put our threat model into action iteratively and expanded the\nprocess into a full-fledged standalone activity.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682156/Blog/Hero%20Images/pexels-jesus-miron-garcia-3043592.jpg",{},"/en-us/blog/threat-modeling-kubernetes-agent",{"ogTitle":5,"ogImage":554,"ogDescription":550,"ogSiteName":558,"noIndex":553,"ogType":559,"ogUrl":560,"title":5,"canonicalUrls":560,"description":550},"https://about.gitlab.com","article","https://about.gitlab.com/blog/threat-modeling-kubernetes-agent","threat-modeling-kubernetes-agent","en-us/blog/threat-modeling-kubernetes-agent",[548],"BlogPost","xvWBxm1G9eQBuCfmiycR540sS2MfRA1xEs-BgN9zzsU",{"logo":567,"freeTrial":572,"sales":577,"login":582,"items":587,"search":914,"minimal":945,"duo":964,"switchNav":973,"pricingDeployment":984},{"config":568},{"href":569,"dataGaName":570,"dataGaLocation":571},"/","gitlab logo","header",{"text":573,"config":574},"Get free trial",{"href":575,"dataGaName":576,"dataGaLocation":571},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":578,"config":579},"Request a demo",{"href":580,"dataGaName":581,"dataGaLocation":571},"/sales/?contact-topic=request-demo","sales",{"text":583,"config":584},"Sign in",{"href":585,"dataGaName":586,"dataGaLocation":571},"https://gitlab.com/users/sign_in/","sign in",[588,617,717,722,836,892],{"text":589,"config":590,"menu":592},"Platform",{"dataNavLevelOne":591},"platform",{"type":593,"columns":594},"cards",[595,601,609],{"title":589,"description":596,"link":597},"The intelligent orchestration platform for DevSecOps",{"text":598,"config":599},"Explore our Platform",{"href":600,"dataGaName":591,"dataGaLocation":571},"/platform/",{"title":602,"description":603,"link":604},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":605,"config":606},"Meet GitLab Duo",{"href":607,"dataGaName":608,"dataGaLocation":571},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":610,"description":611,"link":612},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":613,"config":614},"Learn more",{"href":615,"dataGaName":616,"dataGaLocation":571},"/why-gitlab/","why gitlab",{"text":618,"left":72,"config":619,"menu":621},"Product",{"dataNavLevelOne":620},"solutions",{"type":622,"link":623,"columns":627,"feature":696},"lists",{"text":624,"config":625},"View all Solutions",{"href":626,"dataGaName":620,"dataGaLocation":571},"/solutions/",[628,652,675],{"title":629,"description":630,"link":631,"items":636},"Automation","CI/CD and automation to accelerate deployment",{"config":632},{"icon":633,"href":634,"dataGaName":635,"dataGaLocation":571},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[637,641,644,648],{"text":638,"config":639},"CI/CD",{"href":640,"dataGaLocation":571,"dataGaName":638},"/solutions/continuous-integration/",{"text":602,"config":642},{"href":607,"dataGaLocation":571,"dataGaName":643},"gitlab duo agent platform - product menu",{"text":645,"config":646},"Source Code Management",{"href":647,"dataGaLocation":571,"dataGaName":645},"/solutions/source-code-management/",{"text":649,"config":650},"Automated Software Delivery",{"href":634,"dataGaLocation":571,"dataGaName":651},"Automated software delivery",{"title":653,"description":654,"link":655,"items":660},"Security","Deliver code faster without compromising security",{"config":656},{"href":657,"dataGaName":658,"dataGaLocation":571,"icon":659},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[661,665,670],{"text":662,"config":663},"Application Security Testing",{"href":657,"dataGaName":664,"dataGaLocation":571},"Application security testing",{"text":666,"config":667},"Software Supply Chain Security",{"href":668,"dataGaLocation":571,"dataGaName":669},"/solutions/supply-chain/","Software supply chain security",{"text":671,"config":672},"Software Compliance",{"href":673,"dataGaName":674,"dataGaLocation":571},"/solutions/software-compliance/","software compliance",{"title":676,"link":677,"items":682},"Measurement",{"config":678},{"icon":679,"href":680,"dataGaName":681,"dataGaLocation":571},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[683,687,691],{"text":684,"config":685},"Visibility & Measurement",{"href":680,"dataGaLocation":571,"dataGaName":686},"Visibility and Measurement",{"text":688,"config":689},"Value Stream Management",{"href":690,"dataGaLocation":571,"dataGaName":688},"/solutions/value-stream-management/",{"text":692,"config":693},"Analytics & Insights",{"href":694,"dataGaLocation":571,"dataGaName":695},"/solutions/analytics-and-insights/","Analytics and insights",{"title":697,"type":622,"items":698},"GitLab for",[699,705,711],{"text":700,"config":701},"Enterprise",{"icon":702,"href":703,"dataGaLocation":571,"dataGaName":704},"Building","/enterprise/","enterprise",{"text":706,"config":707},"Small Business",{"icon":708,"href":709,"dataGaLocation":571,"dataGaName":710},"Work","/small-business/","small business",{"text":712,"config":713},"Public Sector",{"icon":714,"href":715,"dataGaLocation":571,"dataGaName":716},"Organization","/solutions/public-sector/","public sector",{"text":718,"config":719},"Pricing",{"href":720,"dataGaName":721,"dataGaLocation":571,"dataNavLevelOne":721},"/pricing/","pricing",{"text":723,"config":724,"menu":726},"Resources",{"dataNavLevelOne":725},"resources",{"type":622,"link":727,"columns":731,"feature":825},{"text":728,"config":729},"View all resources",{"href":730,"dataGaName":725,"dataGaLocation":571},"/resources/",[732,765,792],{"title":733,"items":734},"Getting started",[735,740,745,750,755,760],{"text":736,"config":737},"Install",{"href":738,"dataGaName":739,"dataGaLocation":571},"/install/","install",{"text":741,"config":742},"Quick start guides",{"href":743,"dataGaName":744,"dataGaLocation":571},"/get-started/","quick setup checklists",{"text":746,"config":747},"Learn",{"href":748,"dataGaLocation":571,"dataGaName":749},"https://university.gitlab.com/","learn",{"text":751,"config":752},"Product documentation",{"href":753,"dataGaName":754,"dataGaLocation":571},"https://docs.gitlab.com/","product documentation",{"text":756,"config":757},"Best practice videos",{"href":758,"dataGaName":759,"dataGaLocation":571},"/getting-started-videos/","best practice videos",{"text":761,"config":762},"Integrations",{"href":763,"dataGaName":764,"dataGaLocation":571},"/integrations/","integrations",{"title":766,"items":767},"Discover",[768,773,778,783,787],{"text":769,"config":770},"Customer success stories",{"href":771,"dataGaName":772,"dataGaLocation":571},"/customers/","customer success stories",{"text":774,"config":775},"Blog",{"href":776,"dataGaName":777,"dataGaLocation":571},"/blog/","blog",{"text":779,"config":780},"Demo Hub",{"href":781,"dataGaName":782,"dataGaLocation":571},"/demo-hub/","demo hub",{"text":784,"config":785},"The Source",{"href":786,"dataGaName":777,"dataGaLocation":571},"/the-source/",{"text":788,"config":789},"Remote",{"href":790,"dataGaName":791,"dataGaLocation":571},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":793,"items":794},"Connect",[795,800,805,810,815,820],{"text":796,"config":797},"GitLab Services",{"href":798,"dataGaName":799,"dataGaLocation":571},"/services/","services",{"text":801,"config":802},"Contribute",{"href":803,"dataGaName":804,"dataGaLocation":571},"https://contributors.gitlab.com","contribute",{"text":806,"config":807},"Community",{"href":808,"dataGaName":809,"dataGaLocation":571},"/community/","community",{"text":811,"config":812},"Forum",{"href":813,"dataGaName":814,"dataGaLocation":571},"https://forum.gitlab.com/","forum",{"text":816,"config":817},"Events",{"href":818,"dataGaName":819,"dataGaLocation":571},"/events/","events",{"text":821,"config":822},"Partners",{"href":823,"dataGaName":824,"dataGaLocation":571},"/partners/","partners",{"config":826,"title":829,"text":830,"link":831},{"background":827,"textColor":828},"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":832,"config":833},"Read the latest",{"href":834,"dataGaName":835,"dataGaLocation":571},"/whats-new/","whats new",{"text":837,"config":838,"menu":840},"Company",{"dataNavLevelOne":839},"company",{"type":622,"columns":841},[842],{"items":843},[844,849,855,857,862,867,872,877,882,887],{"text":845,"config":846},"About",{"href":847,"dataGaName":848,"dataGaLocation":571},"/company/","about",{"text":850,"config":851,"footerGa":854},"Jobs",{"href":852,"dataGaName":853,"dataGaLocation":571},"/jobs/","jobs",{"dataGaName":853},{"text":816,"config":856},{"href":818,"dataGaName":819,"dataGaLocation":571},{"text":858,"config":859},"Leadership",{"href":860,"dataGaName":861,"dataGaLocation":571},"/company/team/e-group/","leadership",{"text":863,"config":864},"Handbook",{"href":865,"dataGaName":866,"dataGaLocation":571},"https://handbook.gitlab.com/","handbook",{"text":868,"config":869},"Investor relations",{"href":870,"dataGaName":871,"dataGaLocation":571},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":873,"config":874},"Trust Center",{"href":875,"dataGaName":876,"dataGaLocation":571},"/security/","trust center",{"text":878,"config":879},"AI Transparency Center",{"href":880,"dataGaName":881,"dataGaLocation":571},"/ai-transparency-center/","ai transparency center",{"text":883,"config":884},"Newsletter",{"href":885,"dataGaName":886,"dataGaLocation":571},"/company/contact/#contact-forms","newsletter",{"text":888,"config":889},"Press",{"href":890,"dataGaName":891,"dataGaLocation":571},"/press/","press",{"text":893,"config":894,"menu":895},"Contact us",{"dataNavLevelOne":839},{"type":622,"columns":896},[897],{"items":898},[899,904,909],{"text":900,"config":901},"Talk to sales",{"href":902,"dataGaName":903,"dataGaLocation":571},"/sales/","talk to sales",{"text":905,"config":906},"Support portal",{"href":907,"dataGaName":908,"dataGaLocation":571},"https://support.gitlab.com/hc/en-us","support portal",{"text":910,"config":911},"Customer portal",{"href":912,"dataGaName":913,"dataGaLocation":571},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":915,"login":916,"suggestions":923},"Close",{"text":917,"link":918},"To search repositories and projects, login to",{"text":919,"config":920},"gitlab.com",{"href":585,"dataGaName":921,"dataGaLocation":922},"search login","search",{"text":924,"default":925},"Suggestions",[926,928,932,934,938,942],{"text":602,"config":927},{"href":607,"dataGaName":602,"dataGaLocation":922},{"text":929,"config":930},"Code Suggestions (AI)",{"href":931,"dataGaName":929,"dataGaLocation":922},"/solutions/code-suggestions/",{"text":638,"config":933},{"href":640,"dataGaName":638,"dataGaLocation":922},{"text":935,"config":936},"GitLab on AWS",{"href":937,"dataGaName":935,"dataGaLocation":922},"/partners/technology-partners/aws/",{"text":939,"config":940},"GitLab on Google Cloud",{"href":941,"dataGaName":939,"dataGaLocation":922},"/partners/technology-partners/google-cloud-platform/",{"text":943,"config":944},"Why GitLab?",{"href":615,"dataGaName":943,"dataGaLocation":922},{"freeTrial":946,"mobileIcon":951,"desktopIcon":956,"secondaryButton":959},{"text":947,"config":948},"Start free trial",{"href":949,"dataGaName":576,"dataGaLocation":950},"https://gitlab.com/-/trials/new/","nav",{"altText":952,"config":953},"Gitlab Icon",{"src":954,"dataGaName":955,"dataGaLocation":950},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":952,"config":957},{"src":958,"dataGaName":955,"dataGaLocation":950},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":960,"config":961},"Get Started",{"href":962,"dataGaName":963,"dataGaLocation":950},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":965,"mobileIcon":969,"desktopIcon":971},{"text":966,"config":967},"Learn more about GitLab Duo",{"href":607,"dataGaName":968,"dataGaLocation":950},"gitlab duo",{"altText":952,"config":970},{"src":954,"dataGaName":955,"dataGaLocation":950},{"altText":952,"config":972},{"src":958,"dataGaName":955,"dataGaLocation":950},{"button":974,"mobileIcon":979,"desktopIcon":981},{"text":975,"config":976},"/switch",{"href":977,"dataGaName":978,"dataGaLocation":950},"#contact","switch",{"altText":952,"config":980},{"src":954,"dataGaName":955,"dataGaLocation":950},{"altText":952,"config":982},{"src":983,"dataGaName":955,"dataGaLocation":950},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":985,"mobileIcon":990,"desktopIcon":992},{"text":986,"config":987},"Back to pricing",{"href":720,"dataGaName":988,"dataGaLocation":950,"icon":989},"back to pricing","GoBack",{"altText":952,"config":991},{"src":954,"dataGaName":955,"dataGaLocation":950},{"altText":952,"config":993},{"src":958,"dataGaName":955,"dataGaLocation":950},{"title":995,"titleMobile":996,"button":997,"config":1002},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":613,"config":998},{"href":999,"dataGaName":1000,"dataGaLocation":1001},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1003,"disabled":553},"release",{"data":1005},{"text":1006,"source":1007,"edit":1013,"contribute":1018,"config":1023,"items":1028,"minimal":1238},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1008,"config":1009},"View page source",{"href":1010,"dataGaName":1011,"dataGaLocation":1012},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1014,"config":1015},"Edit this page",{"href":1016,"dataGaName":1017,"dataGaLocation":1012},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1019,"config":1020},"Please contribute",{"href":1021,"dataGaName":1022,"dataGaLocation":1012},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1024,"facebook":1025,"youtube":1026,"linkedin":1027},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1029,1076,1130,1174,1206],{"title":718,"links":1030,"subMenu":1045},[1031,1035,1040],{"text":1032,"config":1033},"View plans",{"href":720,"dataGaName":1034,"dataGaLocation":1012},"view plans",{"text":1036,"config":1037},"Why Premium?",{"href":1038,"dataGaName":1039,"dataGaLocation":1012},"/pricing/premium/","why premium",{"text":1041,"config":1042},"Why Ultimate?",{"href":1043,"dataGaName":1044,"dataGaLocation":1012},"/pricing/ultimate/","why ultimate",[1046],{"title":1047,"links":1048},"Contact Us",[1049,1052,1054,1056,1061,1066,1071],{"text":1050,"config":1051},"Contact sales",{"href":902,"dataGaName":581,"dataGaLocation":1012},{"text":905,"config":1053},{"href":907,"dataGaName":908,"dataGaLocation":1012},{"text":910,"config":1055},{"href":912,"dataGaName":913,"dataGaLocation":1012},{"text":1057,"config":1058},"Status",{"href":1059,"dataGaName":1060,"dataGaLocation":1012},"https://status.gitlab.com/","status",{"text":1062,"config":1063},"Terms of use",{"href":1064,"dataGaName":1065,"dataGaLocation":1012},"/terms/","terms of use",{"text":1067,"config":1068},"Privacy statement",{"href":1069,"dataGaName":1070,"dataGaLocation":1012},"/privacy/","privacy statement",{"text":1072,"config":1073},"Cookie preferences",{"dataGaName":1074,"dataGaLocation":1012,"id":1075,"isOneTrustButton":72},"cookie preferences","ot-sdk-btn",{"title":618,"links":1077,"subMenu":1086},[1078,1082],{"text":1079,"config":1080},"DevSecOps platform",{"href":600,"dataGaName":1081,"dataGaLocation":1012},"devsecops platform",{"text":1083,"config":1084},"AI-Assisted Development",{"href":607,"dataGaName":1085,"dataGaLocation":1012},"ai-assisted development",[1087],{"title":1088,"links":1089},"Topics",[1090,1095,1100,1105,1110,1115,1120,1125],{"text":1091,"config":1092},"CICD",{"href":1093,"dataGaName":1094,"dataGaLocation":1012},"/topics/ci-cd/","cicd",{"text":1096,"config":1097},"GitOps",{"href":1098,"dataGaName":1099,"dataGaLocation":1012},"/topics/gitops/","gitops",{"text":1101,"config":1102},"DevOps",{"href":1103,"dataGaName":1104,"dataGaLocation":1012},"/topics/devops/","devops",{"text":1106,"config":1107},"Version Control",{"href":1108,"dataGaName":1109,"dataGaLocation":1012},"/topics/version-control/","version control",{"text":1111,"config":1112},"DevSecOps",{"href":1113,"dataGaName":1114,"dataGaLocation":1012},"/topics/devsecops/","devsecops",{"text":1116,"config":1117},"Cloud Native",{"href":1118,"dataGaName":1119,"dataGaLocation":1012},"/topics/cloud-native/","cloud native",{"text":1121,"config":1122},"AI for Coding",{"href":1123,"dataGaName":1124,"dataGaLocation":1012},"/topics/devops/ai-for-coding/","ai for coding",{"text":1126,"config":1127},"Agentic AI",{"href":1128,"dataGaName":1129,"dataGaLocation":1012},"/topics/agentic-ai/","agentic ai",{"title":1131,"links":1132},"Solutions",[1133,1135,1137,1142,1146,1149,1153,1156,1158,1161,1164,1169],{"text":662,"config":1134},{"href":657,"dataGaName":662,"dataGaLocation":1012},{"text":651,"config":1136},{"href":634,"dataGaName":635,"dataGaLocation":1012},{"text":1138,"config":1139},"Agile development",{"href":1140,"dataGaName":1141,"dataGaLocation":1012},"/solutions/agile-delivery/","agile delivery",{"text":1143,"config":1144},"SCM",{"href":647,"dataGaName":1145,"dataGaLocation":1012},"source code management",{"text":1091,"config":1147},{"href":640,"dataGaName":1148,"dataGaLocation":1012},"continuous integration & delivery",{"text":1150,"config":1151},"Value stream management",{"href":690,"dataGaName":1152,"dataGaLocation":1012},"value stream management",{"text":1096,"config":1154},{"href":1155,"dataGaName":1099,"dataGaLocation":1012},"/solutions/gitops/",{"text":700,"config":1157},{"href":703,"dataGaName":704,"dataGaLocation":1012},{"text":1159,"config":1160},"Small business",{"href":709,"dataGaName":710,"dataGaLocation":1012},{"text":1162,"config":1163},"Public sector",{"href":715,"dataGaName":716,"dataGaLocation":1012},{"text":1165,"config":1166},"Education",{"href":1167,"dataGaName":1168,"dataGaLocation":1012},"/solutions/education/","education",{"text":1170,"config":1171},"Financial services",{"href":1172,"dataGaName":1173,"dataGaLocation":1012},"/solutions/finance/","financial services",{"title":723,"links":1175},[1176,1178,1180,1182,1185,1187,1190,1192,1194,1196,1198,1200,1202,1204],{"text":736,"config":1177},{"href":738,"dataGaName":739,"dataGaLocation":1012},{"text":741,"config":1179},{"href":743,"dataGaName":744,"dataGaLocation":1012},{"text":746,"config":1181},{"href":748,"dataGaName":749,"dataGaLocation":1012},{"text":751,"config":1183},{"href":753,"dataGaName":1184,"dataGaLocation":1012},"docs",{"text":774,"config":1186},{"href":776,"dataGaName":777,"dataGaLocation":1012},{"text":1188,"config":1189},"What's new",{"href":834,"dataGaName":835,"dataGaLocation":1012},{"text":769,"config":1191},{"href":771,"dataGaName":772,"dataGaLocation":1012},{"text":788,"config":1193},{"href":790,"dataGaName":791,"dataGaLocation":1012},{"text":796,"config":1195},{"href":798,"dataGaName":799,"dataGaLocation":1012},{"text":801,"config":1197},{"href":803,"dataGaName":804,"dataGaLocation":1012},{"text":806,"config":1199},{"href":808,"dataGaName":809,"dataGaLocation":1012},{"text":811,"config":1201},{"href":813,"dataGaName":814,"dataGaLocation":1012},{"text":816,"config":1203},{"href":818,"dataGaName":819,"dataGaLocation":1012},{"text":821,"config":1205},{"href":823,"dataGaName":824,"dataGaLocation":1012},{"title":837,"links":1207},[1208,1210,1212,1214,1216,1218,1222,1227,1229,1231,1233],{"text":845,"config":1209},{"href":847,"dataGaName":839,"dataGaLocation":1012},{"text":850,"config":1211},{"href":852,"dataGaName":853,"dataGaLocation":1012},{"text":858,"config":1213},{"href":860,"dataGaName":861,"dataGaLocation":1012},{"text":863,"config":1215},{"href":865,"dataGaName":866,"dataGaLocation":1012},{"text":868,"config":1217},{"href":870,"dataGaName":871,"dataGaLocation":1012},{"text":1219,"config":1220},"Sustainability",{"href":1221,"dataGaName":1219,"dataGaLocation":1012},"/sustainability/",{"text":1223,"config":1224},"Diversity, inclusion and belonging (DIB)",{"href":1225,"dataGaName":1226,"dataGaLocation":1012},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":873,"config":1228},{"href":875,"dataGaName":876,"dataGaLocation":1012},{"text":883,"config":1230},{"href":885,"dataGaName":886,"dataGaLocation":1012},{"text":888,"config":1232},{"href":890,"dataGaName":891,"dataGaLocation":1012},{"text":1234,"config":1235},"Modern Slavery Transparency Statement",{"href":1236,"dataGaName":1237,"dataGaLocation":1012},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1239},[1240,1243,1246],{"text":1241,"config":1242},"Terms",{"href":1064,"dataGaName":1065,"dataGaLocation":1012},{"text":1244,"config":1245},"Cookies",{"dataGaName":1074,"dataGaLocation":1012,"id":1075,"isOneTrustButton":72},{"text":1247,"config":1248},"Privacy",{"href":1069,"dataGaName":1070,"dataGaLocation":1012},[1250],{"id":1251,"title":7,"body":552,"config":1252,"content":1254,"description":552,"extension":1258,"meta":1259,"navigation":72,"path":1260,"seo":1261,"stem":1262,"__hash__":1263},"blogAuthors/en-us/blog/authors/vitor-meireles-de-sousa.yml",{"template":1253},"BlogAuthor",{"name":7,"config":1255},{"headshot":1256,"ctfId":1257},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682001/Blog/Author%20Headshots/vdesousa-headshot.png","vdesousa","yml",{},"/en-us/blog/authors/vitor-meireles-de-sousa",{},"en-us/blog/authors/vitor-meireles-de-sousa","MR7q049Alj4qR9GdTBFderkWvIFmzGJhcShc8plwldM",[1265,1273,1281],{"title":1266,"description":1267,"heroImage":1268,"category":548,"date":1269,"authors":1270,"slug":1272,"externalUrl":552},"How GitLab tracks vulnerabilities through refactors and reformatting","Learn how GitLab's improved Scope+Offset fingerprinting keeps vulnerability tracking stable across comments, blank lines, and reformatting.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1759320418/xjmqcozxzt4frx0hori3.png","2026-08-12",[1271],"Julian Thome","improved-scope-offset-fingerprinting",{"title":1274,"description":1275,"heroImage":1268,"category":548,"date":1276,"authors":1277,"slug":1280,"externalUrl":552},"GitLab Secrets Manager adds ESO, Terraform, API support","Simplify credential management across your stack. GitLab Secrets Manager provides secure retrieval in Kubernetes, Terraform, and external workflows.","2026-08-06",[1278,1279],"Erick Bajao","Joe Randazzo","gitlab-secrets-manager-add-eso-terraform-api-support",{"title":1282,"description":1283,"heroImage":1284,"category":548,"date":1285,"authors":1286,"slug":1288,"externalUrl":552},"Secure every commit to production with Claude and GitLab","Claude Security catches vulnerabilities inside a coding session. GitLab picks up from there, scanning, enforcing policy, and producing audit evidence for the software lifecycle. ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756122536/akivvcnafog9c4dhhzkp.png","2026-08-03",[1287],"Alisa Ho","claude-security-and-gitlab",{"promotions":1290},[1291,1305,1317,1328],{"id":1292,"categories":1293,"header":1295,"text":1296,"button":1297,"image":1302},"ai-modernization",[1294],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1298,"config":1299},"Get your AI maturity score",{"href":1300,"dataGaName":1301,"dataGaLocation":777},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1303},{"src":1304},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1306,"categories":1307,"header":1309,"text":1296,"button":1310,"image":1314},"devops-modernization",[1308,1114],"product","Are you just managing tools or shipping innovation?",{"text":1311,"config":1312},"Get your DevOps maturity score",{"href":1313,"dataGaName":1301,"dataGaLocation":777},"/assessments/devops-modernization-assessment/",{"config":1315},{"src":1316},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1318,"categories":1319,"header":1320,"text":1296,"button":1321,"image":1325},"security-modernization",[548],"Are you trading speed for security?",{"text":1322,"config":1323},"Get your security maturity score",{"href":1324,"dataGaName":1301,"dataGaLocation":777},"/assessments/security-modernization-assessment/",{"config":1326},{"src":1327},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1329,"paths":1330,"header":1333,"text":1334,"button":1335,"image":1340},"github-azure-migration",[1331,1332],"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":1336,"config":1337},"See how GitLab compares to GitHub",{"href":1338,"dataGaName":1339,"dataGaLocation":777},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1341},{"src":1316},{"header":1343,"blurb":1344,"button":1345,"secondaryButton":1350},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1346,"config":1347},"Get your free trial",{"href":1348,"dataGaName":576,"dataGaLocation":1349},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1050,"config":1351},{"href":902,"dataGaName":581,"dataGaLocation":1349},1786803755685]