Deployment
Deployment is the general process of making a piece of software available to its users. It encompasses a number of important tools and processes including:
- Version control systems
- Infrastructure management
- Testing
- Deployment environments
Version Control Systems
A version control system helps keep a project’s files clean, organized, and maintainable by tracking and maintaining different versions of a file or project.
Important features of version control systems include:
- Tracking every change that is introduced into the code
- Saving all previous versions of the code
- Identifying merge conflicts
Types of Tests
Different types of tests exist that are used in the various stages of deployment. Four types of tests that are often used are:
- A unit test evaluates the smallest possible unit of testable code, such as a single function.
- An integration test evaluates how the units of a program work with one another.
- An acceptance test evaluates whether the user experience aligns with the business requirements of the software.
- An end-to-end test evaluates the application’s behavior using production-like infrastructure that includes networking, databases, and calls to external APIs.
Branching
In version control, branching is the process of creating a copy of the source code (the “trunk”).
Developers can work on their own branches without changing the source code that real users and other developers depend on.
Merging
In version control, merging is the process of combining the changes in one branch with another.
This occurs when the differences between the two branches are ready to be reconciled.
Infrastructure Definition
Infrastructure is the set of hardware and software components that are used to develop, test, deploy and host web services.
Examples of these components include servers, switches, routers, and operating systems.
Operations Team
Operations teams are traditionally responsible for managing an application’s infrastructure.
Services provided by the Operations team include infrastructure configuration, device management, incidence and security response, and ongoing maintenance.
Environments
An environment, in the context of creating and deploying software, is the subset of infrastructure resources used to execute a program under specific constraints. Common examples include:
- Local development environment
- Integration environment
- QA/Testing environment
- Staging environment
- Production environment
Local Development Environments
The local development environment is a developer’s computer where they create features of an application.
Integration Environments
The integration environment is where developers attempt to merge features into a unified codebase, often using version-control software like Git.
Testing Environments
The quality assurance (QA) / testing environment is where tests are executed to ensure the functionality and usability of a project.
Staging Environments
The staging environment mimics the final production environment.
Final performance tests can be executed before real users are involved.
Production Environments
The production environment refers to the infrastructure resources that support the application accessed by clients.
This infrastructure consisted of hardware and software components including databases, servers, APIs, and external services scaled for real-world usage.
DevOps
DevOps is a culture that is supported by a set of practices and tools that assists the collaboration of Development and Operations teams.
DevOps aims to resolve the issues in the development process that arise due to the conflicting goals and isolation of traditional development and operations teams.
Integration of Development and Operations Teams
The integration of Development and Operations teams results in the following benefits:
- Work is no longer passed back and forth between teams
- Development, staging, and production environments are consistent
- Development best practices are applied to infrastructure management
DevOps Team Improvements
The central pillars of a DevOps culture include:
- Thinking about the whole production system, rather than a single department or part (systems-level thinking).
- Feedback loops, allowing each part of the process to receive information and improve.
- A culture of continuous experimentation and learning.
DevOps Team Bottlenecks
DevOps teams seek to reduce the impact of system bottlenecks. Bottlenecks are the slowest part of the production process and they limit the overall pace of production.
DevOps Team Communication
Companies with separated development and operations teams can have some issues:
- Developers might concentrate on the code without considering infrastructure or testing needs.
- The Operations team might only consider infrastructure needs without considering impacts on functionality.
DevOps seeks to have each member of the team consider the entire development process. All members share responsibility for the final result.
DevOps Feedback Loops
Feedback loops use metrics to gain insights into application performance. Action can then be taken from these insights to continuously improve processes. Metrics that measure customer value should be prioritized.
DevOps Failure
In DevOps, failure is seen as something to learn from and is a normal part of the improvement process. It can lead to valuable insights being discovered.
One method DevOps teams use to normalize failure is through blameless retrospectives (or post-mortems).