Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
skip to main content
10.1145/3377811.3380437acmconferencesArticle/Chapter ViewAbstractPublication PagesicseConference Proceedingsconference-collections
research-article

A cost-efficient approach to building in continuous integration

Published: 01 October 2020 Publication History

Abstract

Continuous integration (CI) is a widely used practice in modern software engineering. Unfortunately, it is also an expensive practice --- Google and Mozilla estimate their CI systems in millions of dollars. In this paper, we propose a novel approach for reducing the cost of CI. The cost of CI lies in the computing power to run builds and its value mostly lies on letting developers find bugs early --- when their size is still small. Thus, we target reducing the number of builds that CI executes by still executing as many failing builds as early as possible. To achieve this goal, we propose SmartBuildSkip, a technique which predicts the first builds in a sequence of build failures and the remaining build failures separately. SmartBuildSkip is customizable, allowing developers to select different preferred trade-offs of saving many builds vs. observing build failures early. We evaluate the motivating hypothesis of SmartBuildSkip, its prediction power, and its cost savings in a realistic scenario. In its most conservative configuration, SmartBuildSkip saved a median 30% of builds by only incurring a median delay of 1 build in a median of 15% failing builds.

References

[1]
Rabe Abdalkareem, Suhaib Mujahid, and Emad Shihab. 2020. A Machine Learning Approach to Improve the Detection of CI Skip Commits. IEEE Transactions on Software Engineering (2020).
[2]
R. Abdalkareem, S. Mujahid, E. Shihab, and J. Rilling. 2019. Which Commits Can Be CI Skipped? IEEE Transactions on Software Engineering (2019), 1--1.
[3]
Moritz Beller, Georgios Gousios, and Andy Zaidman. 2017. Oops, my tests broke the build: An explorative analysis of Travis CI with GitHub. In Mining Software Repositories (MSR), 2017 IEEE/ACM 14th International Conference on. IEEE, 356--367.
[4]
Moritz Beller, Georgios Gousios, and Andy Zaidman. 2017. Travistorrent: Synthesizing travis ci and github for full-stack research on continuous integration. In Mining Software Repositories (MSR), 2017 IEEE/ACM 14th International Conference on. IEEE, 447--450.
[5]
Nicolas Bettenburg, Rahul Premraj, Thomas Zimmermann, and Sunghun Kim. 2008. Duplicate bug reports considered harmful - really?. In 2008 IEEE International Conference on Software Maintenance. IEEE, 337--345.
[6]
Marcelo Cataldo and James D Herbsleb. 2011. Factors leading to integration failures in global feature-oriented development: an empirical analysis. In Proceedings of the 33rd International Conference on Software Engineering. ACM, 161--170.
[7]
Ahmet Celik, Alex Knaust, Aleksandar Milicevic, and Milos Gligoric. 2016. Build system with lazy retrieval for Java projects. In Proceedings of the 2016 24th ACM SIGSOFT International Symposium on Foundations of Software Engineering. ACM, 643--654.
[8]
Cloudbee. 2019. Jenkins Enterprise by CloudBees 14.5 User Guide - Skip Next Build Plugin. https://docs.huihoo.com/jenkins/enterprise/14/user-guide-14.5/skip.html. [Online; accessed 27-April-2019].
[9]
William Gemmell Cochran. 1977. Sampling techniques-3. (1977).
[10]
Paul M Duvall, Steve Matyas, and Andrew Glover. 2007. Continuous integration: improving software quality and reducing risk. Pearson Education.
[11]
Sebastian Elbaum, Alexey G Malishevsky, and Gregg Rothermel. 2002. Test case prioritization: A family of empirical studies. IEEE transactions on software engineering 28, 2 (2002), 159--182.
[12]
Sebastian Elbaum, Gregg Rothermel, and John Penix. 2014. Techniques for improving regression testing in continuous integration development environments. In Proceedings of the 22nd ACM SIGSOFT International Symposium on Foundations of Software Engineering. ACM, 235--245.
[13]
Wagner Felidré, Leonardo Furtado, Daniel Alencar Da Costa, Bruno Cartaxo, and Gustavo Pinto. 2019. Continuous Integration Theater. In Proceedings of the 13th ACM/IEEE International Symposium on Empirical Software Engineering and Measurement. 10.
[14]
Jacqui Finlay, Russel Pears, and Andy M Connor. 2014. Data stream mining for predicting software build outcomes using source code metrics. Information and Software Technology 56, 2 (2014), 183--198.
[15]
Martin Fowler and Matthew Foemmel. 2006. Continuous integration. Thought-Works) http://www.thoughtworks.com/ContinuousIntegration.pdf 122 (2006), 14.
[16]
Keheliya Gallaba, Christian Macho, Martin Pinzger, and Shane McIntosh. 2018. Noise and heterogeneity in historical build data: an empirical study of Travis CI. In Proceedings of the 33rd ACM/IEEE International Conference on Automated Software Engineering. ACM, 87--97.
[17]
Alessio Gambi, Zabolotnyi Rostyslav, and Schahram Dustdar. 2015. Improving cloud-based continuous integration environments. In Proceedings of the 37th International Conference on Software Engineering-Volume 2. IEEE Press, 797--798.
[18]
Aakash Gautam, Saket Vishwasrao, and Francisco Servant. 2017. An empirical study of activity, popularity, size, testing, and stability in continuous integration. In 2017 IEEE/ACM 14th International Conference on Mining Software Repositories (MSR). IEEE, 495--498.
[19]
Taher Ahmed Ghaleb, Daniel Alencar da Costa, and Ying Zou. 2019. An empirical study of the long duration of continuous integration builds. Empirical Software Engineering (2019), 1--38.
[20]
Milos Gligoric, Lamyaa Eloussi, and Darko Marinov. 2015. Practical regression test selection with dynamic file dependencies. In Proceedings of the 2015 International Symposium on Software Testing and Analysis. ACM, 211--222.
[21]
Ahmed E Hassan and Ken Zhang. 2006. Using decision trees to predict the certification result of a build. In Automated Software Engineering, 2006. ASE'06. 21st IEEE/ACM International Conference on. IEEE, 189--198.
[22]
Foyzul Hassan, Shaikh Mostafa, Edmund SL Lam, and Xiaoyin Wang. 2017. Automatic building of java projects in software repositories: A study on feasibility and challenges. In 2017 ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM). IEEE, 38--47.
[23]
Foyzul Hassan and Xiaoyin Wang. 2017. Change-aware build prediction model for stall avoidance in continuous integration. In Proceedings of the 11th ACM/IEEE International Symposium on Empirical Software Engineering and Measurement. IEEE Press, 157--162.
[24]
Kim Herzig, Michaela Greiler, Jacek Czerwonka, and Brendan Murphy. 2015. The art of testing less without sacrificing quality. In Proceedings of the 37th International Conference on Software Engineering-Volume 1. IEEE Press, 483--493.
[25]
Michael Hilton, Nicholas Nelson, Timothy Tunnell, Darko Marinov, and Danny Dig. 2017. Trade-offs in continuous integration: assurance, security, and flexibility. In Proceedings of the 2017 11th Joint Meeting on Foundations of Software Engineering. ACM, 197--207.
[26]
Michael Hilton, Timothy Tunnell, Kai Huang, Darko Marinov, and Danny Dig. 2016. Usage, costs, and benefits of continuous integration in open-source projects. In Proceedings of the 31st IEEE/ACM International Conference on Automated Software Engineering. ACM, 426--437.
[27]
Md Rakibul Islam and Minhaz F Zibran. 2017. Insights into continuous integration build failures. In Mining Software Repositories (MSR), 2017 IEEE/ACM 14th International Conference on. IEEE, 467--470.
[28]
Romit Jain, Saket Kumar Singh, and Bharavi Mishra. 2019. A Brief Study on Build Failures in Continuous Integration: Causation and Effect. In Progress in Advanced Computing and Intelligent Engineering. Springer, 17--27.
[29]
Jenkins. 2019. CI Skip Plugin. https://plugins.jenkins.io/ci-skip. [Online; accessed 27-April-2019].
[30]
Xianhao Jin and Francisco Servant. 2019. When Should I Build? A Collection of Cost- efficient Approaches to Running Builds in Continuous Integration.
[31]
John O'Duinn. 2013. The financial cost of a checkin. https://oduinn.com/2013/12/13/the-financial-cost-of-a-checkin-part-2/ [Online; accessed 25-January-2019].
[32]
Noureddine Kerzazi, Foutse Khomh, and Bram Adams. 2014. Why do automated builds break? an empirical study. In Software Maintenance and Evolution (ICSME), 2014 IEEE International Conference on. IEEE, 41--50.
[33]
Irwin Kwan, Adrian Schroter, and Daniela Damian. 2011. Does socio-technical congruence have an effect on software build success? a study of coordination in a software project. IEEE Transactions on Software Engineering 37, 3 (2011), 307--324.
[34]
Marko Leppänen, Simo Mäkinen, Max Pagels, Veli-Pekka Eloranta, Juha Itkonen, Mika V Mäntylä, and Tomi Männistö. 2015. The highways and country roads to continuous deployment. Ieee software 32, 2 (2015), 64--72.
[35]
Jingjing Liang, Sebastian Elbaum, and Gregg Rothermel. 2018. Redefining prioritization: continuous prioritization for continuous integration. In 2018 IEEE/ACM 40th International Conference on Software Engineering (ICSE). IEEE, 688--698.
[36]
Qi Luo, Kevin Moran, Denys Poshyvanyk, and Massimiliano Di Penta. 2018. Assessing test case prioritization on real faults and mutants. In 2018 IEEE International Conference on Software Maintenance and Evolution (ICSME). IEEE, 240--251.
[37]
Mateusz Machalica, Alex Samylkin, Meredith Porth, and Satish Chandra. 2019. Predictive test selection. In Proceedings of the 41st International Conference on Software Engineering: Software Engineering in Practice. IEEE Press, 91--100.
[38]
Dusica Marijan, Arnaud Gotlieb, and Sagar Sen. 2013. Test case prioritization for continuous regression testing: An industrial case study. In 2013 IEEE International Conference on Software Maintenance. IEEE, 540--543.
[39]
Atif Memon, Zebao Gao, Bao Nguyen, Sanjeev Dhanda, Eric Nickell, Rob Siemborski, and John Micco. 2017. Taming google-scale continuous testing. In Proceedings of the 39th International Conference on Software Engineering: Software Engineering in Practice Track. IEEE Press, 233--242.
[40]
John Micco. 2017. The State of Continuous Integration Testing At Google.
[41]
Ade Miller. 2008. A hundred days of continuous integration. In Agile 2008 Conference. IEEE, 289--293.
[42]
Shaikh Mostafa, Xiaoyin Wang, and Tao Xie. 2017. Perfranker: Prioritization of performance regression tests for collection-intensive software. In Proceedings of the 26th ACM SIGSOFT International Symposium on Software Testing and Analysis. ACM, 23--34.
[43]
Ansong Ni and Ming Li. 2017. Cost-effective build outcome prediction using cascaded classifiers. In Mining Software Repositories (MSR), 2017 IEEE/ACM 14th International Conference on. IEEE, 455--458.
[44]
Klérisson VR Paixão, Crícia Z Felício, Fernanda M Delfim, and Marcelo de A Maia. 2017. On the interplay between non-functional requirements and builds on continuous integration. In Proceedings of the 14th International Conference on Mining Software Repositories. IEEE Press, 479--482.
[45]
Gustavo Pinto, Marcel Rebouças, and Fernando Castor. 2017. Inadequate testing, time pressure, and (over) confidence: a tale of continuous integration users. In Proceedings of the 10th International Workshop on Cooperative and Human Aspects of Software Engineering. IEEE Press, 74--77.
[46]
Noam Rabbani, Michael S Harvey, Sadnan Saquif, Keheliya Gallaba, and Shane McIntosh. 2018. Revisiting" Programmers' Build Errors" in the Visual Studio Context. In 2018 IEEE/ACM 15th International Conference on Mining Software Repositories (MSR). IEEE, 98--101.
[47]
Thomas Rausch, Waldemar Hummer, Philipp Leitner, and Stefan Schulte. 2017. An empirical analysis of build failures in the continuous integration workflows of Java-based open-source software. In Proceedings of the 14th International Conference on Mining Software Repositories. IEEE Press, 345--355.
[48]
Marcel Rebouças, Renato O Santos, Gustavo Pinto, and Fernando Castor. 2017. How does contributors' involvement influence the build status of an open-source software project?. In Proceedings of the 14th International Conference on Mining Software Repositories. IEEE Press, 475--478.
[49]
Gregg Rothermel and Mary Jean Harrold. 1996. Analyzing regression test selection techniques. IEEE Transactions on software engineering 22, 8 (1996), 529--551.
[50]
Gregg Rothermel and Mary Jean Harrold. 1997. A safe, efficient regression test selection technique. ACM Transactions on Software Engineering and Methodology (TOSEM) 6, 2 (1997), 173--210.
[51]
Gregg Rothermel, Roland H. Untch, Chengyun Chu, and Mary Jean Harrold. 2001. Prioritizing test cases for regression testing. IEEE Transactions on software engineering 27, 10 (2001), 929--948.
[52]
Hyunmin Seo, Caitlin Sadowski, Sebastian Elbaum, Edward Aftandilian, and Robert Bowdidge. 2014. Programmers' build errors: a case study (at google). In Proceedings of the 36th International Conference on Software Engineering. ACM, 724--734.
[53]
Francisco Servant. 2013. Supporting bug investigation using history analysis. In 2013 28th IEEE/ACM International Conference on Automated Software Engineering (ASE). IEEE, 754--757.
[54]
Francisco Servant and James A Jones. 2011. History slicing. In 2011 26th IEEE/ACM International Conference on Automated Software Engineering (ASE 2011). IEEE, 452--455.
[55]
Francisco Servant and James A Jones. 2012. History slicing: assisting code-evolution tasks. In Proceedings of the ACM SIGSOFT 20th International Symposium on the Foundations of Software Engineering. 1--11.
[56]
Francisco Servant and James A Jones. 2012. WhoseFault: Automatic Developer-to-Fault Assignment through Fault Localization. In International Conference on Software Engineering. 36--46.
[57]
Francisco Servant and James A Jones. 2013. Chronos: Visualizing slices of source-code history. In 2013 First IEEE Working Conference on Software Visualization (VISSOFT). IEEE, 1--4.
[58]
Francisco Servant and James A Jones. 2017. Fuzzy fine-grained code-history analysis. In 2017 IEEE/ACM 39th International Conference on Software Engineering (ICSE). IEEE, 746--757.
[59]
August Shi, Suresh Thummalapenta, Shuvendu K Lahiri, Nikolaj Bjorner, and Jacek Czerwonka. 2017. Optimizing test placement for module-level regression testing. In Proceedings of the 39th International Conference on Software Engineering. IEEE Press, 689--699.
[60]
Alankar Shrivastava, Vipin B Gupta, et al. 2011. Methods for the determination of limit of detection and limit of quantitation of the analytical methods. Chronicles of Young Scientists 2, 1 (2011), 21.
[61]
Stack Overflow contributors. 2019. Skip travis build if an unimportant file changed. https://stackoverflow.com/questions/48455623/skip-travis-build-if-an-unimportant-file-changed [Online; accessed 21-February-2019].
[62]
Daniel Ståhl and Jan Bosch. 2013. Experienced benefits of continuous integration in industry software product development: A case study. In The 12th iasted international conference on software engineering, (innsbruck, austria, 2013). 736--743.
[63]
Ming Tan, Lin Tan, Sashank Dara, and Caleb Mayeux. 2015. Online defect prediction for imbalanced data. In 2015 IEEE/ACM 37th IEEE International Conference on Software Engineering, Vol. 2. IEEE, 99--108.
[64]
Travis. 2019. Skipping a build. https://docs.travis-ci.com/user/customizing-the-build/#skipping-a-build. [Online; accessed 27-April-2019].
[65]
Michele Tufano, Fabio Palomba, Gabriele Bavota, Massimiliano Di Penta, Rocco Oliveto, Andrea De Lucia, and Denys Poshyvanyk. 2017. There and back again: Can you compile that snapshot? Journal of Software: Evolution and Process 29, 4 (2017), e1838.
[66]
Michele Tufano, Hitesh Sajnani, and Kim Herzig. 2019. Towards Predicting the Impact of Software Changes on Building Activities. In 2019 IEEE/ACM 41st International Conference on Software Engineering: New Ideas and Emerging Results (ICSE-NIER) (ICSE '19). 4.
[67]
Bogdan Vasilescu, Stef Van Schuylenburg, Jules Wulms, Alexander Serebrenik, and Mark GJ van den Brand. 2014. Continuous integration in a social-coding world: Empirical evidence from GitHub. In 2014 IEEE International Conference on Software Maintenance and Evolution. IEEE, 401--405.
[68]
Bogdan Vasilescu, Yue Yu, Huaimin Wang, Premkumar Devanbu, and Vladimir Filkov. 2015. Quality and productivity outcomes relating to continuous integration in GitHub. In Proceedings of the 2015 10th Joint Meeting on Foundations of Software Engineering. ACM, 805--816.
[69]
Carmine Vassallo, Gerald Schermann, Fiorella Zampetti, Daniele Romano, Philipp Leitner, Andy Zaidman, Massimiliano Di Penta, and Sebastiano Panichella. 2017. A tale of CI build failures: An open source and a financial organization perspective. In 2017 IEEE international conference on software maintenance and evolution (ICSME). IEEE, 183--193.
[70]
David Gray Widder, Michael Hilton, Christian Kästner, and Bogdan Vasilescu. 2019. A conceptual replication of continuous integration pain points in the context of Travis CI. In Proceedings of the 2019 27th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering. ACM, 647--658.
[71]
Wikipedia contributors. 2019. Cold start (computing) --- Wikipedia, The Free Encyclopedia. https://en.wikipedia.org/w/index.php?title=Cold_start_(computing)&oldid=883021431 [Online; accessed 21-February-2019].
[72]
Timo Wolf, Adrian Schroter, Daniela Damian, and Thanh Nguyen. 2009. Predicting build failures using social network analysis on developer communication. In Proceedings of the 31st International Conference on Software Engineering. IEEE Computer Society, 1--11.
[73]
Zheng Xie and Ming Li. 2018. Cutting the Software Building Efforts in Continuous Integration by Semi-Supervised Online AUC Optimization. In IJCAI. 2875--2881.
[74]
Shin Yoo and Mark Harman. 2007. Pareto efficient multi-objective test case selection. In Proceedings of the 2007 international symposium on Software testing and analysis. ACM, 140--150.
[75]
Shin Yoo and Mark Harman. 2012. Regression testing minimization, selection and prioritization: a survey. Software Testing, Verification and Reliability 22, 2 (2012), 67--120.
[76]
Fiorella Zampetti, Simone Scalabrino, Rocco Oliveto, Gerardo Canfora, and Massimiliano Di Penta. 2017. How open source projects use static code analysis tools in continuous integration pipelines. In 2017 IEEE/ACM 14th International Conference on Mining Software Repositories (MSR). IEEE, 334--344.
[77]
Chen Zhang, Bihuan Chen, Linlin Chen, Xin Peng, and Wenyun Zhao. 2019. A Large-Scale Empirical Study of Compiler Errors in Continuous Integration. (2019).
[78]
Lingming Zhang. 2018. Hybrid regression test selection. In 2018 IEEE/ACM 40th International Conference on Software Engineering (ICSE). IEEE, 199--209.
[79]
Yangyang Zhao, Alexander Serebrenik, Yuming Zhou, Vladimir Filkov, and Bogdan Vasilescu. 2017. The impact of continuous integration on other software development practices: a large-scale empirical study. In Proceedings of the 32nd IEEE/ACM International Conference on Automated Software Engineering. IEEE Press, 60--71.
[80]
Chenguang Zhu, Owolabi Legunsen, August Shi, and Milos Gligoric. 2019. A framework for checking regression test selection tools. In Proceedings of the 41st International Conference on Software Engineering. IEEE Press, 430--441.
[81]
Mahdis Zolfagharinia, Bram Adams, and Yann-Gaël Guéhénuc. 2017. Do Not Trust Build Results at Face Value-An Empirical Study of 30 Million CPAN Builds. In 2017 IEEE/ACM 14th International Conference on Mining Software Repositories (MSR). IEEE, 312--322.

Cited By

View all
  • (2024)Practitioners’ Challenges and Perceptions of CI Build Failure Predictions at AtlassianCompanion Proceedings of the 32nd ACM International Conference on the Foundations of Software Engineering10.1145/3663529.3663856(370-381)Online publication date: 10-Jul-2024
  • (2024)Dependency-Induced Waste in Continuous Integration: An Empirical Study of Unused Dependencies in the npm EcosystemProceedings of the ACM on Software Engineering10.1145/36608231:FSE(2632-2655)Online publication date: 12-Jul-2024
  • (2024)Commit Artifact Preserving Build PredictionProceedings of the 33rd ACM SIGSOFT International Symposium on Software Testing and Analysis10.1145/3650212.3680356(1236-1248)Online publication date: 11-Sep-2024
  • Show More Cited By

Recommendations

Comments

Information & Contributors

Information

Published In

cover image ACM Conferences
ICSE '20: Proceedings of the ACM/IEEE 42nd International Conference on Software Engineering
June 2020
1640 pages
ISBN:9781450371216
DOI:10.1145/3377811
Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. Copyrights for components of this work owned by others than ACM must be honored. Abstracting with credit is permitted. To copy otherwise, or republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a fee. Request permissions from [email protected]

Sponsors

In-Cooperation

  • KIISE: Korean Institute of Information Scientists and Engineers
  • IEEE CS

Publisher

Association for Computing Machinery

New York, NY, United States

Publication History

Published: 01 October 2020

Permissions

Request permissions for this article.

Check for updates

Author Tags

  1. build prediction
  2. continuous integration
  3. maintenance cost

Qualifiers

  • Research-article

Conference

ICSE '20
Sponsor:

Acceptance Rates

Overall Acceptance Rate 276 of 1,856 submissions, 15%

Upcoming Conference

ICSE 2025

Contributors

Other Metrics

Bibliometrics & Citations

Bibliometrics

Article Metrics

  • Downloads (Last 12 months)174
  • Downloads (Last 6 weeks)12
Reflects downloads up to 03 Oct 2024

Other Metrics

Citations

Cited By

View all
  • (2024)Practitioners’ Challenges and Perceptions of CI Build Failure Predictions at AtlassianCompanion Proceedings of the 32nd ACM International Conference on the Foundations of Software Engineering10.1145/3663529.3663856(370-381)Online publication date: 10-Jul-2024
  • (2024)Dependency-Induced Waste in Continuous Integration: An Empirical Study of Unused Dependencies in the npm EcosystemProceedings of the ACM on Software Engineering10.1145/36608231:FSE(2632-2655)Online publication date: 12-Jul-2024
  • (2024)Commit Artifact Preserving Build PredictionProceedings of the 33rd ACM SIGSOFT International Symposium on Software Testing and Analysis10.1145/3650212.3680356(1236-1248)Online publication date: 11-Sep-2024
  • (2024)Mining Our Way Back to Incremental Builds for DevOps PipelinesProceedings of the 21st International Conference on Mining Software Repositories10.1145/3643991.3649106(48-49)Online publication date: 15-Apr-2024
  • (2024)RavenBuild: Context, Relevance, and Dependency Aware Build Outcome PredictionProceedings of the ACM on Software Engineering10.1145/36437711:FSE(996-1018)Online publication date: 12-Jul-2024
  • (2024)Code Impact Beyond Disciplinary Boundaries: Constructing a Multidisciplinary Dependency Graph and Analyzing Cross-Boundary ImpactProceedings of the 46th International Conference on Software Engineering: Software Engineering in Practice10.1145/3639477.3639726(122-133)Online publication date: 14-Apr-2024
  • (2024)Characterizing Timeout Builds in Continuous IntegrationIEEE Transactions on Software Engineering10.1109/TSE.2024.338784050:6(1450-1463)Online publication date: 11-Apr-2024
  • (2024) OneSpaceJournal of Systems and Software10.1016/j.jss.2023.111911208:COnline publication date: 4-Mar-2024
  • (2024)Does using Bazel help speed up continuous integration builds?Empirical Software Engineering10.1007/s10664-024-10497-x29:5Online publication date: 19-Jul-2024
  • (2024)On combining commit grouping and build skip prediction to reduce redundant continuous integration activityEmpirical Software Engineering10.1007/s10664-024-10477-129:6Online publication date: 30-Aug-2024
  • Show More Cited By

View Options

Get Access

Login options

View options

PDF

View or Download as a PDF file.

PDF

eReader

View online with eReader.

eReader

Media

Figures

Other

Tables

Share

Share

Share this Publication link

Share on social media