When you mention ‘DevOps’, it can create a great deal of excitement. It’s become a buzzword in the corporate world, with many businesses rushing to either adopt DevOps or hire a DevOps engineer without fully comprehending exactly what the methodology actually involves – much less how to make it work.
The truth is that DevOps is not a silver bullet, nor is it a strictly defined solution or framework. In fact, several potential elements can go into a DevOps pipeline. Deciding on what tools, techniques, structures, and other aspects are appropriate for a specific business is how you really get the most from the approach.
One of the most common elements found in DevOps cultures is ‘Version Control’. Also known as ‘Source Control’, ‘Version History’, or ‘Version Control Systems (VCS)’, this refers to a type of system used to store and track changes to projects over time. While not strictly required for DevOps teams, a version control system can greatly enhance both efficiency and collaboration, enabling faster and more reliable releases as a result.
So, how exactly do version control systems work, and how can you get the most out of them?
What does version control involve?
‘Version Control’ refers to a system for storing and tracking changes to a project. Rather than simply saying when changes were made, version control software can record:
- Application code and dependencies, such as static content and libraries
- A record of the tools and artifacts used in previous environments
- Scripts used to create application reference data, database schemas, etc.
- Any supporting project artifacts, such as release notes, requirements documentation, and deployment procedures
- Docker files, buildpacks, and other files used to create or compose containers
- Manual test scripts and automated tests
- Cloud configuration files, such as Microsoft Azure Stack DSC files, Pulumi stacks, AWS Cloudformation templates, etc.
- Container orchestration information, such as Mesos, Docker Swarm, or Kubernetes configuration
- Scripts that support deployment, environment provisioning, database migration, or code packaging
- Other configuration or script information used for creating infrastructures which support services (such as database management systems, firewall configuration rules, DNS zone files, enterprise service buses, etc.)
In short, a version control system will store the date and times changes were made, in addition to previous versions of a project and a record of the environment, tools, and team members that were present at different stages. Anything needed to recreate or refer back to previous versions will be present, along with collaborative tools to let team members explain their work (such as annotations).
A key feature of version control systems is the ability to create project ‘branches’. These are, essentially, versions of a project which can be altered and tested without affecting the main ‘trunk’. With various branches existing simultaneously, coders can work on different elements without interrupting the workflows of team members or creating dependency issues. Once work on a branch is completed, it can then be incorporated into the main project.
So, what does version control involve? The right system will offer a number of tools and processes that make it easier to spread out responsibilities, encourage communication, and drive progress. All of this creates a level of efficiency that can lead to remarkable increases in deployment speed.
While this may sound overwhelming, it is important to remember that version control systems can exist in different forms. There are several popular options to choose from, such as Git Version Control, Mercurial, and Subversion, but not all systems look the same once they are integrated into a DevOps pipeline. To make sure your own version control system is up to the task, it will be best to leave the process of choosing and integrating it to an experienced DevOps engineer or DevOps leader.
What advantages do version control systems offer?
A ‘dependency’ is created when one element of a program relies on another. When changes to these elements are made without consulting the development team, it can cause major headaches, to say nothing of delays.
In short, without proper communication and alignment, even perfect code can cause issues. Positive changes to a single branch could be out of sync with the main trunk simply because a coder is unaware of the need to communicate about their work with colleagues.
When using a version control system, all changes to a project are logged. This includes the circumstances behind certain versions and project environments, the reasons behind changes, dates and times, and so on. This removes confusion about when changes were made or where issues originated, making any resulting problems far easier to fix. With this level of communication, colleagues will also be encouraged to keep each other informed of their work, such as by leaving annotations to explain any changes made.
Optimize product reliability
Version control systems enhance visibility, contextual awareness, and communication. This makes it easier for everyone involved in a development project to stay on target and avoid making wasteful errors. As a result, teams will often deliver superior results with fewer bugs and in less time.
Such tools also enable a greater level of ‘reproducibility’. That is to say, configuration information and scripts are stored in a shared system that different team members can access. As a result, it is much easier to provision environments for the sake of fully automated (and far more reliable) testing.
Improvements to team morale
It goes without saying that needlessly inefficient practices and gaps in communication can create a huge drag on team morale, especially when working with skilled professionals.
By incorporating version control into a DevOps pipeline, a business can create a far more positive environment. This, in turn, can lead to increases in employee satisfaction, as well as work quality.
Fix issues faster
When a bug appears during development, the time taken to find it can be just as worrisome as the process of fixing it. As a result, smaller bugs will often be judged as not being worth the effort.
With a version control system, this process is greatly simplified. Changes, along with the environments in which they were made, are automatically tracked, as are the names and details of those who made the changes. As a result, it is far easier to find where and when a bug first appeared and who caused it.
By using a version control system, teams will not only find it easier to fix bugs, but they will also have the freedom to repair more of them without wasting time or resources.
The value of a clear and efficient auditing process cannot be overstated in this day and age. With a version control system in place, a project will be fully outlined from start to finish, including which versions originated with which teams.
With this in mind, both internal and external auditors can locate any information they require with ease. If necessary, they can also clearly highlight areas that are not up to standard.
Automated software delivery
Automation is the bread and butter of DevOps, with teams doing all they can to automate tasks and processes for the sake of reliability and efficiency.
By removing the need to manually recreate environments for development, testing, and production, version control systems demolish many of the biggest barriers for automated software delivery. They can also be easily scaled up, allowing businesses to meet their requirements in terms of speed, even as their services expand.
How do I measure the impact of a version control system?
As is the case with DevOps itself, version control is not something that can simply be deployed and left to do its job. Indeed, choosing a version control tool and applying it often requires guidance from a DevOps engineer.
That being said, there are a few fairly clear metrics that can be used to track the success of a version control system:
- System configurations – When version control is used for system configurations, it is worth tracking how efficiently teams can reconfigure systems, as well as what percentage of your company’s configurations are stored in version control
- Automation scripts – When scripts used for automating build configuration are stored in version control, it is a good idea to track what percentage of scripts are stored this way, as well as how quickly they can be accessed and used to reprovision systems
- Application configuration – When using version control for application configurations, teams should track what percentage of said configurations are stored in this way, along with how efficiently applications can be reconfigured from code stored in version control
- Application code – When version control is used for storing application code, it is good to track what percentage of application code is stored in this way and how easily team members can use version control to recover code
How do I get the most out of version control?
As we said earlier, version control systems are not silver bullets. Companies often make mistakes when using them for the first time, though they are fairly simple to avoid with the aid of an experienced DevOps engineer:
- Apply version control across all production and testing environments, rather than in a limited capacity
- Ensure that your script production and testing infrastructure is built in a way that allows teams to recover from bugs and other issues or scale up in a way that is fully automated
- Ensure that the script and configuration information in version control is sufficient for creating production-like test environments
- Ensure your version control is set up in a way that ensures a triggers the automatic creation of new packages to be used in any environment
- Focus on what your own constraints are, such as any issues in your system architecture. Even with version control, these issues can still cause significant delays