[{"data":1,"prerenderedAt":1085},["ShallowReactive",2],{"/blog/secure-container-images-with-gitlab-and-grype":3,"navigation-en-us":301,"banner-en-us":729,"footer-en-us":739,"blog-post-authors-en-us-Dan Luhring":982,"blog-related-posts-en-us-secure-container-images-with-gitlab-and-grype":996,"blog-promotions-en-us":1022,"next-steps-en-us":1075},{"id":4,"title":5,"authors":6,"body":8,"category":281,"date":282,"description":283,"extension":284,"externalUrl":285,"faq":285,"featured":286,"heroImage":287,"meta":288,"navigation":163,"path":289,"seo":290,"slug":294,"stem":295,"tags":296,"template":299,"updatedDate":285,"__hash__":300},"blogPosts/en-us/blog/secure-container-images-with-gitlab-and-grype.md","How to secure your container images with GitLab and Grype",[7],"Dan Luhring",{"type":9,"value":10,"toc":271},"minimark",[11,30,35,38,41,44,48,57,60,72,75,79,82,87,109,113,120,192,204,208,211,219,222,229,232,236,239,248,267],[12,13,14],"blockquote",{},[15,16,17,18,22,23,29],"p",{},"Support for the Grype scanner in the GitLab Container Scanning analyzer is being deprecated in GitLab 16.9 and will be removed in GitLab 17.0. Users are advised to use the default setting for ",[19,20,21],"code",{},"CS_ANALYZER_IMAGE",", which uses the Trivy scanner. Users who desire to continue using Grype can use the ",[24,25,28],"a",{"href":26,"rel":27},"https://docs.gitlab.com/development/integrations/secure/",[],"Security Scanner Integration\ndocumentation"," to create their own integration with GitLab.",[31,32,34],"h2",{"id":33},"the-importance-of-container-image-security","The importance of container image security",[15,36,37],{},"Thanks to containers, what it means to \"ship software\" has changed dramatically. Engineering teams have shifted to produce container images and use these container images to deploy their software. Because of this change teams are now shipping significantly more software alongside their app – whether they realize it or not.",[15,39,40],{},"Besides packaging an application, container images also include hundreds of binaries and libraries. These binaries and libraries are included in the container image produced by the team because the process of creating a container image requires teams to select a base image. A base image is a preexisting container image on which to \"base\" their own container image. In doing so, all software contained in the base image is inherited into the team's new image.",[15,42,43],{},"The shift to containers has a monumental impact on security. Now, anyone that deploys your team's container image could be deploying software with known vulnerabilities. Similarly, other teams that base their container images on your team's image will inherit any vulnerabilities present in your team's image. It's crucial that teams have a solution in place for detecting these vulnerabilities in the container images they're using.",[31,45,47],{"id":46},"container-scanning-with-grype","Container Scanning with Grype",[15,49,50,51,56],{},"Fortunately, GitLab 14.0 offers a new way for teams to tackle this challenge: ",[24,52,55],{"href":53,"rel":54},"https://github.com/anchore/grype",[],"Grype",". Anchore developed this state-of-the-art vulnerability scanner, which is now available as part of GitLab's Container Scanning feature.",[15,58,59],{},"Grype is an advanced vulnerability scanner because it performs deep inspection of the software installed in a container image, and it uses this detailed information to produce better matches with vulnerability data.",[15,61,62,63,67,68,71],{},"Grype is a particularly powerful tool for security-minded engineers to investigate and remediate findings because it gives comprehensive information in the vulnerability analysis, showing exactly how the tool determined vulnerability ",[64,65,66],"em",{},"X"," matched software package ",[64,69,70],{},"Y",". Grype provides the transparency and detail necessary for any reported vulnerability to investigate why the image vulnerability is being reported. Some examples of what Grype can identify include: The exact image layer and file path where a package is installed, the source of the vulnerability data, available patches, and which parameters of the vulnerability record matched attributes of the package, among other things.",[15,73,74],{},"\"We are excited to embed these very robust container scanning features of Grype within the GitLab DevOps platform,\" says Sam White, senior product manager of Protect at GitLab. \"Our built-in security enables DevOps velocity with confidence and these added features brings even greater security for cloud native applications.\"",[31,76,78],{"id":77},"get-started-with-grype-and-gitlab","Get started with Grype and GitLab",[15,80,81],{},"Follow these steps to get set up GitLab's integration with Grype.",[83,84,86],"h3",{"id":85},"what-youll-need","What you'll need:",[88,89,90,97,100],"ul",{},[91,92,93],"li",{},[24,94,96],{"href":95},"/pricing/ultimate/","GitLab Ultimate",[91,98,99],{},"Access to an image in a container registry (such as the container registry in your GitLab project)",[91,101,102,103,108],{},"Ensure your CI/CD pipeline meets all of the ",[24,104,107],{"href":105,"rel":106},"https://docs.gitlab.com/user/application_security/container_scanning/#requirements",[],"requirements"," for Container Scanning.",[83,110,112],{"id":111},"how-to-start-scanning-with-grype","How to start scanning with Grype",[15,114,115,116,119],{},"To get started, just add the following snippet to your project's ",[19,117,118],{},".gitlab-ci.yml"," file:",[121,122,127],"pre",{"className":123,"code":124,"language":125,"meta":126,"style":126},"language-yaml shiki shiki-themes github-light","include:\n  - template: Security/Container-Scanning.gitlab-ci.yml\n\ncontainer_scanning:\n  variables:\n    CS_ANALYZER_IMAGE: registry.gitlab.com/security-products/container-scanning/grype:4\n\n","yaml","",[19,128,129,142,158,165,173,181],{"__ignoreMap":126},[130,131,134,138],"span",{"class":132,"line":133},"line",1,[130,135,137],{"class":136},"shJU0","include",[130,139,141],{"class":140},"sgsFI",":\n",[130,143,145,148,151,154],{"class":132,"line":144},2,[130,146,147],{"class":140},"  - ",[130,149,150],{"class":136},"template",[130,152,153],{"class":140},": ",[130,155,157],{"class":156},"sYBdl","Security/Container-Scanning.gitlab-ci.yml\n",[130,159,161],{"class":132,"line":160},3,[130,162,164],{"emptyLinePlaceholder":163},true,"\n",[130,166,168,171],{"class":132,"line":167},4,[130,169,170],{"class":136},"container_scanning",[130,172,141],{"class":140},[130,174,176,179],{"class":132,"line":175},5,[130,177,178],{"class":136},"  variables",[130,180,141],{"class":140},[130,182,184,187,189],{"class":132,"line":183},6,[130,185,186],{"class":136},"    CS_ANALYZER_IMAGE",[130,188,153],{"class":140},[130,190,191],{"class":156},"registry.gitlab.com/security-products/container-scanning/grype:4\n",[15,193,194,195,200,201,203],{},"By default, the Container Scanning analyzer makes some assumptions about your target container image's URL and tag. You can have the scanner analyze any container image you want — you just need to specify ",[24,196,199],{"href":197,"rel":198},"https://docs.gitlab.com/user/application_security/container_scanning/#available-cicd-variables",[],"additional variables"," in the \"container_scanning\" section of your ",[19,202,118],{}," file. This set of variables also lets you configure registry credentials, custom CA certificates, whether to validate certificates, etc.",[31,205,207],{"id":206},"viewing-vulnerability-analysis-results","Viewing vulnerability analysis results",[15,209,210],{},"Once your first Container Scanning job completes, you can see what vulnerabilities have been reported. Just go to the \"Security & Compliance\" left-side menu and select \"Vulnerability Report\".",[15,212,213,218],{},[214,215],"img",{"alt":216,"src":217},"GitLab Security and Compliance Menu","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397936/blog/Content%20Images/anchore_blog_images/gitlab-security-menu.png","\nNavigate to \"Vulnerability report\" under the \"Security and Compliance\" menu.",[15,220,221],{},"For example, here's what your vulnerability report could look like:",[15,223,224,228],{},[214,225],{"alt":226,"src":227},"Sample vulnerability report","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397936/blog/Content%20Images/anchore_blog_images/gitlab-vulnerability-report.png","\nSee a sample Vulnerability Report",[15,230,231],{},"You'll notice that the Vulnerability Report page gives you an immediate sense of the severities of the vulnerabilities.Even if there is a large number of vulnerabilities, you can quickly filter the list and dive deeper into any single vulnerability.",[31,233,235],{"id":234},"final-thoughts","Final thoughts",[15,237,238],{},"Adding Container Scanning with Grype to your GitLab pipeline is a straightforward process. With just a small snippet of YAML and some optional configuration, you can add tremendous visibility into the security of your team's container images.",[15,240,241,242,247],{},"Read on to learn more about the ",[24,243,246],{"href":244,"rel":245},"https://docs.gitlab.com/user/application_security/container_scanning/",[],"Container Scanning feature with GitLab",".",[15,249,250,251,255,256,261,262,247],{},"Lastly, make sure to check out the ",[24,252,254],{"href":53,"rel":253},[],"Grype project",". We have an active open source community and make improvements all the time. If you have any questions or feature requests, don't hesitate to ",[24,257,260],{"href":258,"rel":259},"https://github.com/anchore/grype/issues/new/choose",[],"open an issue"," or join our ",[24,263,266],{"href":264,"rel":265},"https://anchore.com/slack",[],"community Slack",[268,269,270],"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":126,"searchDepth":144,"depth":144,"links":272},[273,274,275,279,280],{"id":33,"depth":144,"text":34},{"id":46,"depth":144,"text":47},{"id":77,"depth":144,"text":78,"children":276},[277,278],{"id":85,"depth":160,"text":86},{"id":111,"depth":160,"text":112},{"id":206,"depth":144,"text":207},{"id":234,"depth":144,"text":235},"engineering","2021-07-28","Learn how to start detecting vulnerabilities in your container images in just a few steps.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749671873/Blog/Hero%20Images/logos_header.jpg",{},"/en-us/blog/secure-container-images-with-gitlab-and-grype",{"title":5,"description":283,"ogTitle":5,"ogDescription":283,"noIndex":286,"ogImage":287,"ogUrl":291,"ogSiteName":292,"ogType":293,"canonicalUrls":291},"https://about.gitlab.com/blog/secure-container-images-with-gitlab-and-grype","https://about.gitlab.com","article","secure-container-images-with-gitlab-and-grype","en-us/blog/secure-container-images-with-gitlab-and-grype",[297,298,297],"DevOps","security","BlogPost","A64qmqb58dTOlbqSQSGrRbbN4M7FEMYdJFGs9rSaWWg",{"logo":302,"freeTrial":307,"sales":312,"login":317,"items":322,"search":649,"minimal":680,"duo":699,"switchNav":708,"pricingDeployment":719},{"config":303},{"href":304,"dataGaName":305,"dataGaLocation":306},"/","gitlab logo","header",{"text":308,"config":309},"Get free trial",{"href":310,"dataGaName":311,"dataGaLocation":306},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":313,"config":314},"Request a demo",{"href":315,"dataGaName":316,"dataGaLocation":306},"/sales/?contact-topic=request-demo","sales",{"text":318,"config":319},"Sign in",{"href":320,"dataGaName":321,"dataGaLocation":306},"https://gitlab.com/users/sign_in/","sign in",[323,352,452,457,571,627],{"text":324,"config":325,"menu":327},"Platform",{"dataNavLevelOne":326},"platform",{"type":328,"columns":329},"cards",[330,336,344],{"title":324,"description":331,"link":332},"The intelligent orchestration platform for DevSecOps",{"text":333,"config":334},"Explore our Platform",{"href":335,"dataGaName":326,"dataGaLocation":306},"/platform/",{"title":337,"description":338,"link":339},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":340,"config":341},"Meet GitLab Duo",{"href":342,"dataGaName":343,"dataGaLocation":306},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":345,"description":346,"link":347},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":348,"config":349},"Learn more",{"href":350,"dataGaName":351,"dataGaLocation":306},"/why-gitlab/","why gitlab",{"text":353,"left":163,"config":354,"menu":356},"Product",{"dataNavLevelOne":355},"solutions",{"type":357,"link":358,"columns":362,"feature":431},"lists",{"text":359,"config":360},"View all Solutions",{"href":361,"dataGaName":355,"dataGaLocation":306},"/solutions/",[363,387,410],{"title":364,"description":365,"link":366,"items":371},"Automation","CI/CD and automation to accelerate deployment",{"config":367},{"icon":368,"href":369,"dataGaName":370,"dataGaLocation":306},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[372,376,379,383],{"text":373,"config":374},"CI/CD",{"href":375,"dataGaLocation":306,"dataGaName":373},"/solutions/continuous-integration/",{"text":337,"config":377},{"href":342,"dataGaLocation":306,"dataGaName":378},"gitlab duo agent platform - product menu",{"text":380,"config":381},"Source Code Management",{"href":382,"dataGaLocation":306,"dataGaName":380},"/solutions/source-code-management/",{"text":384,"config":385},"Automated Software Delivery",{"href":369,"dataGaLocation":306,"dataGaName":386},"Automated software delivery",{"title":388,"description":389,"link":390,"items":395},"Security","Deliver code faster without compromising security",{"config":391},{"href":392,"dataGaName":393,"dataGaLocation":306,"icon":394},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[396,400,405],{"text":397,"config":398},"Application Security Testing",{"href":392,"dataGaName":399,"dataGaLocation":306},"Application security testing",{"text":401,"config":402},"Software Supply Chain Security",{"href":403,"dataGaLocation":306,"dataGaName":404},"/solutions/supply-chain/","Software supply chain security",{"text":406,"config":407},"Software Compliance",{"href":408,"dataGaName":409,"dataGaLocation":306},"/solutions/software-compliance/","software compliance",{"title":411,"link":412,"items":417},"Measurement",{"config":413},{"icon":414,"href":415,"dataGaName":416,"dataGaLocation":306},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[418,422,426],{"text":419,"config":420},"Visibility & Measurement",{"href":415,"dataGaLocation":306,"dataGaName":421},"Visibility and Measurement",{"text":423,"config":424},"Value Stream Management",{"href":425,"dataGaLocation":306,"dataGaName":423},"/solutions/value-stream-management/",{"text":427,"config":428},"Analytics & Insights",{"href":429,"dataGaLocation":306,"dataGaName":430},"/solutions/analytics-and-insights/","Analytics and insights",{"title":432,"type":357,"items":433},"GitLab for",[434,440,446],{"text":435,"config":436},"Enterprise",{"icon":437,"href":438,"dataGaLocation":306,"dataGaName":439},"Building","/enterprise/","enterprise",{"text":441,"config":442},"Small Business",{"icon":443,"href":444,"dataGaLocation":306,"dataGaName":445},"Work","/small-business/","small business",{"text":447,"config":448},"Public Sector",{"icon":449,"href":450,"dataGaLocation":306,"dataGaName":451},"Organization","/solutions/public-sector/","public sector",{"text":453,"config":454},"Pricing",{"href":455,"dataGaName":456,"dataGaLocation":306,"dataNavLevelOne":456},"/pricing/","pricing",{"text":458,"config":459,"menu":461},"Resources",{"dataNavLevelOne":460},"resources",{"type":357,"link":462,"columns":466,"feature":560},{"text":463,"config":464},"View all resources",{"href":465,"dataGaName":460,"dataGaLocation":306},"/resources/",[467,500,527],{"title":468,"items":469},"Getting started",[470,475,480,485,490,495],{"text":471,"config":472},"Install",{"href":473,"dataGaName":474,"dataGaLocation":306},"/install/","install",{"text":476,"config":477},"Quick start guides",{"href":478,"dataGaName":479,"dataGaLocation":306},"/get-started/","quick setup checklists",{"text":481,"config":482},"Learn",{"href":483,"dataGaLocation":306,"dataGaName":484},"https://university.gitlab.com/","learn",{"text":486,"config":487},"Product documentation",{"href":488,"dataGaName":489,"dataGaLocation":306},"https://docs.gitlab.com/","product documentation",{"text":491,"config":492},"Best practice videos",{"href":493,"dataGaName":494,"dataGaLocation":306},"/getting-started-videos/","best practice videos",{"text":496,"config":497},"Integrations",{"href":498,"dataGaName":499,"dataGaLocation":306},"/integrations/","integrations",{"title":501,"items":502},"Discover",[503,508,513,518,522],{"text":504,"config":505},"Customer success stories",{"href":506,"dataGaName":507,"dataGaLocation":306},"/customers/","customer success stories",{"text":509,"config":510},"Blog",{"href":511,"dataGaName":512,"dataGaLocation":306},"/blog/","blog",{"text":514,"config":515},"Demo Hub",{"href":516,"dataGaName":517,"dataGaLocation":306},"/demo-hub/","demo hub",{"text":519,"config":520},"The Source",{"href":521,"dataGaName":512,"dataGaLocation":306},"/the-source/",{"text":523,"config":524},"Remote",{"href":525,"dataGaName":526,"dataGaLocation":306},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":528,"items":529},"Connect",[530,535,540,545,550,555],{"text":531,"config":532},"GitLab Services",{"href":533,"dataGaName":534,"dataGaLocation":306},"/services/","services",{"text":536,"config":537},"Contribute",{"href":538,"dataGaName":539,"dataGaLocation":306},"https://contributors.gitlab.com","contribute",{"text":541,"config":542},"Community",{"href":543,"dataGaName":544,"dataGaLocation":306},"/community/","community",{"text":546,"config":547},"Forum",{"href":548,"dataGaName":549,"dataGaLocation":306},"https://forum.gitlab.com/","forum",{"text":551,"config":552},"Events",{"href":553,"dataGaName":554,"dataGaLocation":306},"/events/","events",{"text":556,"config":557},"Partners",{"href":558,"dataGaName":559,"dataGaLocation":306},"/partners/","partners",{"config":561,"title":564,"text":565,"link":566},{"background":562,"textColor":563},"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":567,"config":568},"Read the latest",{"href":569,"dataGaName":570,"dataGaLocation":306},"/whats-new/","whats new",{"text":572,"config":573,"menu":575},"Company",{"dataNavLevelOne":574},"company",{"type":357,"columns":576},[577],{"items":578},[579,584,590,592,597,602,607,612,617,622],{"text":580,"config":581},"About",{"href":582,"dataGaName":583,"dataGaLocation":306},"/company/","about",{"text":585,"config":586,"footerGa":589},"Jobs",{"href":587,"dataGaName":588,"dataGaLocation":306},"/jobs/","jobs",{"dataGaName":588},{"text":551,"config":591},{"href":553,"dataGaName":554,"dataGaLocation":306},{"text":593,"config":594},"Leadership",{"href":595,"dataGaName":596,"dataGaLocation":306},"/company/team/e-group/","leadership",{"text":598,"config":599},"Handbook",{"href":600,"dataGaName":601,"dataGaLocation":306},"https://handbook.gitlab.com/","handbook",{"text":603,"config":604},"Investor relations",{"href":605,"dataGaName":606,"dataGaLocation":306},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":608,"config":609},"Trust Center",{"href":610,"dataGaName":611,"dataGaLocation":306},"/security/","trust center",{"text":613,"config":614},"AI Transparency Center",{"href":615,"dataGaName":616,"dataGaLocation":306},"/ai-transparency-center/","ai transparency center",{"text":618,"config":619},"Newsletter",{"href":620,"dataGaName":621,"dataGaLocation":306},"/company/contact/#contact-forms","newsletter",{"text":623,"config":624},"Press",{"href":625,"dataGaName":626,"dataGaLocation":306},"/press/","press",{"text":628,"config":629,"menu":630},"Contact us",{"dataNavLevelOne":574},{"type":357,"columns":631},[632],{"items":633},[634,639,644],{"text":635,"config":636},"Talk to sales",{"href":637,"dataGaName":638,"dataGaLocation":306},"/sales/","talk to sales",{"text":640,"config":641},"Support portal",{"href":642,"dataGaName":643,"dataGaLocation":306},"https://support.gitlab.com/hc/en-us","support portal",{"text":645,"config":646},"Customer portal",{"href":647,"dataGaName":648,"dataGaLocation":306},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":650,"login":651,"suggestions":658},"Close",{"text":652,"link":653},"To search repositories and projects, login to",{"text":654,"config":655},"gitlab.com",{"href":320,"dataGaName":656,"dataGaLocation":657},"search login","search",{"text":659,"default":660},"Suggestions",[661,663,667,669,673,677],{"text":337,"config":662},{"href":342,"dataGaName":337,"dataGaLocation":657},{"text":664,"config":665},"Code Suggestions (AI)",{"href":666,"dataGaName":664,"dataGaLocation":657},"/solutions/code-suggestions/",{"text":373,"config":668},{"href":375,"dataGaName":373,"dataGaLocation":657},{"text":670,"config":671},"GitLab on AWS",{"href":672,"dataGaName":670,"dataGaLocation":657},"/partners/technology-partners/aws/",{"text":674,"config":675},"GitLab on Google Cloud",{"href":676,"dataGaName":674,"dataGaLocation":657},"/partners/technology-partners/google-cloud-platform/",{"text":678,"config":679},"Why GitLab?",{"href":350,"dataGaName":678,"dataGaLocation":657},{"freeTrial":681,"mobileIcon":686,"desktopIcon":691,"secondaryButton":694},{"text":682,"config":683},"Start free trial",{"href":684,"dataGaName":311,"dataGaLocation":685},"https://gitlab.com/-/trials/new/","nav",{"altText":687,"config":688},"Gitlab Icon",{"src":689,"dataGaName":690,"dataGaLocation":685},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":687,"config":692},{"src":693,"dataGaName":690,"dataGaLocation":685},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":695,"config":696},"Get Started",{"href":697,"dataGaName":698,"dataGaLocation":685},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":700,"mobileIcon":704,"desktopIcon":706},{"text":701,"config":702},"Learn more about GitLab Duo",{"href":342,"dataGaName":703,"dataGaLocation":685},"gitlab duo",{"altText":687,"config":705},{"src":689,"dataGaName":690,"dataGaLocation":685},{"altText":687,"config":707},{"src":693,"dataGaName":690,"dataGaLocation":685},{"button":709,"mobileIcon":714,"desktopIcon":716},{"text":710,"config":711},"/switch",{"href":712,"dataGaName":713,"dataGaLocation":685},"#contact","switch",{"altText":687,"config":715},{"src":689,"dataGaName":690,"dataGaLocation":685},{"altText":687,"config":717},{"src":718,"dataGaName":690,"dataGaLocation":685},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":720,"mobileIcon":725,"desktopIcon":727},{"text":721,"config":722},"Back to pricing",{"href":455,"dataGaName":723,"dataGaLocation":685,"icon":724},"back to pricing","GoBack",{"altText":687,"config":726},{"src":689,"dataGaName":690,"dataGaLocation":685},{"altText":687,"config":728},{"src":693,"dataGaName":690,"dataGaLocation":685},{"title":730,"titleMobile":731,"button":732,"config":737},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":348,"config":733},{"href":734,"dataGaName":735,"dataGaLocation":736},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":738,"disabled":286},"release",{"data":740},{"text":741,"source":742,"edit":748,"contribute":753,"config":758,"items":763,"minimal":971},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":743,"config":744},"View page source",{"href":745,"dataGaName":746,"dataGaLocation":747},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":749,"config":750},"Edit this page",{"href":751,"dataGaName":752,"dataGaLocation":747},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":754,"config":755},"Please contribute",{"href":756,"dataGaName":757,"dataGaLocation":747},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":759,"facebook":760,"youtube":761,"linkedin":762},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[764,810,863,907,939],{"title":453,"links":765,"subMenu":779},[766,770,775],{"text":767,"config":768},"View plans",{"href":455,"dataGaName":769,"dataGaLocation":747},"view plans",{"text":771,"config":772},"Why Premium?",{"href":773,"dataGaName":774,"dataGaLocation":747},"/pricing/premium/","why premium",{"text":776,"config":777},"Why Ultimate?",{"href":95,"dataGaName":778,"dataGaLocation":747},"why ultimate",[780],{"title":781,"links":782},"Contact Us",[783,786,788,790,795,800,805],{"text":784,"config":785},"Contact sales",{"href":637,"dataGaName":316,"dataGaLocation":747},{"text":640,"config":787},{"href":642,"dataGaName":643,"dataGaLocation":747},{"text":645,"config":789},{"href":647,"dataGaName":648,"dataGaLocation":747},{"text":791,"config":792},"Status",{"href":793,"dataGaName":794,"dataGaLocation":747},"https://status.gitlab.com/","status",{"text":796,"config":797},"Terms of use",{"href":798,"dataGaName":799,"dataGaLocation":747},"/terms/","terms of use",{"text":801,"config":802},"Privacy statement",{"href":803,"dataGaName":804,"dataGaLocation":747},"/privacy/","privacy statement",{"text":806,"config":807},"Cookie preferences",{"dataGaName":808,"dataGaLocation":747,"id":809,"isOneTrustButton":163},"cookie preferences","ot-sdk-btn",{"title":353,"links":811,"subMenu":820},[812,816],{"text":813,"config":814},"DevSecOps platform",{"href":335,"dataGaName":815,"dataGaLocation":747},"devsecops platform",{"text":817,"config":818},"AI-Assisted Development",{"href":342,"dataGaName":819,"dataGaLocation":747},"ai-assisted development",[821],{"title":822,"links":823},"Topics",[824,829,834,838,843,848,853,858],{"text":825,"config":826},"CICD",{"href":827,"dataGaName":828,"dataGaLocation":747},"/topics/ci-cd/","cicd",{"text":830,"config":831},"GitOps",{"href":832,"dataGaName":833,"dataGaLocation":747},"/topics/gitops/","gitops",{"text":297,"config":835},{"href":836,"dataGaName":837,"dataGaLocation":747},"/topics/devops/","devops",{"text":839,"config":840},"Version Control",{"href":841,"dataGaName":842,"dataGaLocation":747},"/topics/version-control/","version control",{"text":844,"config":845},"DevSecOps",{"href":846,"dataGaName":847,"dataGaLocation":747},"/topics/devsecops/","devsecops",{"text":849,"config":850},"Cloud Native",{"href":851,"dataGaName":852,"dataGaLocation":747},"/topics/cloud-native/","cloud native",{"text":854,"config":855},"AI for Coding",{"href":856,"dataGaName":857,"dataGaLocation":747},"/topics/devops/ai-for-coding/","ai for coding",{"text":859,"config":860},"Agentic AI",{"href":861,"dataGaName":862,"dataGaLocation":747},"/topics/agentic-ai/","agentic ai",{"title":864,"links":865},"Solutions",[866,868,870,875,879,882,886,889,891,894,897,902],{"text":397,"config":867},{"href":392,"dataGaName":397,"dataGaLocation":747},{"text":386,"config":869},{"href":369,"dataGaName":370,"dataGaLocation":747},{"text":871,"config":872},"Agile development",{"href":873,"dataGaName":874,"dataGaLocation":747},"/solutions/agile-delivery/","agile delivery",{"text":876,"config":877},"SCM",{"href":382,"dataGaName":878,"dataGaLocation":747},"source code management",{"text":825,"config":880},{"href":375,"dataGaName":881,"dataGaLocation":747},"continuous integration & delivery",{"text":883,"config":884},"Value stream management",{"href":425,"dataGaName":885,"dataGaLocation":747},"value stream management",{"text":830,"config":887},{"href":888,"dataGaName":833,"dataGaLocation":747},"/solutions/gitops/",{"text":435,"config":890},{"href":438,"dataGaName":439,"dataGaLocation":747},{"text":892,"config":893},"Small business",{"href":444,"dataGaName":445,"dataGaLocation":747},{"text":895,"config":896},"Public sector",{"href":450,"dataGaName":451,"dataGaLocation":747},{"text":898,"config":899},"Education",{"href":900,"dataGaName":901,"dataGaLocation":747},"/solutions/education/","education",{"text":903,"config":904},"Financial services",{"href":905,"dataGaName":906,"dataGaLocation":747},"/solutions/finance/","financial services",{"title":458,"links":908},[909,911,913,915,918,920,923,925,927,929,931,933,935,937],{"text":471,"config":910},{"href":473,"dataGaName":474,"dataGaLocation":747},{"text":476,"config":912},{"href":478,"dataGaName":479,"dataGaLocation":747},{"text":481,"config":914},{"href":483,"dataGaName":484,"dataGaLocation":747},{"text":486,"config":916},{"href":488,"dataGaName":917,"dataGaLocation":747},"docs",{"text":509,"config":919},{"href":511,"dataGaName":512,"dataGaLocation":747},{"text":921,"config":922},"What's new",{"href":569,"dataGaName":570,"dataGaLocation":747},{"text":504,"config":924},{"href":506,"dataGaName":507,"dataGaLocation":747},{"text":523,"config":926},{"href":525,"dataGaName":526,"dataGaLocation":747},{"text":531,"config":928},{"href":533,"dataGaName":534,"dataGaLocation":747},{"text":536,"config":930},{"href":538,"dataGaName":539,"dataGaLocation":747},{"text":541,"config":932},{"href":543,"dataGaName":544,"dataGaLocation":747},{"text":546,"config":934},{"href":548,"dataGaName":549,"dataGaLocation":747},{"text":551,"config":936},{"href":553,"dataGaName":554,"dataGaLocation":747},{"text":556,"config":938},{"href":558,"dataGaName":559,"dataGaLocation":747},{"title":572,"links":940},[941,943,945,947,949,951,955,960,962,964,966],{"text":580,"config":942},{"href":582,"dataGaName":574,"dataGaLocation":747},{"text":585,"config":944},{"href":587,"dataGaName":588,"dataGaLocation":747},{"text":593,"config":946},{"href":595,"dataGaName":596,"dataGaLocation":747},{"text":598,"config":948},{"href":600,"dataGaName":601,"dataGaLocation":747},{"text":603,"config":950},{"href":605,"dataGaName":606,"dataGaLocation":747},{"text":952,"config":953},"Sustainability",{"href":954,"dataGaName":952,"dataGaLocation":747},"/sustainability/",{"text":956,"config":957},"Diversity, inclusion and belonging (DIB)",{"href":958,"dataGaName":959,"dataGaLocation":747},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":608,"config":961},{"href":610,"dataGaName":611,"dataGaLocation":747},{"text":618,"config":963},{"href":620,"dataGaName":621,"dataGaLocation":747},{"text":623,"config":965},{"href":625,"dataGaName":626,"dataGaLocation":747},{"text":967,"config":968},"Modern Slavery Transparency Statement",{"href":969,"dataGaName":970,"dataGaLocation":747},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":972},[973,976,979],{"text":974,"config":975},"Terms",{"href":798,"dataGaName":799,"dataGaLocation":747},{"text":977,"config":978},"Cookies",{"dataGaName":808,"dataGaLocation":747,"id":809,"isOneTrustButton":163},{"text":980,"config":981},"Privacy",{"href":803,"dataGaName":804,"dataGaLocation":747},[983],{"id":984,"title":7,"body":285,"config":985,"content":987,"description":285,"extension":990,"meta":991,"navigation":163,"path":992,"seo":993,"stem":994,"__hash__":995},"blogAuthors/en-us/blog/authors/dan-luhring.yml",{"template":986},"BlogAuthor",{"name":7,"config":988},{"headshot":126,"ctfId":989},"danluhring","yml",{},"/en-us/blog/authors/dan-luhring",{},"en-us/blog/authors/dan-luhring","5nyc7XWKyn67kMvMmFvCCQsq0FeWgl2PyoIamJ71gV4",[997,1006,1014],{"title":998,"description":999,"heroImage":1000,"category":281,"date":1001,"authors":1002,"slug":1005,"externalUrl":285},"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",[1003,1004],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1007,"description":1008,"heroImage":1009,"category":281,"date":1010,"authors":1011,"slug":1013,"externalUrl":285},"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",[1012],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1015,"description":1016,"heroImage":1017,"category":281,"date":1018,"authors":1019,"slug":1021,"externalUrl":285},"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",[1020],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1023},[1024,1038,1050,1061],{"id":1025,"categories":1026,"header":1028,"text":1029,"button":1030,"image":1035},"ai-modernization",[1027],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1031,"config":1032},"Get your AI maturity score",{"href":1033,"dataGaName":1034,"dataGaLocation":512},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1036},{"src":1037},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1039,"categories":1040,"header":1042,"text":1029,"button":1043,"image":1047},"devops-modernization",[1041,847],"product","Are you just managing tools or shipping innovation?",{"text":1044,"config":1045},"Get your DevOps maturity score",{"href":1046,"dataGaName":1034,"dataGaLocation":512},"/assessments/devops-modernization-assessment/",{"config":1048},{"src":1049},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1051,"categories":1052,"header":1053,"text":1029,"button":1054,"image":1058},"security-modernization",[298],"Are you trading speed for security?",{"text":1055,"config":1056},"Get your security maturity score",{"href":1057,"dataGaName":1034,"dataGaLocation":512},"/assessments/security-modernization-assessment/",{"config":1059},{"src":1060},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1062,"paths":1063,"header":1066,"text":1067,"button":1068,"image":1073},"github-azure-migration",[1064,1065],"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":1069,"config":1070},"See how GitLab compares to GitHub",{"href":1071,"dataGaName":1072,"dataGaLocation":512},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1074},{"src":1049},{"header":1076,"blurb":1077,"button":1078,"secondaryButton":1083},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1079,"config":1080},"Get your free trial",{"href":1081,"dataGaName":311,"dataGaLocation":1082},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":784,"config":1084},{"href":637,"dataGaName":316,"dataGaLocation":1082},1786803765127]