[{"data":1,"prerenderedAt":1354},["ShallowReactive",2],{"/blog/ensuring-compliance":3,"navigation-en-us":556,"banner-en-us":984,"footer-en-us":994,"blog-post-authors-en-us-Beatriz Barbosa|Fernando Diaz":1239,"blog-related-posts-en-us-ensuring-compliance":1266,"blog-promotions-en-us":1291,"next-steps-en-us":1344},{"id":4,"title":5,"authors":6,"body":9,"category":533,"date":534,"description":535,"extension":536,"externalUrl":537,"faq":537,"featured":538,"heroImage":539,"meta":540,"navigation":541,"path":542,"seo":543,"slug":547,"stem":548,"tags":549,"template":553,"updatedDate":554,"__hash__":555},"blogPosts/en-us/blog/ensuring-compliance.md","How to ensure separation of duties and enforce compliance with GitLab",[7,8],"Beatriz Barbosa","Fernando Diaz",{"type":10,"value":11,"toc":525},"minimark",[12,25,31,34,40,53,56,59,64,71,82,89,95,117,137,140,145,176,287,292,295,300,306,310,332,338,343,349,357,363,371,374,379,383,386,404,410,421,425,428,434,440,447,464,472,478,484,487,501,511,514,521],[13,14,15,16,20,21,24],"p",{},"In this article, you'll learn the different ways to ensure ",[17,18,19],"strong",{},"separation of duties"," and\n",[17,22,23],{},"continuous compliance"," with the GitLab DevSecOps platform. But first, let's level-set on two key concepts:",[13,26,27,30],{},[17,28,29],{},"Compliance"," means being in accordance with guidelines and specifications that have been\ndefined either by your corporation or a regulatory agency. Compliance helps maintain\ncorporate ethics, appropriate user policies, security standards, and much more for\nthe safety of consumers.",[13,32,33],{},"Non-compliance may result in a bundle of legal fees and fines, so it is very important to maintain compliance. While maintaining compliance, DevSecOps teams must also ensure sustained development velocity, providing necessary simplicity, visibility, and control.",[13,35,36,39],{},[17,37,38],{},"Separation of duties"," requires multiple actors to complete a task to increase protection from error as well as prevent malicious activity. Separation of duties ensures roles best-suited for the job are the only ones that can perform it. As an example, some of the following\nactors are observed, each with a specific purpose:",[41,42,43,47,50],"ul",{},[44,45,46],"li",{},"a developer will be responsible for developing new features",[44,48,49],{},"a compliance officer will be responsible for creating and enforcing the usage of a pipeline",[44,51,52],{},"an application security engineer will be responsible for approving merge requests with vulnerabilities",[13,54,55],{},"Considering the above roles, we can ensure that a developer cannot change a running pipeline.\nThis is a task that can only be performed by a compliance officer, ensuring only compliant code can be pushed without approval.",[13,57,58],{},"An application security engineer is responsible for reviewing and approving code with vulnerabilities, ensuring proper mitigation can be performed, and that nothing comes as a surprise in the future. In this scenario, developers can't merge code until compliance\nand security requirements are met.",[60,61,63],"h2",{"id":62},"security-policies","Security policies",[13,65,66,67,70],{},"GitLab provides ",[17,68,69],{},"Security Policies",", which enable security teams to require security scans to run according to a configuration. This gives security teams confidence that the configured scans have not been changed or disabled.",[13,72,73,74,77,78,81],{},"Security policies can be scoped to meet certain ",[17,75,76],{},"Compliance Frameworks",". This means that your project has certain compliance requirements and needs additional oversight. This label can be created in ",[17,79,80],{},"Secure > Compliance Center > Frameworks"," under your top-level group.",[13,83,84],{},[85,86],"img",{"alt":87,"src":88},"Compliance Framework Label","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398093/blog/Content%20Images/compliance-04-2022/cf-step-2.png",[13,90,91,94],{},[17,92,93],{},"Note:"," Compliance labels can only be assigned to projects within the top-level group in which we create the label.",[13,96,97,98,104,105,110,111,116],{},"There are three types of policies, ",[99,100,103],"a",{"href":101,"rel":102},"https://docs.gitlab.com/user/application_security/policies/scan_execution_policies/",[],"Scan Execution Policies",", ",[99,106,109],{"href":107,"rel":108},"https://docs.gitlab.com/user/application_security/policies/merge_request_approval_policies/",[],"Merge Request Approval Policies",", and ",[99,112,115],{"href":113,"rel":114},"https://docs.gitlab.com/user/application_security/policies/pipeline_execution_policies/",[],"Pipeline Execution Policies",".",[41,118,119,125,131],{},[44,120,121,124],{},[17,122,123],{},"Scan Execution Policies:"," Require that security scans run on a specified schedule or with the project pipeline.",[44,126,127,130],{},[17,128,129],{},"Merge Request Approval Policies:"," Take action based on scan results, such as requiring approval from the security team before a merge can occur.",[44,132,133,136],{},[17,134,135],{},"Pipeline Execution Policies:"," Enforce CI/CD jobs for applicable projects.",[13,138,139],{},"These policies can be configured via the Policy Editor in a few simple steps.",[141,142,144],"h3",{"id":143},"scan-execution","Scan execution",[146,147,148,154,161,167],"ol",{},[44,149,150,151,116],{},"Go to ",[17,152,153],{},"Security & Compliance > Policies",[44,155,156,157,160],{},"Create a new policy by pressing the ",[17,158,159],{},"New Policy"," button.",[44,162,163,164,116],{},"Select ",[17,165,166],{},"Scan Execution",[44,168,169,170,175],{},"Create the rule. I'm creating a rule that requires ",[99,171,174],{"href":172,"rel":173},"https://docs.gitlab.com/user/application_security/sast/",[],"SAST"," to be configured in order for a pipeline to run.",[177,178,183],"pre",{"className":179,"code":180,"language":181,"meta":182,"style":182},"language-yaml shiki shiki-themes github-light","name: force_sast\ndescription: 'require sast to run'\nenabled: true\nrules:\n- type: pipeline\n  branches:\n  - main\nactions:\n- scan: sast\n","yaml","",[184,185,186,203,214,226,235,249,257,266,274],"code",{"__ignoreMap":182},[187,188,191,195,199],"span",{"class":189,"line":190},"line",1,[187,192,194],{"class":193},"shJU0","name",[187,196,198],{"class":197},"sgsFI",": ",[187,200,202],{"class":201},"sYBdl","force_sast\n",[187,204,206,209,211],{"class":189,"line":205},2,[187,207,208],{"class":193},"description",[187,210,198],{"class":197},[187,212,213],{"class":201},"'require sast to run'\n",[187,215,217,220,222],{"class":189,"line":216},3,[187,218,219],{"class":193},"enabled",[187,221,198],{"class":197},[187,223,225],{"class":224},"sYu0t","true\n",[187,227,229,232],{"class":189,"line":228},4,[187,230,231],{"class":193},"rules",[187,233,234],{"class":197},":\n",[187,236,238,241,244,246],{"class":189,"line":237},5,[187,239,240],{"class":197},"- ",[187,242,243],{"class":193},"type",[187,245,198],{"class":197},[187,247,248],{"class":201},"pipeline\n",[187,250,252,255],{"class":189,"line":251},6,[187,253,254],{"class":193},"  branches",[187,256,234],{"class":197},[187,258,260,263],{"class":189,"line":259},7,[187,261,262],{"class":197},"  - ",[187,264,265],{"class":201},"main\n",[187,267,269,272],{"class":189,"line":268},8,[187,270,271],{"class":193},"actions",[187,273,234],{"class":197},[187,275,277,279,282,284],{"class":189,"line":276},9,[187,278,240],{"class":197},[187,280,281],{"class":193},"scan",[187,283,198],{"class":197},[187,285,286],{"class":201},"sast\n",[146,288,289],{"start":237},[44,290,291],{},"Submit the policy by creating a merge request and then merge.",[13,293,294],{},"All scan execution policy changes are applied through a background job that runs once every 10 minutes.\nAllow up to 10 minutes for any policy changes committed to this project to take effect.",[146,296,297],{"start":251},[44,298,299],{},"Try and run a pipeline. It will not be run unless SAST is defined in the YAML.",[13,301,302,305],{},[17,303,304],{},"Note",": You can also force SAST to run on a timer. For more information, see the scan execution\npolicies documentation.",[141,307,309],{"id":308},"merge-request-approval","Merge Request Approval",[146,311,312,317,321,326,329],{},[44,313,150,314,116],{},[17,315,316],{},"Secure > Policies",[44,318,156,319,160],{},[17,320,159],{},[44,322,163,323,116],{},[17,324,325],{},"Merge Request Approval Policy",[44,327,328],{},"Define policy scope.",[44,330,331],{},"Create the rule.",[13,333,334],{},[85,335],{"alt":336,"src":337},"separation of duties update - image 1","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098241/Blog/Content%20Images/Blog/Content%20Images/image1_aHR0cHM6_1750098241214.png",[146,339,340],{"start":251},[44,341,342],{},"Add action to take.",[13,344,345],{},[85,346],{"alt":347,"src":348},"separation of duties update - image 2","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098241/Blog/Content%20Images/Blog/Content%20Images/image3_aHR0cHM6_1750098241215.png",[13,350,351,353,354,116],{},[17,352,93],{}," The policy is evaluated according to the rules you set. This means that, if the rules are invalid, or can’t be evaluated, approval is required. To prevent this, the default Fallback behavior field can be changed to ",[184,355,356],{},"open",[13,358,359],{},[85,360],{"alt":361,"src":362},"separation of duties update - image 3","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098241/Blog/Content%20Images/Blog/Content%20Images/image5_aHR0cHM6_1750098241217.png",[146,364,365,368],{},[44,366,367],{},"Submit the policy by creating a merge request and then merging",[44,369,370],{},"Create a separate merge request with vulnerabilities",[13,372,373],{},"You can see how to add vulnerabilities by checking out the Developer Workflow section of the GitLab DevSecOps Workshop.",[146,375,376],{"start":216},[44,377,378],{},"Verify Merge Request Approval Policy is being used by viewing merge request.",[141,380,382],{"id":381},"pipeline-execution-policy","Pipeline Execution Policy",[13,384,385],{},"To set up a pipeline execution policy, you need to first create a project containing the CI files you would like to run. Make sure that only the security team and/or administrator has access to ensure separation of duties. I created the \"Compliance and Deploy\" project, which contains the YAML I wish to enforce.",[146,387,388,392,396,400,402],{},[44,389,150,390,116],{},[17,391,316],{},[44,393,156,394,160],{},[17,395,159],{},[44,397,163,398,116],{},[17,399,382],{},[44,401,328],{},[44,403,342],{},[13,405,406],{},[85,407],{"alt":408,"src":409},"separation of duties update - image 4","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098241/Blog/Content%20Images/Blog/Content%20Images/image8_aHR0cHM6_1750098241219.png",[146,411,412,415,418],{"start":251},[44,413,414],{},"Add conditions.",[44,416,417],{},"Submit the policy by creating a merge request and then merging.",[44,419,420],{},"Try and run a pipeline. You will see the policy specific jobs and stages in your pipeline.",[60,422,424],{"id":423},"audit-management-and-compliance-dashboard","Audit Management and Compliance Dashboard",[13,426,427],{},"Another important part of compliance is knowing it is actually happening in your groups/projects. GitLab has Audit Events and Compliance Reports to assist with audits.",[13,429,430,433],{},[17,431,432],{},"Audit Events"," allows GitLab owners and administrators to track important events such as who performed certain actions and the time they occurred.",[13,435,436],{},[85,437],{"alt":438,"src":439},"Audit events","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398093/blog/Content%20Images/compliance-04-2022/project-audit-events.png",[13,441,442,443,446],{},"Audit Events records different events per group and per project, which can be seen\nin the audit events documentation.\nAudit Events can be accessed by going to ",[17,444,445],{},"Security & Compliance > Audit Events",".\nSome examples include:",[41,448,449,452,455,458,461],{},[44,450,451],{},"user was added to project and their permissions",[44,453,454],{},"permission changes of a user assigned to a project",[44,456,457],{},"project CI/CD variable added, removed, or protected status changed",[44,459,460],{},"user was added to group and their permissions",[44,462,463],{},"group name or path changed",[13,465,466,467,116],{},"Audit Events can also be sent to an HTTP endpoint using Audit Event Streaming. Learn how\nto implement Audit Event Streaming in this ",[99,468,471],{"href":469,"rel":470},"https://youtu.be/zHwVF9-i7e4?t=52",[],"video",[13,473,474,477],{},[17,475,476],{},"Standards Adherence"," gives you the ability to see a group's merge request activity. It provides a high-level view for all projects in the group.",[13,479,480],{},[85,481],{"alt":482,"src":483},"separation of duties update - image 5","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098241/Blog/Content%20Images/Blog/Content%20Images/image2_aHR0cHM6_1750098241222.png",[13,485,486],{},"You can use the report to:",[41,488,489,492,495,498],{},[44,490,491],{},"get an overview of the latest merge request for each project",[44,493,494],{},"see if merge requests were approved and by whom",[44,496,497],{},"see merge request authors",[44,499,500],{},"see the latest CI/CD pipeline result for each merge request",[13,502,503,504,507,508,510],{},"The Standards Adherence report can be accessed in the top-level group by going to ",[17,505,506],{},"Secure > Compliance Center",", and choosing the ",[17,509,476],{}," tab.",[512,513],"hr",{},[13,515,516,517],{},"Thanks for reading! For more information on separation of duties within GitLab, check out ",[99,518,520],{"href":519},"/solutions/compliance/","Continous Software Compliance with GitLab",[522,523,524],"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 pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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":182,"searchDepth":205,"depth":205,"links":526},[527,532],{"id":62,"depth":205,"text":63,"children":528},[529,530,531],{"id":143,"depth":216,"text":144},{"id":308,"depth":216,"text":309},{"id":381,"depth":216,"text":382},{"id":423,"depth":205,"text":424},"security","2022-04-04","Use your DevSecOps platform to help maintain compliance without compromising on development speed.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098232/Blog/Hero%20Images/Blog/Hero%20Images/AdobeStock_479904468%20%281%29_4lmOEVlaXP0YC3hSFmOw6i_1750098232241.jpg",{},true,"/en-us/blog/ensuring-compliance",{"title":5,"description":535,"ogTitle":5,"ogDescription":535,"noIndex":538,"ogImage":539,"ogUrl":544,"ogSiteName":545,"ogType":546,"canonicalUrls":544},"https://about.gitlab.com/blog/ensuring-compliance","https://about.gitlab.com","article","ensuring-compliance","en-us/blog/ensuring-compliance",[533,550,551,552],"CI","CD","features","BlogPost","2024-12-16","xtvcD3vIp5bqiFXY2TaDBjcIOWzky_nP5BATpK09UdM",{"logo":557,"freeTrial":562,"sales":567,"login":572,"items":577,"search":904,"minimal":935,"duo":954,"switchNav":963,"pricingDeployment":974},{"config":558},{"href":559,"dataGaName":560,"dataGaLocation":561},"/","gitlab logo","header",{"text":563,"config":564},"Get free trial",{"href":565,"dataGaName":566,"dataGaLocation":561},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":568,"config":569},"Request a demo",{"href":570,"dataGaName":571,"dataGaLocation":561},"/sales/?contact-topic=request-demo","sales",{"text":573,"config":574},"Sign in",{"href":575,"dataGaName":576,"dataGaLocation":561},"https://gitlab.com/users/sign_in/","sign in",[578,607,707,712,826,882],{"text":579,"config":580,"menu":582},"Platform",{"dataNavLevelOne":581},"platform",{"type":583,"columns":584},"cards",[585,591,599],{"title":579,"description":586,"link":587},"The intelligent orchestration platform for DevSecOps",{"text":588,"config":589},"Explore our Platform",{"href":590,"dataGaName":581,"dataGaLocation":561},"/platform/",{"title":592,"description":593,"link":594},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":595,"config":596},"Meet GitLab Duo",{"href":597,"dataGaName":598,"dataGaLocation":561},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":600,"description":601,"link":602},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":603,"config":604},"Learn more",{"href":605,"dataGaName":606,"dataGaLocation":561},"/why-gitlab/","why gitlab",{"text":608,"left":541,"config":609,"menu":611},"Product",{"dataNavLevelOne":610},"solutions",{"type":612,"link":613,"columns":617,"feature":686},"lists",{"text":614,"config":615},"View all Solutions",{"href":616,"dataGaName":610,"dataGaLocation":561},"/solutions/",[618,642,665],{"title":619,"description":620,"link":621,"items":626},"Automation","CI/CD and automation to accelerate deployment",{"config":622},{"icon":623,"href":624,"dataGaName":625,"dataGaLocation":561},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[627,631,634,638],{"text":628,"config":629},"CI/CD",{"href":630,"dataGaLocation":561,"dataGaName":628},"/solutions/continuous-integration/",{"text":592,"config":632},{"href":597,"dataGaLocation":561,"dataGaName":633},"gitlab duo agent platform - product menu",{"text":635,"config":636},"Source Code Management",{"href":637,"dataGaLocation":561,"dataGaName":635},"/solutions/source-code-management/",{"text":639,"config":640},"Automated Software Delivery",{"href":624,"dataGaLocation":561,"dataGaName":641},"Automated software delivery",{"title":643,"description":644,"link":645,"items":650},"Security","Deliver code faster without compromising security",{"config":646},{"href":647,"dataGaName":648,"dataGaLocation":561,"icon":649},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[651,655,660],{"text":652,"config":653},"Application Security Testing",{"href":647,"dataGaName":654,"dataGaLocation":561},"Application security testing",{"text":656,"config":657},"Software Supply Chain Security",{"href":658,"dataGaLocation":561,"dataGaName":659},"/solutions/supply-chain/","Software supply chain security",{"text":661,"config":662},"Software Compliance",{"href":663,"dataGaName":664,"dataGaLocation":561},"/solutions/software-compliance/","software compliance",{"title":666,"link":667,"items":672},"Measurement",{"config":668},{"icon":669,"href":670,"dataGaName":671,"dataGaLocation":561},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[673,677,681],{"text":674,"config":675},"Visibility & Measurement",{"href":670,"dataGaLocation":561,"dataGaName":676},"Visibility and Measurement",{"text":678,"config":679},"Value Stream Management",{"href":680,"dataGaLocation":561,"dataGaName":678},"/solutions/value-stream-management/",{"text":682,"config":683},"Analytics & Insights",{"href":684,"dataGaLocation":561,"dataGaName":685},"/solutions/analytics-and-insights/","Analytics and insights",{"title":687,"type":612,"items":688},"GitLab for",[689,695,701],{"text":690,"config":691},"Enterprise",{"icon":692,"href":693,"dataGaLocation":561,"dataGaName":694},"Building","/enterprise/","enterprise",{"text":696,"config":697},"Small Business",{"icon":698,"href":699,"dataGaLocation":561,"dataGaName":700},"Work","/small-business/","small business",{"text":702,"config":703},"Public Sector",{"icon":704,"href":705,"dataGaLocation":561,"dataGaName":706},"Organization","/solutions/public-sector/","public sector",{"text":708,"config":709},"Pricing",{"href":710,"dataGaName":711,"dataGaLocation":561,"dataNavLevelOne":711},"/pricing/","pricing",{"text":713,"config":714,"menu":716},"Resources",{"dataNavLevelOne":715},"resources",{"type":612,"link":717,"columns":721,"feature":815},{"text":718,"config":719},"View all resources",{"href":720,"dataGaName":715,"dataGaLocation":561},"/resources/",[722,755,782],{"title":723,"items":724},"Getting started",[725,730,735,740,745,750],{"text":726,"config":727},"Install",{"href":728,"dataGaName":729,"dataGaLocation":561},"/install/","install",{"text":731,"config":732},"Quick start guides",{"href":733,"dataGaName":734,"dataGaLocation":561},"/get-started/","quick setup checklists",{"text":736,"config":737},"Learn",{"href":738,"dataGaLocation":561,"dataGaName":739},"https://university.gitlab.com/","learn",{"text":741,"config":742},"Product documentation",{"href":743,"dataGaName":744,"dataGaLocation":561},"https://docs.gitlab.com/","product documentation",{"text":746,"config":747},"Best practice videos",{"href":748,"dataGaName":749,"dataGaLocation":561},"/getting-started-videos/","best practice videos",{"text":751,"config":752},"Integrations",{"href":753,"dataGaName":754,"dataGaLocation":561},"/integrations/","integrations",{"title":756,"items":757},"Discover",[758,763,768,773,777],{"text":759,"config":760},"Customer success stories",{"href":761,"dataGaName":762,"dataGaLocation":561},"/customers/","customer success stories",{"text":764,"config":765},"Blog",{"href":766,"dataGaName":767,"dataGaLocation":561},"/blog/","blog",{"text":769,"config":770},"Demo Hub",{"href":771,"dataGaName":772,"dataGaLocation":561},"/demo-hub/","demo hub",{"text":774,"config":775},"The Source",{"href":776,"dataGaName":767,"dataGaLocation":561},"/the-source/",{"text":778,"config":779},"Remote",{"href":780,"dataGaName":781,"dataGaLocation":561},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":783,"items":784},"Connect",[785,790,795,800,805,810],{"text":786,"config":787},"GitLab Services",{"href":788,"dataGaName":789,"dataGaLocation":561},"/services/","services",{"text":791,"config":792},"Contribute",{"href":793,"dataGaName":794,"dataGaLocation":561},"https://contributors.gitlab.com","contribute",{"text":796,"config":797},"Community",{"href":798,"dataGaName":799,"dataGaLocation":561},"/community/","community",{"text":801,"config":802},"Forum",{"href":803,"dataGaName":804,"dataGaLocation":561},"https://forum.gitlab.com/","forum",{"text":806,"config":807},"Events",{"href":808,"dataGaName":809,"dataGaLocation":561},"/events/","events",{"text":811,"config":812},"Partners",{"href":813,"dataGaName":814,"dataGaLocation":561},"/partners/","partners",{"config":816,"title":819,"text":820,"link":821},{"background":817,"textColor":818},"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":822,"config":823},"Read the latest",{"href":824,"dataGaName":825,"dataGaLocation":561},"/whats-new/","whats new",{"text":827,"config":828,"menu":830},"Company",{"dataNavLevelOne":829},"company",{"type":612,"columns":831},[832],{"items":833},[834,839,845,847,852,857,862,867,872,877],{"text":835,"config":836},"About",{"href":837,"dataGaName":838,"dataGaLocation":561},"/company/","about",{"text":840,"config":841,"footerGa":844},"Jobs",{"href":842,"dataGaName":843,"dataGaLocation":561},"/jobs/","jobs",{"dataGaName":843},{"text":806,"config":846},{"href":808,"dataGaName":809,"dataGaLocation":561},{"text":848,"config":849},"Leadership",{"href":850,"dataGaName":851,"dataGaLocation":561},"/company/team/e-group/","leadership",{"text":853,"config":854},"Handbook",{"href":855,"dataGaName":856,"dataGaLocation":561},"https://handbook.gitlab.com/","handbook",{"text":858,"config":859},"Investor relations",{"href":860,"dataGaName":861,"dataGaLocation":561},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":863,"config":864},"Trust Center",{"href":865,"dataGaName":866,"dataGaLocation":561},"/security/","trust center",{"text":868,"config":869},"AI Transparency Center",{"href":870,"dataGaName":871,"dataGaLocation":561},"/ai-transparency-center/","ai transparency center",{"text":873,"config":874},"Newsletter",{"href":875,"dataGaName":876,"dataGaLocation":561},"/company/contact/#contact-forms","newsletter",{"text":878,"config":879},"Press",{"href":880,"dataGaName":881,"dataGaLocation":561},"/press/","press",{"text":883,"config":884,"menu":885},"Contact us",{"dataNavLevelOne":829},{"type":612,"columns":886},[887],{"items":888},[889,894,899],{"text":890,"config":891},"Talk to sales",{"href":892,"dataGaName":893,"dataGaLocation":561},"/sales/","talk to sales",{"text":895,"config":896},"Support portal",{"href":897,"dataGaName":898,"dataGaLocation":561},"https://support.gitlab.com/hc/en-us","support portal",{"text":900,"config":901},"Customer portal",{"href":902,"dataGaName":903,"dataGaLocation":561},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":905,"login":906,"suggestions":913},"Close",{"text":907,"link":908},"To search repositories and projects, login to",{"text":909,"config":910},"gitlab.com",{"href":575,"dataGaName":911,"dataGaLocation":912},"search login","search",{"text":914,"default":915},"Suggestions",[916,918,922,924,928,932],{"text":592,"config":917},{"href":597,"dataGaName":592,"dataGaLocation":912},{"text":919,"config":920},"Code Suggestions (AI)",{"href":921,"dataGaName":919,"dataGaLocation":912},"/solutions/code-suggestions/",{"text":628,"config":923},{"href":630,"dataGaName":628,"dataGaLocation":912},{"text":925,"config":926},"GitLab on AWS",{"href":927,"dataGaName":925,"dataGaLocation":912},"/partners/technology-partners/aws/",{"text":929,"config":930},"GitLab on Google Cloud",{"href":931,"dataGaName":929,"dataGaLocation":912},"/partners/technology-partners/google-cloud-platform/",{"text":933,"config":934},"Why GitLab?",{"href":605,"dataGaName":933,"dataGaLocation":912},{"freeTrial":936,"mobileIcon":941,"desktopIcon":946,"secondaryButton":949},{"text":937,"config":938},"Start free trial",{"href":939,"dataGaName":566,"dataGaLocation":940},"https://gitlab.com/-/trials/new/","nav",{"altText":942,"config":943},"Gitlab Icon",{"src":944,"dataGaName":945,"dataGaLocation":940},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":942,"config":947},{"src":948,"dataGaName":945,"dataGaLocation":940},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":950,"config":951},"Get Started",{"href":952,"dataGaName":953,"dataGaLocation":940},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":955,"mobileIcon":959,"desktopIcon":961},{"text":956,"config":957},"Learn more about GitLab Duo",{"href":597,"dataGaName":958,"dataGaLocation":940},"gitlab duo",{"altText":942,"config":960},{"src":944,"dataGaName":945,"dataGaLocation":940},{"altText":942,"config":962},{"src":948,"dataGaName":945,"dataGaLocation":940},{"button":964,"mobileIcon":969,"desktopIcon":971},{"text":965,"config":966},"/switch",{"href":967,"dataGaName":968,"dataGaLocation":940},"#contact","switch",{"altText":942,"config":970},{"src":944,"dataGaName":945,"dataGaLocation":940},{"altText":942,"config":972},{"src":973,"dataGaName":945,"dataGaLocation":940},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":975,"mobileIcon":980,"desktopIcon":982},{"text":976,"config":977},"Back to pricing",{"href":710,"dataGaName":978,"dataGaLocation":940,"icon":979},"back to pricing","GoBack",{"altText":942,"config":981},{"src":944,"dataGaName":945,"dataGaLocation":940},{"altText":942,"config":983},{"src":948,"dataGaName":945,"dataGaLocation":940},{"title":985,"titleMobile":986,"button":987,"config":992},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":603,"config":988},{"href":989,"dataGaName":990,"dataGaLocation":991},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":993,"disabled":538},"release",{"data":995},{"text":996,"source":997,"edit":1003,"contribute":1008,"config":1013,"items":1018,"minimal":1228},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":998,"config":999},"View page source",{"href":1000,"dataGaName":1001,"dataGaLocation":1002},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1004,"config":1005},"Edit this page",{"href":1006,"dataGaName":1007,"dataGaLocation":1002},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1009,"config":1010},"Please contribute",{"href":1011,"dataGaName":1012,"dataGaLocation":1002},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1014,"facebook":1015,"youtube":1016,"linkedin":1017},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1019,1066,1120,1164,1196],{"title":708,"links":1020,"subMenu":1035},[1021,1025,1030],{"text":1022,"config":1023},"View plans",{"href":710,"dataGaName":1024,"dataGaLocation":1002},"view plans",{"text":1026,"config":1027},"Why Premium?",{"href":1028,"dataGaName":1029,"dataGaLocation":1002},"/pricing/premium/","why premium",{"text":1031,"config":1032},"Why Ultimate?",{"href":1033,"dataGaName":1034,"dataGaLocation":1002},"/pricing/ultimate/","why ultimate",[1036],{"title":1037,"links":1038},"Contact Us",[1039,1042,1044,1046,1051,1056,1061],{"text":1040,"config":1041},"Contact sales",{"href":892,"dataGaName":571,"dataGaLocation":1002},{"text":895,"config":1043},{"href":897,"dataGaName":898,"dataGaLocation":1002},{"text":900,"config":1045},{"href":902,"dataGaName":903,"dataGaLocation":1002},{"text":1047,"config":1048},"Status",{"href":1049,"dataGaName":1050,"dataGaLocation":1002},"https://status.gitlab.com/","status",{"text":1052,"config":1053},"Terms of use",{"href":1054,"dataGaName":1055,"dataGaLocation":1002},"/terms/","terms of use",{"text":1057,"config":1058},"Privacy statement",{"href":1059,"dataGaName":1060,"dataGaLocation":1002},"/privacy/","privacy statement",{"text":1062,"config":1063},"Cookie preferences",{"dataGaName":1064,"dataGaLocation":1002,"id":1065,"isOneTrustButton":541},"cookie preferences","ot-sdk-btn",{"title":608,"links":1067,"subMenu":1076},[1068,1072],{"text":1069,"config":1070},"DevSecOps platform",{"href":590,"dataGaName":1071,"dataGaLocation":1002},"devsecops platform",{"text":1073,"config":1074},"AI-Assisted Development",{"href":597,"dataGaName":1075,"dataGaLocation":1002},"ai-assisted development",[1077],{"title":1078,"links":1079},"Topics",[1080,1085,1090,1095,1100,1105,1110,1115],{"text":1081,"config":1082},"CICD",{"href":1083,"dataGaName":1084,"dataGaLocation":1002},"/topics/ci-cd/","cicd",{"text":1086,"config":1087},"GitOps",{"href":1088,"dataGaName":1089,"dataGaLocation":1002},"/topics/gitops/","gitops",{"text":1091,"config":1092},"DevOps",{"href":1093,"dataGaName":1094,"dataGaLocation":1002},"/topics/devops/","devops",{"text":1096,"config":1097},"Version Control",{"href":1098,"dataGaName":1099,"dataGaLocation":1002},"/topics/version-control/","version control",{"text":1101,"config":1102},"DevSecOps",{"href":1103,"dataGaName":1104,"dataGaLocation":1002},"/topics/devsecops/","devsecops",{"text":1106,"config":1107},"Cloud Native",{"href":1108,"dataGaName":1109,"dataGaLocation":1002},"/topics/cloud-native/","cloud native",{"text":1111,"config":1112},"AI for Coding",{"href":1113,"dataGaName":1114,"dataGaLocation":1002},"/topics/devops/ai-for-coding/","ai for coding",{"text":1116,"config":1117},"Agentic AI",{"href":1118,"dataGaName":1119,"dataGaLocation":1002},"/topics/agentic-ai/","agentic ai",{"title":1121,"links":1122},"Solutions",[1123,1125,1127,1132,1136,1139,1143,1146,1148,1151,1154,1159],{"text":652,"config":1124},{"href":647,"dataGaName":652,"dataGaLocation":1002},{"text":641,"config":1126},{"href":624,"dataGaName":625,"dataGaLocation":1002},{"text":1128,"config":1129},"Agile development",{"href":1130,"dataGaName":1131,"dataGaLocation":1002},"/solutions/agile-delivery/","agile delivery",{"text":1133,"config":1134},"SCM",{"href":637,"dataGaName":1135,"dataGaLocation":1002},"source code management",{"text":1081,"config":1137},{"href":630,"dataGaName":1138,"dataGaLocation":1002},"continuous integration & delivery",{"text":1140,"config":1141},"Value stream management",{"href":680,"dataGaName":1142,"dataGaLocation":1002},"value stream management",{"text":1086,"config":1144},{"href":1145,"dataGaName":1089,"dataGaLocation":1002},"/solutions/gitops/",{"text":690,"config":1147},{"href":693,"dataGaName":694,"dataGaLocation":1002},{"text":1149,"config":1150},"Small business",{"href":699,"dataGaName":700,"dataGaLocation":1002},{"text":1152,"config":1153},"Public sector",{"href":705,"dataGaName":706,"dataGaLocation":1002},{"text":1155,"config":1156},"Education",{"href":1157,"dataGaName":1158,"dataGaLocation":1002},"/solutions/education/","education",{"text":1160,"config":1161},"Financial services",{"href":1162,"dataGaName":1163,"dataGaLocation":1002},"/solutions/finance/","financial services",{"title":713,"links":1165},[1166,1168,1170,1172,1175,1177,1180,1182,1184,1186,1188,1190,1192,1194],{"text":726,"config":1167},{"href":728,"dataGaName":729,"dataGaLocation":1002},{"text":731,"config":1169},{"href":733,"dataGaName":734,"dataGaLocation":1002},{"text":736,"config":1171},{"href":738,"dataGaName":739,"dataGaLocation":1002},{"text":741,"config":1173},{"href":743,"dataGaName":1174,"dataGaLocation":1002},"docs",{"text":764,"config":1176},{"href":766,"dataGaName":767,"dataGaLocation":1002},{"text":1178,"config":1179},"What's new",{"href":824,"dataGaName":825,"dataGaLocation":1002},{"text":759,"config":1181},{"href":761,"dataGaName":762,"dataGaLocation":1002},{"text":778,"config":1183},{"href":780,"dataGaName":781,"dataGaLocation":1002},{"text":786,"config":1185},{"href":788,"dataGaName":789,"dataGaLocation":1002},{"text":791,"config":1187},{"href":793,"dataGaName":794,"dataGaLocation":1002},{"text":796,"config":1189},{"href":798,"dataGaName":799,"dataGaLocation":1002},{"text":801,"config":1191},{"href":803,"dataGaName":804,"dataGaLocation":1002},{"text":806,"config":1193},{"href":808,"dataGaName":809,"dataGaLocation":1002},{"text":811,"config":1195},{"href":813,"dataGaName":814,"dataGaLocation":1002},{"title":827,"links":1197},[1198,1200,1202,1204,1206,1208,1212,1217,1219,1221,1223],{"text":835,"config":1199},{"href":837,"dataGaName":829,"dataGaLocation":1002},{"text":840,"config":1201},{"href":842,"dataGaName":843,"dataGaLocation":1002},{"text":848,"config":1203},{"href":850,"dataGaName":851,"dataGaLocation":1002},{"text":853,"config":1205},{"href":855,"dataGaName":856,"dataGaLocation":1002},{"text":858,"config":1207},{"href":860,"dataGaName":861,"dataGaLocation":1002},{"text":1209,"config":1210},"Sustainability",{"href":1211,"dataGaName":1209,"dataGaLocation":1002},"/sustainability/",{"text":1213,"config":1214},"Diversity, inclusion and belonging (DIB)",{"href":1215,"dataGaName":1216,"dataGaLocation":1002},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":863,"config":1218},{"href":865,"dataGaName":866,"dataGaLocation":1002},{"text":873,"config":1220},{"href":875,"dataGaName":876,"dataGaLocation":1002},{"text":878,"config":1222},{"href":880,"dataGaName":881,"dataGaLocation":1002},{"text":1224,"config":1225},"Modern Slavery Transparency Statement",{"href":1226,"dataGaName":1227,"dataGaLocation":1002},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1229},[1230,1233,1236],{"text":1231,"config":1232},"Terms",{"href":1054,"dataGaName":1055,"dataGaLocation":1002},{"text":1234,"config":1235},"Cookies",{"dataGaName":1064,"dataGaLocation":1002,"id":1065,"isOneTrustButton":541},{"text":1237,"config":1238},"Privacy",{"href":1059,"dataGaName":1060,"dataGaLocation":1002},[1240,1254],{"id":1241,"title":7,"body":537,"config":1242,"content":1244,"description":537,"extension":1248,"meta":1249,"navigation":541,"path":1250,"seo":1251,"stem":1252,"__hash__":1253},"blogAuthors/en-us/blog/authors/beatriz-barbosa.yml",{"template":1243},"BlogAuthor",{"name":7,"config":1245},{"headshot":1246,"ctfId":1247},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749665252/Blog/Author%20Headshots/beatriz_barbosa.png","7GdHsfTvzkhnGh2qQmZF91","yml",{},"/en-us/blog/authors/beatriz-barbosa",{},"en-us/blog/authors/beatriz-barbosa","rjU7EY8kxvB4hBLZFgPomL5Ro7OXb7zPwBhuKV5xydw",{"id":1255,"title":8,"body":537,"config":1256,"content":1257,"description":537,"extension":1248,"meta":1261,"navigation":541,"path":1262,"seo":1263,"stem":1264,"__hash__":1265},"blogAuthors/en-us/blog/authors/fernando-diaz.yml",{"template":1243},{"name":8,"config":1258},{"headshot":1259,"ctfId":1260},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659556/Blog/Author%20Headshots/fern_diaz.png","fjdiaz",{},"/en-us/blog/authors/fernando-diaz",{},"en-us/blog/authors/fernando-diaz","lxRJIOydP4_yzYZvsPcuQevP9AYAKREF7i8QmmdnOWc",[1267,1275,1283],{"title":1268,"description":1269,"heroImage":1270,"category":533,"date":1271,"authors":1272,"slug":1274,"externalUrl":537},"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",[1273],"Julian Thome","improved-scope-offset-fingerprinting",{"title":1276,"description":1277,"heroImage":1270,"category":533,"date":1278,"authors":1279,"slug":1282,"externalUrl":537},"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",[1280,1281],"Erick Bajao","Joe Randazzo","gitlab-secrets-manager-add-eso-terraform-api-support",{"title":1284,"description":1285,"heroImage":1286,"category":533,"date":1287,"authors":1288,"slug":1290,"externalUrl":537},"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",[1289],"Alisa Ho","claude-security-and-gitlab",{"promotions":1292},[1293,1307,1319,1330],{"id":1294,"categories":1295,"header":1297,"text":1298,"button":1299,"image":1304},"ai-modernization",[1296],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1300,"config":1301},"Get your AI maturity score",{"href":1302,"dataGaName":1303,"dataGaLocation":767},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1305},{"src":1306},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1308,"categories":1309,"header":1311,"text":1298,"button":1312,"image":1316},"devops-modernization",[1310,1104],"product","Are you just managing tools or shipping innovation?",{"text":1313,"config":1314},"Get your DevOps maturity score",{"href":1315,"dataGaName":1303,"dataGaLocation":767},"/assessments/devops-modernization-assessment/",{"config":1317},{"src":1318},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1320,"categories":1321,"header":1322,"text":1298,"button":1323,"image":1327},"security-modernization",[533],"Are you trading speed for security?",{"text":1324,"config":1325},"Get your security maturity score",{"href":1326,"dataGaName":1303,"dataGaLocation":767},"/assessments/security-modernization-assessment/",{"config":1328},{"src":1329},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1331,"paths":1332,"header":1335,"text":1336,"button":1337,"image":1342},"github-azure-migration",[1333,1334],"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":1338,"config":1339},"See how GitLab compares to GitHub",{"href":1340,"dataGaName":1341,"dataGaLocation":767},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1343},{"src":1318},{"header":1345,"blurb":1346,"button":1347,"secondaryButton":1352},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1348,"config":1349},"Get your free trial",{"href":1350,"dataGaName":566,"dataGaLocation":1351},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1040,"config":1353},{"href":892,"dataGaName":571,"dataGaLocation":1351},1786803759174]