So far, I feel that you have noticed that we haven't talked about any tools to make DevOps possible. This is because tools will not solve all these types of problems. They will help you and your customers enforce the DevOps culture, but they are not what makes DevOps possible.
Standardization and testing before we deliver our product is essential to Agile and DevOps, and tools will help us achieve these two goals. Let’s take a look into the Agile workflow and the DevOps workflow:
Here is a look at the Agile workflow:
Here is how it compares to DevOps:
It is very clear that both go hand in hand and that they overlap each other, as they seek the same goals. DevOps has extra steps, such as operate and monitor, which take place after the deployment of the code. These steps are very self-explanatory; monitor consists of monitoring our application in production, checking its behavior regarding whether it presents any bugs, of whether it is using all the resources that were allocated to it. Operate the hardware, VM, or PaaS where it was deployed.
The idea behind continuous deployment (CD) and continuous integration (CI) is to bring us standardization and the means for us to make sure that changes and releases make it into production as quickly as possible with the least possible failures. If a failure happens, we can revert quickly and easily as well. The whole point of CI/CD is to automate manual processes, and many companies still compile releases manually and still send emails to operations with the binaries and instructions on how to deploy their code. To achieve CI/CD, we have tools that will help us automate the whole build, test, deploy, and release cycle.
A typical pipeline of CI/CD is triggered by a commit to a Git repository, which then triggers an automated build process that usually generates an artifact or a drop, which triggers automated testing and automated deployment of the application.
Let's take a look at some of the different open source tools, with a brief explanation of each and to which stage of the DevOps cycle it belongs to.
This is nowhere near an extensive list, and the explanations are a brief summary of their purpose:
- Code:
- Git: A version control system that allows developers to have a distributed repository of their code and track changes across the development cycle.
- GitHub, GitLab, Bitbucket: These three are Git type repositories instead of tools. However, they are worth the mentioning, as they are the most used public and private repositories of Git that are used in the industry.
- Apache subversion (SVN): This is another versioning system. Although it is no longer as popular as it was since the release of Git, it is worth mentioning that it exists, as you might run into it in legacy environments.
- Build:
- Docker: Docker, as we discussed in the Chapter 14, Getting Your Hands Salty, is a tool you can use to build your container images, independent of which language your application is written in. Docker uses Buildkit under the hood, which can also be used as a standalone product to build the docker images.
- Apache ant: This tool was the first one to replace the famous Unix build binary that was made for Java applications. It uses xml to define the steps of the build. This tool is mainly for Java applications.
- Apache Maven: Apache Maven is also another Java build tool, but it came to fix problems such as dependency management that Apache Ant lacked.
- Gradle: Grade was built on the basis of Apache Ant and Apache Maven, but Gradle uses it's own specific language based on Groovy for defining the steps that are required. Gradle is the most modular of all, and mostly all functionalities are added through plugins.
- Grunt: This is the Ant or Maven equivalent of JavaScript; it automates and runs tasks such as linting, unit testing, minification, and compilation. Grunt is highly modular, as there are thousands of plugins available.
- Test:
- Selenium: This is mainly a web application tester that can be run against of most modern-day web browsers. With Selenium, you don't necessarily need to know a test programming language as it offers an IDE and the option to use several of the most popular programming languages.
- Apache JMeter: This is basically a load performance tool that generates a heavy load on servers to test static and dynamic content so that you can analyse its performance on different load types.
- Appium: On the other hand, Appium not only tests web applications, but it can also perform tests on mobile and desktop apps.
- Release, Deploy, Manage, Orchestrate, Operate:
- Jenkins: This is probably the most used tool in the DevOps culture. Jenkins is an automation server that makes all the steps possible via triggers that call the automation of the build and the release process, as well as any automated testing that is configured in the pipelines.
- Ansible: This is mostly a configuration management tool, but it can also help us release our applications via its modularity and provides an easy way of developing your own playbooks to run against a set of servers.
- Puppet: This is another configuration management tool that helps us maintain configurations and manage package patch installations on our environment servers.
- Helm: Look at Helm as the yum or the apt of Kubernetes: on its own, it is unable to automate any deployment process, but with the help of tools such as Jenkins, you can use it to deploy your own custom charts to Kubernetes, as well as keep a release history if a rollback is needed.
- Monitor:
- Nagios: This is the classical monitoring centralized tool that monitors everything from system performance to the status of services and much more.
- Prometheus: A project under the umbrella of the cloud native computing foundation. It allows us to create our own metrics and alerting.
- Fluentbit: This allows you to collect multiple logs and/or data and send it to multiple destinations for log gathering or processing.