Implementing DevOps the right way means focusing on people and processes. However, it’s still important to make sure they’re supported by the right tools and technologies.
Enterprise organizations need to ensure they’re not asking their engineers to build modern infrastructure using legacy tools.
Part 1 offered a high-level blueprint for getting started with DevOps. Part 2 went in-depth on how to build the culture of people and processes. Part 3 will focus on the right tools and technology needed to help enable high-performing DevOps teams. Using the Twelve Factor Methodology as a guide, it will cover key tools that form the pillars of good DevOps architecture: version control, CI/CD, containers, and infrastructure as code.
Version Control
If there is a truly foundational pillar in DevOps, version control merits strong consideration for that title.
The definition is simple enough; a system or service that tracks changes to software or code over time. Behind that description is a wealth of functionality that enables modern software development to progress at its current scale, and beyond.
Any organization that wants to be successful in their DevOps journey needs to be invested in version control early in the life cycle of their software product. That doesn’t mean precious cycles have to be spent deploying complex infrastructure; many service providers have a rich, “batteries-included” feature set.
GitHub
GitHub is one of the most widely used version control services. GitHub hosts some of the most popular and active open source projects, and it’s likely most engineers and developers will have used it in a professional or personal capacity. Offering a wide variety of integrations and features, GitHub as a managed service is especially attractive for smaller teams and engineering organizations that are just starting out. Down the road, teams can bring GitHub hosting in house if need be. With GitHub Actions, GitHub now provides an all-in-one version control and CI/CD platform, making it a top choice.
Gitlab
GitLab is another well known version control service. Like GitHub, it is also based on the git open source version control technology. GitLab was actually earlier to market with some of the integrated DevOps features now present in GitHub.
For companies that want a more mature, fully-featured CI/CD integration, Gitlab is an excellent choice.
Bitbucket
Anyone that’s worked in DevOps is probably familiar with the creator of the next tool. Atlassian, responsible for Jira ticketing software and the Confluence wiki, offers its own managed version control service called Bitbucket. Following in the footsteps of Gitlab and GitHub, it offers similar, fully-featured Devops integrations like CI/CD and security scanning. Organizations that already make use of Jira and Confluence will appreciate Bitbucket’s strong integration features; easily marrying work items to deployment workflows is a huge boon to Agile development teams.
AWS CodeCommit
AWS offers their own managed version control service, known as AWS CodeCommit. Although it only provides private repositories, and doesn’t offer some of the broader feature sets of the other providers, it has a strong value proposition in offering close, tight integration with other AWS services. Cloud platforms are often the destination for application code and configuration, so having your version control platform share the same API and logical hosting space can be a meaningful advantage.
Continuous Integration/Continuous Delivery
Continuous Integration/Continuous Delivery(CI/CD) is another critical pillar in DevOps. Without CI/CD, it would be impossible to iterate, develop, and deploy features and updates to software at modern scale. CI/CD provides developers with fast feedback on the quality and functionality of their code.
Organizations have to use some form of CI/CD automation if they expect to deliver software effectively at scale.
GitHub Actions
Released in 2018, GitHub Actions provided API-based workflow orchestration for GitHub. In 2019, GitHub released additional features that gave GitHub Actions CI/CD capabilities. Existing GitHub users can now take advantage of a robust set of CI/CD capabilities, including 3rd party plugins and integrations, and workflows defined in code via yaml templates. GitHub Actions allows use of cloud or on-prem hosted runners for performing tasks as well.
CircleCI
One of the first, dedicated CI/CD-as-a-service platforms, CircleCI touts an impressive feature set, and is utilized by some of the largest and most well known brands in the world. One of the benefits of a platform like CircleCI is that it is agnostic to the underlying version control service.
Decoupling the CI/CD infrastructure means that an organization is not locked in to a particular VCS provider or platform.
TeamCity
TeamCity is developed by JetBrains, famous for their popular suite of IDEs and developer tooling. Offering both free and paid self-hosting, as well as newer managed cloud platforms, TeamCity offers organizations several choices in how they manage CI/CD infrastructure. Although it is more complex to manage and configure than some of the other offerings, it offers powerful customization and extensibility features for organizations willing to invest the resources to utilize it fully.
TravisCI
Often a staple in open source and personal project tooling, TravisCI offers easy to use integrations with most popular version control systems. TravisCI started life as a free, open source service for personal projects [[https://travis-ci.org/, having graduated to more enterprise-focused features such as paid support, and custom runners. Similar to CircleCI and TeamCity, being decoupled from VCS means companies can choose their VCS provider independently.
Jenkins
Often viewed as a legacy offering, Jenkins nonetheless provides a powerful CI/CD platform with deep extensibility. In contrast to the other platforms described in this article, Jenkins does not provide its own managed service, requiring customers to install on their own infrastructure or through a 3rd party provider. Jenkins is incredibly powerful and highly scalable, however it can require managing complex infrastructure deployments, often limiting it to larger enterprise organizations to deploy and manage.
Containers
Containers have revolutionized modern software development and deployment.
Utilizing containers means that teams can ensure close parity between development and production environments. The immutable nature of built containers means that the path from committed code to live feature is faster, more efficient, and more ops friendly. In the context of 12factor principles, containers enable dev/prod parity.
Docker
Docker is a name that is synonymous with containers. Although the concept of containerization existed in various forms prior to Docker, it helped drive mass adoption and acceptance of it as a fundamental design paradigm of modern, distributed systems. Teams that aren’t already making use of containerization should consider Docker. It has wide support across a variety of platforms, integrates well at multiple levels of the DevOps ecosystem, and is likely to be a common thread of experience amongst potential engineer candidates for new roles.
Containerd
Part of the Cloud Native Computing Foundation(CNCF), containerd is a modern container runtime utilized by Amazon and Google to help drive their managed container offerings. Containerd was actually part of the Docker suite before it was separated out. Containerd is great for organizations that need a more minimal and low-level container runtime that also obeys community standards.
Podman
Unlike the other container engines, Podman operates as a daemonless engine, and allows for managing pods, containers, and container images. Eschewing the client/server daemon-style architecture of Docker and containerd means that Podman operates with a smaller performance footprint, and does not depend on a daemon process as a potential single point of failure. Podman also offers compatibility with existing container solutions, and can utilize existing container images, as well as export pod configurations to tools like Kubernetes.
Infrastructure-as-Code (IaC)
Infrastructure-as-Code(IaC) enables DevOps teams to create modular, repeatable definitions of their architecture, kept in VCS alongside application code. Legacy methods of provisioning resources were often manual, error-prone affairs.
With IaC, entire application stacks can be deployed automatically and efficiently.
Chef/Ansible/Puppet
Configuration management can be thought of as the first generation of infrastructure as code. Most engineers who have automated infrastructure at scale have used one of these tools, and they still provide value today. However, configuration management can result in “config drift”, making immutable infrastructure more difficult to implement.
Using modern IaC tooling helps keep the gap between the code and “live” configuration minimal.
Terraform
One of the first IaC tools to offer first class support for multiple cloud providers, Terraform has become ubiquitous as the IaC tool of choice for most organizations with cloud infrastructure. Terraform offers a lot of flexibility in how organizations choose to manage their cloud infrastructure. It integrates well with CI/CD and version control, allows “state” to be managed with a variety of backends, and has paid options with managed services from Hashicorp. Terraform supports a variety of resource provisioning beyond just the “big 3” cloud providers, meaning organizations can provision nearly all of their tooling via IaC.
Cloudformation
Cloudformation is AWS’ native IaC tool. While it’s limited to supporting AWS services, that also means it provides first class support and integration with all supported AWS tools and services. Cloudformation is a great choice for organizations that have gone all-in on AWS services and hosting.
Pulumi
Eschewing the declarative, DSL-based models of Terraform and Cloudformation, Pulumi enables developers to define and provision infrastructure resources using the language of their choice. Declarative tools like Terraform and Cloudformation have always struggled with simple imperative logic that is second nature in most programming languages. Using Pulumi, developers can create powerful, logic based infrastructure definitions without having to integrate a DSL into their application code.
CDK
The AWS CDK is Amazon’s entry to the field of using imperative programming logic to define infrastructure, rather than the declarative model of a tool like Terraform. Similar to Cloudformation, the primary focus is on support of AWS services. However, it introduces the ability to use imperative logic(like if/then or for loops) to define resources, and provides constructs for integrating Terraform state files and tooling.
Modern DevOps is an Ongoing Journey
The key to being successful in any DevOps endeavor is be continuously improving. An ongoing investment in people, process, and tools is absolutely necessary. If an organization decides that it’s DevOps initiative is “done”, they’ll never reap the full benefits that DevOps can provide. Companies that aren’t sure how to get started with DevOps should get in touch with Akava, so that we can help you start to realize the benefits of DevOps done right.
Akava would love to help your organization adapt, evolve and innovate your DevOps initiatives. If you’re looking to discuss, strategize or implement any of these processes, reach out to [email protected] and reference this post.