[{"data":1,"prerenderedAt":1490},["ShallowReactive",2],{"/blog/how-to-integrate-custom-security-scanners-into-gitlab":3,"navigation-en-us":707,"banner-en-us":1134,"footer-en-us":1144,"blog-post-authors-en-us-Fernando Diaz":1387,"blog-related-posts-en-us-how-to-integrate-custom-security-scanners-into-gitlab":1402,"blog-promotions-en-us":1427,"next-steps-en-us":1480},{"id":4,"title":5,"authors":6,"body":8,"category":685,"date":686,"description":687,"extension":688,"externalUrl":689,"faq":689,"featured":690,"heroImage":691,"meta":692,"navigation":690,"path":693,"seo":694,"slug":699,"stem":700,"tags":701,"template":705,"updatedDate":689,"__hash__":706},"blogPosts/en-us/blog/how-to-integrate-custom-security-scanners-into-gitlab.md","How to integrate custom security scanners into GitLab",[7],"Fernando Diaz",{"type":9,"value":10,"toc":667},"minimark",[11,15,18,93,97,100,117,126,129,143,147,150,157,163,166,192,198,203,206,209,212,215,221,226,229,232,235,246,252,256,259,262,265,296,299,305,310,313,316,319,330,336,341,344,350,355,358,361,364,401,415,421,426,431,437,442,447,453,458,464,467,473,478,481,484,487,505,508,521,524,527,541,549,554,559,568,576,579,582,585,598,626,632,636,639],[12,13,14],"p",{},"GitLab, the most comprehensive DevSecOps platform, has everything you need to plan, manage, build, deploy, secure, govern, and monitor your applications. However, there are instances where you may want to extend GitLab with third-party or custom tools. For example, you might need to migrate to a DevSecOps platform from separate solutions, evaluate third-party tools, or integrate proprietary or custom-built solutions into GitLab.",[12,16,17],{},"Here's what is covered:",[19,20,21,29,73],"ul",{},[22,23,24],"li",{},[25,26,28],"a",{"href":27},"#gitlab-devsecops-platform-extensibility","GitLab DevSecOps platform extensibility",[22,30,31,35],{},[25,32,34],{"href":33},"#gitlab-security-scanner-integration","GitLab security scanner integration",[19,36,37,43,49,55,61,67],{},[22,38,39],{},[25,40,42],{"href":41},"#merge-request-security-widget","Merge request security widget",[22,44,45],{},[25,46,48],{"href":47},"#pipeline-security-section","Pipeline Security section",[22,50,51],{},[25,52,54],{"href":53},"#vulnerability-report","Vulnerability Report",[22,56,57],{},[25,58,60],{"href":59},"#vulnerability-pages","Vulnerability pages",[22,62,63],{},[25,64,66],{"href":65},"#security-dashboard","Security dashboard",[22,68,69],{},[25,70,72],{"href":71},"#scan-result-policy-integration","Scan Result Policy integration",[22,74,75,79],{},[25,76,78],{"href":77},"#tutorial-integrating-custom-security-scanners","Tutorial: Integrating custom security scanners",[19,80,81,87],{},[22,82,83],{},[25,84,86],{"href":85},"#creating-a-custom-security-scanner","Creating a custom security scanner",[22,88,89],{},[25,90,92],{"href":91},"#integrating-a-custom-security-scanner-with-gitlab","Integrating a custom security scanner with GitLab",[94,95,28],"h2",{"id":96},"gitlab-devsecops-platform-extensibility",[12,98,99],{},"GitLab can be extended in many ways to support enhanced functionality that your organization may require. Some common examples of these integrations include:",[19,101,102,105,108,111,114],{},[22,103,104],{},"external application integrations such as Jenkins and Slack",[22,106,107],{},"external issue tracking integrations such as Bugzilla and Jira",[22,109,110],{},"external authentication provider integrations such as LDAP and SAML",[22,112,113],{},"external security scanner integrations such as Fortify and Checkmarx",[22,115,116],{},"ability to respond to leaked secrets such as AWS and GCP access keys",[12,118,119,120,125],{},"You can see all the available integrations in the ",[25,121,124],{"href":122,"rel":123},"https://docs.gitlab.com/integration/",[],"Integrate with GitLab documentation",". (Note: Not all integrations are listed in the documentation.)",[94,127,34],{"id":128},"gitlab-security-scanner-integration",[12,130,131,136,137,142],{},[25,132,135],{"href":133,"rel":134},"https://docs.gitlab.com/integration/#security-improvements",[],"Third-party security scanners"," or ",[25,138,141],{"href":139,"rel":140},"https://gitlab.com/gitlab-da/tutorials/security-and-governance/custom-scanner-integration",[],"custom-built security scanners"," can be integrated into GitLab to populate the merge request widget, Pipeline Security section, Vulnerability Report, vulnerability pages, Security dashboard, and Scan Result Policies. Let's review each integration.",[144,145,42],"h3",{"id":146},"merge-request-security-widget",[12,148,149],{},"A merge request contains a security widget which displays a summary of the newly detected vulnerabilities.",[12,151,152],{},[153,154],"img",{"alt":155,"src":156},"integrating security scanners - image 1","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097089/Blog/Content%20Images/Blog/Content%20Images/image4_aHR0cHM6_1750097088837.png",[158,159,160],"center",{},[161,162,42],"em",{},[12,164,165],{},"When you click on a vulnerability, you will see a popup that contains the following information:",[19,167,168,171,174,177,180,183,186,189],{},[22,169,170],{},"status",[22,172,173],{},"description",[22,175,176],{},"project",[22,178,179],{},"file",[22,181,182],{},"identifiers",[22,184,185],{},"severity",[22,187,188],{},"tool",[22,190,191],{},"scanner provider",[12,193,194],{},[153,195],{"alt":196,"src":197},"integrating security scanners - image 2","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097089/Blog/Content%20Images/Blog/Content%20Images/image2_aHR0cHM6_1750097088838.png",[158,199,200],{},[161,201,202],{},"Actionable vulnerabilities with details",[12,204,205],{},"These vulnerabilities are also actionable, which means that they can either be dismissed or a confidential issue can be created.",[12,207,208],{},"The results of a custom scanner can be used to populate the security widget. The vulnerability data is populated from the JSON schema the scanner emits.",[144,210,48],{"id":211},"pipeline-security-section",[12,213,214],{},"All enabled security analyzers run in the pipeline and output their results as artifacts. These artifacts are processed, including deduplication, and the results are listed on the Pipeline Security tab. From here, you can also download the resulting JSON files.",[12,216,217],{},[153,218],{"alt":219,"src":220},"integrating security scanners - image 3","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097089/Blog/Content%20Images/Blog/Content%20Images/image11_aHR0cHM6_1750097088840.png",[158,222,223],{},[161,224,225],{},"Pipeline Security tab",[12,227,228],{},"The results of a custom scanner can be used to populate the Pipeline Security tab. The columns are filled in using the JSON schema the scanner emits.",[144,230,54],{"id":231},"vulnerability-report",[12,233,234],{},"The Vulnerability Report provides information about vulnerabilities from scans of the default branch, including:",[19,236,237,240,243],{},[22,238,239],{},"totals of vulnerabilities per severity level",[22,241,242],{},"filters for common vulnerability attributes",[22,244,245],{},"details of each vulnerability, presented in tabular layout",[12,247,248],{},[153,249],{"alt":250,"src":251},"integrating security scanners - image 4","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097089/Blog/Content%20Images/Blog/Content%20Images/image8_aHR0cHM6_1750097088842.png",[158,253,254],{},[161,255,54],{},[12,257,258],{},"The results of a custom scanner on the default branch can be used to populate the Vulnerability Report.",[144,260,60],{"id":261},"vulnerability-pages",[12,263,264],{},"Clicking on a vulnerability present within the Vulnerability Report takes you to its vulnerability page. Each vulnerability in a project has a vulnerability page that provides details such as:",[19,266,267,269,272,275,278,281,284,287,290,293],{},[22,268,173],{},[22,270,271],{},"when it was detected",[22,273,274],{},"current status",[22,276,277],{},"location detected",[22,279,280],{},"available actions",[22,282,283],{},"linked issues",[22,285,286],{},"actions log",[22,288,289],{},"solutions",[22,291,292],{},"identifier",[22,294,295],{},"training",[12,297,298],{},"You can use the data provided in the vulnerability page to triage a detected vulnerability as well as assist in its remediation.",[12,300,301],{},[153,302],{"alt":303,"src":304},"integrating security scanners - image 5","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097089/Blog/Content%20Images/Blog/Content%20Images/image5_aHR0cHM6_1750097088844.png",[158,306,307],{},[161,308,309],{},"Vulnerability page for secret detection vulnerability",[12,311,312],{},"The results of a custom scanner can be used to populate the vulnerability page. The vulnerability data is populated from the JSON schema the scanner emits.",[144,314,66],{"id":315},"security-dashboard",[12,317,318],{},"Security dashboards are used to assess the security posture of your applications. GitLab provides you with a collection of metrics, ratings, and charts for the vulnerabilities detected by the security scanners run on your project. The security dashboard provides data such as:",[19,320,321,324,327],{},[22,322,323],{},"vulnerability trends over a 30-, 60-, or 90-day timeframe for all projects in a group",[22,325,326],{},"a letter grade rating for each project based on vulnerability severity",[22,328,329],{},"the total number of vulnerabilities detected within the last 365 days and their severity levels",[12,331,332],{},[153,333],{"alt":334,"src":335},"integrating security scanners - image 6","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097089/Blog/Content%20Images/Blog/Content%20Images/image7_aHR0cHM6_1750097088846.png",[158,337,338],{},[161,339,340],{},"Group-level Security dashboard",[12,342,343],{},"From the group-level Security dashboard you can click on a project to access its specific Security dashboard, which provides the 365-day view.",[12,345,346],{},[153,347],{"alt":348,"src":349},"integrating security scanners - image 7","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097089/Blog/Content%20Images/Blog/Content%20Images/image3_aHR0cHM6_1750097088847.png",[158,351,352],{},[161,353,354],{},"Project-level Security dashboard",[144,356,72],{"id":357},"scan-result-policy-integration",[12,359,360],{},"Scan Result Policies are used to require approval based on the findings of one or more security scan jobs. This can prevent insecure code from being merged to production. Scan Result Policies are evaluated after a CI scanning job is fully executed, where policies are evaluated based on the job artifact reports that are published in the completed pipeline.",[12,362,363],{},"For example, you can create a Scan Result Policy that requires approval from project maintainers if a secret detection scanner finds any vulnerabilities. Here's how:",[365,366,367,375,381,387,398],"ol",{},[22,368,369,370,374],{},"On the left sidebar, select ",[371,372,373],"strong",{},"Search or go to"," and search for the project you wish to add a policy to.",[22,376,377,378],{},"On the project left sidebar, go to ",[371,379,380],{},"Secure > Policies",[22,382,383,384],{},"Select ",[371,385,386],{},"New policy",[22,388,389,390,393,394,397],{},"In the ",[371,391,392],{},"Scan result policy"," section, select ",[371,395,396],{},"Select policy",".",[22,399,400],{},"Complete the fields:",[19,402,403,406,409,412],{},[22,404,405],{},"Name: The name of the Policy",[22,407,408],{},"Description: The description of the Policy",[22,410,411],{},"Policy status: Whether it is enabled or not",[22,413,414],{},"Rules: The conditions that must be met for an action (require approval) to take place",[12,416,417],{},[153,418],{"alt":419,"src":420},"integrating security scanners - image 8","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097089/Blog/Content%20Images/Blog/Content%20Images/image1_aHR0cHM6_1750097088849.png",[158,422,423],{},[161,424,425],{},"Scan Result Policy rules",[19,427,428],{},[22,429,430],{},"Actions: The action to be taken whenever the conditions in the rules (defined vulnerabilities/licenses detected) are met",[12,432,433],{},[153,434],{"alt":435,"src":436},"integrating security scanners - image 9","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097089/Blog/Content%20Images/Blog/Content%20Images/image9_aHR0cHM6_1750097088850.png",[158,438,439],{},[161,440,441],{},"Scan Result Policy actions",[19,443,444],{},[22,445,446],{},"Override project approval settings: If selected, the following choices will overwrite project settings but only affect the branches selected in the policy",[12,448,449],{},[153,450],{"alt":451,"src":452},"integrating security scanners - image 11","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097089/Blog/Content%20Images/Blog/Content%20Images/image6_aHR0cHM6_1750097088851.png",[158,454,455],{},[161,456,457],{},"Scan Result Policy approval settings",[365,459,461],{"start":460},6,[22,462,463],{},"Press the \"Configure with a merge request\" button.",[12,465,466],{},"Once the Scan Result Policy has been merged, whenever you create a merge request and the criteria defined in the rules are met, then the defined action will be triggered. In this case, at least one approval will be required from a maintainer before the code can be merged.",[12,468,469],{},[153,470],{"alt":471,"src":472},"integrated security scanner - image 10","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097089/Blog/Content%20Images/Blog/Content%20Images/image10_aHR0cHM6_1750097088852.png",[158,474,475],{},[161,476,477],{},"Blocked merge request due to detected vulnerabilities",[12,479,480],{},"The results of a custom scanner can be fully integrated with Scan Result Policies. If the custom scanner detects a vulnerability, then approval will be required before the code can be merged. The scanner you select in a Scan Result Policy must be leveraging the appropriate JSON schema.",[94,482,78],{"id":483},"tutorial-integrating-custom-security-scanners",[12,485,486],{},"Now let’s get to the fun part – integrating a custom security scanner. In this tutorial, you will learn how to create a custom security scanner, as well as how to integrate it with GitLab. We will be leveraging the following projects:",[19,488,489,497],{},[22,490,491,496],{},[25,492,495],{"href":493,"rel":494},"https://gitlab.com/gitlab-da/tutorials/security-and-governance/custom-scanner-integration/fern-pattern-scanner",[],"Fern Pattern Scanner",": Scans your files looking for specific patterns such as passwords, private keys, and social security numbers.",[22,498,499,504],{},[25,500,503],{"href":501,"rel":502},"https://gitlab.com/gitlab-da/tutorials/security-and-governance/custom-scanner-integration/secret-list",[],"Secret list",": Contains a list of user passwords, clients, and keys. This project is used to showcase how a custom security scanner can be integrated into GitLab.",[12,506,507],{},"You can watch the following video to see how the application was created and how it is used in detail:",[509,510,513,514],"figure",{"className":511},[512],"video_container","\n  ",[515,516,520],"iframe",{"src":517,"frameBorder":518,"allowFullScreen":519},"https://www.youtube.com/embed/timMbl5SP-w?si=R2DKtZ5MmBR1rQFL","0","true"," ",[144,522,86],{"id":523},"creating-a-custom-security-scanner",[12,525,526],{},"Now let’s create a custom scanner that can be integrated into GitLab. Before a custom scanner can be fully integrated with GitLab, the scanner must:",[19,528,529,532,535,538],{},[22,530,531],{},"scan a directory for defined patterns",[22,533,534],{},"emit a JSON following the appropriate schema",[22,536,537],{},"be containerized and accessible",[22,539,540],{},"provide a template to allow it to be run on another project",[12,542,543,544,548],{},"When the ",[25,545,547],{"href":493,"rel":546},[],"Fern Pattern scanner"," is run on a project using the provided template, it performs the following steps:",[365,550,551],{},[22,552,553],{},"Loads a set of rules which define patterns (regex) to detect.",[19,555,556],{},[22,557,558],{},"Allow rules to be configurable to meet the changing needs of your organization.",[365,560,562,565],{"start":561},2,[22,563,564],{},"Scans files for defined patterns.",[22,566,567],{},"Emits a JSON report following the Secret Detection schema.",[19,569,570,573],{},[22,571,572],{},"Go templates are used in this project to create a JSON.",[22,574,575],{},"Depending on what your scanner will look for, make sure you use the appropriate schema.",[12,577,578],{},"Once the JSON report is loaded as an artifact into GitLab, it will populate the merge request widget, Vulnerability Report, vulnerability pages, Scan Result Policies, and Security dashboards as defined above.",[144,580,92],{"id":581},"integrating-a-custom-security-scanner-with-gitlab",[12,583,584],{},"Once you have created your custom scanner that meets all the needs for integration, you can run it on GitLab.",[12,586,587,588,592,593,597],{},"Running a custom scanner is as easy as adding a template. We can see how the Fern Pattern scanner template is loaded by examining the ",[589,590,591],"code",{},".gitlab-ci.yml"," in the ",[25,594,596],{"href":501,"rel":595},[],"Secret List"," project.",[365,599,600,609,623],{},[22,601,602,603,608],{},"Create a ",[25,604,607],{"href":605,"rel":606},"https://docs.gitlab.com/ci/quick_start/#create-a-gitlab-ciyml-file",[],".gitlab-ci.yml file"," in the project you want the scanner to run on.",[22,610,611,612,617,618],{},"Include the ",[25,613,616],{"href":614,"rel":615},"https://docs.gitlab.com/ci/yaml/includes/",[],"Custom Scanner template",".\n",[19,619,620],{},[22,621,622],{},"You should also be able to configure the template with environment variables.",[22,624,625],{},"Commit the file to the main branch.",[12,627,628,629,631],{},"Once the file has been committed, you can see that the custom scanner will run in your pipeline. Once the pipeline is complete, the scanner will populate all the areas defined above in the ",[25,630,34],{"href":33}," section.",[94,633,635],{"id":634},"read-more","Read more",[12,637,638],{},"Check out these resources to learn more about GitLab and the other ways you can extend your DevSecOps platform:",[19,640,641,648,654,660],{},[22,642,643],{},[25,644,647],{"href":645,"rel":646},"https://docs.gitlab.com/development/integrations/secure/",[],"Security Scanner GitLab Integration",[22,649,650],{},[25,651,653],{"href":122,"rel":652},[],"GitLab Partner Integrations",[22,655,656],{},[25,657,659],{"href":139,"rel":658},[],"Custom Security Scanner Projects Group",[22,661,662],{},[25,663,666],{"href":664,"rel":665},"https://docs.gitlab.com/user/application_security/secret_detection/automatic_response/",[],"Automatic Response to a Secret Leak",{"title":668,"searchDepth":561,"depth":561,"links":669},"",[670,671,680,684],{"id":96,"depth":561,"text":28},{"id":128,"depth":561,"text":34,"children":672},[673,675,676,677,678,679],{"id":146,"depth":674,"text":42},3,{"id":211,"depth":674,"text":48},{"id":231,"depth":674,"text":54},{"id":261,"depth":674,"text":60},{"id":315,"depth":674,"text":66},{"id":357,"depth":674,"text":72},{"id":483,"depth":561,"text":78,"children":681},[682,683],{"id":523,"depth":674,"text":86},{"id":581,"depth":674,"text":92},{"id":634,"depth":561,"text":635},"security","2024-02-27","Learn how to extend the DevSecOps platform by adding custom security scanners to your workflows (includes an easy-to-follow tutorial).","md",null,true,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097082/Blog/Hero%20Images/Blog/Hero%20Images/securitycheck_securitycheck.png_1750097081856.png",{},"/en-us/blog/how-to-integrate-custom-security-scanners-into-gitlab",{"title":5,"description":687,"ogTitle":5,"ogDescription":687,"noIndex":695,"ogImage":691,"ogUrl":696,"ogSiteName":697,"ogType":698,"canonicalUrls":696},false,"https://about.gitlab.com/blog/how-to-integrate-custom-security-scanners-into-gitlab","https://about.gitlab.com","article","how-to-integrate-custom-security-scanners-into-gitlab","en-us/blog/how-to-integrate-custom-security-scanners-into-gitlab",[702,685,703,704],"tutorial","testing","DevSecOps platform","BlogPost","4EZha0bXEQ7lV4ai320jP7OSApg6ae3aGA5nsMHU2GU",{"logo":708,"freeTrial":713,"sales":718,"login":723,"items":728,"search":1054,"minimal":1085,"duo":1104,"switchNav":1113,"pricingDeployment":1124},{"config":709},{"href":710,"dataGaName":711,"dataGaLocation":712},"/","gitlab logo","header",{"text":714,"config":715},"Get free trial",{"href":716,"dataGaName":717,"dataGaLocation":712},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":719,"config":720},"Request a demo",{"href":721,"dataGaName":722,"dataGaLocation":712},"/sales/?contact-topic=request-demo","sales",{"text":724,"config":725},"Sign in",{"href":726,"dataGaName":727,"dataGaLocation":712},"https://gitlab.com/users/sign_in/","sign in",[729,758,857,862,976,1032],{"text":730,"config":731,"menu":733},"Platform",{"dataNavLevelOne":732},"platform",{"type":734,"columns":735},"cards",[736,742,750],{"title":730,"description":737,"link":738},"The intelligent orchestration platform for DevSecOps",{"text":739,"config":740},"Explore our Platform",{"href":741,"dataGaName":732,"dataGaLocation":712},"/platform/",{"title":743,"description":744,"link":745},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":746,"config":747},"Meet GitLab Duo",{"href":748,"dataGaName":749,"dataGaLocation":712},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":751,"description":752,"link":753},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":754,"config":755},"Learn more",{"href":756,"dataGaName":757,"dataGaLocation":712},"/why-gitlab/","why gitlab",{"text":759,"left":690,"config":760,"menu":761},"Product",{"dataNavLevelOne":289},{"type":762,"link":763,"columns":767,"feature":836},"lists",{"text":764,"config":765},"View all Solutions",{"href":766,"dataGaName":289,"dataGaLocation":712},"/solutions/",[768,792,815],{"title":769,"description":770,"link":771,"items":776},"Automation","CI/CD and automation to accelerate deployment",{"config":772},{"icon":773,"href":774,"dataGaName":775,"dataGaLocation":712},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[777,781,784,788],{"text":778,"config":779},"CI/CD",{"href":780,"dataGaLocation":712,"dataGaName":778},"/solutions/continuous-integration/",{"text":743,"config":782},{"href":748,"dataGaLocation":712,"dataGaName":783},"gitlab duo agent platform - product menu",{"text":785,"config":786},"Source Code Management",{"href":787,"dataGaLocation":712,"dataGaName":785},"/solutions/source-code-management/",{"text":789,"config":790},"Automated Software Delivery",{"href":774,"dataGaLocation":712,"dataGaName":791},"Automated software delivery",{"title":793,"description":794,"link":795,"items":800},"Security","Deliver code faster without compromising security",{"config":796},{"href":797,"dataGaName":798,"dataGaLocation":712,"icon":799},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[801,805,810],{"text":802,"config":803},"Application Security Testing",{"href":797,"dataGaName":804,"dataGaLocation":712},"Application security testing",{"text":806,"config":807},"Software Supply Chain Security",{"href":808,"dataGaLocation":712,"dataGaName":809},"/solutions/supply-chain/","Software supply chain security",{"text":811,"config":812},"Software Compliance",{"href":813,"dataGaName":814,"dataGaLocation":712},"/solutions/software-compliance/","software compliance",{"title":816,"link":817,"items":822},"Measurement",{"config":818},{"icon":819,"href":820,"dataGaName":821,"dataGaLocation":712},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[823,827,831],{"text":824,"config":825},"Visibility & Measurement",{"href":820,"dataGaLocation":712,"dataGaName":826},"Visibility and Measurement",{"text":828,"config":829},"Value Stream Management",{"href":830,"dataGaLocation":712,"dataGaName":828},"/solutions/value-stream-management/",{"text":832,"config":833},"Analytics & Insights",{"href":834,"dataGaLocation":712,"dataGaName":835},"/solutions/analytics-and-insights/","Analytics and insights",{"title":837,"type":762,"items":838},"GitLab for",[839,845,851],{"text":840,"config":841},"Enterprise",{"icon":842,"href":843,"dataGaLocation":712,"dataGaName":844},"Building","/enterprise/","enterprise",{"text":846,"config":847},"Small Business",{"icon":848,"href":849,"dataGaLocation":712,"dataGaName":850},"Work","/small-business/","small business",{"text":852,"config":853},"Public Sector",{"icon":854,"href":855,"dataGaLocation":712,"dataGaName":856},"Organization","/solutions/public-sector/","public sector",{"text":858,"config":859},"Pricing",{"href":860,"dataGaName":861,"dataGaLocation":712,"dataNavLevelOne":861},"/pricing/","pricing",{"text":863,"config":864,"menu":866},"Resources",{"dataNavLevelOne":865},"resources",{"type":762,"link":867,"columns":871,"feature":965},{"text":868,"config":869},"View all resources",{"href":870,"dataGaName":865,"dataGaLocation":712},"/resources/",[872,905,932],{"title":873,"items":874},"Getting started",[875,880,885,890,895,900],{"text":876,"config":877},"Install",{"href":878,"dataGaName":879,"dataGaLocation":712},"/install/","install",{"text":881,"config":882},"Quick start guides",{"href":883,"dataGaName":884,"dataGaLocation":712},"/get-started/","quick setup checklists",{"text":886,"config":887},"Learn",{"href":888,"dataGaLocation":712,"dataGaName":889},"https://university.gitlab.com/","learn",{"text":891,"config":892},"Product documentation",{"href":893,"dataGaName":894,"dataGaLocation":712},"https://docs.gitlab.com/","product documentation",{"text":896,"config":897},"Best practice videos",{"href":898,"dataGaName":899,"dataGaLocation":712},"/getting-started-videos/","best practice videos",{"text":901,"config":902},"Integrations",{"href":903,"dataGaName":904,"dataGaLocation":712},"/integrations/","integrations",{"title":906,"items":907},"Discover",[908,913,918,923,927],{"text":909,"config":910},"Customer success stories",{"href":911,"dataGaName":912,"dataGaLocation":712},"/customers/","customer success stories",{"text":914,"config":915},"Blog",{"href":916,"dataGaName":917,"dataGaLocation":712},"/blog/","blog",{"text":919,"config":920},"Demo Hub",{"href":921,"dataGaName":922,"dataGaLocation":712},"/demo-hub/","demo hub",{"text":924,"config":925},"The Source",{"href":926,"dataGaName":917,"dataGaLocation":712},"/the-source/",{"text":928,"config":929},"Remote",{"href":930,"dataGaName":931,"dataGaLocation":712},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":933,"items":934},"Connect",[935,940,945,950,955,960],{"text":936,"config":937},"GitLab Services",{"href":938,"dataGaName":939,"dataGaLocation":712},"/services/","services",{"text":941,"config":942},"Contribute",{"href":943,"dataGaName":944,"dataGaLocation":712},"https://contributors.gitlab.com","contribute",{"text":946,"config":947},"Community",{"href":948,"dataGaName":949,"dataGaLocation":712},"/community/","community",{"text":951,"config":952},"Forum",{"href":953,"dataGaName":954,"dataGaLocation":712},"https://forum.gitlab.com/","forum",{"text":956,"config":957},"Events",{"href":958,"dataGaName":959,"dataGaLocation":712},"/events/","events",{"text":961,"config":962},"Partners",{"href":963,"dataGaName":964,"dataGaLocation":712},"/partners/","partners",{"config":966,"title":969,"text":970,"link":971},{"background":967,"textColor":968},"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":972,"config":973},"Read the latest",{"href":974,"dataGaName":975,"dataGaLocation":712},"/whats-new/","whats new",{"text":977,"config":978,"menu":980},"Company",{"dataNavLevelOne":979},"company",{"type":762,"columns":981},[982],{"items":983},[984,989,995,997,1002,1007,1012,1017,1022,1027],{"text":985,"config":986},"About",{"href":987,"dataGaName":988,"dataGaLocation":712},"/company/","about",{"text":990,"config":991,"footerGa":994},"Jobs",{"href":992,"dataGaName":993,"dataGaLocation":712},"/jobs/","jobs",{"dataGaName":993},{"text":956,"config":996},{"href":958,"dataGaName":959,"dataGaLocation":712},{"text":998,"config":999},"Leadership",{"href":1000,"dataGaName":1001,"dataGaLocation":712},"/company/team/e-group/","leadership",{"text":1003,"config":1004},"Handbook",{"href":1005,"dataGaName":1006,"dataGaLocation":712},"https://handbook.gitlab.com/","handbook",{"text":1008,"config":1009},"Investor relations",{"href":1010,"dataGaName":1011,"dataGaLocation":712},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1013,"config":1014},"Trust Center",{"href":1015,"dataGaName":1016,"dataGaLocation":712},"/security/","trust center",{"text":1018,"config":1019},"AI Transparency Center",{"href":1020,"dataGaName":1021,"dataGaLocation":712},"/ai-transparency-center/","ai transparency center",{"text":1023,"config":1024},"Newsletter",{"href":1025,"dataGaName":1026,"dataGaLocation":712},"/company/contact/#contact-forms","newsletter",{"text":1028,"config":1029},"Press",{"href":1030,"dataGaName":1031,"dataGaLocation":712},"/press/","press",{"text":1033,"config":1034,"menu":1035},"Contact us",{"dataNavLevelOne":979},{"type":762,"columns":1036},[1037],{"items":1038},[1039,1044,1049],{"text":1040,"config":1041},"Talk to sales",{"href":1042,"dataGaName":1043,"dataGaLocation":712},"/sales/","talk to sales",{"text":1045,"config":1046},"Support portal",{"href":1047,"dataGaName":1048,"dataGaLocation":712},"https://support.gitlab.com/hc/en-us","support portal",{"text":1050,"config":1051},"Customer portal",{"href":1052,"dataGaName":1053,"dataGaLocation":712},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1055,"login":1056,"suggestions":1063},"Close",{"text":1057,"link":1058},"To search repositories and projects, login to",{"text":1059,"config":1060},"gitlab.com",{"href":726,"dataGaName":1061,"dataGaLocation":1062},"search login","search",{"text":1064,"default":1065},"Suggestions",[1066,1068,1072,1074,1078,1082],{"text":743,"config":1067},{"href":748,"dataGaName":743,"dataGaLocation":1062},{"text":1069,"config":1070},"Code Suggestions (AI)",{"href":1071,"dataGaName":1069,"dataGaLocation":1062},"/solutions/code-suggestions/",{"text":778,"config":1073},{"href":780,"dataGaName":778,"dataGaLocation":1062},{"text":1075,"config":1076},"GitLab on AWS",{"href":1077,"dataGaName":1075,"dataGaLocation":1062},"/partners/technology-partners/aws/",{"text":1079,"config":1080},"GitLab on Google Cloud",{"href":1081,"dataGaName":1079,"dataGaLocation":1062},"/partners/technology-partners/google-cloud-platform/",{"text":1083,"config":1084},"Why GitLab?",{"href":756,"dataGaName":1083,"dataGaLocation":1062},{"freeTrial":1086,"mobileIcon":1091,"desktopIcon":1096,"secondaryButton":1099},{"text":1087,"config":1088},"Start free trial",{"href":1089,"dataGaName":717,"dataGaLocation":1090},"https://gitlab.com/-/trials/new/","nav",{"altText":1092,"config":1093},"Gitlab Icon",{"src":1094,"dataGaName":1095,"dataGaLocation":1090},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1092,"config":1097},{"src":1098,"dataGaName":1095,"dataGaLocation":1090},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1100,"config":1101},"Get Started",{"href":1102,"dataGaName":1103,"dataGaLocation":1090},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1105,"mobileIcon":1109,"desktopIcon":1111},{"text":1106,"config":1107},"Learn more about GitLab Duo",{"href":748,"dataGaName":1108,"dataGaLocation":1090},"gitlab duo",{"altText":1092,"config":1110},{"src":1094,"dataGaName":1095,"dataGaLocation":1090},{"altText":1092,"config":1112},{"src":1098,"dataGaName":1095,"dataGaLocation":1090},{"button":1114,"mobileIcon":1119,"desktopIcon":1121},{"text":1115,"config":1116},"/switch",{"href":1117,"dataGaName":1118,"dataGaLocation":1090},"#contact","switch",{"altText":1092,"config":1120},{"src":1094,"dataGaName":1095,"dataGaLocation":1090},{"altText":1092,"config":1122},{"src":1123,"dataGaName":1095,"dataGaLocation":1090},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1125,"mobileIcon":1130,"desktopIcon":1132},{"text":1126,"config":1127},"Back to pricing",{"href":860,"dataGaName":1128,"dataGaLocation":1090,"icon":1129},"back to pricing","GoBack",{"altText":1092,"config":1131},{"src":1094,"dataGaName":1095,"dataGaLocation":1090},{"altText":1092,"config":1133},{"src":1098,"dataGaName":1095,"dataGaLocation":1090},{"title":1135,"titleMobile":1136,"button":1137,"config":1142},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":754,"config":1138},{"href":1139,"dataGaName":1140,"dataGaLocation":1141},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1143,"disabled":695},"release",{"data":1145},{"text":1146,"source":1147,"edit":1153,"contribute":1158,"config":1163,"items":1168,"minimal":1376},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1148,"config":1149},"View page source",{"href":1150,"dataGaName":1151,"dataGaLocation":1152},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1154,"config":1155},"Edit this page",{"href":1156,"dataGaName":1157,"dataGaLocation":1152},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1159,"config":1160},"Please contribute",{"href":1161,"dataGaName":1162,"dataGaLocation":1152},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1164,"facebook":1165,"youtube":1166,"linkedin":1167},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1169,1215,1268,1312,1344],{"title":858,"links":1170,"subMenu":1185},[1171,1175,1180],{"text":1172,"config":1173},"View plans",{"href":860,"dataGaName":1174,"dataGaLocation":1152},"view plans",{"text":1176,"config":1177},"Why Premium?",{"href":1178,"dataGaName":1179,"dataGaLocation":1152},"/pricing/premium/","why premium",{"text":1181,"config":1182},"Why Ultimate?",{"href":1183,"dataGaName":1184,"dataGaLocation":1152},"/pricing/ultimate/","why ultimate",[1186],{"title":1187,"links":1188},"Contact Us",[1189,1192,1194,1196,1200,1205,1210],{"text":1190,"config":1191},"Contact sales",{"href":1042,"dataGaName":722,"dataGaLocation":1152},{"text":1045,"config":1193},{"href":1047,"dataGaName":1048,"dataGaLocation":1152},{"text":1050,"config":1195},{"href":1052,"dataGaName":1053,"dataGaLocation":1152},{"text":1197,"config":1198},"Status",{"href":1199,"dataGaName":170,"dataGaLocation":1152},"https://status.gitlab.com/",{"text":1201,"config":1202},"Terms of use",{"href":1203,"dataGaName":1204,"dataGaLocation":1152},"/terms/","terms of use",{"text":1206,"config":1207},"Privacy statement",{"href":1208,"dataGaName":1209,"dataGaLocation":1152},"/privacy/","privacy statement",{"text":1211,"config":1212},"Cookie preferences",{"dataGaName":1213,"dataGaLocation":1152,"id":1214,"isOneTrustButton":690},"cookie preferences","ot-sdk-btn",{"title":759,"links":1216,"subMenu":1224},[1217,1220],{"text":704,"config":1218},{"href":741,"dataGaName":1219,"dataGaLocation":1152},"devsecops platform",{"text":1221,"config":1222},"AI-Assisted Development",{"href":748,"dataGaName":1223,"dataGaLocation":1152},"ai-assisted development",[1225],{"title":1226,"links":1227},"Topics",[1228,1233,1238,1243,1248,1253,1258,1263],{"text":1229,"config":1230},"CICD",{"href":1231,"dataGaName":1232,"dataGaLocation":1152},"/topics/ci-cd/","cicd",{"text":1234,"config":1235},"GitOps",{"href":1236,"dataGaName":1237,"dataGaLocation":1152},"/topics/gitops/","gitops",{"text":1239,"config":1240},"DevOps",{"href":1241,"dataGaName":1242,"dataGaLocation":1152},"/topics/devops/","devops",{"text":1244,"config":1245},"Version Control",{"href":1246,"dataGaName":1247,"dataGaLocation":1152},"/topics/version-control/","version control",{"text":1249,"config":1250},"DevSecOps",{"href":1251,"dataGaName":1252,"dataGaLocation":1152},"/topics/devsecops/","devsecops",{"text":1254,"config":1255},"Cloud Native",{"href":1256,"dataGaName":1257,"dataGaLocation":1152},"/topics/cloud-native/","cloud native",{"text":1259,"config":1260},"AI for Coding",{"href":1261,"dataGaName":1262,"dataGaLocation":1152},"/topics/devops/ai-for-coding/","ai for coding",{"text":1264,"config":1265},"Agentic AI",{"href":1266,"dataGaName":1267,"dataGaLocation":1152},"/topics/agentic-ai/","agentic ai",{"title":1269,"links":1270},"Solutions",[1271,1273,1275,1280,1284,1287,1291,1294,1296,1299,1302,1307],{"text":802,"config":1272},{"href":797,"dataGaName":802,"dataGaLocation":1152},{"text":791,"config":1274},{"href":774,"dataGaName":775,"dataGaLocation":1152},{"text":1276,"config":1277},"Agile development",{"href":1278,"dataGaName":1279,"dataGaLocation":1152},"/solutions/agile-delivery/","agile delivery",{"text":1281,"config":1282},"SCM",{"href":787,"dataGaName":1283,"dataGaLocation":1152},"source code management",{"text":1229,"config":1285},{"href":780,"dataGaName":1286,"dataGaLocation":1152},"continuous integration & delivery",{"text":1288,"config":1289},"Value stream management",{"href":830,"dataGaName":1290,"dataGaLocation":1152},"value stream management",{"text":1234,"config":1292},{"href":1293,"dataGaName":1237,"dataGaLocation":1152},"/solutions/gitops/",{"text":840,"config":1295},{"href":843,"dataGaName":844,"dataGaLocation":1152},{"text":1297,"config":1298},"Small business",{"href":849,"dataGaName":850,"dataGaLocation":1152},{"text":1300,"config":1301},"Public sector",{"href":855,"dataGaName":856,"dataGaLocation":1152},{"text":1303,"config":1304},"Education",{"href":1305,"dataGaName":1306,"dataGaLocation":1152},"/solutions/education/","education",{"text":1308,"config":1309},"Financial services",{"href":1310,"dataGaName":1311,"dataGaLocation":1152},"/solutions/finance/","financial services",{"title":863,"links":1313},[1314,1316,1318,1320,1323,1325,1328,1330,1332,1334,1336,1338,1340,1342],{"text":876,"config":1315},{"href":878,"dataGaName":879,"dataGaLocation":1152},{"text":881,"config":1317},{"href":883,"dataGaName":884,"dataGaLocation":1152},{"text":886,"config":1319},{"href":888,"dataGaName":889,"dataGaLocation":1152},{"text":891,"config":1321},{"href":893,"dataGaName":1322,"dataGaLocation":1152},"docs",{"text":914,"config":1324},{"href":916,"dataGaName":917,"dataGaLocation":1152},{"text":1326,"config":1327},"What's new",{"href":974,"dataGaName":975,"dataGaLocation":1152},{"text":909,"config":1329},{"href":911,"dataGaName":912,"dataGaLocation":1152},{"text":928,"config":1331},{"href":930,"dataGaName":931,"dataGaLocation":1152},{"text":936,"config":1333},{"href":938,"dataGaName":939,"dataGaLocation":1152},{"text":941,"config":1335},{"href":943,"dataGaName":944,"dataGaLocation":1152},{"text":946,"config":1337},{"href":948,"dataGaName":949,"dataGaLocation":1152},{"text":951,"config":1339},{"href":953,"dataGaName":954,"dataGaLocation":1152},{"text":956,"config":1341},{"href":958,"dataGaName":959,"dataGaLocation":1152},{"text":961,"config":1343},{"href":963,"dataGaName":964,"dataGaLocation":1152},{"title":977,"links":1345},[1346,1348,1350,1352,1354,1356,1360,1365,1367,1369,1371],{"text":985,"config":1347},{"href":987,"dataGaName":979,"dataGaLocation":1152},{"text":990,"config":1349},{"href":992,"dataGaName":993,"dataGaLocation":1152},{"text":998,"config":1351},{"href":1000,"dataGaName":1001,"dataGaLocation":1152},{"text":1003,"config":1353},{"href":1005,"dataGaName":1006,"dataGaLocation":1152},{"text":1008,"config":1355},{"href":1010,"dataGaName":1011,"dataGaLocation":1152},{"text":1357,"config":1358},"Sustainability",{"href":1359,"dataGaName":1357,"dataGaLocation":1152},"/sustainability/",{"text":1361,"config":1362},"Diversity, inclusion and belonging (DIB)",{"href":1363,"dataGaName":1364,"dataGaLocation":1152},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1013,"config":1366},{"href":1015,"dataGaName":1016,"dataGaLocation":1152},{"text":1023,"config":1368},{"href":1025,"dataGaName":1026,"dataGaLocation":1152},{"text":1028,"config":1370},{"href":1030,"dataGaName":1031,"dataGaLocation":1152},{"text":1372,"config":1373},"Modern Slavery Transparency Statement",{"href":1374,"dataGaName":1375,"dataGaLocation":1152},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1377},[1378,1381,1384],{"text":1379,"config":1380},"Terms",{"href":1203,"dataGaName":1204,"dataGaLocation":1152},{"text":1382,"config":1383},"Cookies",{"dataGaName":1213,"dataGaLocation":1152,"id":1214,"isOneTrustButton":690},{"text":1385,"config":1386},"Privacy",{"href":1208,"dataGaName":1209,"dataGaLocation":1152},[1388],{"id":1389,"title":7,"body":689,"config":1390,"content":1392,"description":689,"extension":1396,"meta":1397,"navigation":690,"path":1398,"seo":1399,"stem":1400,"__hash__":1401},"blogAuthors/en-us/blog/authors/fernando-diaz.yml",{"template":1391},"BlogAuthor",{"name":7,"config":1393},{"headshot":1394,"ctfId":1395},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659556/Blog/Author%20Headshots/fern_diaz.png","fjdiaz","yml",{},"/en-us/blog/authors/fernando-diaz",{},"en-us/blog/authors/fernando-diaz","lxRJIOydP4_yzYZvsPcuQevP9AYAKREF7i8QmmdnOWc",[1403,1411,1419],{"title":1404,"description":1405,"heroImage":1406,"category":685,"date":1407,"authors":1408,"slug":1410,"externalUrl":689},"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",[1409],"Julian Thome","improved-scope-offset-fingerprinting",{"title":1412,"description":1413,"heroImage":1406,"category":685,"date":1414,"authors":1415,"slug":1418,"externalUrl":689},"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",[1416,1417],"Erick Bajao","Joe Randazzo","gitlab-secrets-manager-add-eso-terraform-api-support",{"title":1420,"description":1421,"heroImage":1422,"category":685,"date":1423,"authors":1424,"slug":1426,"externalUrl":689},"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",[1425],"Alisa Ho","claude-security-and-gitlab",{"promotions":1428},[1429,1443,1455,1466],{"id":1430,"categories":1431,"header":1433,"text":1434,"button":1435,"image":1440},"ai-modernization",[1432],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1436,"config":1437},"Get your AI maturity score",{"href":1438,"dataGaName":1439,"dataGaLocation":917},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1441},{"src":1442},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1444,"categories":1445,"header":1447,"text":1434,"button":1448,"image":1452},"devops-modernization",[1446,1252],"product","Are you just managing tools or shipping innovation?",{"text":1449,"config":1450},"Get your DevOps maturity score",{"href":1451,"dataGaName":1439,"dataGaLocation":917},"/assessments/devops-modernization-assessment/",{"config":1453},{"src":1454},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1456,"categories":1457,"header":1458,"text":1434,"button":1459,"image":1463},"security-modernization",[685],"Are you trading speed for security?",{"text":1460,"config":1461},"Get your security maturity score",{"href":1462,"dataGaName":1439,"dataGaLocation":917},"/assessments/security-modernization-assessment/",{"config":1464},{"src":1465},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1467,"paths":1468,"header":1471,"text":1472,"button":1473,"image":1478},"github-azure-migration",[1469,1470],"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":1474,"config":1475},"See how GitLab compares to GitHub",{"href":1476,"dataGaName":1477,"dataGaLocation":917},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1479},{"src":1454},{"header":1481,"blurb":1482,"button":1483,"secondaryButton":1488},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1484,"config":1485},"Get your free trial",{"href":1486,"dataGaName":717,"dataGaLocation":1487},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1190,"config":1489},{"href":1042,"dataGaName":722,"dataGaLocation":1487},1786803752080]