[{"data":1,"prerenderedAt":1109},["ShallowReactive",2],{"/blog/moving-workflows-to-gitlab-the-case-of-the-hipaa-audit-protocol":3,"navigation-en-us":324,"banner-en-us":752,"footer-en-us":762,"blog-post-authors-en-us-Luka Trbojevic":1006,"blog-related-posts-en-us-moving-workflows-to-gitlab-the-case-of-the-hipaa-audit-protocol":1020,"blog-promotions-en-us":1046,"next-steps-en-us":1099},{"id":4,"title":5,"authors":6,"body":8,"category":302,"date":303,"description":304,"extension":305,"externalUrl":306,"faq":306,"featured":307,"heroImage":308,"meta":309,"navigation":310,"path":311,"seo":312,"slug":316,"stem":317,"tags":318,"template":322,"updatedDate":306,"__hash__":323},"blogPosts/en-us/blog/moving-workflows-to-gitlab-the-case-of-the-hipaa-audit-protocol.md","Moving workflows to GitLab: The case of the HIPAA Audit Protocol",[7],"Luka Trbojevic",{"type":9,"value":10,"toc":292},"minimark",[11,15,22,32,48,53,61,64,73,76,83,86,91,94,104,115,118,124,129,132,137,140,145,149,152,157,160,164,167,172,182,186,209,213,216,225,228,231,234,247,250,259,268,271,275,278],[12,13,14],"p",{},"Using GitLab for just about everything we do, I’ve seen firsthand how powerful and effective\nit can be as a project management tool.",[12,16,17,21],{},[18,19,20],"strong",{},"However, in speaking with folks about adopting GitLab for their own non-development\nworkflows, the most common roadblock I hear is the lack of specific examples."," If you're not\na developer or otherwise don't work with GitLab often, it can be hard to see how all the\nfeatures and capabilities fit together to go from an idea to a functional workflow. Because\nof this, I thought it was important to create a specific, real-world example for something most\nfolks can relate to: an audit.",[12,23,24,25,31],{},"The ",[26,27,30],"a",{"href":28,"rel":29},"https://www.hhs.gov/hipaa/for-professionals/compliance-enforcement/audit/protocol/index.html",[],"HIPAA Audit Protocol","\nis published by the U.S. Department of Health & Human Services and is used by the\nOffice for Civil Rights as part of its HIPAA compliance enforcement efforts. The\nHIPAA Audit Protocol currently exists as a table on the HHS website and is most commonly turned\ninto a spreadsheet. But there are limitations and inefficiencies to working with an audit\nprotocol in a spreadsheet, as compared to GitLab:",[33,34,35,39,42,45],"ul",{},[36,37,38],"li",{},"Collaboration is challenging in a spreadsheet. With issues, robust and well-organized conversations are easy.",[36,40,41],{},"You can't upload audit protocol files directly to the spreadsheet. With issues, you can upload files directly.",[36,43,44],{},"There's no simple, clean way to maintain a full, comprehensive change history in a\nspreadsheet. With issues and merge requests, change history and logging is directly built in.",[36,46,47],{},"It can be challenging to manage due dates, milestones, and work assignments in a\nspreadsheet. With issues, those are all native features.",[49,50,52],"h2",{"id":51},"introducing-the-hipaa-audit-protocol-issue-generator","Introducing the HIPAA Audit Protocol Issue Generator",[12,54,55,56,60],{},"The HIPAA Audit Protocol Issue Generator is a simple Python script using the\n",[57,58,59],"code",{},"python-gitlab"," API wrapper to create issues out of every audit inquiry in the protocol.\nThe purpose of the script is to highlight how easy it is to use the GitLab API to move\nworkflows inside of GitLab and leverage GitLab's project management capabilities.",[12,62,63],{},"The best part? Creating this tool was really easy and simple. I started by copying the\nHTML table of the audit protocol into a CSV. Then I wrote a simple loop to go through each\nrow in the CSV and automatically create an associated issue. Note: While you can use the\nissue importer, you’d have to create a very strictly structured and formatted import file.\nWith the GitLab API, you have more flexibility and the output is easier to work with.",[12,65,66,67,72],{},"For your use, we’ve made\nthe ",[26,68,71],{"href":69,"rel":70},"https://gitlab.com/ltrbojevic/hipaa-audit-protocol-issue-generator",[],"full script and a CSV of the audit protocol","\navailable.",[12,74,75],{},"Here’s what an issue looks like:",[12,77,78],{},[79,80],"img",{"alt":81,"src":82},"sample issue","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397897/blog/Content%20Images/HIPAA-audit-protocol-example.png",[12,84,85],{},"All the information you need is front and center and the issues are labeled.",[87,88,90],"h3",{"id":89},"customizing-the-issue-structure","Customizing the issue structure",[12,92,93],{},"First, it’s important to understand how we load the data from the CSV. There are different\nways to do it, but I like to assign every column in the CSV to a variable, then pass that\nvariable to the issue create API call. For this script, we have:",[95,96,102],"pre",{"className":97,"code":99,"language":100,"meta":101},[98],"language-text","audit_type = col[0]\nsection = col[1]\nkey_activity = col[2]\nestablished_performance_criteria = col[3]\naudit_inquiry = col[4]\nrequired_addressable = col[5]\n","text","",[57,103,99],{"__ignoreMap":101},[12,105,106,107,110,111,114],{},"That means ",[57,108,109],{},"audit_type"," is the first column, ",[57,112,113],{},"section"," is the second column, and so on.",[12,116,117],{},"These variables then get used in the issue create API call. For this script, we have:",[95,119,122],{"className":120,"code":121,"language":100,"meta":101},[98],"issue = project.issues.create({'title': key_activity,\n'description': '## Established Performance Criteria' + '\\n' +\nestablished_performance_criteria + '\\n' + '## Audit Inquiry' +\n'\\n' + audit_inquiry,\n'labels': [audit_type] + [required_addressable] + [section]})\n",[57,123,121],{"__ignoreMap":101},[125,126,128],"h4",{"id":127},"title","Title",[12,130,131],{},"I decided to use the respective Key Activity of every audit inquiry. In the issue create API\ncall, it looks like this:",[12,133,134],{},[57,135,136],{},"‘title’: key_activity,",[12,138,139],{},"You can make the title anything you want. In this case I just used a column from the CSV, but I\ncould start or end the title with some other text not in the CSV, like:",[12,141,142],{},[57,143,144],{},"‘title’: Any text you want:’ + ‘ ‘ key_activity,",[125,146,148],{"id":147},"description","Description",[12,150,151],{},"I just used a string to manually write out the headers for the section and filled the sections\nusing the data from the CSV. In the issue create API call, it looks like this:",[12,153,154],{},[57,155,156],{},"'description': '## Established Performance Criteria' + '\\n' + established_performance_criteria + '\\n' + '## Audit Inquiry' + '\\n' + audit_inquiry,",[12,158,159],{},"Notice how I use the newline. Without the newline, all of the data would be added to the description\nright next to each other and it would be unreadable. You can add as many newlines as you want,\nand if you’re planning on doing regular editing of the issue description itself, consider\nadding two newlines to create a new paragraph so the issue description is more readable in edit mode.",[125,161,163],{"id":162},"labels","Labels",[12,165,166],{},"Labels are very helpful for organizing, searching, filtering, and creating boards. For the labels,\nI opted to use Audit Type and Section. In the issue create API call, it looks like this:",[12,168,169],{},[57,170,171],{},"'labels': [audit_type] + [required_addressable] + [section]",[12,173,174,175,178,179,181],{},"You can also add your own labels to the CSV by creating a new column and adding the labels you\nwant for every given row, or you can add a static label applied to all the issues by adding it\nto the API call. Make sure to keep the variables in brackets or the string will split\n(for example, instead of ",[57,176,177],{},"Privacy"," it will create a label for each letter in the word ",[57,180,177],{},").",[125,183,185],{"id":184},"adding-other-sections","Adding other sections",[12,187,188,189,194,195,200,201,208],{},"You can customize the script to add any other sections allowable by\nthe ",[26,190,193],{"href":191,"rel":192},"https://docs.gitlab.com/api/",[],"GitLab API",". Because we’re working with issues,\nthe ",[26,196,199],{"href":197,"rel":198},"https://docs.gitlab.com/api/issues/",[],"GitLab Issues API"," documentation will be\nhelpful. The ",[26,202,205,207],{"href":203,"rel":204},"https://python-gitlab.readthedocs.io/en/stable/index.html",[],[57,206,59],{}," documentation"," is\nalso a great resource, given that this script makes use of it.",[49,210,212],{"id":211},"making-your-own-workflows-in-gitlab","Making your own workflows in GitLab",[12,214,215],{},"While in this blog post I've focused on the HIPAA Audit Protocol and the issue generator\nscript, it is also a practical, hands-on example of how simple it is to use the\nGitLab API to move any workflow to GitLab. There are two primary components:",[217,218,219,222],"ol",{},[36,220,221],{},"A data source (I prefer CSV files)",[36,223,224],{},"A crafted API call to use the data source to bring the data into GitLab",[12,226,227],{},"I think of the data source as the thing I want in GitLab and the crafted API call as the\nvehicle to get it into GitLab. Think of a row in your CSV as an issue and the columns as the\nthings you’re putting in the issue.",[12,229,230],{},"While my specific example was the audit protocol, we can use this strategy for just about anything.\nSome examples are risk assessments, gap analyses, event planning, product launches, and more.",[12,232,233],{},"To adapt this script for other workflows:",[217,235,236,239],{},[36,237,238],{},"Start by getting your data into a CSV. Be sure to remove your headers before running the script\nbecause the script doesn’t account for column headers as is!",[36,240,241,242,246],{},"Modify the variables and issue create API call we talked about in\nthe ",[26,243,245],{"href":244},"#customizing-the-issue-structure","Customizing the issue structure section above"," to match with your CSV and data.",[12,248,249],{},"And that’s really it!",[12,251,252,253,258],{},"At GitLab, we use the\n",[26,254,257],{"href":255,"rel":256},"https://handbook.gitlab.com/handbook/values/#boring-solutions",[],"simplest and most boring solution","\nto solve problems. With this approach, we were able to turn an HTML table of the HIPAA Audit Protocol\non the HHS website into a functional workflow within GitLab in just a few\nhours (including API research time and CSV formatting) and in 42 lines of code (including comments).\nTo add to that, the script can be repurposed for just about any other workflow. Plus, the script is\navailable for anyone to download, use, and modify in any way, and this blog post can serve as a\nguide on how to do that.",[12,260,261,262,267],{},"As a long-term solution to bring this functionality into\nGitLab as a feature, there’s also an\n",[26,263,266],{"href":264,"rel":265},"https://gitlab.com/gitlab-org/gitlab-ce/issues/62895",[],"open issue to collect feedback on creating\na marketplace for issue templates",". If you have any suggestions or comments about the marketplace\nidea, feel free to post them in the issue!",[12,269,270],{},"Have a specific question you want answered or want to get feedback on a specific use case? Comment below!",[87,272,274],{"id":273},"disclaimer","Disclaimer",[12,276,277],{},"THE INFORMATION PROVIDED ON THIS WEBSITE IS TO BE USED FOR INFORMATIONAL PURPOSES ONLY. THE\nINFORMATION SHOULD NOT BE RELIED UPON OR CONSTRUED AS LEGAL OR COMPLIANCE ADVICE OR OPINIONS.\nTHE INFORMATION IS NOT COMPREHENSIVE AND WILL NOT GUARANTEE COMPLIANCE WITH ANY REGULATION OR\nINDUSTRY STANDARD. YOU MUST NOT RELY ON THE INFORMATION FOUND ON THIS WEBSITE AS AN\nALTERNATIVE TO SEEKING PROFESSIONAL ADVICE FROM YOUR ATTORNEY AND/OR COMPLIANCE PROFESSIONAL.",[12,279,280,281,286,287],{},"Photo by ",[26,282,285],{"href":283,"rel":284},"https://www.pexels.com/photo/bright-cardiac-cardiology-care-433267/",[],"Pixabay"," on ",[26,288,291],{"href":289,"rel":290},"https://www.pexels.com",[],"Pexels",{"title":101,"searchDepth":293,"depth":293,"links":294},2,[295,299],{"id":51,"depth":293,"text":52,"children":296},[297],{"id":89,"depth":298,"text":90},3,{"id":211,"depth":293,"text":212,"children":300},[301],{"id":273,"depth":298,"text":274},"engineering","2019-07-25","With the GitLab API, you can easily move workflows into GitLab. Here’s how we did it for the HIPAA Audit Protocol.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679716/Blog/Hero%20Images/bright-cardiac-cardiology.jpg",{},true,"/en-us/blog/moving-workflows-to-gitlab-the-case-of-the-hipaa-audit-protocol",{"title":5,"description":304,"ogTitle":5,"ogDescription":304,"noIndex":307,"ogImage":308,"ogUrl":313,"ogSiteName":314,"ogType":315,"canonicalUrls":313},"https://about.gitlab.com/blog/moving-workflows-to-gitlab-the-case-of-the-hipaa-audit-protocol","https://about.gitlab.com","article","moving-workflows-to-gitlab-the-case-of-the-hipaa-audit-protocol","en-us/blog/moving-workflows-to-gitlab-the-case-of-the-hipaa-audit-protocol",[319,320,321],"inside GitLab","open source","security","BlogPost","t6ERzEEC4xMrP8fElA07WmjNEW-Pn5wTA12Cyf2Njxw",{"logo":325,"freeTrial":330,"sales":335,"login":340,"items":345,"search":672,"minimal":703,"duo":722,"switchNav":731,"pricingDeployment":742},{"config":326},{"href":327,"dataGaName":328,"dataGaLocation":329},"/","gitlab logo","header",{"text":331,"config":332},"Get free trial",{"href":333,"dataGaName":334,"dataGaLocation":329},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":336,"config":337},"Request a demo",{"href":338,"dataGaName":339,"dataGaLocation":329},"/sales/?contact-topic=request-demo","sales",{"text":341,"config":342},"Sign in",{"href":343,"dataGaName":344,"dataGaLocation":329},"https://gitlab.com/users/sign_in/","sign in",[346,375,475,480,594,650],{"text":347,"config":348,"menu":350},"Platform",{"dataNavLevelOne":349},"platform",{"type":351,"columns":352},"cards",[353,359,367],{"title":347,"description":354,"link":355},"The intelligent orchestration platform for DevSecOps",{"text":356,"config":357},"Explore our Platform",{"href":358,"dataGaName":349,"dataGaLocation":329},"/platform/",{"title":360,"description":361,"link":362},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":363,"config":364},"Meet GitLab Duo",{"href":365,"dataGaName":366,"dataGaLocation":329},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":368,"description":369,"link":370},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":371,"config":372},"Learn more",{"href":373,"dataGaName":374,"dataGaLocation":329},"/why-gitlab/","why gitlab",{"text":376,"left":310,"config":377,"menu":379},"Product",{"dataNavLevelOne":378},"solutions",{"type":380,"link":381,"columns":385,"feature":454},"lists",{"text":382,"config":383},"View all Solutions",{"href":384,"dataGaName":378,"dataGaLocation":329},"/solutions/",[386,410,433],{"title":387,"description":388,"link":389,"items":394},"Automation","CI/CD and automation to accelerate deployment",{"config":390},{"icon":391,"href":392,"dataGaName":393,"dataGaLocation":329},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[395,399,402,406],{"text":396,"config":397},"CI/CD",{"href":398,"dataGaLocation":329,"dataGaName":396},"/solutions/continuous-integration/",{"text":360,"config":400},{"href":365,"dataGaLocation":329,"dataGaName":401},"gitlab duo agent platform - product menu",{"text":403,"config":404},"Source Code Management",{"href":405,"dataGaLocation":329,"dataGaName":403},"/solutions/source-code-management/",{"text":407,"config":408},"Automated Software Delivery",{"href":392,"dataGaLocation":329,"dataGaName":409},"Automated software delivery",{"title":411,"description":412,"link":413,"items":418},"Security","Deliver code faster without compromising security",{"config":414},{"href":415,"dataGaName":416,"dataGaLocation":329,"icon":417},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[419,423,428],{"text":420,"config":421},"Application Security Testing",{"href":415,"dataGaName":422,"dataGaLocation":329},"Application security testing",{"text":424,"config":425},"Software Supply Chain Security",{"href":426,"dataGaLocation":329,"dataGaName":427},"/solutions/supply-chain/","Software supply chain security",{"text":429,"config":430},"Software Compliance",{"href":431,"dataGaName":432,"dataGaLocation":329},"/solutions/software-compliance/","software compliance",{"title":434,"link":435,"items":440},"Measurement",{"config":436},{"icon":437,"href":438,"dataGaName":439,"dataGaLocation":329},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[441,445,449],{"text":442,"config":443},"Visibility & Measurement",{"href":438,"dataGaLocation":329,"dataGaName":444},"Visibility and Measurement",{"text":446,"config":447},"Value Stream Management",{"href":448,"dataGaLocation":329,"dataGaName":446},"/solutions/value-stream-management/",{"text":450,"config":451},"Analytics & Insights",{"href":452,"dataGaLocation":329,"dataGaName":453},"/solutions/analytics-and-insights/","Analytics and insights",{"title":455,"type":380,"items":456},"GitLab for",[457,463,469],{"text":458,"config":459},"Enterprise",{"icon":460,"href":461,"dataGaLocation":329,"dataGaName":462},"Building","/enterprise/","enterprise",{"text":464,"config":465},"Small Business",{"icon":466,"href":467,"dataGaLocation":329,"dataGaName":468},"Work","/small-business/","small business",{"text":470,"config":471},"Public Sector",{"icon":472,"href":473,"dataGaLocation":329,"dataGaName":474},"Organization","/solutions/public-sector/","public sector",{"text":476,"config":477},"Pricing",{"href":478,"dataGaName":479,"dataGaLocation":329,"dataNavLevelOne":479},"/pricing/","pricing",{"text":481,"config":482,"menu":484},"Resources",{"dataNavLevelOne":483},"resources",{"type":380,"link":485,"columns":489,"feature":583},{"text":486,"config":487},"View all resources",{"href":488,"dataGaName":483,"dataGaLocation":329},"/resources/",[490,523,550],{"title":491,"items":492},"Getting started",[493,498,503,508,513,518],{"text":494,"config":495},"Install",{"href":496,"dataGaName":497,"dataGaLocation":329},"/install/","install",{"text":499,"config":500},"Quick start guides",{"href":501,"dataGaName":502,"dataGaLocation":329},"/get-started/","quick setup checklists",{"text":504,"config":505},"Learn",{"href":506,"dataGaLocation":329,"dataGaName":507},"https://university.gitlab.com/","learn",{"text":509,"config":510},"Product documentation",{"href":511,"dataGaName":512,"dataGaLocation":329},"https://docs.gitlab.com/","product documentation",{"text":514,"config":515},"Best practice videos",{"href":516,"dataGaName":517,"dataGaLocation":329},"/getting-started-videos/","best practice videos",{"text":519,"config":520},"Integrations",{"href":521,"dataGaName":522,"dataGaLocation":329},"/integrations/","integrations",{"title":524,"items":525},"Discover",[526,531,536,541,545],{"text":527,"config":528},"Customer success stories",{"href":529,"dataGaName":530,"dataGaLocation":329},"/customers/","customer success stories",{"text":532,"config":533},"Blog",{"href":534,"dataGaName":535,"dataGaLocation":329},"/blog/","blog",{"text":537,"config":538},"Demo Hub",{"href":539,"dataGaName":540,"dataGaLocation":329},"/demo-hub/","demo hub",{"text":542,"config":543},"The Source",{"href":544,"dataGaName":535,"dataGaLocation":329},"/the-source/",{"text":546,"config":547},"Remote",{"href":548,"dataGaName":549,"dataGaLocation":329},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":551,"items":552},"Connect",[553,558,563,568,573,578],{"text":554,"config":555},"GitLab Services",{"href":556,"dataGaName":557,"dataGaLocation":329},"/services/","services",{"text":559,"config":560},"Contribute",{"href":561,"dataGaName":562,"dataGaLocation":329},"https://contributors.gitlab.com","contribute",{"text":564,"config":565},"Community",{"href":566,"dataGaName":567,"dataGaLocation":329},"/community/","community",{"text":569,"config":570},"Forum",{"href":571,"dataGaName":572,"dataGaLocation":329},"https://forum.gitlab.com/","forum",{"text":574,"config":575},"Events",{"href":576,"dataGaName":577,"dataGaLocation":329},"/events/","events",{"text":579,"config":580},"Partners",{"href":581,"dataGaName":582,"dataGaLocation":329},"/partners/","partners",{"config":584,"title":587,"text":588,"link":589},{"background":585,"textColor":586},"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":590,"config":591},"Read the latest",{"href":592,"dataGaName":593,"dataGaLocation":329},"/whats-new/","whats new",{"text":595,"config":596,"menu":598},"Company",{"dataNavLevelOne":597},"company",{"type":380,"columns":599},[600],{"items":601},[602,607,613,615,620,625,630,635,640,645],{"text":603,"config":604},"About",{"href":605,"dataGaName":606,"dataGaLocation":329},"/company/","about",{"text":608,"config":609,"footerGa":612},"Jobs",{"href":610,"dataGaName":611,"dataGaLocation":329},"/jobs/","jobs",{"dataGaName":611},{"text":574,"config":614},{"href":576,"dataGaName":577,"dataGaLocation":329},{"text":616,"config":617},"Leadership",{"href":618,"dataGaName":619,"dataGaLocation":329},"/company/team/e-group/","leadership",{"text":621,"config":622},"Handbook",{"href":623,"dataGaName":624,"dataGaLocation":329},"https://handbook.gitlab.com/","handbook",{"text":626,"config":627},"Investor relations",{"href":628,"dataGaName":629,"dataGaLocation":329},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":631,"config":632},"Trust Center",{"href":633,"dataGaName":634,"dataGaLocation":329},"/security/","trust center",{"text":636,"config":637},"AI Transparency Center",{"href":638,"dataGaName":639,"dataGaLocation":329},"/ai-transparency-center/","ai transparency center",{"text":641,"config":642},"Newsletter",{"href":643,"dataGaName":644,"dataGaLocation":329},"/company/contact/#contact-forms","newsletter",{"text":646,"config":647},"Press",{"href":648,"dataGaName":649,"dataGaLocation":329},"/press/","press",{"text":651,"config":652,"menu":653},"Contact us",{"dataNavLevelOne":597},{"type":380,"columns":654},[655],{"items":656},[657,662,667],{"text":658,"config":659},"Talk to sales",{"href":660,"dataGaName":661,"dataGaLocation":329},"/sales/","talk to sales",{"text":663,"config":664},"Support portal",{"href":665,"dataGaName":666,"dataGaLocation":329},"https://support.gitlab.com/hc/en-us","support portal",{"text":668,"config":669},"Customer portal",{"href":670,"dataGaName":671,"dataGaLocation":329},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":673,"login":674,"suggestions":681},"Close",{"text":675,"link":676},"To search repositories and projects, login to",{"text":677,"config":678},"gitlab.com",{"href":343,"dataGaName":679,"dataGaLocation":680},"search login","search",{"text":682,"default":683},"Suggestions",[684,686,690,692,696,700],{"text":360,"config":685},{"href":365,"dataGaName":360,"dataGaLocation":680},{"text":687,"config":688},"Code Suggestions (AI)",{"href":689,"dataGaName":687,"dataGaLocation":680},"/solutions/code-suggestions/",{"text":396,"config":691},{"href":398,"dataGaName":396,"dataGaLocation":680},{"text":693,"config":694},"GitLab on AWS",{"href":695,"dataGaName":693,"dataGaLocation":680},"/partners/technology-partners/aws/",{"text":697,"config":698},"GitLab on Google Cloud",{"href":699,"dataGaName":697,"dataGaLocation":680},"/partners/technology-partners/google-cloud-platform/",{"text":701,"config":702},"Why GitLab?",{"href":373,"dataGaName":701,"dataGaLocation":680},{"freeTrial":704,"mobileIcon":709,"desktopIcon":714,"secondaryButton":717},{"text":705,"config":706},"Start free trial",{"href":707,"dataGaName":334,"dataGaLocation":708},"https://gitlab.com/-/trials/new/","nav",{"altText":710,"config":711},"Gitlab Icon",{"src":712,"dataGaName":713,"dataGaLocation":708},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":710,"config":715},{"src":716,"dataGaName":713,"dataGaLocation":708},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":718,"config":719},"Get Started",{"href":720,"dataGaName":721,"dataGaLocation":708},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":723,"mobileIcon":727,"desktopIcon":729},{"text":724,"config":725},"Learn more about GitLab Duo",{"href":365,"dataGaName":726,"dataGaLocation":708},"gitlab duo",{"altText":710,"config":728},{"src":712,"dataGaName":713,"dataGaLocation":708},{"altText":710,"config":730},{"src":716,"dataGaName":713,"dataGaLocation":708},{"button":732,"mobileIcon":737,"desktopIcon":739},{"text":733,"config":734},"/switch",{"href":735,"dataGaName":736,"dataGaLocation":708},"#contact","switch",{"altText":710,"config":738},{"src":712,"dataGaName":713,"dataGaLocation":708},{"altText":710,"config":740},{"src":741,"dataGaName":713,"dataGaLocation":708},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":743,"mobileIcon":748,"desktopIcon":750},{"text":744,"config":745},"Back to pricing",{"href":478,"dataGaName":746,"dataGaLocation":708,"icon":747},"back to pricing","GoBack",{"altText":710,"config":749},{"src":712,"dataGaName":713,"dataGaLocation":708},{"altText":710,"config":751},{"src":716,"dataGaName":713,"dataGaLocation":708},{"title":753,"titleMobile":754,"button":755,"config":760},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":371,"config":756},{"href":757,"dataGaName":758,"dataGaLocation":759},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":761,"disabled":307},"release",{"data":763},{"text":764,"source":765,"edit":771,"contribute":776,"config":781,"items":786,"minimal":996},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":766,"config":767},"View page source",{"href":768,"dataGaName":769,"dataGaLocation":770},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":772,"config":773},"Edit this page",{"href":774,"dataGaName":775,"dataGaLocation":770},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":777,"config":778},"Please contribute",{"href":779,"dataGaName":780,"dataGaLocation":770},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":782,"facebook":783,"youtube":784,"linkedin":785},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[787,834,888,932,964],{"title":476,"links":788,"subMenu":803},[789,793,798],{"text":790,"config":791},"View plans",{"href":478,"dataGaName":792,"dataGaLocation":770},"view plans",{"text":794,"config":795},"Why Premium?",{"href":796,"dataGaName":797,"dataGaLocation":770},"/pricing/premium/","why premium",{"text":799,"config":800},"Why Ultimate?",{"href":801,"dataGaName":802,"dataGaLocation":770},"/pricing/ultimate/","why ultimate",[804],{"title":805,"links":806},"Contact Us",[807,810,812,814,819,824,829],{"text":808,"config":809},"Contact sales",{"href":660,"dataGaName":339,"dataGaLocation":770},{"text":663,"config":811},{"href":665,"dataGaName":666,"dataGaLocation":770},{"text":668,"config":813},{"href":670,"dataGaName":671,"dataGaLocation":770},{"text":815,"config":816},"Status",{"href":817,"dataGaName":818,"dataGaLocation":770},"https://status.gitlab.com/","status",{"text":820,"config":821},"Terms of use",{"href":822,"dataGaName":823,"dataGaLocation":770},"/terms/","terms of use",{"text":825,"config":826},"Privacy statement",{"href":827,"dataGaName":828,"dataGaLocation":770},"/privacy/","privacy statement",{"text":830,"config":831},"Cookie preferences",{"dataGaName":832,"dataGaLocation":770,"id":833,"isOneTrustButton":310},"cookie preferences","ot-sdk-btn",{"title":376,"links":835,"subMenu":844},[836,840],{"text":837,"config":838},"DevSecOps platform",{"href":358,"dataGaName":839,"dataGaLocation":770},"devsecops platform",{"text":841,"config":842},"AI-Assisted Development",{"href":365,"dataGaName":843,"dataGaLocation":770},"ai-assisted development",[845],{"title":846,"links":847},"Topics",[848,853,858,863,868,873,878,883],{"text":849,"config":850},"CICD",{"href":851,"dataGaName":852,"dataGaLocation":770},"/topics/ci-cd/","cicd",{"text":854,"config":855},"GitOps",{"href":856,"dataGaName":857,"dataGaLocation":770},"/topics/gitops/","gitops",{"text":859,"config":860},"DevOps",{"href":861,"dataGaName":862,"dataGaLocation":770},"/topics/devops/","devops",{"text":864,"config":865},"Version Control",{"href":866,"dataGaName":867,"dataGaLocation":770},"/topics/version-control/","version control",{"text":869,"config":870},"DevSecOps",{"href":871,"dataGaName":872,"dataGaLocation":770},"/topics/devsecops/","devsecops",{"text":874,"config":875},"Cloud Native",{"href":876,"dataGaName":877,"dataGaLocation":770},"/topics/cloud-native/","cloud native",{"text":879,"config":880},"AI for Coding",{"href":881,"dataGaName":882,"dataGaLocation":770},"/topics/devops/ai-for-coding/","ai for coding",{"text":884,"config":885},"Agentic AI",{"href":886,"dataGaName":887,"dataGaLocation":770},"/topics/agentic-ai/","agentic ai",{"title":889,"links":890},"Solutions",[891,893,895,900,904,907,911,914,916,919,922,927],{"text":420,"config":892},{"href":415,"dataGaName":420,"dataGaLocation":770},{"text":409,"config":894},{"href":392,"dataGaName":393,"dataGaLocation":770},{"text":896,"config":897},"Agile development",{"href":898,"dataGaName":899,"dataGaLocation":770},"/solutions/agile-delivery/","agile delivery",{"text":901,"config":902},"SCM",{"href":405,"dataGaName":903,"dataGaLocation":770},"source code management",{"text":849,"config":905},{"href":398,"dataGaName":906,"dataGaLocation":770},"continuous integration & delivery",{"text":908,"config":909},"Value stream management",{"href":448,"dataGaName":910,"dataGaLocation":770},"value stream management",{"text":854,"config":912},{"href":913,"dataGaName":857,"dataGaLocation":770},"/solutions/gitops/",{"text":458,"config":915},{"href":461,"dataGaName":462,"dataGaLocation":770},{"text":917,"config":918},"Small business",{"href":467,"dataGaName":468,"dataGaLocation":770},{"text":920,"config":921},"Public sector",{"href":473,"dataGaName":474,"dataGaLocation":770},{"text":923,"config":924},"Education",{"href":925,"dataGaName":926,"dataGaLocation":770},"/solutions/education/","education",{"text":928,"config":929},"Financial services",{"href":930,"dataGaName":931,"dataGaLocation":770},"/solutions/finance/","financial services",{"title":481,"links":933},[934,936,938,940,943,945,948,950,952,954,956,958,960,962],{"text":494,"config":935},{"href":496,"dataGaName":497,"dataGaLocation":770},{"text":499,"config":937},{"href":501,"dataGaName":502,"dataGaLocation":770},{"text":504,"config":939},{"href":506,"dataGaName":507,"dataGaLocation":770},{"text":509,"config":941},{"href":511,"dataGaName":942,"dataGaLocation":770},"docs",{"text":532,"config":944},{"href":534,"dataGaName":535,"dataGaLocation":770},{"text":946,"config":947},"What's new",{"href":592,"dataGaName":593,"dataGaLocation":770},{"text":527,"config":949},{"href":529,"dataGaName":530,"dataGaLocation":770},{"text":546,"config":951},{"href":548,"dataGaName":549,"dataGaLocation":770},{"text":554,"config":953},{"href":556,"dataGaName":557,"dataGaLocation":770},{"text":559,"config":955},{"href":561,"dataGaName":562,"dataGaLocation":770},{"text":564,"config":957},{"href":566,"dataGaName":567,"dataGaLocation":770},{"text":569,"config":959},{"href":571,"dataGaName":572,"dataGaLocation":770},{"text":574,"config":961},{"href":576,"dataGaName":577,"dataGaLocation":770},{"text":579,"config":963},{"href":581,"dataGaName":582,"dataGaLocation":770},{"title":595,"links":965},[966,968,970,972,974,976,980,985,987,989,991],{"text":603,"config":967},{"href":605,"dataGaName":597,"dataGaLocation":770},{"text":608,"config":969},{"href":610,"dataGaName":611,"dataGaLocation":770},{"text":616,"config":971},{"href":618,"dataGaName":619,"dataGaLocation":770},{"text":621,"config":973},{"href":623,"dataGaName":624,"dataGaLocation":770},{"text":626,"config":975},{"href":628,"dataGaName":629,"dataGaLocation":770},{"text":977,"config":978},"Sustainability",{"href":979,"dataGaName":977,"dataGaLocation":770},"/sustainability/",{"text":981,"config":982},"Diversity, inclusion and belonging (DIB)",{"href":983,"dataGaName":984,"dataGaLocation":770},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":631,"config":986},{"href":633,"dataGaName":634,"dataGaLocation":770},{"text":641,"config":988},{"href":643,"dataGaName":644,"dataGaLocation":770},{"text":646,"config":990},{"href":648,"dataGaName":649,"dataGaLocation":770},{"text":992,"config":993},"Modern Slavery Transparency Statement",{"href":994,"dataGaName":995,"dataGaLocation":770},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":997},[998,1001,1004],{"text":999,"config":1000},"Terms",{"href":822,"dataGaName":823,"dataGaLocation":770},{"text":1002,"config":1003},"Cookies",{"dataGaName":832,"dataGaLocation":770,"id":833,"isOneTrustButton":310},{"text":177,"config":1005},{"href":827,"dataGaName":828,"dataGaLocation":770},[1007],{"id":1008,"title":7,"body":306,"config":1009,"content":1011,"description":306,"extension":1014,"meta":1015,"navigation":310,"path":1016,"seo":1017,"stem":1018,"__hash__":1019},"blogAuthors/en-us/blog/authors/luka-trbojevic.yml",{"template":1010},"BlogAuthor",{"name":7,"config":1012},{"headshot":101,"ctfId":1013},"ltrbojevic","yml",{},"/en-us/blog/authors/luka-trbojevic",{},"en-us/blog/authors/luka-trbojevic","MuQC6ZmkfmkdoNVm6SEahKlhvfTXmQZ9zfjexb0UXCY",[1021,1030,1038],{"title":1022,"description":1023,"heroImage":1024,"category":302,"date":1025,"authors":1026,"slug":1029,"externalUrl":306},"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",[1027,1028],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1031,"description":1032,"heroImage":1033,"category":302,"date":1034,"authors":1035,"slug":1037,"externalUrl":306},"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",[1036],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1039,"description":1040,"heroImage":1041,"category":302,"date":1042,"authors":1043,"slug":1045,"externalUrl":306},"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",[1044],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1047},[1048,1062,1074,1085],{"id":1049,"categories":1050,"header":1052,"text":1053,"button":1054,"image":1059},"ai-modernization",[1051],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1055,"config":1056},"Get your AI maturity score",{"href":1057,"dataGaName":1058,"dataGaLocation":535},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1060},{"src":1061},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1063,"categories":1064,"header":1066,"text":1053,"button":1067,"image":1071},"devops-modernization",[1065,872],"product","Are you just managing tools or shipping innovation?",{"text":1068,"config":1069},"Get your DevOps maturity score",{"href":1070,"dataGaName":1058,"dataGaLocation":535},"/assessments/devops-modernization-assessment/",{"config":1072},{"src":1073},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1075,"categories":1076,"header":1077,"text":1053,"button":1078,"image":1082},"security-modernization",[321],"Are you trading speed for security?",{"text":1079,"config":1080},"Get your security maturity score",{"href":1081,"dataGaName":1058,"dataGaLocation":535},"/assessments/security-modernization-assessment/",{"config":1083},{"src":1084},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1086,"paths":1087,"header":1090,"text":1091,"button":1092,"image":1097},"github-azure-migration",[1088,1089],"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":1093,"config":1094},"See how GitLab compares to GitHub",{"href":1095,"dataGaName":1096,"dataGaLocation":535},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1098},{"src":1073},{"header":1100,"blurb":1101,"button":1102,"secondaryButton":1107},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1103,"config":1104},"Get your free trial",{"href":1105,"dataGaName":334,"dataGaLocation":1106},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":808,"config":1108},{"href":660,"dataGaName":339,"dataGaLocation":1106},1786803753618]