[{"data":1,"prerenderedAt":1179},["ShallowReactive",2],{"/blog/build-an-ml-app-pipeline-with-gitlab-model-registry-using-mlflow":3,"navigation-en-us":382,"banner-en-us":806,"footer-en-us":816,"blog-post-authors-en-us-Gufran Yeşilyurt, OBSS|Péter Bozsó":1061,"blog-related-posts-en-us-build-an-ml-app-pipeline-with-gitlab-model-registry-using-mlflow":1091,"blog-promotions-en-us":1116,"next-steps-en-us":1169},{"id":4,"title":5,"authors":6,"body":9,"category":359,"date":360,"description":361,"extension":362,"externalUrl":363,"faq":363,"featured":364,"heroImage":365,"meta":366,"navigation":364,"path":367,"seo":368,"slug":373,"stem":374,"tags":375,"template":380,"updatedDate":363,"__hash__":381},"blogPosts/en-us/blog/build-an-ml-app-pipeline-with-gitlab-model-registry-using-mlflow.md","Build an ML app pipeline with GitLab Model Registry using MLflow",[7,8],"Gufran Yeşilyurt, OBSS","Péter Bozsó",{"type":10,"value":11,"toc":348},"minimark",[12,22,25,34,37,40,43,52,55,58,61,77,80,106,109,118,131,135,143,185,195,198,201,209,212,218,225,228,231,234,239,245,254,262,266,274,284,287,295,298,302,330,344],[13,14,15],"p",{},[16,17,18],"strong",{},[19,20,21],"em",{},"Editor's note: From time to time, we invite members of our partner community to contribute to the GitLab Blog. Thanks to Gufran Yeşilyurt, a DevOps consultant at OBSS Technology, for co-creating with us.",[13,23,24],{},"This tutorial will walk you through setting up an MLOps pipeline with GitLab Model Registry, utilizing MLflow. This will be a great starting point to manage your ML apps entirely through GitLab. But first, it is crucial to understand why we need MLOps and what GitLab offers.",[13,26,27,33],{},[28,29,32],"a",{"href":30,"rel":31},"https://docs.gitlab.com/user/project/ml/",[],"MLOps",", or machine learning operations, is a critical practice for managing and automating the lifecycle of machine learning models, from development to deployment and maintenance. Its importance lies in addressing the complexity and dynamism of machine learning workflows, which involve not just software development but also data management, model training, testing, deployment, and continuous monitoring.",[13,35,36],{},"MLOps ensures that models are reproducible, scalable, and maintainable, facilitating collaboration between data scientists, machine learning engineers, and operations teams. By incorporating MLOps, organizations can streamline the deployment process, reduce time to market, and improve the reliability and performance of their machine learning applications.",[13,38,39],{},"The necessity of MLOps arises from the unique challenges posed by machine learning projects. Unlike traditional software development, machine learning involves handling large datasets, experimenting with various models, and continuously updating models based on new data and feedback.",[13,41,42],{},"Without proper operations, managing these aspects becomes cumbersome, leading to potential issues like model drift, where the model's performance degrades over time due to changes in the underlying data. MLOps provides a structured approach to monitor and manage these changes, ensuring that models remain accurate and effective. Moreover, it introduces automation in various stages, such as data preprocessing, model training, and deployment, thereby reducing manual errors and enhancing efficiency.",[13,44,45,46,51],{},"GitLab's features play a pivotal role in implementing MLOps effectively. GitLab provides an integrated platform that combines source code management, ",[28,47,50],{"href":48,"rel":49},"https://about.gitlab.com/topics/ci-cd/",[],"CI/CD pipelines",", tracking and collaboration tools, making it ideal for managing machine learning projects.",[13,53,54],{},"With GitLab, teams can leverage version control to track changes in both code and data, ensuring reproducibility and transparency. The CI/CD pipelines in GitLab automate the testing and deployment of machine learning models, allowing for continuous integration and continuous delivery. This automation not only speeds up the deployment process but also ensures consistency and reliability in the models being deployed.",[13,56,57],{},"Additionally, GitLab's collaboration features, such as merge requests and code reviews, facilitate better communication and coordination among team members, ensuring that everyone is aligned and any issues are promptly addressed.",[13,59,60],{},"Prerequisites:",[62,63,64,68,71,74],"ul",{},[65,66,67],"li",{},"basic knowledge of GitLab pipelines",[65,69,70],{},"basic knowledge of MLflow",[65,72,73],{},"a Kubernetes cluster",[65,75,76],{},"Dockerfile",[13,78,79],{},"This tutorial includes instructions to:",[62,81,82,88,94,100],{},[65,83,84],{},[28,85,87],{"href":86},"#set-up-environment-variables-of-mlflow","Set up environment variables of MLflow",[65,89,90],{},[28,91,93],{"href":92},"#train-and-log-candidates-at-merge-request","Train and log candidates at merge request",[65,95,96],{},[28,97,99],{"href":98},"#register-the-most-successful-candidate","Register the most successful candidate",[65,101,102],{},[28,103,105],{"href":104},"#dockerize-and-deploy-an-ml-app-with-the-registered-model","Dockerize and deploy an ML app with the registered model",[13,107,108],{},"In this example, to decide whether to provide the user a loan, we make use of Random Forest Classifier, Decision Tree, and Logistic Regression. At the end of this showcase, we will have a web application that utilizes machine learning to respond to the user.",[13,110,111,112,117],{},"To reproduce this example in your own GitLab environment, you can read the rest of this article or follow the video below. You can find the source code of this example in ",[28,113,116],{"href":114,"rel":115},"https://gitlab.com/gitlab-partners-public/obss",[],"these OBSS repositories",".",[119,120,123,124],"figure",{"className":121},[122],"video_container","\n  ",[125,126,130],"iframe",{"src":127,"frameBorder":128,"allow":129},"https://www.youtube.com/embed/grNJAp1xAi0?si=Bf9CAP9lB1uWErOZ","0","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"," ",[132,133,87],"h2",{"id":134},"set-up-environment-variables-of-mlflow",[13,136,137,138,142],{},"On the host where the code is executed, set the environment variables for tracking URI and token. This might be a remote host, CI pipeline, or your local environment. When they are set, you can call ",[139,140,141],"code",{},"mlflow.set_experiment(\"\u003Cexperiment_name>\")",". As a reference:",[144,145,150],"pre",{"className":146,"code":147,"language":148,"meta":149,"style":149},"language-shell shiki shiki-themes github-light","export MLFLOW_TRACKING_URI=\"\u003Cyour gitlab endpoint>/api/v4/projects/\u003Cyour project id>/ml/mlflow\"\nexport MLFLOW_TRACKING_TOKEN=\"\u003Cyour_access_token>\"\n","shell","",[139,151,152,172],{"__ignoreMap":149},[153,154,157,161,165,168],"span",{"class":155,"line":156},"line",1,[153,158,160],{"class":159},"sD7c4","export",[153,162,164],{"class":163},"sgsFI"," MLFLOW_TRACKING_URI",[153,166,167],{"class":159},"=",[153,169,171],{"class":170},"sYBdl","\"\u003Cyour gitlab endpoint>/api/v4/projects/\u003Cyour project id>/ml/mlflow\"\n",[153,173,175,177,180,182],{"class":155,"line":174},2,[153,176,160],{"class":159},[153,178,179],{"class":163}," MLFLOW_TRACKING_TOKEN",[153,181,167],{"class":159},[153,183,184],{"class":170},"\"\u003Cyour_access_token>\"\n",[13,186,187,190,191,194],{},[16,188,189],{},"Note:"," If the training code contains the call to ",[139,192,193],{},"mlflow.set_tracking_uri()",", remove it.",[132,196,93],{"id":197},"train-and-log-candidates-at-merge-request",[13,199,200],{},"In your model train code, you can use MLflow methods to log metrics, artifacts, and parameters. You can also divide the train steps into pipeline stages if you are comfortable with that part. In this example, one Python file will be used for both training and report generation.",[144,202,207],{"className":203,"code":205,"language":206,"meta":149},[204],"language-text","mlflow.log_params(params)\nmlflow.log_metrics(metrics_data)\nmlflow.log_artifact(artifacts)\n","text",[139,208,205],{"__ignoreMap":149},[13,210,211],{},"You can then create the necessary pipeline to train the experiment. By adding the relevant rules, you can trigger this pipeline manually in merge requests and observe the report generated as MR Note.",[13,213,214,215,117],{},"When the pipeline is finished, you can see the details about the candidate in ",[16,216,217],{},"Analyze > Model Experiments",[13,219,220],{},[221,222],"img",{"alt":223,"src":224},"details about the candidate in the finished pipeline","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749676127/Blog/Content%20Images/Screenshot_1.png",[132,226,99],{"id":227},"register-the-most-successful-candidate",[13,229,230],{},"According to the measurements you have made, we can register the most successful candidate (may be the one with the highest accuracy value) with the Run ID of the candidate.",[13,232,233],{},"But first, we need to create a model and its version in Registry. I created these steps in separate stages and components (because I may need these steps in other projects). You should be careful to use semantic versioning when versioning.",[235,236,238],"h3",{"id":237},"register-source-model-parameters-and-metrics","Register source model parameters and metrics",[144,240,243],{"className":241,"code":242,"language":206,"meta":149},[204],"source_candidate = client.get_run(source_candidate_id)\nparams = { k: v for k, v in source_candidate.data.params.items() }\nmetric = { k: v for k, v in source_candidate.data.metrics.items() }\n\nmodel_version = client.get_model_version(model_name, version)\nrun_id = model_version.run_id\nmodel_class = \"\"\nfor name, value in params.items():\n    client.log_param(run_id, name, value)\n    if name == \"Class\":\n        model_class = value\n\nfor name, value in metric.items():\n    client.log_metric(run_id, name, value)\n\n",[139,244,242],{"__ignoreMap":149},[13,246,247,248,253],{},"After logging the parameters and metrics, you can ",[28,249,252],{"href":250,"rel":251},"https://gitlab.com/gitlab-partners-public/obss/mlops-loan-prediction/-/blob/main/register_candidate.py",[],"register the artifacts"," as you did in the train step.",[13,255,256,257,117],{},"You may want to manually enter the inputs of the relevant steps as ",[28,258,261],{"href":259,"rel":260},"https://gitlab.com/gitlab-partners-public/obss/components/-/blob/main/templates/register-candidate.yml",[],"a variable in the pipeline",[132,263,265],{"id":264},"cicd-components","CI/CD components",[13,267,268,269,273],{},"I have used ",[28,270,265],{"href":271,"rel":272},"https://docs.gitlab.com/ci/components/",[]," because they provide a structured environment for managing machine learning workflows. These components enable reusability by allowing teams to store and share standardized scripts, models, and datasets, ensuring that previous work can be easily accessed, modified, and redeployed in future projects, thus accelerating development and reducing redundancy.",[275,276,277],"blockquote",{},[13,278,279,117],{},[28,280,283],{"href":281,"rel":282},"https://about.gitlab.com/blog/ci-cd-catalog-goes-ga-no-more-building-pipelines-from-scratch/",[],"Learn more about CI/CD components and the CI/CD Catalog",[132,285,105],{"id":286},"dockerize-and-deploy-an-ml-app-with-the-registered-model",[13,288,289,290,117],{},"In this project, while registering the model, I also register the pkl file as an artifact and then create the docker image with that artifact and send it to ",[28,291,294],{"href":292,"rel":293},"https://about.gitlab.com/blog/next-generation-gitlab-container-registry-goes-ga/",[],"GitLab Container Registry",[13,296,297],{},"You can now access your Docker image from the Container Registry and deploy it to your environment with the method you want.",[132,299,301],{"id":300},"resources","Resources",[62,303,304,311,318,323],{},[65,305,306],{},[28,307,310],{"href":308,"rel":309},"https://docs.gitlab.com/user/project/ml/experiment_tracking/",[],"Model experiments",[65,312,313],{},[28,314,317],{"href":315,"rel":316},"https://docs.gitlab.com/user/project/ml/experiment_tracking/mlflow_client/",[],"MLflow client compatibility",[65,319,320],{},[28,321,265],{"href":271,"rel":322},[],[65,324,325],{},[28,326,329],{"href":327,"rel":328},"https://about.gitlab.com/blog/there-is-no-mlops-without-devsecops/",[],"Building GitLab with GitLab: Why there is no MLOps without DevSecOps",[13,331,332],{},[19,333,334,337,338,343],{},[16,335,336],{},"Credits:","\nThis tutorial and the corresponding sample projects were created and generously shared with the community by ",[28,339,342],{"href":340,"rel":341},"https://obss.tech/en/",[],"OBSS",". OBSS is an EMEA-based channel partner of GitLab. They have deep expertise across the whole DevSecOps lifecycle and amongst many other things, they are more than happy to support customers with migrating their MLOps workloads to GitLab.",[345,346,347],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}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":149,"searchDepth":174,"depth":174,"links":349},[350,351,352,356,357,358],{"id":134,"depth":174,"text":87},{"id":197,"depth":174,"text":93},{"id":227,"depth":174,"text":99,"children":353},[354],{"id":237,"depth":355,"text":238},3,{"id":264,"depth":174,"text":265},{"id":286,"depth":174,"text":105},{"id":300,"depth":174,"text":301},"ai","2024-09-17","Learn how to manage your ML apps entirely through GitLab with this tutorial. Also discover the role machine learning operations, or MLOps, plays in automating the DevSecOps lifecycle.","md",null,true,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749660151/Blog/Hero%20Images/blog-image-template-1800x945__26_.png",{},"/en-us/blog/build-an-ml-app-pipeline-with-gitlab-model-registry-using-mlflow",{"title":5,"description":361,"ogTitle":5,"ogDescription":361,"noIndex":369,"ogImage":365,"ogUrl":370,"ogSiteName":371,"ogType":372,"canonicalUrls":370},false,"https://about.gitlab.com/blog/build-an-ml-app-pipeline-with-gitlab-model-registry-using-mlflow","https://about.gitlab.com","article","build-an-ml-app-pipeline-with-gitlab-model-registry-using-mlflow","en-us/blog/build-an-ml-app-pipeline-with-gitlab-model-registry-using-mlflow",[376,377,378,379],"AI","tutorial","CI/CD","partners","BlogPost","vhFVqBWzehlfpWxpBkpoKpDD3pE5uCYPyKV91dClr-k",{"logo":383,"freeTrial":388,"sales":393,"login":398,"items":403,"search":726,"minimal":757,"duo":776,"switchNav":785,"pricingDeployment":796},{"config":384},{"href":385,"dataGaName":386,"dataGaLocation":387},"/","gitlab logo","header",{"text":389,"config":390},"Get free trial",{"href":391,"dataGaName":392,"dataGaLocation":387},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":394,"config":395},"Request a demo",{"href":396,"dataGaName":397,"dataGaLocation":387},"/sales/?contact-topic=request-demo","sales",{"text":399,"config":400},"Sign in",{"href":401,"dataGaName":402,"dataGaLocation":387},"https://gitlab.com/users/sign_in/","sign in",[404,433,532,537,648,704],{"text":405,"config":406,"menu":408},"Platform",{"dataNavLevelOne":407},"platform",{"type":409,"columns":410},"cards",[411,417,425],{"title":405,"description":412,"link":413},"The intelligent orchestration platform for DevSecOps",{"text":414,"config":415},"Explore our Platform",{"href":416,"dataGaName":407,"dataGaLocation":387},"/platform/",{"title":418,"description":419,"link":420},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":421,"config":422},"Meet GitLab Duo",{"href":423,"dataGaName":424,"dataGaLocation":387},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":426,"description":427,"link":428},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":429,"config":430},"Learn more",{"href":431,"dataGaName":432,"dataGaLocation":387},"/why-gitlab/","why gitlab",{"text":434,"left":364,"config":435,"menu":437},"Product",{"dataNavLevelOne":436},"solutions",{"type":438,"link":439,"columns":443,"feature":511},"lists",{"text":440,"config":441},"View all Solutions",{"href":442,"dataGaName":436,"dataGaLocation":387},"/solutions/",[444,467,490],{"title":445,"description":446,"link":447,"items":452},"Automation","CI/CD and automation to accelerate deployment",{"config":448},{"icon":449,"href":450,"dataGaName":451,"dataGaLocation":387},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[453,456,459,463],{"text":378,"config":454},{"href":455,"dataGaLocation":387,"dataGaName":378},"/solutions/continuous-integration/",{"text":418,"config":457},{"href":423,"dataGaLocation":387,"dataGaName":458},"gitlab duo agent platform - product menu",{"text":460,"config":461},"Source Code Management",{"href":462,"dataGaLocation":387,"dataGaName":460},"/solutions/source-code-management/",{"text":464,"config":465},"Automated Software Delivery",{"href":450,"dataGaLocation":387,"dataGaName":466},"Automated software delivery",{"title":468,"description":469,"link":470,"items":475},"Security","Deliver code faster without compromising security",{"config":471},{"href":472,"dataGaName":473,"dataGaLocation":387,"icon":474},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[476,480,485],{"text":477,"config":478},"Application Security Testing",{"href":472,"dataGaName":479,"dataGaLocation":387},"Application security testing",{"text":481,"config":482},"Software Supply Chain Security",{"href":483,"dataGaLocation":387,"dataGaName":484},"/solutions/supply-chain/","Software supply chain security",{"text":486,"config":487},"Software Compliance",{"href":488,"dataGaName":489,"dataGaLocation":387},"/solutions/software-compliance/","software compliance",{"title":491,"link":492,"items":497},"Measurement",{"config":493},{"icon":494,"href":495,"dataGaName":496,"dataGaLocation":387},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[498,502,506],{"text":499,"config":500},"Visibility & Measurement",{"href":495,"dataGaLocation":387,"dataGaName":501},"Visibility and Measurement",{"text":503,"config":504},"Value Stream Management",{"href":505,"dataGaLocation":387,"dataGaName":503},"/solutions/value-stream-management/",{"text":507,"config":508},"Analytics & Insights",{"href":509,"dataGaLocation":387,"dataGaName":510},"/solutions/analytics-and-insights/","Analytics and insights",{"title":512,"type":438,"items":513},"GitLab for",[514,520,526],{"text":515,"config":516},"Enterprise",{"icon":517,"href":518,"dataGaLocation":387,"dataGaName":519},"Building","/enterprise/","enterprise",{"text":521,"config":522},"Small Business",{"icon":523,"href":524,"dataGaLocation":387,"dataGaName":525},"Work","/small-business/","small business",{"text":527,"config":528},"Public Sector",{"icon":529,"href":530,"dataGaLocation":387,"dataGaName":531},"Organization","/solutions/public-sector/","public sector",{"text":533,"config":534},"Pricing",{"href":535,"dataGaName":536,"dataGaLocation":387,"dataNavLevelOne":536},"/pricing/","pricing",{"text":301,"config":538,"menu":539},{"dataNavLevelOne":300},{"type":438,"link":540,"columns":544,"feature":637},{"text":541,"config":542},"View all resources",{"href":543,"dataGaName":300,"dataGaLocation":387},"/resources/",[545,578,605],{"title":546,"items":547},"Getting started",[548,553,558,563,568,573],{"text":549,"config":550},"Install",{"href":551,"dataGaName":552,"dataGaLocation":387},"/install/","install",{"text":554,"config":555},"Quick start guides",{"href":556,"dataGaName":557,"dataGaLocation":387},"/get-started/","quick setup checklists",{"text":559,"config":560},"Learn",{"href":561,"dataGaLocation":387,"dataGaName":562},"https://university.gitlab.com/","learn",{"text":564,"config":565},"Product documentation",{"href":566,"dataGaName":567,"dataGaLocation":387},"https://docs.gitlab.com/","product documentation",{"text":569,"config":570},"Best practice videos",{"href":571,"dataGaName":572,"dataGaLocation":387},"/getting-started-videos/","best practice videos",{"text":574,"config":575},"Integrations",{"href":576,"dataGaName":577,"dataGaLocation":387},"/integrations/","integrations",{"title":579,"items":580},"Discover",[581,586,591,596,600],{"text":582,"config":583},"Customer success stories",{"href":584,"dataGaName":585,"dataGaLocation":387},"/customers/","customer success stories",{"text":587,"config":588},"Blog",{"href":589,"dataGaName":590,"dataGaLocation":387},"/blog/","blog",{"text":592,"config":593},"Demo Hub",{"href":594,"dataGaName":595,"dataGaLocation":387},"/demo-hub/","demo hub",{"text":597,"config":598},"The Source",{"href":599,"dataGaName":590,"dataGaLocation":387},"/the-source/",{"text":601,"config":602},"Remote",{"href":603,"dataGaName":604,"dataGaLocation":387},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":606,"items":607},"Connect",[608,613,618,623,628,633],{"text":609,"config":610},"GitLab Services",{"href":611,"dataGaName":612,"dataGaLocation":387},"/services/","services",{"text":614,"config":615},"Contribute",{"href":616,"dataGaName":617,"dataGaLocation":387},"https://contributors.gitlab.com","contribute",{"text":619,"config":620},"Community",{"href":621,"dataGaName":622,"dataGaLocation":387},"/community/","community",{"text":624,"config":625},"Forum",{"href":626,"dataGaName":627,"dataGaLocation":387},"https://forum.gitlab.com/","forum",{"text":629,"config":630},"Events",{"href":631,"dataGaName":632,"dataGaLocation":387},"/events/","events",{"text":634,"config":635},"Partners",{"href":636,"dataGaName":379,"dataGaLocation":387},"/partners/",{"config":638,"title":641,"text":642,"link":643},{"background":639,"textColor":640},"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":644,"config":645},"Read the latest",{"href":646,"dataGaName":647,"dataGaLocation":387},"/whats-new/","whats new",{"text":649,"config":650,"menu":652},"Company",{"dataNavLevelOne":651},"company",{"type":438,"columns":653},[654],{"items":655},[656,661,667,669,674,679,684,689,694,699],{"text":657,"config":658},"About",{"href":659,"dataGaName":660,"dataGaLocation":387},"/company/","about",{"text":662,"config":663,"footerGa":666},"Jobs",{"href":664,"dataGaName":665,"dataGaLocation":387},"/jobs/","jobs",{"dataGaName":665},{"text":629,"config":668},{"href":631,"dataGaName":632,"dataGaLocation":387},{"text":670,"config":671},"Leadership",{"href":672,"dataGaName":673,"dataGaLocation":387},"/company/team/e-group/","leadership",{"text":675,"config":676},"Handbook",{"href":677,"dataGaName":678,"dataGaLocation":387},"https://handbook.gitlab.com/","handbook",{"text":680,"config":681},"Investor relations",{"href":682,"dataGaName":683,"dataGaLocation":387},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":685,"config":686},"Trust Center",{"href":687,"dataGaName":688,"dataGaLocation":387},"/security/","trust center",{"text":690,"config":691},"AI Transparency Center",{"href":692,"dataGaName":693,"dataGaLocation":387},"/ai-transparency-center/","ai transparency center",{"text":695,"config":696},"Newsletter",{"href":697,"dataGaName":698,"dataGaLocation":387},"/company/contact/#contact-forms","newsletter",{"text":700,"config":701},"Press",{"href":702,"dataGaName":703,"dataGaLocation":387},"/press/","press",{"text":705,"config":706,"menu":707},"Contact us",{"dataNavLevelOne":651},{"type":438,"columns":708},[709],{"items":710},[711,716,721],{"text":712,"config":713},"Talk to sales",{"href":714,"dataGaName":715,"dataGaLocation":387},"/sales/","talk to sales",{"text":717,"config":718},"Support portal",{"href":719,"dataGaName":720,"dataGaLocation":387},"https://support.gitlab.com/hc/en-us","support portal",{"text":722,"config":723},"Customer portal",{"href":724,"dataGaName":725,"dataGaLocation":387},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":727,"login":728,"suggestions":735},"Close",{"text":729,"link":730},"To search repositories and projects, login to",{"text":731,"config":732},"gitlab.com",{"href":401,"dataGaName":733,"dataGaLocation":734},"search login","search",{"text":736,"default":737},"Suggestions",[738,740,744,746,750,754],{"text":418,"config":739},{"href":423,"dataGaName":418,"dataGaLocation":734},{"text":741,"config":742},"Code Suggestions (AI)",{"href":743,"dataGaName":741,"dataGaLocation":734},"/solutions/code-suggestions/",{"text":378,"config":745},{"href":455,"dataGaName":378,"dataGaLocation":734},{"text":747,"config":748},"GitLab on AWS",{"href":749,"dataGaName":747,"dataGaLocation":734},"/partners/technology-partners/aws/",{"text":751,"config":752},"GitLab on Google Cloud",{"href":753,"dataGaName":751,"dataGaLocation":734},"/partners/technology-partners/google-cloud-platform/",{"text":755,"config":756},"Why GitLab?",{"href":431,"dataGaName":755,"dataGaLocation":734},{"freeTrial":758,"mobileIcon":763,"desktopIcon":768,"secondaryButton":771},{"text":759,"config":760},"Start free trial",{"href":761,"dataGaName":392,"dataGaLocation":762},"https://gitlab.com/-/trials/new/","nav",{"altText":764,"config":765},"Gitlab Icon",{"src":766,"dataGaName":767,"dataGaLocation":762},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":764,"config":769},{"src":770,"dataGaName":767,"dataGaLocation":762},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":772,"config":773},"Get Started",{"href":774,"dataGaName":775,"dataGaLocation":762},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":777,"mobileIcon":781,"desktopIcon":783},{"text":778,"config":779},"Learn more about GitLab Duo",{"href":423,"dataGaName":780,"dataGaLocation":762},"gitlab duo",{"altText":764,"config":782},{"src":766,"dataGaName":767,"dataGaLocation":762},{"altText":764,"config":784},{"src":770,"dataGaName":767,"dataGaLocation":762},{"button":786,"mobileIcon":791,"desktopIcon":793},{"text":787,"config":788},"/switch",{"href":789,"dataGaName":790,"dataGaLocation":762},"#contact","switch",{"altText":764,"config":792},{"src":766,"dataGaName":767,"dataGaLocation":762},{"altText":764,"config":794},{"src":795,"dataGaName":767,"dataGaLocation":762},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":797,"mobileIcon":802,"desktopIcon":804},{"text":798,"config":799},"Back to pricing",{"href":535,"dataGaName":800,"dataGaLocation":762,"icon":801},"back to pricing","GoBack",{"altText":764,"config":803},{"src":766,"dataGaName":767,"dataGaLocation":762},{"altText":764,"config":805},{"src":770,"dataGaName":767,"dataGaLocation":762},{"title":807,"titleMobile":808,"button":809,"config":814},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":429,"config":810},{"href":811,"dataGaName":812,"dataGaLocation":813},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":815,"disabled":369},"release",{"data":817},{"text":818,"source":819,"edit":825,"contribute":830,"config":835,"items":840,"minimal":1050},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":820,"config":821},"View page source",{"href":822,"dataGaName":823,"dataGaLocation":824},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":826,"config":827},"Edit this page",{"href":828,"dataGaName":829,"dataGaLocation":824},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":831,"config":832},"Please contribute",{"href":833,"dataGaName":834,"dataGaLocation":824},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":836,"facebook":837,"youtube":838,"linkedin":839},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[841,888,942,986,1018],{"title":533,"links":842,"subMenu":857},[843,847,852],{"text":844,"config":845},"View plans",{"href":535,"dataGaName":846,"dataGaLocation":824},"view plans",{"text":848,"config":849},"Why Premium?",{"href":850,"dataGaName":851,"dataGaLocation":824},"/pricing/premium/","why premium",{"text":853,"config":854},"Why Ultimate?",{"href":855,"dataGaName":856,"dataGaLocation":824},"/pricing/ultimate/","why ultimate",[858],{"title":859,"links":860},"Contact Us",[861,864,866,868,873,878,883],{"text":862,"config":863},"Contact sales",{"href":714,"dataGaName":397,"dataGaLocation":824},{"text":717,"config":865},{"href":719,"dataGaName":720,"dataGaLocation":824},{"text":722,"config":867},{"href":724,"dataGaName":725,"dataGaLocation":824},{"text":869,"config":870},"Status",{"href":871,"dataGaName":872,"dataGaLocation":824},"https://status.gitlab.com/","status",{"text":874,"config":875},"Terms of use",{"href":876,"dataGaName":877,"dataGaLocation":824},"/terms/","terms of use",{"text":879,"config":880},"Privacy statement",{"href":881,"dataGaName":882,"dataGaLocation":824},"/privacy/","privacy statement",{"text":884,"config":885},"Cookie preferences",{"dataGaName":886,"dataGaLocation":824,"id":887,"isOneTrustButton":364},"cookie preferences","ot-sdk-btn",{"title":434,"links":889,"subMenu":898},[890,894],{"text":891,"config":892},"DevSecOps platform",{"href":416,"dataGaName":893,"dataGaLocation":824},"devsecops platform",{"text":895,"config":896},"AI-Assisted Development",{"href":423,"dataGaName":897,"dataGaLocation":824},"ai-assisted development",[899],{"title":900,"links":901},"Topics",[902,907,912,917,922,927,932,937],{"text":903,"config":904},"CICD",{"href":905,"dataGaName":906,"dataGaLocation":824},"/topics/ci-cd/","cicd",{"text":908,"config":909},"GitOps",{"href":910,"dataGaName":911,"dataGaLocation":824},"/topics/gitops/","gitops",{"text":913,"config":914},"DevOps",{"href":915,"dataGaName":916,"dataGaLocation":824},"/topics/devops/","devops",{"text":918,"config":919},"Version Control",{"href":920,"dataGaName":921,"dataGaLocation":824},"/topics/version-control/","version control",{"text":923,"config":924},"DevSecOps",{"href":925,"dataGaName":926,"dataGaLocation":824},"/topics/devsecops/","devsecops",{"text":928,"config":929},"Cloud Native",{"href":930,"dataGaName":931,"dataGaLocation":824},"/topics/cloud-native/","cloud native",{"text":933,"config":934},"AI for Coding",{"href":935,"dataGaName":936,"dataGaLocation":824},"/topics/devops/ai-for-coding/","ai for coding",{"text":938,"config":939},"Agentic AI",{"href":940,"dataGaName":941,"dataGaLocation":824},"/topics/agentic-ai/","agentic ai",{"title":943,"links":944},"Solutions",[945,947,949,954,958,961,965,968,970,973,976,981],{"text":477,"config":946},{"href":472,"dataGaName":477,"dataGaLocation":824},{"text":466,"config":948},{"href":450,"dataGaName":451,"dataGaLocation":824},{"text":950,"config":951},"Agile development",{"href":952,"dataGaName":953,"dataGaLocation":824},"/solutions/agile-delivery/","agile delivery",{"text":955,"config":956},"SCM",{"href":462,"dataGaName":957,"dataGaLocation":824},"source code management",{"text":903,"config":959},{"href":455,"dataGaName":960,"dataGaLocation":824},"continuous integration & delivery",{"text":962,"config":963},"Value stream management",{"href":505,"dataGaName":964,"dataGaLocation":824},"value stream management",{"text":908,"config":966},{"href":967,"dataGaName":911,"dataGaLocation":824},"/solutions/gitops/",{"text":515,"config":969},{"href":518,"dataGaName":519,"dataGaLocation":824},{"text":971,"config":972},"Small business",{"href":524,"dataGaName":525,"dataGaLocation":824},{"text":974,"config":975},"Public sector",{"href":530,"dataGaName":531,"dataGaLocation":824},{"text":977,"config":978},"Education",{"href":979,"dataGaName":980,"dataGaLocation":824},"/solutions/education/","education",{"text":982,"config":983},"Financial services",{"href":984,"dataGaName":985,"dataGaLocation":824},"/solutions/finance/","financial services",{"title":301,"links":987},[988,990,992,994,997,999,1002,1004,1006,1008,1010,1012,1014,1016],{"text":549,"config":989},{"href":551,"dataGaName":552,"dataGaLocation":824},{"text":554,"config":991},{"href":556,"dataGaName":557,"dataGaLocation":824},{"text":559,"config":993},{"href":561,"dataGaName":562,"dataGaLocation":824},{"text":564,"config":995},{"href":566,"dataGaName":996,"dataGaLocation":824},"docs",{"text":587,"config":998},{"href":589,"dataGaName":590,"dataGaLocation":824},{"text":1000,"config":1001},"What's new",{"href":646,"dataGaName":647,"dataGaLocation":824},{"text":582,"config":1003},{"href":584,"dataGaName":585,"dataGaLocation":824},{"text":601,"config":1005},{"href":603,"dataGaName":604,"dataGaLocation":824},{"text":609,"config":1007},{"href":611,"dataGaName":612,"dataGaLocation":824},{"text":614,"config":1009},{"href":616,"dataGaName":617,"dataGaLocation":824},{"text":619,"config":1011},{"href":621,"dataGaName":622,"dataGaLocation":824},{"text":624,"config":1013},{"href":626,"dataGaName":627,"dataGaLocation":824},{"text":629,"config":1015},{"href":631,"dataGaName":632,"dataGaLocation":824},{"text":634,"config":1017},{"href":636,"dataGaName":379,"dataGaLocation":824},{"title":649,"links":1019},[1020,1022,1024,1026,1028,1030,1034,1039,1041,1043,1045],{"text":657,"config":1021},{"href":659,"dataGaName":651,"dataGaLocation":824},{"text":662,"config":1023},{"href":664,"dataGaName":665,"dataGaLocation":824},{"text":670,"config":1025},{"href":672,"dataGaName":673,"dataGaLocation":824},{"text":675,"config":1027},{"href":677,"dataGaName":678,"dataGaLocation":824},{"text":680,"config":1029},{"href":682,"dataGaName":683,"dataGaLocation":824},{"text":1031,"config":1032},"Sustainability",{"href":1033,"dataGaName":1031,"dataGaLocation":824},"/sustainability/",{"text":1035,"config":1036},"Diversity, inclusion and belonging (DIB)",{"href":1037,"dataGaName":1038,"dataGaLocation":824},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":685,"config":1040},{"href":687,"dataGaName":688,"dataGaLocation":824},{"text":695,"config":1042},{"href":697,"dataGaName":698,"dataGaLocation":824},{"text":700,"config":1044},{"href":702,"dataGaName":703,"dataGaLocation":824},{"text":1046,"config":1047},"Modern Slavery Transparency Statement",{"href":1048,"dataGaName":1049,"dataGaLocation":824},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1051},[1052,1055,1058],{"text":1053,"config":1054},"Terms",{"href":876,"dataGaName":877,"dataGaLocation":824},{"text":1056,"config":1057},"Cookies",{"dataGaName":886,"dataGaLocation":824,"id":887,"isOneTrustButton":364},{"text":1059,"config":1060},"Privacy",{"href":881,"dataGaName":882,"dataGaLocation":824},[1062,1078],{"id":1063,"title":1064,"body":363,"config":1065,"content":1067,"description":363,"extension":1072,"meta":1073,"navigation":364,"path":1074,"seo":1075,"stem":1076,"__hash__":1077},"blogAuthors/en-us/blog/authors/gufran-yeilyurt-obss.yml","Gufran Yeilyurt Obss",{"template":1066},"BlogAuthor",{"name":7,"config":1068},{"headshot":1069,"linkedin":1070,"ctfId":1071},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749666380/Blog/Author%20Headshots/1643972670650.jpg","https://www.linkedin.com/in/gufran-yesilyurt/","2ydYMU86my71BUASual2EI","yml",{},"/en-us/blog/authors/gufran-yeilyurt-obss",{},"en-us/blog/authors/gufran-yeilyurt-obss","ZuRDHnG3DPYj2wujBvsvrAXii98gwZmz4z4laZGEVeA",{"id":1079,"title":1080,"body":363,"config":1081,"content":1082,"description":363,"extension":1072,"meta":1086,"navigation":364,"path":1087,"seo":1088,"stem":1089,"__hash__":1090},"blogAuthors/en-us/blog/authors/pter-bozs.yml","Pter Bozs",{"template":1066},{"name":8,"config":1083},{"headshot":1084,"ctfId":1085},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749666384/Blog/Author%20Headshots/pbozso_headshot.png","4i1NVYip0RqxRnbpZ9deKp",{},"/en-us/blog/authors/pter-bozs",{},"en-us/blog/authors/pter-bozs","M3DsNH5-3AKaaKicmGt_Gqj-Vp7wbz2QaGO8u57CB04",[1092,1100,1108],{"title":1093,"description":1094,"heroImage":1095,"category":359,"date":1096,"authors":1097,"slug":1099,"externalUrl":363},"How I built a demo generator with GitLab Duo Agent Platform","Demos haven't always looked like this. Looking back over my career, here's how they have evolved. Follow the tutorial to build your own demo and agent.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-08-13",[1098],"Itzik Gan Baruch","agentic-click-through-demo",{"title":1101,"description":1102,"heroImage":1103,"category":359,"date":1104,"authors":1105,"slug":1107,"externalUrl":363},"How to govern agentic AI, MCPs, and AI code assistants","AI agents can write, push, and deploy without human review at each step. Learn a practical framework for controlling access, permissions, and audit trails.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785337625/ifzlc2hyzaxhzmjgyymh.png","2026-07-31",[1106],"Julie Griffin","govern-agentic-ai-mcps-code-assistants",{"title":1109,"description":1110,"heroImage":1111,"category":359,"date":1112,"authors":1113,"slug":1115,"externalUrl":363},"Claude Opus 5 on GitLab: Reasoning built for the hard tasks","Anthropic’s Claude Opus 5 is now available on GitLab Duo Agent Platform, delivering deeper reasoning without sacrificing speed.","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-07-27",[1114],"Brittany Lutz","claude-opus-5-on-gitlab-duo-agent-platform",{"promotions":1117},[1118,1131,1143,1155],{"id":1119,"categories":1120,"header":1121,"text":1122,"button":1123,"image":1128},"ai-modernization",[359],"Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1124,"config":1125},"Get your AI maturity score",{"href":1126,"dataGaName":1127,"dataGaLocation":590},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1129},{"src":1130},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1132,"categories":1133,"header":1135,"text":1122,"button":1136,"image":1140},"devops-modernization",[1134,926],"product","Are you just managing tools or shipping innovation?",{"text":1137,"config":1138},"Get your DevOps maturity score",{"href":1139,"dataGaName":1127,"dataGaLocation":590},"/assessments/devops-modernization-assessment/",{"config":1141},{"src":1142},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1144,"categories":1145,"header":1147,"text":1122,"button":1148,"image":1152},"security-modernization",[1146],"security","Are you trading speed for security?",{"text":1149,"config":1150},"Get your security maturity score",{"href":1151,"dataGaName":1127,"dataGaLocation":590},"/assessments/security-modernization-assessment/",{"config":1153},{"src":1154},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1156,"paths":1157,"header":1160,"text":1161,"button":1162,"image":1167},"github-azure-migration",[1158,1159],"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":1163,"config":1164},"See how GitLab compares to GitHub",{"href":1165,"dataGaName":1166,"dataGaLocation":590},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1168},{"src":1142},{"header":1170,"blurb":1171,"button":1172,"secondaryButton":1177},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1173,"config":1174},"Get your free trial",{"href":1175,"dataGaName":392,"dataGaLocation":1176},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":862,"config":1178},{"href":714,"dataGaName":397,"dataGaLocation":1176},1786803757586]