# SD3.4 Deployment Management This skill conveys how dependencies are managed, how and why to setup different environments for development, testing, and production, how and why to automate the deployment process and the importance of preserving and documenting reproducible software stacks that can be used by other users/researchers in order to reliably reproduce the results. ## Learning objectives * Describe the basics of dependency management. * Discuss why different environments for testing, development, production, and staging are necessary. * Compare the differences between different deployment environments, and what are their specific requirements. * Use software building environments like make, Autotools, CMake. * Correlate continuous integration, delivery, and deployment and the differences between them. * Analyze the benefits, drawbacks, and tradeoffs of continuous integration, delivery, and deployment. * Set up the production, testing, and development environments. * Define and preserve reproducible software stacks to make computational results reproducible, e.g. by applying virtualization environments like VirtualBox, Docker, rkt, or BioContainers or tools for defining scientific workflows like Nextflow, or Singularity. * Configure an environment for continuous integration, delivery, and deployment using a selected continuous integration tool like Jenkins, Buildbot or Travis-CI with basic processing steps like compiling and automated testing. * Describe the basics of dependency management for different programming languages. * Use advanced software building environments like Scons and Waf. * Discuss the challenges for Portability, e.g. for the source code of programs and job scripts to avoid typical compiler-, linker-, and MPI-issues. * Use a software build and installation framework like EasyBuild. ## Subskills