DevOps
The word “DevOps” is a mashup of “development’ and “operations” but it represents a set of ideas and practices much larger than those two terms alone, or together. DevOps includes security, collaborative ways of working, data analytics, and many other things. But what is it?
DevOps describes approaches to speeding up the processes by which an idea (like a new software feature, a request for enhancement, or a bug fix) goes from development to deployment in a production environment where it can provide value to the user. These approaches require that development teams and operations teams communicate frequently and approach their work with empathy for their teammates. Scalability and flexible provisioning are also necessary. With DevOps, those that need power the most, get it—through self-service and automation. Developers, usually coding in a standard development environment, work closely with IT operations to speed software builds, tests, and releases—without sacrificing reliability.
Continuous Integration
In modern application development, the goal is to have multiple developers working simultaneously on different features of the same app. However, if an organization is set up to merge all branching source code together on one day (known as “merge day”), the resulting work can be tedious, manual, and time intensive. That’s because when a developer working in isolation makes a change to an application, there’s a chance it will conflict with different changes being simultaneously made by other developers. This problem can be further compounded if each developer has customized their own local integrated development environment (IDE), rather than the team agreeing on one cloud-based IDE.
Continuous integration (CI) helps developers merge their code changes back to a shared branch, or “trunk,” more frequently & sometimes even daily. Once a developer’s changes to an application are merged, those changes are validated by automatically building the application and running different levels of automated testing, typically unit and integration tests, to ensure the changes haven’t broken the app. This means testing everything from classes and function to the different modules that comprise the entire app. If automated testing discovers a conflict between new and existing code, CI makes it easier to fix those bugs quickly and often.
Continuous Testing
Continuous Testing is a software testing type in which the product is evaluated early, often, and throughout the entire Continuous Delivery (CD) process. Continuous testing uses automated tests to ensure teams receive immediate feedback to quickly mitigate as many risks as possible throughout the software development lifecycle. Moreover, team members can continuously learn about their product and what can be done to increase quality and reliability.
Incorporating continuous testing into your organization is not a simple procedure, however, as you need to build out a test strategy to ensure a smooth transition.
You also asked why is it so valuable? Imagine this: Traditionally, testing software is only done after code is written and sent to the Quality Assurance department to be independently tested. After bugs are found, the code is then sent back to developers to be fixed. This testing model is relatively functional.
However, it is risky, disrupted, and time-consuming. Instead, businesses nowadays require fast delivery of high-quality products. That is where continuous testing becomes valuable. Testing code directly after submitting it to the repository helps detect bugs before any additional code is written. That extra code would then not have to be adjusted to incorporate bug fixes. Talk about saving time!
Benefits of Continuous Testing
- Find errors: Ensure as many errors are found before being released to production
- Test early and often: Tested throughout the development, delivery, testing, and deployment cycles
- Accelerate testing: Run parallel performance tests to increase testing execution speed
- Earn customer loyalty: Accomplish continuous improvement and quality
- Automation: Automate your test cases to decrease time spent testing
- Increase release rate: Speed up delivery to production and release faster
- Reduce business risks: Assess potential problems before they become an actual problem
- DevOps: Incorporates into your DevOps processes smoothly
- Communication transparency: Eliminate silos between the development, testing, and operations teams
- Available testing tools: Available tools that support continuous testing to make the testing process easier, faster, and more reliable
Main challenges of continuous testing
While continuous testing has a myriad of key benefits, there are several challenges that software development teams must take into consideration:
- Adjust to DevOps: Professionals don’t process the right tools and training for continuous testing within Agile and DevOps environments.
- Change in culture: Cultural shifts among your development and testing teams may happen if traditional processes are maintained.
- Update testing strategy: Maintaining only traditional testing methods and test data management that is not clearly defined keeps continuous testing from reaching its full potential.
- Code integration: Developers who don’t integration their code on a regular basis (recommended several times daily) create defect issues with duplicated coding efforts and non-compatible code.
- Test environments: Make sure your test environments work within your code repository base for seamless testing of the newest available code.
- Production environments: Also, make sure your production environments reflect the test environment to ensure every area was properly tested.
Continuous Deployment
The final stage of a mature CI/CD pipeline is continuous deployment. As an extension of continuous delivery, which automates the release of a production-ready build to a code repository, continuous deployment automates releasing an app to production. Because there is no manual gate at the stage of the pipeline before production, continuous deployment relies heavily on well-designed test automation.
In practice, continuous deployment means that a developer’s change to a cloud application could go live within minutes of writing it (assuming it passes automated testing). This makes it much easier to continuously receive and incorporate user feedback. Taken together, all of these connected CI/CD practices make deployment of an application less risky, whereby it’s easier to release changes to apps in small pieces, rather than all at once. There’s also a lot of upfront investment, though, since automated tests will need to be written to accommodate a variety of testing and release stages in the CI/CD pipeline.
Continuous Delivery
Following the automation of builds and unit and integration testing in CI, continuous delivery automates the release of that validated code to a repository. So, in order to have an effective continuous delivery process, it’s important that CI is already built into your development pipeline. The goal of continuous delivery is to have a codebase that is always ready for deployment to a production environment.
In continuous delivery, every stage—from the merger of code changes to the delivery of production-ready builds—involves test automation and code release automation. At the end of that process, the operations team is able to deploy an app to production quickly and easily.
What’s the difference between CI and CD (and the other CD)?
The acronym CI/CD has a few different meanings. The “CI” in CI/CD always refers to continuous integration, which is an automation process for developers. Successful CI means new code changes to an app are regularly built, tested, and merged to a shared repository. It’s a solution to the problem of having too many branches of an app in development at once that might conflict with each other.
The “CD” in CI/CD refers to continuous delivery and/or continuous deployment, which are related concepts that sometimes get used interchangeably. Both are about automating further stages of the pipeline, but they’re sometimes used separately to illustrate just how much automation is happening.
Continuous delivery usually means a developer’s changes to an application are automatically bug tested and uploaded to a repository (like GitHub or a container registry), where they can then be deployed to a live production environment by the operations team. It’s an answer to the problem of poor visibility and communication between dev and business teams. To that end, the purpose of continuous delivery is to ensure that it takes minimal effort to deploy new code.
Continuous deployment (the other possible “CD”) can refer to automatically releasing a developer’s changes from the repository to production, where it is usable by customers. It addresses the problem of overloading operations teams with manual processes that slow down app delivery. It builds on the benefits of continuous delivery by automating the next stage in the pipeline.
It’s possible for CI/CD to specify just the connected practices of continuous integration and continuous delivery, or it can also mean all 3 connected practices of continuous integration, continuous delivery, and continuous deployment. To make it more complicated, sometimes “continuous delivery” is used in a way that encompasses the processes of continuous deployment as well.
In the end, it’s probably not worth your time to get bogged down in these semantics—just remember that CI/CD is really a process, often visualized as a pipeline, that involves adding a high degree of ongoing automation and continuous monitoring to app development.
Case-by-case, what the terms refer to depends on how much automation has been built into the CI/CD pipeline. Many enterprises start by adding CI, and then work their way towards automating delivery and deployment down the road, for instance as part of cloud-native apps.