[{"data":1,"prerenderedAt":1052},["ShallowReactive",2],{"/blog/arctic-engine-fuzz-testing-blog":3,"navigation-en-us":269,"banner-en-us":696,"footer-en-us":706,"blog-post-authors-en-us-Huldra":951,"blog-related-posts-en-us-arctic-engine-fuzz-testing-blog":965,"blog-promotions-en-us":989,"next-steps-en-us":1042},{"id":4,"title":5,"authors":6,"body":8,"category":245,"date":246,"description":247,"extension":248,"externalUrl":249,"faq":249,"featured":250,"heroImage":251,"meta":252,"navigation":253,"path":254,"seo":255,"slug":259,"stem":260,"tags":261,"template":267,"updatedDate":249,"__hash__":268},"blogPosts/en-us/blog/arctic-engine-fuzz-testing-blog.md","How Arctic Engine uses GitLab's fuzz testing",[7],"Huldra",{"type":9,"value":10,"toc":236},"minimark",[11,16,32,36,39,42,46,61,171,182,185,188,191,195,198,202,220,225,232],[12,13,15],"h2",{"id":14},"about-arctic-engine","About Arctic Engine",[17,18,19,25,26,31],"p",{},[20,21,24],"a",{"href":22,"rel":23},"https://gitlab.com/huldra/arctic",[],"Arctic Engine"," is an open-source, free game\nengine released under the ",[20,27,30],{"href":28,"rel":29},"https://opensource.org/licenses/MIT",[],"MIT license",".\nArctic Engine is implemented in C++ and focuses on simplicity. Being a C++\nprogrammer and making games should not be joyless, disillusioning, and\ndiscouraging. In the '80s and '90s, a programmer could make games alone, and\nit was fun. Arctic Engine aims at making game development in C++ fun again.",[12,33,35],{"id":34},"testing-can-be-fun","Testing can be fun",[17,37,38],{},"Testing the game engine is very important since games are usually no more\nrobust and performant than the underlying middleware or game engine. Writing\ntests by hand is time-consuming and disillusioning, and it may drain the fun\nfrom the development process. So, to my shame, I avoided writing tests in every\nway I could. For instance, I used static analyzers to detect bugs. The problem\nwith static analyzers was the lack of motivation to fix potential issues. You\nmay be unsure whether a bug is really there, and it can sometimes be hard to\nfind a way to trigger it.",[17,40,41],{},"The other possibility was fuzz testing. I heard about fuzzing but didn't try it\nearlier because I thought it was hard to integrate with the project. I could\nnot be more wrong. It's amazing how little effort it takes to get fuzz testing\nup and running with GitLab.",[12,43,45],{"id":44},"fuzz-testing-and-what-it-exposed","Fuzz testing and what it exposed",[17,47,48,49,54,55,60],{},"Thanks to ",[20,50,53],{"href":51,"rel":52},"https://gitlab.com/stkerr",[],"Sam Kerr"," for proving me wrong about\nfuzzing by ",[20,56,59],{"href":57,"rel":58},"https://gitlab.com/huldra/arctic/-/commit/946382569d88c3af7f4a7ea075c3c3cb18d3b06b",[],"actually fuzzing","\nthe sound loader code. Arctic Engine allows loading a sound from a WAV file in\nmemory. To fuzz the loader's code, you create a small CPP file with a single\nfunction like this:",[62,63,68],"pre",{"className":64,"code":65,"language":66,"meta":67,"style":67},"language-cpp shiki shiki-themes github-light","extern \"C\" int LLVMFuzzerTestOneInput(const uint8_t * data, size_t size) {\n    std::shared_ptr\u003Carctic::SoundInstance> result = arctic::LoadWav(data, size);\n    return 0;\n}\n","cpp","",[69,70,71,113,152,165],"code",{"__ignoreMap":67},[72,73,76,80,84,87,91,95,98,101,104,107,110],"span",{"class":74,"line":75},"line",1,[72,77,79],{"class":78},"sD7c4","extern",[72,81,83],{"class":82},"sYBdl"," \"C\"",[72,85,86],{"class":78}," int",[72,88,90],{"class":89},"s7eDp"," LLVMFuzzerTestOneInput",[72,92,94],{"class":93},"sgsFI","(",[72,96,97],{"class":78},"const",[72,99,100],{"class":78}," uint8_t",[72,102,103],{"class":78}," *",[72,105,106],{"class":93}," data, ",[72,108,109],{"class":78},"size_t",[72,111,112],{"class":93}," size) {\n",[72,114,116,119,122,125,128,131,134,137,140,143,146,149],{"class":74,"line":115},2,[72,117,118],{"class":89},"    std",[72,120,121],{"class":93},"::shared_ptr",[72,123,124],{"class":78},"\u003C",[72,126,127],{"class":89},"arctic",[72,129,130],{"class":93},"::SoundInstance",[72,132,133],{"class":78},">",[72,135,136],{"class":93}," result ",[72,138,139],{"class":78},"=",[72,141,142],{"class":89}," arctic",[72,144,145],{"class":93},"::",[72,147,148],{"class":89},"LoadWav",[72,150,151],{"class":93},"(data, size);\n",[72,153,155,158,162],{"class":74,"line":154},3,[72,156,157],{"class":78},"    return",[72,159,161],{"class":160},"sYu0t"," 0",[72,163,164],{"class":93},";\n",[72,166,168],{"class":74,"line":167},4,[72,169,170],{"class":93},"}\n",[17,172,173,174,177,178,181],{},"Then you add ",[69,175,176],{},"-fsanitize=fuzzer"," flag to the CMakeLists.txt file and a few\nlines to the ",[69,179,180],{},".gitlab-ci.yml"," file, and the fuzzing begins! You may want to\ndrop in a few WAV files to the corpus folder to help the fuzzer and speed up\nthe process, but that's optional. Ok, it was a little harder than that with the\nArctic Engine because it would output a message and quit upon processing\nunsupported file formats. Still, handling file loading errors this way was a\nbad idea, and I finally had a reason to fix it.",[17,183,184],{},"The fuzzer started crashing Arctic Engine: first, it triggered a signed integer\noverflow, a division by zero, and a buffer overrun. And then, the wave loader\ngot out-of-memory while trying to resample a tiny WAV file with a sampling rate\nof 1 sample per second to 44100 samples per second. Wow.",[17,186,187],{},"What I liked about fuzzing is that fuzzer actually crashes your program and\nprovides you the input so you can reproduce the crash. And once you've set up\nthe test harness, the entire testing process is fully automated, saving you\ntime and effort. It's like having a personal QA team, you commit your code, and\nin a few minutes, you already have it tests-covered.",[17,189,190],{},"Then I fuzzed the CSV and the TGA file parsers and expected to find some bugs\nin the CSV and none in the TGA. What can I say? You may not find bugs where you\nexpect them to be and find bugs where you thought there were none. The TGA\nloader crashed immediately with a buffer overrun. It did not account for files\ncontaining only a valid header but no actual image data after it.",[12,192,194],{"id":193},"plans","Plans",[17,196,197],{},"I will add a simple HTTP web server and some multiplayer network interaction\ncode to the Arctic Engine. I was putting it off for quite a while now because I\nthought testing would be a pain. Now that I know how easy it is to apply\nGitLab's fuzz testing to any data processing code, I'm very optimistic and\nsomewhat challenged. Like \"Can I make it withstand the fuzzer from the first try?\".\nIt makes writing code fun for me once again.",[12,199,201],{"id":200},"further-reading","Further reading",[203,204,205,213],"ul",{},[206,207,208],"li",{},[20,209,212],{"href":210,"rel":211},"https://docs.gitlab.com/user/application_security/coverage_fuzzing/#coverage-guided-fuzz-testing",[],"GitLab's coverage-guided fuzz testing documentation",[206,214,215],{},[20,216,219],{"href":217,"rel":218},"https://www.youtube.com/playlist?list=PL05JrBw4t0KoYzW1CR-g1rMc9Xgmnhjfe",[],"GitLab's Fuzzing 101 playlist",[221,222,224],"h3",{"id":223},"about-the-guest-author","About the guest author",[17,226,227,228,231],{},"Huldra is a senior videogame programmer by day maintainer of the ",[20,229,24],{"href":22,"rel":230},[]," by night. She started it because she wanted a game engine that kept simple things simple and made complex things possible.",[233,234,235],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}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":67,"searchDepth":115,"depth":115,"links":237},[238,239,240,241,242],{"id":14,"depth":115,"text":15},{"id":34,"depth":115,"text":35},{"id":44,"depth":115,"text":45},{"id":193,"depth":115,"text":194},{"id":200,"depth":115,"text":201,"children":243},[244],{"id":223,"depth":154,"text":224},"unfiltered","2020-08-19","Using GitLab's fuzz testing, we discovered and fixed various real defects that could crash our software. Now we can detect vulnerabilities before merging the code.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749681504/Blog/Hero%20Images/arcticengine.png",{},true,"/en-us/blog/arctic-engine-fuzz-testing-blog",{"title":5,"description":247,"ogTitle":5,"ogDescription":247,"noIndex":250,"ogImage":251,"ogUrl":256,"ogSiteName":257,"ogType":258,"canonicalUrls":256},"https://about.gitlab.com/blog/arctic-engine-fuzz-testing-blog","https://about.gitlab.com","article","arctic-engine-fuzz-testing-blog","en-us/blog/arctic-engine-fuzz-testing-blog",[262,263,264,265,266,265],"CI/CD","open source","security","testing","user stories","BlogPost","1_yc7tqhwnzhc6y12WGhTh-G7EDtuW0ELB8lUTzt5fQ",{"logo":270,"freeTrial":275,"sales":280,"login":285,"items":290,"search":616,"minimal":647,"duo":666,"switchNav":675,"pricingDeployment":686},{"config":271},{"href":272,"dataGaName":273,"dataGaLocation":274},"/","gitlab logo","header",{"text":276,"config":277},"Get free trial",{"href":278,"dataGaName":279,"dataGaLocation":274},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":281,"config":282},"Request a demo",{"href":283,"dataGaName":284,"dataGaLocation":274},"/sales/?contact-topic=request-demo","sales",{"text":286,"config":287},"Sign in",{"href":288,"dataGaName":289,"dataGaLocation":274},"https://gitlab.com/users/sign_in/","sign in",[291,320,419,424,538,594],{"text":292,"config":293,"menu":295},"Platform",{"dataNavLevelOne":294},"platform",{"type":296,"columns":297},"cards",[298,304,312],{"title":292,"description":299,"link":300},"The intelligent orchestration platform for DevSecOps",{"text":301,"config":302},"Explore our Platform",{"href":303,"dataGaName":294,"dataGaLocation":274},"/platform/",{"title":305,"description":306,"link":307},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":308,"config":309},"Meet GitLab Duo",{"href":310,"dataGaName":311,"dataGaLocation":274},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":313,"description":314,"link":315},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":316,"config":317},"Learn more",{"href":318,"dataGaName":319,"dataGaLocation":274},"/why-gitlab/","why gitlab",{"text":321,"left":253,"config":322,"menu":324},"Product",{"dataNavLevelOne":323},"solutions",{"type":325,"link":326,"columns":330,"feature":398},"lists",{"text":327,"config":328},"View all Solutions",{"href":329,"dataGaName":323,"dataGaLocation":274},"/solutions/",[331,354,377],{"title":332,"description":333,"link":334,"items":339},"Automation","CI/CD and automation to accelerate deployment",{"config":335},{"icon":336,"href":337,"dataGaName":338,"dataGaLocation":274},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[340,343,346,350],{"text":262,"config":341},{"href":342,"dataGaLocation":274,"dataGaName":262},"/solutions/continuous-integration/",{"text":305,"config":344},{"href":310,"dataGaLocation":274,"dataGaName":345},"gitlab duo agent platform - product menu",{"text":347,"config":348},"Source Code Management",{"href":349,"dataGaLocation":274,"dataGaName":347},"/solutions/source-code-management/",{"text":351,"config":352},"Automated Software Delivery",{"href":337,"dataGaLocation":274,"dataGaName":353},"Automated software delivery",{"title":355,"description":356,"link":357,"items":362},"Security","Deliver code faster without compromising security",{"config":358},{"href":359,"dataGaName":360,"dataGaLocation":274,"icon":361},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[363,367,372],{"text":364,"config":365},"Application Security Testing",{"href":359,"dataGaName":366,"dataGaLocation":274},"Application security testing",{"text":368,"config":369},"Software Supply Chain Security",{"href":370,"dataGaLocation":274,"dataGaName":371},"/solutions/supply-chain/","Software supply chain security",{"text":373,"config":374},"Software Compliance",{"href":375,"dataGaName":376,"dataGaLocation":274},"/solutions/software-compliance/","software compliance",{"title":378,"link":379,"items":384},"Measurement",{"config":380},{"icon":381,"href":382,"dataGaName":383,"dataGaLocation":274},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[385,389,393],{"text":386,"config":387},"Visibility & Measurement",{"href":382,"dataGaLocation":274,"dataGaName":388},"Visibility and Measurement",{"text":390,"config":391},"Value Stream Management",{"href":392,"dataGaLocation":274,"dataGaName":390},"/solutions/value-stream-management/",{"text":394,"config":395},"Analytics & Insights",{"href":396,"dataGaLocation":274,"dataGaName":397},"/solutions/analytics-and-insights/","Analytics and insights",{"title":399,"type":325,"items":400},"GitLab for",[401,407,413],{"text":402,"config":403},"Enterprise",{"icon":404,"href":405,"dataGaLocation":274,"dataGaName":406},"Building","/enterprise/","enterprise",{"text":408,"config":409},"Small Business",{"icon":410,"href":411,"dataGaLocation":274,"dataGaName":412},"Work","/small-business/","small business",{"text":414,"config":415},"Public Sector",{"icon":416,"href":417,"dataGaLocation":274,"dataGaName":418},"Organization","/solutions/public-sector/","public sector",{"text":420,"config":421},"Pricing",{"href":422,"dataGaName":423,"dataGaLocation":274,"dataNavLevelOne":423},"/pricing/","pricing",{"text":425,"config":426,"menu":428},"Resources",{"dataNavLevelOne":427},"resources",{"type":325,"link":429,"columns":433,"feature":527},{"text":430,"config":431},"View all resources",{"href":432,"dataGaName":427,"dataGaLocation":274},"/resources/",[434,467,494],{"title":435,"items":436},"Getting started",[437,442,447,452,457,462],{"text":438,"config":439},"Install",{"href":440,"dataGaName":441,"dataGaLocation":274},"/install/","install",{"text":443,"config":444},"Quick start guides",{"href":445,"dataGaName":446,"dataGaLocation":274},"/get-started/","quick setup checklists",{"text":448,"config":449},"Learn",{"href":450,"dataGaLocation":274,"dataGaName":451},"https://university.gitlab.com/","learn",{"text":453,"config":454},"Product documentation",{"href":455,"dataGaName":456,"dataGaLocation":274},"https://docs.gitlab.com/","product documentation",{"text":458,"config":459},"Best practice videos",{"href":460,"dataGaName":461,"dataGaLocation":274},"/getting-started-videos/","best practice videos",{"text":463,"config":464},"Integrations",{"href":465,"dataGaName":466,"dataGaLocation":274},"/integrations/","integrations",{"title":468,"items":469},"Discover",[470,475,480,485,489],{"text":471,"config":472},"Customer success stories",{"href":473,"dataGaName":474,"dataGaLocation":274},"/customers/","customer success stories",{"text":476,"config":477},"Blog",{"href":478,"dataGaName":479,"dataGaLocation":274},"/blog/","blog",{"text":481,"config":482},"Demo Hub",{"href":483,"dataGaName":484,"dataGaLocation":274},"/demo-hub/","demo hub",{"text":486,"config":487},"The Source",{"href":488,"dataGaName":479,"dataGaLocation":274},"/the-source/",{"text":490,"config":491},"Remote",{"href":492,"dataGaName":493,"dataGaLocation":274},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":495,"items":496},"Connect",[497,502,507,512,517,522],{"text":498,"config":499},"GitLab Services",{"href":500,"dataGaName":501,"dataGaLocation":274},"/services/","services",{"text":503,"config":504},"Contribute",{"href":505,"dataGaName":506,"dataGaLocation":274},"https://contributors.gitlab.com","contribute",{"text":508,"config":509},"Community",{"href":510,"dataGaName":511,"dataGaLocation":274},"/community/","community",{"text":513,"config":514},"Forum",{"href":515,"dataGaName":516,"dataGaLocation":274},"https://forum.gitlab.com/","forum",{"text":518,"config":519},"Events",{"href":520,"dataGaName":521,"dataGaLocation":274},"/events/","events",{"text":523,"config":524},"Partners",{"href":525,"dataGaName":526,"dataGaLocation":274},"/partners/","partners",{"config":528,"title":531,"text":532,"link":533},{"background":529,"textColor":530},"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":534,"config":535},"Read the latest",{"href":536,"dataGaName":537,"dataGaLocation":274},"/whats-new/","whats new",{"text":539,"config":540,"menu":542},"Company",{"dataNavLevelOne":541},"company",{"type":325,"columns":543},[544],{"items":545},[546,551,557,559,564,569,574,579,584,589],{"text":547,"config":548},"About",{"href":549,"dataGaName":550,"dataGaLocation":274},"/company/","about",{"text":552,"config":553,"footerGa":556},"Jobs",{"href":554,"dataGaName":555,"dataGaLocation":274},"/jobs/","jobs",{"dataGaName":555},{"text":518,"config":558},{"href":520,"dataGaName":521,"dataGaLocation":274},{"text":560,"config":561},"Leadership",{"href":562,"dataGaName":563,"dataGaLocation":274},"/company/team/e-group/","leadership",{"text":565,"config":566},"Handbook",{"href":567,"dataGaName":568,"dataGaLocation":274},"https://handbook.gitlab.com/","handbook",{"text":570,"config":571},"Investor relations",{"href":572,"dataGaName":573,"dataGaLocation":274},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":575,"config":576},"Trust Center",{"href":577,"dataGaName":578,"dataGaLocation":274},"/security/","trust center",{"text":580,"config":581},"AI Transparency Center",{"href":582,"dataGaName":583,"dataGaLocation":274},"/ai-transparency-center/","ai transparency center",{"text":585,"config":586},"Newsletter",{"href":587,"dataGaName":588,"dataGaLocation":274},"/company/contact/#contact-forms","newsletter",{"text":590,"config":591},"Press",{"href":592,"dataGaName":593,"dataGaLocation":274},"/press/","press",{"text":595,"config":596,"menu":597},"Contact us",{"dataNavLevelOne":541},{"type":325,"columns":598},[599],{"items":600},[601,606,611],{"text":602,"config":603},"Talk to sales",{"href":604,"dataGaName":605,"dataGaLocation":274},"/sales/","talk to sales",{"text":607,"config":608},"Support portal",{"href":609,"dataGaName":610,"dataGaLocation":274},"https://support.gitlab.com/hc/en-us","support portal",{"text":612,"config":613},"Customer portal",{"href":614,"dataGaName":615,"dataGaLocation":274},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":617,"login":618,"suggestions":625},"Close",{"text":619,"link":620},"To search repositories and projects, login to",{"text":621,"config":622},"gitlab.com",{"href":288,"dataGaName":623,"dataGaLocation":624},"search login","search",{"text":626,"default":627},"Suggestions",[628,630,634,636,640,644],{"text":305,"config":629},{"href":310,"dataGaName":305,"dataGaLocation":624},{"text":631,"config":632},"Code Suggestions (AI)",{"href":633,"dataGaName":631,"dataGaLocation":624},"/solutions/code-suggestions/",{"text":262,"config":635},{"href":342,"dataGaName":262,"dataGaLocation":624},{"text":637,"config":638},"GitLab on AWS",{"href":639,"dataGaName":637,"dataGaLocation":624},"/partners/technology-partners/aws/",{"text":641,"config":642},"GitLab on Google Cloud",{"href":643,"dataGaName":641,"dataGaLocation":624},"/partners/technology-partners/google-cloud-platform/",{"text":645,"config":646},"Why GitLab?",{"href":318,"dataGaName":645,"dataGaLocation":624},{"freeTrial":648,"mobileIcon":653,"desktopIcon":658,"secondaryButton":661},{"text":649,"config":650},"Start free trial",{"href":651,"dataGaName":279,"dataGaLocation":652},"https://gitlab.com/-/trials/new/","nav",{"altText":654,"config":655},"Gitlab Icon",{"src":656,"dataGaName":657,"dataGaLocation":652},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":654,"config":659},{"src":660,"dataGaName":657,"dataGaLocation":652},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":662,"config":663},"Get Started",{"href":664,"dataGaName":665,"dataGaLocation":652},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":667,"mobileIcon":671,"desktopIcon":673},{"text":668,"config":669},"Learn more about GitLab Duo",{"href":310,"dataGaName":670,"dataGaLocation":652},"gitlab duo",{"altText":654,"config":672},{"src":656,"dataGaName":657,"dataGaLocation":652},{"altText":654,"config":674},{"src":660,"dataGaName":657,"dataGaLocation":652},{"button":676,"mobileIcon":681,"desktopIcon":683},{"text":677,"config":678},"/switch",{"href":679,"dataGaName":680,"dataGaLocation":652},"#contact","switch",{"altText":654,"config":682},{"src":656,"dataGaName":657,"dataGaLocation":652},{"altText":654,"config":684},{"src":685,"dataGaName":657,"dataGaLocation":652},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":687,"mobileIcon":692,"desktopIcon":694},{"text":688,"config":689},"Back to pricing",{"href":422,"dataGaName":690,"dataGaLocation":652,"icon":691},"back to pricing","GoBack",{"altText":654,"config":693},{"src":656,"dataGaName":657,"dataGaLocation":652},{"altText":654,"config":695},{"src":660,"dataGaName":657,"dataGaLocation":652},{"title":697,"titleMobile":698,"button":699,"config":704},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":316,"config":700},{"href":701,"dataGaName":702,"dataGaLocation":703},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":705,"disabled":250},"release",{"data":707},{"text":708,"source":709,"edit":715,"contribute":720,"config":725,"items":730,"minimal":940},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":710,"config":711},"View page source",{"href":712,"dataGaName":713,"dataGaLocation":714},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":716,"config":717},"Edit this page",{"href":718,"dataGaName":719,"dataGaLocation":714},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":721,"config":722},"Please contribute",{"href":723,"dataGaName":724,"dataGaLocation":714},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":726,"facebook":727,"youtube":728,"linkedin":729},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[731,778,832,876,908],{"title":420,"links":732,"subMenu":747},[733,737,742],{"text":734,"config":735},"View plans",{"href":422,"dataGaName":736,"dataGaLocation":714},"view plans",{"text":738,"config":739},"Why Premium?",{"href":740,"dataGaName":741,"dataGaLocation":714},"/pricing/premium/","why premium",{"text":743,"config":744},"Why Ultimate?",{"href":745,"dataGaName":746,"dataGaLocation":714},"/pricing/ultimate/","why ultimate",[748],{"title":749,"links":750},"Contact Us",[751,754,756,758,763,768,773],{"text":752,"config":753},"Contact sales",{"href":604,"dataGaName":284,"dataGaLocation":714},{"text":607,"config":755},{"href":609,"dataGaName":610,"dataGaLocation":714},{"text":612,"config":757},{"href":614,"dataGaName":615,"dataGaLocation":714},{"text":759,"config":760},"Status",{"href":761,"dataGaName":762,"dataGaLocation":714},"https://status.gitlab.com/","status",{"text":764,"config":765},"Terms of use",{"href":766,"dataGaName":767,"dataGaLocation":714},"/terms/","terms of use",{"text":769,"config":770},"Privacy statement",{"href":771,"dataGaName":772,"dataGaLocation":714},"/privacy/","privacy statement",{"text":774,"config":775},"Cookie preferences",{"dataGaName":776,"dataGaLocation":714,"id":777,"isOneTrustButton":253},"cookie preferences","ot-sdk-btn",{"title":321,"links":779,"subMenu":788},[780,784],{"text":781,"config":782},"DevSecOps platform",{"href":303,"dataGaName":783,"dataGaLocation":714},"devsecops platform",{"text":785,"config":786},"AI-Assisted Development",{"href":310,"dataGaName":787,"dataGaLocation":714},"ai-assisted development",[789],{"title":790,"links":791},"Topics",[792,797,802,807,812,817,822,827],{"text":793,"config":794},"CICD",{"href":795,"dataGaName":796,"dataGaLocation":714},"/topics/ci-cd/","cicd",{"text":798,"config":799},"GitOps",{"href":800,"dataGaName":801,"dataGaLocation":714},"/topics/gitops/","gitops",{"text":803,"config":804},"DevOps",{"href":805,"dataGaName":806,"dataGaLocation":714},"/topics/devops/","devops",{"text":808,"config":809},"Version Control",{"href":810,"dataGaName":811,"dataGaLocation":714},"/topics/version-control/","version control",{"text":813,"config":814},"DevSecOps",{"href":815,"dataGaName":816,"dataGaLocation":714},"/topics/devsecops/","devsecops",{"text":818,"config":819},"Cloud Native",{"href":820,"dataGaName":821,"dataGaLocation":714},"/topics/cloud-native/","cloud native",{"text":823,"config":824},"AI for Coding",{"href":825,"dataGaName":826,"dataGaLocation":714},"/topics/devops/ai-for-coding/","ai for coding",{"text":828,"config":829},"Agentic AI",{"href":830,"dataGaName":831,"dataGaLocation":714},"/topics/agentic-ai/","agentic ai",{"title":833,"links":834},"Solutions",[835,837,839,844,848,851,855,858,860,863,866,871],{"text":364,"config":836},{"href":359,"dataGaName":364,"dataGaLocation":714},{"text":353,"config":838},{"href":337,"dataGaName":338,"dataGaLocation":714},{"text":840,"config":841},"Agile development",{"href":842,"dataGaName":843,"dataGaLocation":714},"/solutions/agile-delivery/","agile delivery",{"text":845,"config":846},"SCM",{"href":349,"dataGaName":847,"dataGaLocation":714},"source code management",{"text":793,"config":849},{"href":342,"dataGaName":850,"dataGaLocation":714},"continuous integration & delivery",{"text":852,"config":853},"Value stream management",{"href":392,"dataGaName":854,"dataGaLocation":714},"value stream management",{"text":798,"config":856},{"href":857,"dataGaName":801,"dataGaLocation":714},"/solutions/gitops/",{"text":402,"config":859},{"href":405,"dataGaName":406,"dataGaLocation":714},{"text":861,"config":862},"Small business",{"href":411,"dataGaName":412,"dataGaLocation":714},{"text":864,"config":865},"Public sector",{"href":417,"dataGaName":418,"dataGaLocation":714},{"text":867,"config":868},"Education",{"href":869,"dataGaName":870,"dataGaLocation":714},"/solutions/education/","education",{"text":872,"config":873},"Financial services",{"href":874,"dataGaName":875,"dataGaLocation":714},"/solutions/finance/","financial services",{"title":425,"links":877},[878,880,882,884,887,889,892,894,896,898,900,902,904,906],{"text":438,"config":879},{"href":440,"dataGaName":441,"dataGaLocation":714},{"text":443,"config":881},{"href":445,"dataGaName":446,"dataGaLocation":714},{"text":448,"config":883},{"href":450,"dataGaName":451,"dataGaLocation":714},{"text":453,"config":885},{"href":455,"dataGaName":886,"dataGaLocation":714},"docs",{"text":476,"config":888},{"href":478,"dataGaName":479,"dataGaLocation":714},{"text":890,"config":891},"What's new",{"href":536,"dataGaName":537,"dataGaLocation":714},{"text":471,"config":893},{"href":473,"dataGaName":474,"dataGaLocation":714},{"text":490,"config":895},{"href":492,"dataGaName":493,"dataGaLocation":714},{"text":498,"config":897},{"href":500,"dataGaName":501,"dataGaLocation":714},{"text":503,"config":899},{"href":505,"dataGaName":506,"dataGaLocation":714},{"text":508,"config":901},{"href":510,"dataGaName":511,"dataGaLocation":714},{"text":513,"config":903},{"href":515,"dataGaName":516,"dataGaLocation":714},{"text":518,"config":905},{"href":520,"dataGaName":521,"dataGaLocation":714},{"text":523,"config":907},{"href":525,"dataGaName":526,"dataGaLocation":714},{"title":539,"links":909},[910,912,914,916,918,920,924,929,931,933,935],{"text":547,"config":911},{"href":549,"dataGaName":541,"dataGaLocation":714},{"text":552,"config":913},{"href":554,"dataGaName":555,"dataGaLocation":714},{"text":560,"config":915},{"href":562,"dataGaName":563,"dataGaLocation":714},{"text":565,"config":917},{"href":567,"dataGaName":568,"dataGaLocation":714},{"text":570,"config":919},{"href":572,"dataGaName":573,"dataGaLocation":714},{"text":921,"config":922},"Sustainability",{"href":923,"dataGaName":921,"dataGaLocation":714},"/sustainability/",{"text":925,"config":926},"Diversity, inclusion and belonging (DIB)",{"href":927,"dataGaName":928,"dataGaLocation":714},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":575,"config":930},{"href":577,"dataGaName":578,"dataGaLocation":714},{"text":585,"config":932},{"href":587,"dataGaName":588,"dataGaLocation":714},{"text":590,"config":934},{"href":592,"dataGaName":593,"dataGaLocation":714},{"text":936,"config":937},"Modern Slavery Transparency Statement",{"href":938,"dataGaName":939,"dataGaLocation":714},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":941},[942,945,948],{"text":943,"config":944},"Terms",{"href":766,"dataGaName":767,"dataGaLocation":714},{"text":946,"config":947},"Cookies",{"dataGaName":776,"dataGaLocation":714,"id":777,"isOneTrustButton":253},{"text":949,"config":950},"Privacy",{"href":771,"dataGaName":772,"dataGaLocation":714},[952],{"id":953,"title":7,"body":249,"config":954,"content":956,"description":249,"extension":959,"meta":960,"navigation":253,"path":961,"seo":962,"stem":963,"__hash__":964},"blogAuthors/en-us/blog/authors/huldra.yml",{"template":955},"BlogAuthor",{"name":7,"config":957},{"headshot":67,"ctfId":958},"huldra","yml",{},"/en-us/blog/authors/huldra",{},"en-us/blog/authors/huldra","ZDTn7GX2AkcFa_VI20rHy6L2A-zC_DIMal6kviSVG60",[966,974,982],{"title":967,"description":968,"heroImage":969,"category":245,"date":970,"authors":971,"slug":973,"externalUrl":249},"CEO Shadow Takeaways from Jacie","Recap of my experience in the CEO Shadow Program.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664102/Blog/Hero%20Images/gitlab-values-cover.png","2021-05-18",[972],"Jacie Bandur","ceo-shadow-recap",{"title":975,"description":976,"heroImage":977,"category":245,"date":978,"authors":979,"slug":981,"externalUrl":249},"Why I love contributing to GitLab","Making small meaningful changes is what it's all about.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679501/Blog/Hero%20Images/new-feature.png","2021-05-11",[980],"Austin Regnery","why-i-love-contributing-to-gitlab",{"title":983,"description":984,"heroImage":985,"category":245,"date":978,"authors":986,"slug":988,"externalUrl":249},"Placebo Lines on the Pipeline Graph","Have you noticed the connecting lines missing on your pipelines lately? Here's why","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679507/Blog/Hero%20Images/ci-cd.png",[987],"Sam Beckham","placebo-lines-on-the-pipeline-graph",{"promotions":990},[991,1005,1017,1028],{"id":992,"categories":993,"header":995,"text":996,"button":997,"image":1002},"ai-modernization",[994],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":998,"config":999},"Get your AI maturity score",{"href":1000,"dataGaName":1001,"dataGaLocation":479},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1003},{"src":1004},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1006,"categories":1007,"header":1009,"text":996,"button":1010,"image":1014},"devops-modernization",[1008,816],"product","Are you just managing tools or shipping innovation?",{"text":1011,"config":1012},"Get your DevOps maturity score",{"href":1013,"dataGaName":1001,"dataGaLocation":479},"/assessments/devops-modernization-assessment/",{"config":1015},{"src":1016},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1018,"categories":1019,"header":1020,"text":996,"button":1021,"image":1025},"security-modernization",[264],"Are you trading speed for security?",{"text":1022,"config":1023},"Get your security maturity score",{"href":1024,"dataGaName":1001,"dataGaLocation":479},"/assessments/security-modernization-assessment/",{"config":1026},{"src":1027},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1029,"paths":1030,"header":1033,"text":1034,"button":1035,"image":1040},"github-azure-migration",[1031,1032],"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":1036,"config":1037},"See how GitLab compares to GitHub",{"href":1038,"dataGaName":1039,"dataGaLocation":479},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1041},{"src":1016},{"header":1043,"blurb":1044,"button":1045,"secondaryButton":1050},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1046,"config":1047},"Get your free trial",{"href":1048,"dataGaName":279,"dataGaLocation":1049},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":752,"config":1051},{"href":604,"dataGaName":284,"dataGaLocation":1049},1786803754106]