[{"data":1,"prerenderedAt":1205},["ShallowReactive",2],{"/blog/gitlab-and-reproducibility":3,"navigation-en-us":419,"banner-en-us":847,"footer-en-us":857,"blog-post-authors-en-us-Vicky Steeves":1102,"blog-related-posts-en-us-gitlab-and-reproducibility":1116,"blog-promotions-en-us":1141,"next-steps-en-us":1195},{"id":4,"title":5,"authors":6,"body":8,"category":394,"date":395,"description":396,"extension":397,"externalUrl":398,"faq":398,"featured":399,"heroImage":400,"meta":401,"navigation":246,"path":406,"seo":407,"slug":411,"stem":412,"tags":413,"template":417,"updatedDate":398,"__hash__":418},"blogPosts/en-us/blog/gitlab-and-reproducibility.md","How GitLab can help in research reproducibility",[7],"Vicky Steeves",{"type":9,"value":10,"toc":388},"minimark",[11,15,22,25,30,33,43,104,107,113,117,132,135,138,144,147,151,162,172,175,310,313,316,348,356,361,364,384],[12,13,14],"p",{},"GitLab is a great platform for active, ongoing, collaborative research. It enables folks to work together easily and share that work in the open. This is especially poignant given the problems in sharing code in academia, across time and people.",[12,16,17],{},[18,19],"img",{"alt":20,"src":21},"phd-code-comic","https://phdcomics.com/comics/archive/phd031214s.gif",[12,23,24],{},"It's no surprise that GitLab, a platform for collaborative coding and Git repository hosting, has features for reproducibility that researchers can leverage for their own and their communities’ benefit.",[26,27,29],"h3",{"id":28},"what-exactly-is-reproducibility","What exactly is reproducibility?",[12,31,32],{},"Reproducibility is a core component in a variety of work, from software engineering to research. For software engineers, the ability to reproduce errors or functionality is key to development. For researchers, reproducibility is about independent verification of results/methods, to build on top of previous work, and to increase the impact, visibility, and quality of research. Y’know. That Sir Isaac Newton quote in every reproducibility presentation ever: \"If I have seen further, it is by standing on the shoulders of giants.\"",[12,34,35,36,42],{},"Like all things, reproducibility exists on a spectrum. I like Stodden et al’s definitions from the ",[37,38,41],"a",{"href":39,"rel":40},"http://stodden.net/icerm_report.pdf",[],"2013 ICERM report",", so I’ll use those:",[44,45,46,60],"table",{},[47,48,49],"thead",{},[50,51,52,57],"tr",{},[53,54,56],"th",{"align":55},"left","ICERM Report Definitions",[53,58,59],{"align":55},"Potential Real-World Examples",[61,62,63,72,80,88,96],"tbody",{},[50,64,65,69],{},[66,67,68],"td",{"align":55},"Reviewable Research: Sufficient detail for peer review and assessment",[66,70,71],{"align":55},"The code and data are openly available",[50,73,74,77],{},[66,75,76],{"align":55},"Replicable Research: Tools are available to duplicate the author’s results using their data",[66,78,79],{"align":55},"The tools (software) used in the analysis are freely available for others to confirm results",[50,81,82,85],{},[66,83,84],{"align":55},"Confirmable Research: Main conclusions can be attained independently without author’s software",[66,86,87],{"align":55},"Others can reach the conclusion using similar tools, not necessarily the same as the author, or on a different operating system",[50,89,90,93],{},[66,91,92],{"align":55},"Auditable Research: Process and tools archived such that it can be defended later if necessary",[66,94,95],{"align":55},"The tools, environment, data, and code are put into a preservation-ready format",[50,97,98,101],{},[66,99,100],{"align":55},"Open/Reproducible Research: Auditable research made openly available",[66,102,103],{"align":55},"Everything above is made available in a repository for others to examine and use",[12,105,106],{},"The last bullet there is the goal – open and reproducible research. Releasing code and data are key to open research, but not necessarily enough for reproducibility. This is where the concept of computational reproducibility becomes important, where whole environments are captured. You could also look at it this way:",[12,108,109],{},[18,110],{"alt":111,"src":112},"reproducibility-pyramid","https://osf.io/8rx9y/download",[26,114,116],{"id":115},"how-can-gitlab-help","How can GitLab help?",[12,118,119,120,125,126,131],{},"There are a few solutions out there, including containers (such as Docker or Singularity) for active research, and ",[37,121,124],{"href":122,"rel":123},"http://o2r.info/",[],"o2r"," and ",[37,127,130],{"href":128,"rel":129},"https://reprozip.org",[],"ReproZip"," for capturing and reproducing completed research. For this post, I’m going to focus on active research and containers.",[12,133,134],{},"I like GitLab for research reproducibility because it makes working together simple, and seamless. There’s no hacking together 100 different third-party services. GitLab has hosting, LFS, and integrated Continuous Integration for free, for both public and private repositories! Everything is integrated in a single GitLab repository which, if made publicly available, can enable secondary users to reproduce results in a more streamlined fashion. You can also keep these private to a group – you control the visibility of everything in one repository in one place, as opposed to updating permissions across multiple services.",[12,136,137],{},"There are a few key features that set GitLab apart when it comes to containers and reproducibility. The first is that GitLab doesn’t use a third-party service for continuous integration. It’s shipped with CI runners which can use Docker images from GitLab’s registry. Basically, you can use the Docker Container Registry, a secure, private Docker registry, to choose a container that GitLab CI uses to run each job in a separate and isolated container.",[12,139,140],{},[18,141],{"alt":142,"src":143},"gitlab-ci-repro","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782404836/site/Content%20Images/ci/arch-1.jpg",[12,145,146],{},"If you don’t feel like using the GitLab registry, you can also use images from DockerHub or a custom Docker container you’re already using locally. These can be integrated with GitLab CI, and if made public, any secondary users can use it as well!",[26,148,150],{"id":149},"lets-look-at-an-example","Let's look at an example",[12,152,153,154,158,159,161],{},"This process is set up in a single file, a ",[155,156,157],"code",{},".gitlab-ci.yml",". Another feature that makes my life easier – GitLab can syntax-check the CI config files! The ",[155,160,157],{}," file describes the pipelines and stages, each of which has a different function and can have its own tags, produce its own artifacts, and reuse artifacts from other stages. These stages can also run in parallel if needed. Here’s an example of what a basic config file looks like with R:",[163,164,170],"pre",{"className":165,"code":167,"language":168,"meta":169},[166],"language-text","image: jangorecki/r-base-dev\ntest:\n  script:\n    - R CMD build . --no-build-vignettes --no-manual\n    - PKG_FILE_NAME=$(ls -1t *.tar.gz | head -n 1)\n    - R CMD check \"${PKG_FILE_NAME}\" --no-build-vignettes --no-manual --as-cran\n\n","text","",[155,171,167],{"__ignoreMap":169},[12,173,174],{},"And here’s an example of building a website using the GitLab and the static site generator, Nikola:",[163,176,180],{"className":177,"code":178,"language":179,"meta":169,"style":169},"language-yaml shiki shiki-themes github-light","image: registry.gitlab.com/paddy-hack/nikola:7.8.7\ntest:\n  script:\n  - nikola build\n  except:\n  - master\n\npages:\n  script:\n    - nikola build\n  artifacts:\n    paths:\n    - public\n  only:\n  - master\n\n","yaml",[155,181,182,199,208,216,225,233,241,248,256,263,271,279,287,295,303],{"__ignoreMap":169},[183,184,187,191,195],"span",{"class":185,"line":186},"line",1,[183,188,190],{"class":189},"shJU0","image",[183,192,194],{"class":193},"sgsFI",": ",[183,196,198],{"class":197},"sYBdl","registry.gitlab.com/paddy-hack/nikola:7.8.7\n",[183,200,202,205],{"class":185,"line":201},2,[183,203,204],{"class":189},"test",[183,206,207],{"class":193},":\n",[183,209,211,214],{"class":185,"line":210},3,[183,212,213],{"class":189},"  script",[183,215,207],{"class":193},[183,217,219,222],{"class":185,"line":218},4,[183,220,221],{"class":193},"  - ",[183,223,224],{"class":197},"nikola build\n",[183,226,228,231],{"class":185,"line":227},5,[183,229,230],{"class":189},"  except",[183,232,207],{"class":193},[183,234,236,238],{"class":185,"line":235},6,[183,237,221],{"class":193},[183,239,240],{"class":197},"master\n",[183,242,244],{"class":185,"line":243},7,[183,245,247],{"emptyLinePlaceholder":246},true,"\n",[183,249,251,254],{"class":185,"line":250},8,[183,252,253],{"class":189},"pages",[183,255,207],{"class":193},[183,257,259,261],{"class":185,"line":258},9,[183,260,213],{"class":189},[183,262,207],{"class":193},[183,264,266,269],{"class":185,"line":265},10,[183,267,268],{"class":193},"    - ",[183,270,224],{"class":197},[183,272,274,277],{"class":185,"line":273},11,[183,275,276],{"class":189},"  artifacts",[183,278,207],{"class":193},[183,280,282,285],{"class":185,"line":281},12,[183,283,284],{"class":189},"    paths",[183,286,207],{"class":193},[183,288,290,292],{"class":185,"line":289},13,[183,291,268],{"class":193},[183,293,294],{"class":197},"public\n",[183,296,298,301],{"class":185,"line":297},14,[183,299,300],{"class":189},"  only",[183,302,207],{"class":193},[183,304,306,308],{"class":185,"line":305},15,[183,307,221],{"class":193},[183,309,240],{"class":197},[12,311,312],{},"It’s also worth noting that you can use different containers per step in your workflow, if you outline it in your .gitlab-ci.yml. If your data collection script runs in one environment but your analysis script needs another, that’s perfectly fine using GitLab, and others have the information to reproduce it easily! Another feature that puts GitLab apart is that a build of one project can trigger a build of another – AKA, multi-project pipelines. For those of you working with big data, you can automatically spin up and down VMs to make sure your builds get processed immediately with GitLab’s CI as well.",[12,314,315],{},"Here are some other great resources and examples of using GitLab to make research more reproducible:",[317,318,319,327,334,341],"ul",{},[320,321,322],"li",{},[37,323,326],{"href":324,"rel":325},"https://gitlab.com/jangorecki/r.gitlab.ci",[],"Gitlab-CI for R packages",[320,328,329],{},[37,330,333],{"href":331,"rel":332},"http://www.jonzelner.net/statistics/make/docker/reproducibility/2016/05/31/reproducibility-pt-1/",[],"Blog Post explaining GitLab + reproducibility - Jon Zelner",[320,335,336],{},[37,337,340],{"href":338,"rel":339},"https://gitlab.com/jzelner/reproducible-stan",[],"GitLab repo accompanying blog post - Jon Zelner",[320,342,343],{},[37,344,347],{"href":345,"rel":346},"https://www.nersc.gov/assets/Uploads/2017-02-06-Gitlab-CI.pdf",[],"Continuous Integration with Gitlab - Tony Wildish",[12,349,350,351,355],{},"Beyond reproducibility, there are a lot of features that make GitLab an ideal place for me to work and organize my research. I’d urge folks to look at the ",[37,352,354],{"href":353},"/pricing/feature-comparison/","feature list"," and see how they can get started!",[357,358,360],"h2",{"id":359},"about-the-guest-author","About the Guest Author",[12,362,363],{},"Vicky Steeves is the Librarian for Research Data Management and Reproducibility at New York University, a dual appointment between the Division of Libraries and Center for Data Science. In this role, she works supporting researchers in creating well-managed, high quality, and reproducible research through facilitating use of tools such as ReproZip. Her research centers on integrating reproducible practices into the research workflow, advocating openness in all facets of scholarship, and building/contributing to open infrastructure.",[12,365,366,367,372,373,378,379],{},"“",[37,368,371],{"href":369,"rel":370},"https://www.flickr.com/photos/alovesdc/3464555556/",[],"research","” by ",[37,374,377],{"href":375,"rel":376},"https://www.flickr.com/photos/alovesdc/",[],"a loves dc"," is licensed under ",[37,380,383],{"href":381,"rel":382},"https://creativecommons.org/licenses/by/2.0/legalcode",[],"CC BY 2.0",[385,386,387],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .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":169,"searchDepth":201,"depth":201,"links":389},[390,391,392,393],{"id":28,"depth":210,"text":29},{"id":115,"depth":210,"text":116},{"id":149,"depth":210,"text":150},{"id":359,"depth":201,"text":360},"open-source","2017-08-25","NYU reproducibility librarian Vicky Steeves shares why GitLab is her choice for ongoing collaborative research, and how it can help overcome challenges with sharing code in academia.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749672928/Blog/Hero%20Images/gitlab-and-reproducibility.jpg",{"excerpt":402},{"type":9,"value":403},[404],[12,405,14],{},"/en-us/blog/gitlab-and-reproducibility",{"title":5,"description":396,"ogTitle":5,"ogDescription":396,"noIndex":399,"ogImage":400,"ogUrl":408,"ogSiteName":409,"ogType":410,"canonicalUrls":408},"https://about.gitlab.com/blog/gitlab-and-reproducibility","https://about.gitlab.com","article","gitlab-and-reproducibility","en-us/blog/gitlab-and-reproducibility",[414,415,416],"open source","collaboration","user stories","BlogPost","khxY-mUVBbkEogCkzRiEzn9iI302DozfG1ZMvPOFt7E",{"logo":420,"freeTrial":425,"sales":430,"login":435,"items":440,"search":767,"minimal":798,"duo":817,"switchNav":826,"pricingDeployment":837},{"config":421},{"href":422,"dataGaName":423,"dataGaLocation":424},"/","gitlab logo","header",{"text":426,"config":427},"Get free trial",{"href":428,"dataGaName":429,"dataGaLocation":424},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":431,"config":432},"Request a demo",{"href":433,"dataGaName":434,"dataGaLocation":424},"/sales/?contact-topic=request-demo","sales",{"text":436,"config":437},"Sign in",{"href":438,"dataGaName":439,"dataGaLocation":424},"https://gitlab.com/users/sign_in/","sign in",[441,470,570,575,689,745],{"text":442,"config":443,"menu":445},"Platform",{"dataNavLevelOne":444},"platform",{"type":446,"columns":447},"cards",[448,454,462],{"title":442,"description":449,"link":450},"The intelligent orchestration platform for DevSecOps",{"text":451,"config":452},"Explore our Platform",{"href":453,"dataGaName":444,"dataGaLocation":424},"/platform/",{"title":455,"description":456,"link":457},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":458,"config":459},"Meet GitLab Duo",{"href":460,"dataGaName":461,"dataGaLocation":424},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":463,"description":464,"link":465},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":466,"config":467},"Learn more",{"href":468,"dataGaName":469,"dataGaLocation":424},"/why-gitlab/","why gitlab",{"text":471,"left":246,"config":472,"menu":474},"Product",{"dataNavLevelOne":473},"solutions",{"type":475,"link":476,"columns":480,"feature":549},"lists",{"text":477,"config":478},"View all Solutions",{"href":479,"dataGaName":473,"dataGaLocation":424},"/solutions/",[481,505,528],{"title":482,"description":483,"link":484,"items":489},"Automation","CI/CD and automation to accelerate deployment",{"config":485},{"icon":486,"href":487,"dataGaName":488,"dataGaLocation":424},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[490,494,497,501],{"text":491,"config":492},"CI/CD",{"href":493,"dataGaLocation":424,"dataGaName":491},"/solutions/continuous-integration/",{"text":455,"config":495},{"href":460,"dataGaLocation":424,"dataGaName":496},"gitlab duo agent platform - product menu",{"text":498,"config":499},"Source Code Management",{"href":500,"dataGaLocation":424,"dataGaName":498},"/solutions/source-code-management/",{"text":502,"config":503},"Automated Software Delivery",{"href":487,"dataGaLocation":424,"dataGaName":504},"Automated software delivery",{"title":506,"description":507,"link":508,"items":513},"Security","Deliver code faster without compromising security",{"config":509},{"href":510,"dataGaName":511,"dataGaLocation":424,"icon":512},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[514,518,523],{"text":515,"config":516},"Application Security Testing",{"href":510,"dataGaName":517,"dataGaLocation":424},"Application security testing",{"text":519,"config":520},"Software Supply Chain Security",{"href":521,"dataGaLocation":424,"dataGaName":522},"/solutions/supply-chain/","Software supply chain security",{"text":524,"config":525},"Software Compliance",{"href":526,"dataGaName":527,"dataGaLocation":424},"/solutions/software-compliance/","software compliance",{"title":529,"link":530,"items":535},"Measurement",{"config":531},{"icon":532,"href":533,"dataGaName":534,"dataGaLocation":424},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[536,540,544],{"text":537,"config":538},"Visibility & Measurement",{"href":533,"dataGaLocation":424,"dataGaName":539},"Visibility and Measurement",{"text":541,"config":542},"Value Stream Management",{"href":543,"dataGaLocation":424,"dataGaName":541},"/solutions/value-stream-management/",{"text":545,"config":546},"Analytics & Insights",{"href":547,"dataGaLocation":424,"dataGaName":548},"/solutions/analytics-and-insights/","Analytics and insights",{"title":550,"type":475,"items":551},"GitLab for",[552,558,564],{"text":553,"config":554},"Enterprise",{"icon":555,"href":556,"dataGaLocation":424,"dataGaName":557},"Building","/enterprise/","enterprise",{"text":559,"config":560},"Small Business",{"icon":561,"href":562,"dataGaLocation":424,"dataGaName":563},"Work","/small-business/","small business",{"text":565,"config":566},"Public Sector",{"icon":567,"href":568,"dataGaLocation":424,"dataGaName":569},"Organization","/solutions/public-sector/","public sector",{"text":571,"config":572},"Pricing",{"href":573,"dataGaName":574,"dataGaLocation":424,"dataNavLevelOne":574},"/pricing/","pricing",{"text":576,"config":577,"menu":579},"Resources",{"dataNavLevelOne":578},"resources",{"type":475,"link":580,"columns":584,"feature":678},{"text":581,"config":582},"View all resources",{"href":583,"dataGaName":578,"dataGaLocation":424},"/resources/",[585,618,645],{"title":586,"items":587},"Getting started",[588,593,598,603,608,613],{"text":589,"config":590},"Install",{"href":591,"dataGaName":592,"dataGaLocation":424},"/install/","install",{"text":594,"config":595},"Quick start guides",{"href":596,"dataGaName":597,"dataGaLocation":424},"/get-started/","quick setup checklists",{"text":599,"config":600},"Learn",{"href":601,"dataGaLocation":424,"dataGaName":602},"https://university.gitlab.com/","learn",{"text":604,"config":605},"Product documentation",{"href":606,"dataGaName":607,"dataGaLocation":424},"https://docs.gitlab.com/","product documentation",{"text":609,"config":610},"Best practice videos",{"href":611,"dataGaName":612,"dataGaLocation":424},"/getting-started-videos/","best practice videos",{"text":614,"config":615},"Integrations",{"href":616,"dataGaName":617,"dataGaLocation":424},"/integrations/","integrations",{"title":619,"items":620},"Discover",[621,626,631,636,640],{"text":622,"config":623},"Customer success stories",{"href":624,"dataGaName":625,"dataGaLocation":424},"/customers/","customer success stories",{"text":627,"config":628},"Blog",{"href":629,"dataGaName":630,"dataGaLocation":424},"/blog/","blog",{"text":632,"config":633},"Demo Hub",{"href":634,"dataGaName":635,"dataGaLocation":424},"/demo-hub/","demo hub",{"text":637,"config":638},"The Source",{"href":639,"dataGaName":630,"dataGaLocation":424},"/the-source/",{"text":641,"config":642},"Remote",{"href":643,"dataGaName":644,"dataGaLocation":424},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":646,"items":647},"Connect",[648,653,658,663,668,673],{"text":649,"config":650},"GitLab Services",{"href":651,"dataGaName":652,"dataGaLocation":424},"/services/","services",{"text":654,"config":655},"Contribute",{"href":656,"dataGaName":657,"dataGaLocation":424},"https://contributors.gitlab.com","contribute",{"text":659,"config":660},"Community",{"href":661,"dataGaName":662,"dataGaLocation":424},"/community/","community",{"text":664,"config":665},"Forum",{"href":666,"dataGaName":667,"dataGaLocation":424},"https://forum.gitlab.com/","forum",{"text":669,"config":670},"Events",{"href":671,"dataGaName":672,"dataGaLocation":424},"/events/","events",{"text":674,"config":675},"Partners",{"href":676,"dataGaName":677,"dataGaLocation":424},"/partners/","partners",{"config":679,"title":682,"text":683,"link":684},{"background":680,"textColor":681},"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":685,"config":686},"Read the latest",{"href":687,"dataGaName":688,"dataGaLocation":424},"/whats-new/","whats new",{"text":690,"config":691,"menu":693},"Company",{"dataNavLevelOne":692},"company",{"type":475,"columns":694},[695],{"items":696},[697,702,708,710,715,720,725,730,735,740],{"text":698,"config":699},"About",{"href":700,"dataGaName":701,"dataGaLocation":424},"/company/","about",{"text":703,"config":704,"footerGa":707},"Jobs",{"href":705,"dataGaName":706,"dataGaLocation":424},"/jobs/","jobs",{"dataGaName":706},{"text":669,"config":709},{"href":671,"dataGaName":672,"dataGaLocation":424},{"text":711,"config":712},"Leadership",{"href":713,"dataGaName":714,"dataGaLocation":424},"/company/team/e-group/","leadership",{"text":716,"config":717},"Handbook",{"href":718,"dataGaName":719,"dataGaLocation":424},"https://handbook.gitlab.com/","handbook",{"text":721,"config":722},"Investor relations",{"href":723,"dataGaName":724,"dataGaLocation":424},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":726,"config":727},"Trust Center",{"href":728,"dataGaName":729,"dataGaLocation":424},"/security/","trust center",{"text":731,"config":732},"AI Transparency Center",{"href":733,"dataGaName":734,"dataGaLocation":424},"/ai-transparency-center/","ai transparency center",{"text":736,"config":737},"Newsletter",{"href":738,"dataGaName":739,"dataGaLocation":424},"/company/contact/#contact-forms","newsletter",{"text":741,"config":742},"Press",{"href":743,"dataGaName":744,"dataGaLocation":424},"/press/","press",{"text":746,"config":747,"menu":748},"Contact us",{"dataNavLevelOne":692},{"type":475,"columns":749},[750],{"items":751},[752,757,762],{"text":753,"config":754},"Talk to sales",{"href":755,"dataGaName":756,"dataGaLocation":424},"/sales/","talk to sales",{"text":758,"config":759},"Support portal",{"href":760,"dataGaName":761,"dataGaLocation":424},"https://support.gitlab.com/hc/en-us","support portal",{"text":763,"config":764},"Customer portal",{"href":765,"dataGaName":766,"dataGaLocation":424},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":768,"login":769,"suggestions":776},"Close",{"text":770,"link":771},"To search repositories and projects, login to",{"text":772,"config":773},"gitlab.com",{"href":438,"dataGaName":774,"dataGaLocation":775},"search login","search",{"text":777,"default":778},"Suggestions",[779,781,785,787,791,795],{"text":455,"config":780},{"href":460,"dataGaName":455,"dataGaLocation":775},{"text":782,"config":783},"Code Suggestions (AI)",{"href":784,"dataGaName":782,"dataGaLocation":775},"/solutions/code-suggestions/",{"text":491,"config":786},{"href":493,"dataGaName":491,"dataGaLocation":775},{"text":788,"config":789},"GitLab on AWS",{"href":790,"dataGaName":788,"dataGaLocation":775},"/partners/technology-partners/aws/",{"text":792,"config":793},"GitLab on Google Cloud",{"href":794,"dataGaName":792,"dataGaLocation":775},"/partners/technology-partners/google-cloud-platform/",{"text":796,"config":797},"Why GitLab?",{"href":468,"dataGaName":796,"dataGaLocation":775},{"freeTrial":799,"mobileIcon":804,"desktopIcon":809,"secondaryButton":812},{"text":800,"config":801},"Start free trial",{"href":802,"dataGaName":429,"dataGaLocation":803},"https://gitlab.com/-/trials/new/","nav",{"altText":805,"config":806},"Gitlab Icon",{"src":807,"dataGaName":808,"dataGaLocation":803},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":805,"config":810},{"src":811,"dataGaName":808,"dataGaLocation":803},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":813,"config":814},"Get Started",{"href":815,"dataGaName":816,"dataGaLocation":803},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":818,"mobileIcon":822,"desktopIcon":824},{"text":819,"config":820},"Learn more about GitLab Duo",{"href":460,"dataGaName":821,"dataGaLocation":803},"gitlab duo",{"altText":805,"config":823},{"src":807,"dataGaName":808,"dataGaLocation":803},{"altText":805,"config":825},{"src":811,"dataGaName":808,"dataGaLocation":803},{"button":827,"mobileIcon":832,"desktopIcon":834},{"text":828,"config":829},"/switch",{"href":830,"dataGaName":831,"dataGaLocation":803},"#contact","switch",{"altText":805,"config":833},{"src":807,"dataGaName":808,"dataGaLocation":803},{"altText":805,"config":835},{"src":836,"dataGaName":808,"dataGaLocation":803},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":838,"mobileIcon":843,"desktopIcon":845},{"text":839,"config":840},"Back to pricing",{"href":573,"dataGaName":841,"dataGaLocation":803,"icon":842},"back to pricing","GoBack",{"altText":805,"config":844},{"src":807,"dataGaName":808,"dataGaLocation":803},{"altText":805,"config":846},{"src":811,"dataGaName":808,"dataGaLocation":803},{"title":848,"titleMobile":849,"button":850,"config":855},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":466,"config":851},{"href":852,"dataGaName":853,"dataGaLocation":854},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":856,"disabled":399},"release",{"data":858},{"text":859,"source":860,"edit":866,"contribute":871,"config":876,"items":881,"minimal":1091},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":861,"config":862},"View page source",{"href":863,"dataGaName":864,"dataGaLocation":865},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":867,"config":868},"Edit this page",{"href":869,"dataGaName":870,"dataGaLocation":865},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":872,"config":873},"Please contribute",{"href":874,"dataGaName":875,"dataGaLocation":865},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":877,"facebook":878,"youtube":879,"linkedin":880},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[882,929,983,1027,1059],{"title":571,"links":883,"subMenu":898},[884,888,893],{"text":885,"config":886},"View plans",{"href":573,"dataGaName":887,"dataGaLocation":865},"view plans",{"text":889,"config":890},"Why Premium?",{"href":891,"dataGaName":892,"dataGaLocation":865},"/pricing/premium/","why premium",{"text":894,"config":895},"Why Ultimate?",{"href":896,"dataGaName":897,"dataGaLocation":865},"/pricing/ultimate/","why ultimate",[899],{"title":900,"links":901},"Contact Us",[902,905,907,909,914,919,924],{"text":903,"config":904},"Contact sales",{"href":755,"dataGaName":434,"dataGaLocation":865},{"text":758,"config":906},{"href":760,"dataGaName":761,"dataGaLocation":865},{"text":763,"config":908},{"href":765,"dataGaName":766,"dataGaLocation":865},{"text":910,"config":911},"Status",{"href":912,"dataGaName":913,"dataGaLocation":865},"https://status.gitlab.com/","status",{"text":915,"config":916},"Terms of use",{"href":917,"dataGaName":918,"dataGaLocation":865},"/terms/","terms of use",{"text":920,"config":921},"Privacy statement",{"href":922,"dataGaName":923,"dataGaLocation":865},"/privacy/","privacy statement",{"text":925,"config":926},"Cookie preferences",{"dataGaName":927,"dataGaLocation":865,"id":928,"isOneTrustButton":246},"cookie preferences","ot-sdk-btn",{"title":471,"links":930,"subMenu":939},[931,935],{"text":932,"config":933},"DevSecOps platform",{"href":453,"dataGaName":934,"dataGaLocation":865},"devsecops platform",{"text":936,"config":937},"AI-Assisted Development",{"href":460,"dataGaName":938,"dataGaLocation":865},"ai-assisted development",[940],{"title":941,"links":942},"Topics",[943,948,953,958,963,968,973,978],{"text":944,"config":945},"CICD",{"href":946,"dataGaName":947,"dataGaLocation":865},"/topics/ci-cd/","cicd",{"text":949,"config":950},"GitOps",{"href":951,"dataGaName":952,"dataGaLocation":865},"/topics/gitops/","gitops",{"text":954,"config":955},"DevOps",{"href":956,"dataGaName":957,"dataGaLocation":865},"/topics/devops/","devops",{"text":959,"config":960},"Version Control",{"href":961,"dataGaName":962,"dataGaLocation":865},"/topics/version-control/","version control",{"text":964,"config":965},"DevSecOps",{"href":966,"dataGaName":967,"dataGaLocation":865},"/topics/devsecops/","devsecops",{"text":969,"config":970},"Cloud Native",{"href":971,"dataGaName":972,"dataGaLocation":865},"/topics/cloud-native/","cloud native",{"text":974,"config":975},"AI for Coding",{"href":976,"dataGaName":977,"dataGaLocation":865},"/topics/devops/ai-for-coding/","ai for coding",{"text":979,"config":980},"Agentic AI",{"href":981,"dataGaName":982,"dataGaLocation":865},"/topics/agentic-ai/","agentic ai",{"title":984,"links":985},"Solutions",[986,988,990,995,999,1002,1006,1009,1011,1014,1017,1022],{"text":515,"config":987},{"href":510,"dataGaName":515,"dataGaLocation":865},{"text":504,"config":989},{"href":487,"dataGaName":488,"dataGaLocation":865},{"text":991,"config":992},"Agile development",{"href":993,"dataGaName":994,"dataGaLocation":865},"/solutions/agile-delivery/","agile delivery",{"text":996,"config":997},"SCM",{"href":500,"dataGaName":998,"dataGaLocation":865},"source code management",{"text":944,"config":1000},{"href":493,"dataGaName":1001,"dataGaLocation":865},"continuous integration & delivery",{"text":1003,"config":1004},"Value stream management",{"href":543,"dataGaName":1005,"dataGaLocation":865},"value stream management",{"text":949,"config":1007},{"href":1008,"dataGaName":952,"dataGaLocation":865},"/solutions/gitops/",{"text":553,"config":1010},{"href":556,"dataGaName":557,"dataGaLocation":865},{"text":1012,"config":1013},"Small business",{"href":562,"dataGaName":563,"dataGaLocation":865},{"text":1015,"config":1016},"Public sector",{"href":568,"dataGaName":569,"dataGaLocation":865},{"text":1018,"config":1019},"Education",{"href":1020,"dataGaName":1021,"dataGaLocation":865},"/solutions/education/","education",{"text":1023,"config":1024},"Financial services",{"href":1025,"dataGaName":1026,"dataGaLocation":865},"/solutions/finance/","financial services",{"title":576,"links":1028},[1029,1031,1033,1035,1038,1040,1043,1045,1047,1049,1051,1053,1055,1057],{"text":589,"config":1030},{"href":591,"dataGaName":592,"dataGaLocation":865},{"text":594,"config":1032},{"href":596,"dataGaName":597,"dataGaLocation":865},{"text":599,"config":1034},{"href":601,"dataGaName":602,"dataGaLocation":865},{"text":604,"config":1036},{"href":606,"dataGaName":1037,"dataGaLocation":865},"docs",{"text":627,"config":1039},{"href":629,"dataGaName":630,"dataGaLocation":865},{"text":1041,"config":1042},"What's new",{"href":687,"dataGaName":688,"dataGaLocation":865},{"text":622,"config":1044},{"href":624,"dataGaName":625,"dataGaLocation":865},{"text":641,"config":1046},{"href":643,"dataGaName":644,"dataGaLocation":865},{"text":649,"config":1048},{"href":651,"dataGaName":652,"dataGaLocation":865},{"text":654,"config":1050},{"href":656,"dataGaName":657,"dataGaLocation":865},{"text":659,"config":1052},{"href":661,"dataGaName":662,"dataGaLocation":865},{"text":664,"config":1054},{"href":666,"dataGaName":667,"dataGaLocation":865},{"text":669,"config":1056},{"href":671,"dataGaName":672,"dataGaLocation":865},{"text":674,"config":1058},{"href":676,"dataGaName":677,"dataGaLocation":865},{"title":690,"links":1060},[1061,1063,1065,1067,1069,1071,1075,1080,1082,1084,1086],{"text":698,"config":1062},{"href":700,"dataGaName":692,"dataGaLocation":865},{"text":703,"config":1064},{"href":705,"dataGaName":706,"dataGaLocation":865},{"text":711,"config":1066},{"href":713,"dataGaName":714,"dataGaLocation":865},{"text":716,"config":1068},{"href":718,"dataGaName":719,"dataGaLocation":865},{"text":721,"config":1070},{"href":723,"dataGaName":724,"dataGaLocation":865},{"text":1072,"config":1073},"Sustainability",{"href":1074,"dataGaName":1072,"dataGaLocation":865},"/sustainability/",{"text":1076,"config":1077},"Diversity, inclusion and belonging (DIB)",{"href":1078,"dataGaName":1079,"dataGaLocation":865},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":726,"config":1081},{"href":728,"dataGaName":729,"dataGaLocation":865},{"text":736,"config":1083},{"href":738,"dataGaName":739,"dataGaLocation":865},{"text":741,"config":1085},{"href":743,"dataGaName":744,"dataGaLocation":865},{"text":1087,"config":1088},"Modern Slavery Transparency Statement",{"href":1089,"dataGaName":1090,"dataGaLocation":865},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1092},[1093,1096,1099],{"text":1094,"config":1095},"Terms",{"href":917,"dataGaName":918,"dataGaLocation":865},{"text":1097,"config":1098},"Cookies",{"dataGaName":927,"dataGaLocation":865,"id":928,"isOneTrustButton":246},{"text":1100,"config":1101},"Privacy",{"href":922,"dataGaName":923,"dataGaLocation":865},[1103],{"id":1104,"title":7,"body":398,"config":1105,"content":1107,"description":398,"extension":1110,"meta":1111,"navigation":246,"path":1112,"seo":1113,"stem":1114,"__hash__":1115},"blogAuthors/en-us/blog/authors/vicky-steeves.yml",{"template":1106},"BlogAuthor",{"name":7,"config":1108},{"headshot":169,"ctfId":1109},"vickysteeves","yml",{},"/en-us/blog/authors/vicky-steeves",{},"en-us/blog/authors/vicky-steeves","7lvqgoepDRm94o5_RtzOfeHcPxcvRtlPBtZolT6exe0",[1117,1125,1133],{"title":1118,"description":1119,"heroImage":1120,"category":394,"date":1121,"authors":1122,"slug":1124,"externalUrl":398},"What's new in Git 2.55.0?","Learn about the new features and changes in Git 2.55, including a new git-history(1) fixup command, an fsmonitor daemon for Linux, pushing to remote groups, and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782732487/ztwgrvlolpifo01vj8qc.png","2026-06-29",[1123],"Toon Claes","whats-new-in-git-2-55-0",{"title":1126,"description":1127,"heroImage":1128,"category":394,"date":1129,"authors":1130,"slug":1132,"externalUrl":398},"GitLab AI Hackathon 2026: Meet the winners","Nearly 7,000 developers built 600+ AI agents and flows on GitLab Duo Agent Platform. Find out who won and what they created.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-22",[1131],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"title":1134,"description":1135,"heroImage":1136,"category":394,"date":1137,"authors":1138,"slug":1140,"externalUrl":398},"What’s new in Git 2.54.0?","Learn about release contributions, including new repository maintenance, a new command to edit commit history, a replacement for git-sizer(1), and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782734716/ztwgrvlolpifo01vj8qc.png","2026-04-20",[1139],"Patrick Steinhardt","whats-new-in-git-2-54-0",{"promotions":1142},[1143,1157,1169,1181],{"id":1144,"categories":1145,"header":1147,"text":1148,"button":1149,"image":1154},"ai-modernization",[1146],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1150,"config":1151},"Get your AI maturity score",{"href":1152,"dataGaName":1153,"dataGaLocation":630},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1155},{"src":1156},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1158,"categories":1159,"header":1161,"text":1148,"button":1162,"image":1166},"devops-modernization",[1160,967],"product","Are you just managing tools or shipping innovation?",{"text":1163,"config":1164},"Get your DevOps maturity score",{"href":1165,"dataGaName":1153,"dataGaLocation":630},"/assessments/devops-modernization-assessment/",{"config":1167},{"src":1168},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1170,"categories":1171,"header":1173,"text":1148,"button":1174,"image":1178},"security-modernization",[1172],"security","Are you trading speed for security?",{"text":1175,"config":1176},"Get your security maturity score",{"href":1177,"dataGaName":1153,"dataGaLocation":630},"/assessments/security-modernization-assessment/",{"config":1179},{"src":1180},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1182,"paths":1183,"header":1186,"text":1187,"button":1188,"image":1193},"github-azure-migration",[1184,1185],"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":1189,"config":1190},"See how GitLab compares to GitHub",{"href":1191,"dataGaName":1192,"dataGaLocation":630},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1194},{"src":1168},{"header":1196,"blurb":1197,"button":1198,"secondaryButton":1203},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1199,"config":1200},"Get your free trial",{"href":1201,"dataGaName":429,"dataGaLocation":1202},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":903,"config":1204},{"href":755,"dataGaName":434,"dataGaLocation":1202},1786803732963]