[{"data":1,"prerenderedAt":1309},["ShallowReactive",2],{"/blog/continuous-machine-learning-development-with-gitlab-ci":3,"navigation-en-us":528,"banner-en-us":953,"footer-en-us":963,"blog-post-authors-en-us-Dr. Elle O'Brien":1207,"blog-related-posts-en-us-continuous-machine-learning-development-with-gitlab-ci":1223,"blog-promotions-en-us":1245,"next-steps-en-us":1299},{"id":4,"title":5,"authors":6,"body":8,"category":505,"date":506,"description":507,"extension":508,"externalUrl":509,"faq":509,"featured":510,"heroImage":511,"meta":512,"navigation":129,"path":513,"seo":514,"slug":518,"stem":519,"tags":520,"template":526,"updatedDate":509,"__hash__":527},"blogPosts/en-us/blog/continuous-machine-learning-development-with-gitlab-ci.md","How machine learning ops works with GitLab and continuous machine learning",[7],"Dr. Elle O'Brien",{"type":9,"value":10,"toc":497},"minimark",[11,15,24,29,49,62,66,69,77,85,228,237,262,265,268,272,279,431,439,446,455,459,462,473,478,493],[12,13,14],"p",{},"Continuous integration (CI) is standard practice in software development for speeding up development cycles, and for keeping them short and painless. CI means making small commits, often, and automating tests so every commit is a release candidate.",[12,16,17,18,23],{},"When a project involves machine learning (ML), though, new challenges arise: Traditional ",[19,20,22],"a",{"href":21},"/topics/version-control/","version control systems"," (like Git) that are key to CI struggle to manage large datasets and models.\nFurthermore, typical pass-fail tests are too coarse for understanding ML model performance – you might need to consider how several metrics, like accuracy, sensitivity, and specificity, are affected by changes in your code or data.\nData visualizations like confusion matrices and loss plots are needed to make sense of the high-dimensional and often unintuitive behavior of models.",[25,26,28],"h2",{"id":27},"continuous-machine-learning-an-introduction","Continuous machine learning: an introduction",[12,30,31,36,37,42,43,48],{},[19,32,35],{"href":33,"rel":34},"https://iterative.ai",[],"Iterative.ai",", the team behind the popular open source version control system for ML projects ",[19,38,41],{"href":39,"rel":40},"https://dvc.org",[],"DVC"," (short for Data Version Control),\nhas recently released another open source project called ",[19,44,47],{"href":45,"rel":46},"https://cml.dev",[],"CML",", which stands for continuous machine learning.\nCML is our approach to adapting powerful CI systems like GitLab CI to common data science and ML use cases, including:",[50,51,52,56,59],"ul",{},[53,54,55],"li",{},"Automatic model training",[53,57,58],{},"Automatic model and dataset testing",[53,60,61],{},"Transparent and rich reporting about models and datasets (with data viz and metrics) in a merge request (MR)",[25,63,65],{"id":64},"your-first-continuous-machine-learning-report","Your first continuous machine learning report",[12,67,68],{},"CML helps you put tables, data viz, and even sample outputs from models into comments on your MRs, so you can review datasets and models like code.\nLet's see how to produce a basic report – we'll train an ML model using GitLab CI, and then report a model metric and confusion matrix in our MR.",[12,70,71,76],{},[72,73],"img",{"alt":74,"src":75},"Confusion Matrix","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398083/blog/Content%20Images/cml_confusion_matrix.jpg","\nConfusion matrix",[12,78,79,80,84],{},"To make this report, our ",[81,82,83],"code",{},".gitlab-ci.yml"," contains the following workflow:",[86,87,92],"pre",{"className":88,"code":89,"language":90,"meta":91,"style":91},"language-yaml shiki shiki-themes github-light","# .gitlab-ci.yml\nstages:\n    - cml_run\n\ncml:\n    stage: cml_run\n    image: dvcorg/cml-py3:latest\n\n    script:\n        - pip3 install -r requirements.txt\n        - python train.py\n\n        - cat metrics.txt >> report.md\n        - echo >> report.md\n        - cml-publish confusion_matrix.png --md --title 'confusion-matrix' >> report.md\n        - cml-send-comment report.md\n\n","yaml","",[81,93,94,103,114,124,131,139,150,161,166,174,183,191,196,204,212,220],{"__ignoreMap":91},[95,96,99],"span",{"class":97,"line":98},"line",1,[95,100,102],{"class":101},"sAwPA","# .gitlab-ci.yml\n",[95,104,106,110],{"class":97,"line":105},2,[95,107,109],{"class":108},"shJU0","stages",[95,111,113],{"class":112},"sgsFI",":\n",[95,115,117,120],{"class":97,"line":116},3,[95,118,119],{"class":112},"    - ",[95,121,123],{"class":122},"sYBdl","cml_run\n",[95,125,127],{"class":97,"line":126},4,[95,128,130],{"emptyLinePlaceholder":129},true,"\n",[95,132,134,137],{"class":97,"line":133},5,[95,135,136],{"class":108},"cml",[95,138,113],{"class":112},[95,140,142,145,148],{"class":97,"line":141},6,[95,143,144],{"class":108},"    stage",[95,146,147],{"class":112},": ",[95,149,123],{"class":122},[95,151,153,156,158],{"class":97,"line":152},7,[95,154,155],{"class":108},"    image",[95,157,147],{"class":112},[95,159,160],{"class":122},"dvcorg/cml-py3:latest\n",[95,162,164],{"class":97,"line":163},8,[95,165,130],{"emptyLinePlaceholder":129},[95,167,169,172],{"class":97,"line":168},9,[95,170,171],{"class":108},"    script",[95,173,113],{"class":112},[95,175,177,180],{"class":97,"line":176},10,[95,178,179],{"class":112},"        - ",[95,181,182],{"class":122},"pip3 install -r requirements.txt\n",[95,184,186,188],{"class":97,"line":185},11,[95,187,179],{"class":112},[95,189,190],{"class":122},"python train.py\n",[95,192,194],{"class":97,"line":193},12,[95,195,130],{"emptyLinePlaceholder":129},[95,197,199,201],{"class":97,"line":198},13,[95,200,179],{"class":112},[95,202,203],{"class":122},"cat metrics.txt >> report.md\n",[95,205,207,209],{"class":97,"line":206},14,[95,208,179],{"class":112},[95,210,211],{"class":122},"echo >> report.md\n",[95,213,215,217],{"class":97,"line":214},15,[95,216,179],{"class":112},[95,218,219],{"class":122},"cml-publish confusion_matrix.png --md --title 'confusion-matrix' >> report.md\n",[95,221,223,225],{"class":97,"line":222},16,[95,224,179],{"class":112},[95,226,227],{"class":122},"cml-send-comment report.md\n",[12,229,230,231,236],{},"The entire ",[19,232,235],{"href":233,"rel":234},"https://gitlab.com/iterative.ai/cml-base-case/",[],"project repository is available here",".\nThe steps consist of the following:",[50,238,239,250,256],{},[53,240,241,245,246,249],{},[242,243,244],"strong",{},"Train",": This is a classic training step where we install requirements (like ",[81,247,248],{},"pip"," packages) and run the training script.",[53,251,252,255],{},[242,253,254],{},"Write a CML report",": Produced metrics are appended to a markdown report.",[53,257,258,261],{},[242,259,260],{},"Publish a CML report",": CML publishes an image of the confusion matrix with the embedded metrics to your GitLab MR.",[12,263,264],{},"Now, when you and your teammates are deciding if your changes have had a positive effect on your modeling goals,\nyou have a dashboard of sorts to review. Plus, this report is linked by Git to your exact project version (data and code) and the runner used for training and the logs from that run.",[12,266,267],{},"This is the simplest use case for achieving continuous machine learning with CML and GitLab. In the next section we'll look at a more complex use case.",[25,269,271],{"id":270},"cml-with-dvc-for-data-version-control","CML with DVC for data version control",[12,273,274,275,278],{},"In machine learning projects, you need to track changes in your datasets as well as changes in your code.\nSince Git is frequently a poor fit for managing large files, we can use ",[19,276,41],{"href":39,"rel":277},[]," to link remote datasets to your CI system.",[86,280,282],{"className":88,"code":281,"language":90,"meta":91,"style":91},"# .gitlab-ci.yml\nstages:\n  - cml_run\n\ncml:\n  stage: cml_run\n  image: dvcorg/cml-py3:latest\n  script:\n    - dvc pull data\n\n    - pip install -r requirements.txt\n    - dvc repro\n\n    # Compare metrics to master\n    - git fetch --prune\n    - dvc metrics diff --show-md master >> report.md\n    - echo >> report.md\n\n    # Visualize loss function diff\n    - dvc plots diff\n      --target loss.csv --show-vega master > vega.json\n    - vl2png vega.json | cml-publish --md >> report.md\n    - cml-send-comment report.md\n\n",[81,283,284,288,294,301,305,311,320,329,336,343,347,354,361,365,370,377,384,391,396,402,410,416,424],{"__ignoreMap":91},[95,285,286],{"class":97,"line":98},[95,287,102],{"class":101},[95,289,290,292],{"class":97,"line":105},[95,291,109],{"class":108},[95,293,113],{"class":112},[95,295,296,299],{"class":97,"line":116},[95,297,298],{"class":112},"  - ",[95,300,123],{"class":122},[95,302,303],{"class":97,"line":126},[95,304,130],{"emptyLinePlaceholder":129},[95,306,307,309],{"class":97,"line":133},[95,308,136],{"class":108},[95,310,113],{"class":112},[95,312,313,316,318],{"class":97,"line":141},[95,314,315],{"class":108},"  stage",[95,317,147],{"class":112},[95,319,123],{"class":122},[95,321,322,325,327],{"class":97,"line":152},[95,323,324],{"class":108},"  image",[95,326,147],{"class":112},[95,328,160],{"class":122},[95,330,331,334],{"class":97,"line":163},[95,332,333],{"class":108},"  script",[95,335,113],{"class":112},[95,337,338,340],{"class":97,"line":168},[95,339,119],{"class":112},[95,341,342],{"class":122},"dvc pull data\n",[95,344,345],{"class":97,"line":176},[95,346,130],{"emptyLinePlaceholder":129},[95,348,349,351],{"class":97,"line":185},[95,350,119],{"class":112},[95,352,353],{"class":122},"pip install -r requirements.txt\n",[95,355,356,358],{"class":97,"line":193},[95,357,119],{"class":112},[95,359,360],{"class":122},"dvc repro\n",[95,362,363],{"class":97,"line":198},[95,364,130],{"emptyLinePlaceholder":129},[95,366,367],{"class":97,"line":206},[95,368,369],{"class":101},"    # Compare metrics to master\n",[95,371,372,374],{"class":97,"line":214},[95,373,119],{"class":112},[95,375,376],{"class":122},"git fetch --prune\n",[95,378,379,381],{"class":97,"line":222},[95,380,119],{"class":112},[95,382,383],{"class":122},"dvc metrics diff --show-md master >> report.md\n",[95,385,387,389],{"class":97,"line":386},17,[95,388,119],{"class":112},[95,390,211],{"class":122},[95,392,394],{"class":97,"line":393},18,[95,395,130],{"emptyLinePlaceholder":129},[95,397,399],{"class":97,"line":398},19,[95,400,401],{"class":101},"    # Visualize loss function diff\n",[95,403,405,407],{"class":97,"line":404},20,[95,406,119],{"class":112},[95,408,409],{"class":122},"dvc plots diff\n",[95,411,413],{"class":97,"line":412},21,[95,414,415],{"class":122},"      --target loss.csv --show-vega master > vega.json\n",[95,417,419,421],{"class":97,"line":418},22,[95,420,119],{"class":112},[95,422,423],{"class":122},"vl2png vega.json | cml-publish --md >> report.md\n",[95,425,427,429],{"class":97,"line":426},23,[95,428,119],{"class":112},[95,430,227],{"class":122},[12,432,230,433,438],{},[19,434,437],{"href":435,"rel":436},"https://gitlab.com/iterative.ai/cml-dvc-case",[],"project is available here",".\nIn this workflow, we have additional steps that use DVC to pull a training dataset, run an experiment, and then use CML to publish the report in your MR.",[12,440,441,445],{},[72,442],{"alt":443,"src":444},"CML with DVC","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398083/blog/Content%20Images/cml_dvc.jpg","\nCML with DVC",[12,447,448,449,454],{},"For more details about ML data versioning and tracking, check out the ",[19,450,453],{"href":451,"rel":452},"https://dvc.org/doc",[],"DVC documentation",".",[25,456,458],{"id":457},"summary","Summary",[12,460,461],{},"We made CML to adapt CI to machine learning, so data science teams can enjoy benefits such as:",[50,463,464,467,470],{},[53,465,466],{},"Your code, data, models, and training infrastructure (hardware and software environment) will be Git versioned.",[53,468,469],{},"You’re automating work, testing frequently, and getting fast feedback (with visual reports if you use CML). In the long run, this will almost certainly speed up your project’s development.",[53,471,472],{},"CI systems make your work visible to everyone on your team. No one has to search very hard to find the code, data, and model from your best run.",[474,475,477],"h3",{"id":476},"about-the-guest-author","About the guest author",[12,479,480],{},[481,482,483,484,487,488,454],"em",{},"Dr. Elle O'Brien is a Ph.D data scientist at iterative.ai and co-creator of ",[19,485,47],{"href":45,"rel":486},[]," project. She is also a lecturer at ",[19,489,492],{"href":490,"rel":491},"https://www.si.umich.edu/",[],"UMSI",[494,495,496],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":91,"searchDepth":105,"depth":105,"links":498},[499,500,501,502],{"id":27,"depth":105,"text":28},{"id":64,"depth":105,"text":65},{"id":270,"depth":105,"text":271},{"id":457,"depth":105,"text":458,"children":503},[504],{"id":476,"depth":116,"text":477},"news","2020-12-01","We share different machine learning use cases for CML projects using GitLab CI.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749681802/Blog/Hero%20Images/gitlab_cml_dvc_banner.png",{},"/en-us/blog/continuous-machine-learning-development-with-gitlab-ci",{"title":5,"description":507,"ogTitle":5,"ogDescription":507,"noIndex":510,"ogImage":511,"ogUrl":515,"ogSiteName":516,"ogType":517,"canonicalUrls":515},"https://about.gitlab.com/blog/continuous-machine-learning-development-with-gitlab-ci","https://about.gitlab.com","article","continuous-machine-learning-development-with-gitlab-ci","en-us/blog/continuous-machine-learning-development-with-gitlab-ci",[521,522,523,524,525],"CI/CD","community","integrations","open source","AI","BlogPost","CgG0TlJN70_di0lMsAlP82BGq2ZqK8L1HmlLlGf5MaY",{"logo":529,"freeTrial":534,"sales":539,"login":544,"items":549,"search":873,"minimal":904,"duo":923,"switchNav":932,"pricingDeployment":943},{"config":530},{"href":531,"dataGaName":532,"dataGaLocation":533},"/","gitlab logo","header",{"text":535,"config":536},"Get free trial",{"href":537,"dataGaName":538,"dataGaLocation":533},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":540,"config":541},"Request a demo",{"href":542,"dataGaName":543,"dataGaLocation":533},"/sales/?contact-topic=request-demo","sales",{"text":545,"config":546},"Sign in",{"href":547,"dataGaName":548,"dataGaLocation":533},"https://gitlab.com/users/sign_in/","sign in",[550,579,678,683,795,851],{"text":551,"config":552,"menu":554},"Platform",{"dataNavLevelOne":553},"platform",{"type":555,"columns":556},"cards",[557,563,571],{"title":551,"description":558,"link":559},"The intelligent orchestration platform for DevSecOps",{"text":560,"config":561},"Explore our Platform",{"href":562,"dataGaName":553,"dataGaLocation":533},"/platform/",{"title":564,"description":565,"link":566},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":567,"config":568},"Meet GitLab Duo",{"href":569,"dataGaName":570,"dataGaLocation":533},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":572,"description":573,"link":574},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":575,"config":576},"Learn more",{"href":577,"dataGaName":578,"dataGaLocation":533},"/why-gitlab/","why gitlab",{"text":580,"left":129,"config":581,"menu":583},"Product",{"dataNavLevelOne":582},"solutions",{"type":584,"link":585,"columns":589,"feature":657},"lists",{"text":586,"config":587},"View all Solutions",{"href":588,"dataGaName":582,"dataGaLocation":533},"/solutions/",[590,613,636],{"title":591,"description":592,"link":593,"items":598},"Automation","CI/CD and automation to accelerate deployment",{"config":594},{"icon":595,"href":596,"dataGaName":597,"dataGaLocation":533},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[599,602,605,609],{"text":521,"config":600},{"href":601,"dataGaLocation":533,"dataGaName":521},"/solutions/continuous-integration/",{"text":564,"config":603},{"href":569,"dataGaLocation":533,"dataGaName":604},"gitlab duo agent platform - product menu",{"text":606,"config":607},"Source Code Management",{"href":608,"dataGaLocation":533,"dataGaName":606},"/solutions/source-code-management/",{"text":610,"config":611},"Automated Software Delivery",{"href":596,"dataGaLocation":533,"dataGaName":612},"Automated software delivery",{"title":614,"description":615,"link":616,"items":621},"Security","Deliver code faster without compromising security",{"config":617},{"href":618,"dataGaName":619,"dataGaLocation":533,"icon":620},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[622,626,631],{"text":623,"config":624},"Application Security Testing",{"href":618,"dataGaName":625,"dataGaLocation":533},"Application security testing",{"text":627,"config":628},"Software Supply Chain Security",{"href":629,"dataGaLocation":533,"dataGaName":630},"/solutions/supply-chain/","Software supply chain security",{"text":632,"config":633},"Software Compliance",{"href":634,"dataGaName":635,"dataGaLocation":533},"/solutions/software-compliance/","software compliance",{"title":637,"link":638,"items":643},"Measurement",{"config":639},{"icon":640,"href":641,"dataGaName":642,"dataGaLocation":533},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[644,648,652],{"text":645,"config":646},"Visibility & Measurement",{"href":641,"dataGaLocation":533,"dataGaName":647},"Visibility and Measurement",{"text":649,"config":650},"Value Stream Management",{"href":651,"dataGaLocation":533,"dataGaName":649},"/solutions/value-stream-management/",{"text":653,"config":654},"Analytics & Insights",{"href":655,"dataGaLocation":533,"dataGaName":656},"/solutions/analytics-and-insights/","Analytics and insights",{"title":658,"type":584,"items":659},"GitLab for",[660,666,672],{"text":661,"config":662},"Enterprise",{"icon":663,"href":664,"dataGaLocation":533,"dataGaName":665},"Building","/enterprise/","enterprise",{"text":667,"config":668},"Small Business",{"icon":669,"href":670,"dataGaLocation":533,"dataGaName":671},"Work","/small-business/","small business",{"text":673,"config":674},"Public Sector",{"icon":675,"href":676,"dataGaLocation":533,"dataGaName":677},"Organization","/solutions/public-sector/","public sector",{"text":679,"config":680},"Pricing",{"href":681,"dataGaName":682,"dataGaLocation":533,"dataNavLevelOne":682},"/pricing/","pricing",{"text":684,"config":685,"menu":687},"Resources",{"dataNavLevelOne":686},"resources",{"type":584,"link":688,"columns":692,"feature":784},{"text":689,"config":690},"View all resources",{"href":691,"dataGaName":686,"dataGaLocation":533},"/resources/",[693,725,752],{"title":694,"items":695},"Getting started",[696,701,706,711,716,721],{"text":697,"config":698},"Install",{"href":699,"dataGaName":700,"dataGaLocation":533},"/install/","install",{"text":702,"config":703},"Quick start guides",{"href":704,"dataGaName":705,"dataGaLocation":533},"/get-started/","quick setup checklists",{"text":707,"config":708},"Learn",{"href":709,"dataGaLocation":533,"dataGaName":710},"https://university.gitlab.com/","learn",{"text":712,"config":713},"Product documentation",{"href":714,"dataGaName":715,"dataGaLocation":533},"https://docs.gitlab.com/","product documentation",{"text":717,"config":718},"Best practice videos",{"href":719,"dataGaName":720,"dataGaLocation":533},"/getting-started-videos/","best practice videos",{"text":722,"config":723},"Integrations",{"href":724,"dataGaName":523,"dataGaLocation":533},"/integrations/",{"title":726,"items":727},"Discover",[728,733,738,743,747],{"text":729,"config":730},"Customer success stories",{"href":731,"dataGaName":732,"dataGaLocation":533},"/customers/","customer success stories",{"text":734,"config":735},"Blog",{"href":736,"dataGaName":737,"dataGaLocation":533},"/blog/","blog",{"text":739,"config":740},"Demo Hub",{"href":741,"dataGaName":742,"dataGaLocation":533},"/demo-hub/","demo hub",{"text":744,"config":745},"The Source",{"href":746,"dataGaName":737,"dataGaLocation":533},"/the-source/",{"text":748,"config":749},"Remote",{"href":750,"dataGaName":751,"dataGaLocation":533},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":753,"items":754},"Connect",[755,760,765,769,774,779],{"text":756,"config":757},"GitLab Services",{"href":758,"dataGaName":759,"dataGaLocation":533},"/services/","services",{"text":761,"config":762},"Contribute",{"href":763,"dataGaName":764,"dataGaLocation":533},"https://contributors.gitlab.com","contribute",{"text":766,"config":767},"Community",{"href":768,"dataGaName":522,"dataGaLocation":533},"/community/",{"text":770,"config":771},"Forum",{"href":772,"dataGaName":773,"dataGaLocation":533},"https://forum.gitlab.com/","forum",{"text":775,"config":776},"Events",{"href":777,"dataGaName":778,"dataGaLocation":533},"/events/","events",{"text":780,"config":781},"Partners",{"href":782,"dataGaName":783,"dataGaLocation":533},"/partners/","partners",{"config":785,"title":788,"text":789,"link":790},{"background":786,"textColor":787},"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":791,"config":792},"Read the latest",{"href":793,"dataGaName":794,"dataGaLocation":533},"/whats-new/","whats new",{"text":796,"config":797,"menu":799},"Company",{"dataNavLevelOne":798},"company",{"type":584,"columns":800},[801],{"items":802},[803,808,814,816,821,826,831,836,841,846],{"text":804,"config":805},"About",{"href":806,"dataGaName":807,"dataGaLocation":533},"/company/","about",{"text":809,"config":810,"footerGa":813},"Jobs",{"href":811,"dataGaName":812,"dataGaLocation":533},"/jobs/","jobs",{"dataGaName":812},{"text":775,"config":815},{"href":777,"dataGaName":778,"dataGaLocation":533},{"text":817,"config":818},"Leadership",{"href":819,"dataGaName":820,"dataGaLocation":533},"/company/team/e-group/","leadership",{"text":822,"config":823},"Handbook",{"href":824,"dataGaName":825,"dataGaLocation":533},"https://handbook.gitlab.com/","handbook",{"text":827,"config":828},"Investor relations",{"href":829,"dataGaName":830,"dataGaLocation":533},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":832,"config":833},"Trust Center",{"href":834,"dataGaName":835,"dataGaLocation":533},"/security/","trust center",{"text":837,"config":838},"AI Transparency Center",{"href":839,"dataGaName":840,"dataGaLocation":533},"/ai-transparency-center/","ai transparency center",{"text":842,"config":843},"Newsletter",{"href":844,"dataGaName":845,"dataGaLocation":533},"/company/contact/#contact-forms","newsletter",{"text":847,"config":848},"Press",{"href":849,"dataGaName":850,"dataGaLocation":533},"/press/","press",{"text":852,"config":853,"menu":854},"Contact us",{"dataNavLevelOne":798},{"type":584,"columns":855},[856],{"items":857},[858,863,868],{"text":859,"config":860},"Talk to sales",{"href":861,"dataGaName":862,"dataGaLocation":533},"/sales/","talk to sales",{"text":864,"config":865},"Support portal",{"href":866,"dataGaName":867,"dataGaLocation":533},"https://support.gitlab.com/hc/en-us","support portal",{"text":869,"config":870},"Customer portal",{"href":871,"dataGaName":872,"dataGaLocation":533},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":874,"login":875,"suggestions":882},"Close",{"text":876,"link":877},"To search repositories and projects, login to",{"text":878,"config":879},"gitlab.com",{"href":547,"dataGaName":880,"dataGaLocation":881},"search login","search",{"text":883,"default":884},"Suggestions",[885,887,891,893,897,901],{"text":564,"config":886},{"href":569,"dataGaName":564,"dataGaLocation":881},{"text":888,"config":889},"Code Suggestions (AI)",{"href":890,"dataGaName":888,"dataGaLocation":881},"/solutions/code-suggestions/",{"text":521,"config":892},{"href":601,"dataGaName":521,"dataGaLocation":881},{"text":894,"config":895},"GitLab on AWS",{"href":896,"dataGaName":894,"dataGaLocation":881},"/partners/technology-partners/aws/",{"text":898,"config":899},"GitLab on Google Cloud",{"href":900,"dataGaName":898,"dataGaLocation":881},"/partners/technology-partners/google-cloud-platform/",{"text":902,"config":903},"Why GitLab?",{"href":577,"dataGaName":902,"dataGaLocation":881},{"freeTrial":905,"mobileIcon":910,"desktopIcon":915,"secondaryButton":918},{"text":906,"config":907},"Start free trial",{"href":908,"dataGaName":538,"dataGaLocation":909},"https://gitlab.com/-/trials/new/","nav",{"altText":911,"config":912},"Gitlab Icon",{"src":913,"dataGaName":914,"dataGaLocation":909},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":911,"config":916},{"src":917,"dataGaName":914,"dataGaLocation":909},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":919,"config":920},"Get Started",{"href":921,"dataGaName":922,"dataGaLocation":909},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":924,"mobileIcon":928,"desktopIcon":930},{"text":925,"config":926},"Learn more about GitLab Duo",{"href":569,"dataGaName":927,"dataGaLocation":909},"gitlab duo",{"altText":911,"config":929},{"src":913,"dataGaName":914,"dataGaLocation":909},{"altText":911,"config":931},{"src":917,"dataGaName":914,"dataGaLocation":909},{"button":933,"mobileIcon":938,"desktopIcon":940},{"text":934,"config":935},"/switch",{"href":936,"dataGaName":937,"dataGaLocation":909},"#contact","switch",{"altText":911,"config":939},{"src":913,"dataGaName":914,"dataGaLocation":909},{"altText":911,"config":941},{"src":942,"dataGaName":914,"dataGaLocation":909},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":944,"mobileIcon":949,"desktopIcon":951},{"text":945,"config":946},"Back to pricing",{"href":681,"dataGaName":947,"dataGaLocation":909,"icon":948},"back to pricing","GoBack",{"altText":911,"config":950},{"src":913,"dataGaName":914,"dataGaLocation":909},{"altText":911,"config":952},{"src":917,"dataGaName":914,"dataGaLocation":909},{"title":954,"titleMobile":955,"button":956,"config":961},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":575,"config":957},{"href":958,"dataGaName":959,"dataGaLocation":960},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":962,"disabled":510},"release",{"data":964},{"text":965,"source":966,"edit":972,"contribute":977,"config":982,"items":987,"minimal":1196},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":967,"config":968},"View page source",{"href":969,"dataGaName":970,"dataGaLocation":971},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":973,"config":974},"Edit this page",{"href":975,"dataGaName":976,"dataGaLocation":971},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":978,"config":979},"Please contribute",{"href":980,"dataGaName":981,"dataGaLocation":971},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":983,"facebook":984,"youtube":985,"linkedin":986},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[988,1035,1088,1132,1164],{"title":679,"links":989,"subMenu":1004},[990,994,999],{"text":991,"config":992},"View plans",{"href":681,"dataGaName":993,"dataGaLocation":971},"view plans",{"text":995,"config":996},"Why Premium?",{"href":997,"dataGaName":998,"dataGaLocation":971},"/pricing/premium/","why premium",{"text":1000,"config":1001},"Why Ultimate?",{"href":1002,"dataGaName":1003,"dataGaLocation":971},"/pricing/ultimate/","why ultimate",[1005],{"title":1006,"links":1007},"Contact Us",[1008,1011,1013,1015,1020,1025,1030],{"text":1009,"config":1010},"Contact sales",{"href":861,"dataGaName":543,"dataGaLocation":971},{"text":864,"config":1012},{"href":866,"dataGaName":867,"dataGaLocation":971},{"text":869,"config":1014},{"href":871,"dataGaName":872,"dataGaLocation":971},{"text":1016,"config":1017},"Status",{"href":1018,"dataGaName":1019,"dataGaLocation":971},"https://status.gitlab.com/","status",{"text":1021,"config":1022},"Terms of use",{"href":1023,"dataGaName":1024,"dataGaLocation":971},"/terms/","terms of use",{"text":1026,"config":1027},"Privacy statement",{"href":1028,"dataGaName":1029,"dataGaLocation":971},"/privacy/","privacy statement",{"text":1031,"config":1032},"Cookie preferences",{"dataGaName":1033,"dataGaLocation":971,"id":1034,"isOneTrustButton":129},"cookie preferences","ot-sdk-btn",{"title":580,"links":1036,"subMenu":1045},[1037,1041],{"text":1038,"config":1039},"DevSecOps platform",{"href":562,"dataGaName":1040,"dataGaLocation":971},"devsecops platform",{"text":1042,"config":1043},"AI-Assisted Development",{"href":569,"dataGaName":1044,"dataGaLocation":971},"ai-assisted development",[1046],{"title":1047,"links":1048},"Topics",[1049,1054,1059,1064,1068,1073,1078,1083],{"text":1050,"config":1051},"CICD",{"href":1052,"dataGaName":1053,"dataGaLocation":971},"/topics/ci-cd/","cicd",{"text":1055,"config":1056},"GitOps",{"href":1057,"dataGaName":1058,"dataGaLocation":971},"/topics/gitops/","gitops",{"text":1060,"config":1061},"DevOps",{"href":1062,"dataGaName":1063,"dataGaLocation":971},"/topics/devops/","devops",{"text":1065,"config":1066},"Version Control",{"href":21,"dataGaName":1067,"dataGaLocation":971},"version control",{"text":1069,"config":1070},"DevSecOps",{"href":1071,"dataGaName":1072,"dataGaLocation":971},"/topics/devsecops/","devsecops",{"text":1074,"config":1075},"Cloud Native",{"href":1076,"dataGaName":1077,"dataGaLocation":971},"/topics/cloud-native/","cloud native",{"text":1079,"config":1080},"AI for Coding",{"href":1081,"dataGaName":1082,"dataGaLocation":971},"/topics/devops/ai-for-coding/","ai for coding",{"text":1084,"config":1085},"Agentic AI",{"href":1086,"dataGaName":1087,"dataGaLocation":971},"/topics/agentic-ai/","agentic ai",{"title":1089,"links":1090},"Solutions",[1091,1093,1095,1100,1104,1107,1111,1114,1116,1119,1122,1127],{"text":623,"config":1092},{"href":618,"dataGaName":623,"dataGaLocation":971},{"text":612,"config":1094},{"href":596,"dataGaName":597,"dataGaLocation":971},{"text":1096,"config":1097},"Agile development",{"href":1098,"dataGaName":1099,"dataGaLocation":971},"/solutions/agile-delivery/","agile delivery",{"text":1101,"config":1102},"SCM",{"href":608,"dataGaName":1103,"dataGaLocation":971},"source code management",{"text":1050,"config":1105},{"href":601,"dataGaName":1106,"dataGaLocation":971},"continuous integration & delivery",{"text":1108,"config":1109},"Value stream management",{"href":651,"dataGaName":1110,"dataGaLocation":971},"value stream management",{"text":1055,"config":1112},{"href":1113,"dataGaName":1058,"dataGaLocation":971},"/solutions/gitops/",{"text":661,"config":1115},{"href":664,"dataGaName":665,"dataGaLocation":971},{"text":1117,"config":1118},"Small business",{"href":670,"dataGaName":671,"dataGaLocation":971},{"text":1120,"config":1121},"Public sector",{"href":676,"dataGaName":677,"dataGaLocation":971},{"text":1123,"config":1124},"Education",{"href":1125,"dataGaName":1126,"dataGaLocation":971},"/solutions/education/","education",{"text":1128,"config":1129},"Financial services",{"href":1130,"dataGaName":1131,"dataGaLocation":971},"/solutions/finance/","financial services",{"title":684,"links":1133},[1134,1136,1138,1140,1143,1145,1148,1150,1152,1154,1156,1158,1160,1162],{"text":697,"config":1135},{"href":699,"dataGaName":700,"dataGaLocation":971},{"text":702,"config":1137},{"href":704,"dataGaName":705,"dataGaLocation":971},{"text":707,"config":1139},{"href":709,"dataGaName":710,"dataGaLocation":971},{"text":712,"config":1141},{"href":714,"dataGaName":1142,"dataGaLocation":971},"docs",{"text":734,"config":1144},{"href":736,"dataGaName":737,"dataGaLocation":971},{"text":1146,"config":1147},"What's new",{"href":793,"dataGaName":794,"dataGaLocation":971},{"text":729,"config":1149},{"href":731,"dataGaName":732,"dataGaLocation":971},{"text":748,"config":1151},{"href":750,"dataGaName":751,"dataGaLocation":971},{"text":756,"config":1153},{"href":758,"dataGaName":759,"dataGaLocation":971},{"text":761,"config":1155},{"href":763,"dataGaName":764,"dataGaLocation":971},{"text":766,"config":1157},{"href":768,"dataGaName":522,"dataGaLocation":971},{"text":770,"config":1159},{"href":772,"dataGaName":773,"dataGaLocation":971},{"text":775,"config":1161},{"href":777,"dataGaName":778,"dataGaLocation":971},{"text":780,"config":1163},{"href":782,"dataGaName":783,"dataGaLocation":971},{"title":796,"links":1165},[1166,1168,1170,1172,1174,1176,1180,1185,1187,1189,1191],{"text":804,"config":1167},{"href":806,"dataGaName":798,"dataGaLocation":971},{"text":809,"config":1169},{"href":811,"dataGaName":812,"dataGaLocation":971},{"text":817,"config":1171},{"href":819,"dataGaName":820,"dataGaLocation":971},{"text":822,"config":1173},{"href":824,"dataGaName":825,"dataGaLocation":971},{"text":827,"config":1175},{"href":829,"dataGaName":830,"dataGaLocation":971},{"text":1177,"config":1178},"Sustainability",{"href":1179,"dataGaName":1177,"dataGaLocation":971},"/sustainability/",{"text":1181,"config":1182},"Diversity, inclusion and belonging (DIB)",{"href":1183,"dataGaName":1184,"dataGaLocation":971},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":832,"config":1186},{"href":834,"dataGaName":835,"dataGaLocation":971},{"text":842,"config":1188},{"href":844,"dataGaName":845,"dataGaLocation":971},{"text":847,"config":1190},{"href":849,"dataGaName":850,"dataGaLocation":971},{"text":1192,"config":1193},"Modern Slavery Transparency Statement",{"href":1194,"dataGaName":1195,"dataGaLocation":971},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1197},[1198,1201,1204],{"text":1199,"config":1200},"Terms",{"href":1023,"dataGaName":1024,"dataGaLocation":971},{"text":1202,"config":1203},"Cookies",{"dataGaName":1033,"dataGaLocation":971,"id":1034,"isOneTrustButton":129},{"text":1205,"config":1206},"Privacy",{"href":1028,"dataGaName":1029,"dataGaLocation":971},[1208],{"id":1209,"title":1210,"body":509,"config":1211,"content":1213,"description":509,"extension":1217,"meta":1218,"navigation":129,"path":1219,"seo":1220,"stem":1221,"__hash__":1222},"blogAuthors/en-us/blog/authors/dr-elle-obrien.yml","Dr Elle Obrien",{"template":1212},"BlogAuthor",{"name":7,"config":1214},{"headshot":1215,"ctfId":1216},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Dr-Elle-OBrien","yml",{},"/en-us/blog/authors/dr-elle-obrien",{},"en-us/blog/authors/dr-elle-obrien","2QbDS094UsB0v6BSWztBkgBs8iuHIAkelzXjLqPogvQ",[1224,1232,1239],{"title":1225,"description":1226,"heroImage":1227,"category":505,"date":1228,"authors":1229,"slug":1231,"externalUrl":509},"GitLab named a Leader in the 2026 Gartner® Magic Quadrant™ for DevSecOps Platforms","Agents made coding fast. GitLab is the Intelligent Orchestration Platform for DevSecOps that brings speed with control for the rest of the software lifecycle.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","2026-06-17",[1230],"Manav Khurana","gitlab-leader-2026-gartner-mq-devsecops-platforms",{"title":1233,"description":1234,"heroImage":1235,"category":505,"date":1228,"authors":1236,"slug":1238,"externalUrl":509},"GitLab and Capgemini accelerate DevSecOps transformation","The global alliance helps organizations modernize software delivery, secure their supply chain, and bring AI into development workflows.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1781279411/n3pkmddd2eswa8qbu06z.png",[1237],"Alex Picker","gitlab-and-capgemini-global-alliance-partnership",{"title":1240,"description":1241,"heroImage":1242,"category":505,"date":1228,"authors":1243,"slug":1244,"externalUrl":509},"Introducing the 2026 EMEA GitLab Partner Award winners","Learn about the EMEA partners who made an outstanding impact over the past year.\n","https://res.cloudinary.com/about-gitlab-com/image/upload/v1781608381/biycl2ib2kpsbspjlac7.png",[1237],"2026-emea-gitlab-partner-awards",{"promotions":1246},[1247,1261,1273,1285],{"id":1248,"categories":1249,"header":1251,"text":1252,"button":1253,"image":1258},"ai-modernization",[1250],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1254,"config":1255},"Get your AI maturity score",{"href":1256,"dataGaName":1257,"dataGaLocation":737},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1259},{"src":1260},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1262,"categories":1263,"header":1265,"text":1252,"button":1266,"image":1270},"devops-modernization",[1264,1072],"product","Are you just managing tools or shipping innovation?",{"text":1267,"config":1268},"Get your DevOps maturity score",{"href":1269,"dataGaName":1257,"dataGaLocation":737},"/assessments/devops-modernization-assessment/",{"config":1271},{"src":1272},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1274,"categories":1275,"header":1277,"text":1252,"button":1278,"image":1282},"security-modernization",[1276],"security","Are you trading speed for security?",{"text":1279,"config":1280},"Get your security maturity score",{"href":1281,"dataGaName":1257,"dataGaLocation":737},"/assessments/security-modernization-assessment/",{"config":1283},{"src":1284},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1286,"paths":1287,"header":1290,"text":1291,"button":1292,"image":1297},"github-azure-migration",[1288,1289],"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":1293,"config":1294},"See how GitLab compares to GitHub",{"href":1295,"dataGaName":1296,"dataGaLocation":737},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1298},{"src":1272},{"header":1300,"blurb":1301,"button":1302,"secondaryButton":1307},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1303,"config":1304},"Get your free trial",{"href":1305,"dataGaName":538,"dataGaLocation":1306},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1009,"config":1308},{"href":861,"dataGaName":543,"dataGaLocation":1306},1786803731565]