Progressive delivery is a development methodology that improves continuous integration and continuous delivery (CI/CD) and enables DevOps transformation. The goal of progressive delivery is to gain greater control over development, delivery, and releases so you can ship code faster while reducing risk and improving the end-user experience. But what is progressive delivery, and how can it be used in microservice architectures? We’ll answer these common questions and provide advice for implementing progressive delivery in your SDLC.
Progressive delivery focuses on control. It provides mechanisms for controlling the automated delivery and release of new code so you can practice CI/CD safely. Progressive delivery involves controlling when new features are released, who can release them, and which users are impacted by the updates.
The two core tenets of progressive delivery are:
Release progressions can limit which end-users receive updates, enabling an incremental release of new features. Gates or checkpoints can be established for testing and gathering feedback. Additionally, these testing guardrails can limit the impact of issues to a smaller subgroup of users instead of your entire customer base. For example, you might initially release a feature to 5% of your user population while continuously performing tests and collecting feedback. If all goes well, you could gradually increase the radius of your release to 10%, 20%, etc. If any issues are found or reported, the release can be rolled back to a previous version until the issues are resolved. Then you can reattempt the release and repeat until you’ve successfully deployed to every end-user.
Progressive delegation shifts the control of a feature throughout the release cycle to whoever is most closely responsible for the outcome of the current stage. For example, during coding, an engineer should own the feature. When the code is ready to release, the engineer should transfer ownership to someone closer to the end-users, such as a product manager.
Progressive delivery allows DevOps teams to take advantage of the speed of automated delivery and deployment tools without negatively affecting the customer experience. It can also be used to gain greater control over deployments to microservice architectures like Kubernetes.
There are a couple of distinct approaches to progressively deploying code to Kubernetes and other microservice architectures. Each can be used separately, but they often complement each other when used together.
Service meshes are similar to a blue-green deployment. You have version A of your software, a.k.a. the blue version, which is the current build. Then you create version B, a.k.a. the green version, which is your application with the new feature or functionality. You use a service mesh to route a small subset of your users (often called a “canary group”) to version B, while the majority of your users are still routed to version A. Assuming version B passes all tests and generates positive feedback, the service mesh can perform traffic shifting by progressively routing more and more users to the new build. If tests fail or users report issues, you can use the service mesh to route all traffic back to the old version.
Feature management involves using feature flags (also called feature toggles) to limit who has access to a new version. Before a new feature is deployed to a production environment, it’s wrapped in a feature flag that identifies the canary group of allowed users. You then route your canary group to that feature (perhaps using service meshes), perform your canary tests, and collect feedback. If there are any problems with that new version, a kill switch can toggle the feature flag to the “off” position, so users no longer have access. On the other hand, if the new feature passes all tests and benchmarks, you can continue to progressively allow more and more users to pass through the feature flag.
What is progressive delivery? It’s a way to automatically and continuously deploy new code while maintaining control over when, how, and to whom it’s delivered. Progressive delivery is especially beneficial for DevOps teams using CI/CD to deploy software to microservice architectures like Kubernetes. With release progressions and progressive delegation, you can improve the overall value of your product by ensuring that your deployment speed doesn’t negatively impact your customer base.