Lifecycles are a new concept in Octopus that will allow us to tackle a number of related suggestions that we've been longing to solve:
- Automatically promoting between environments (triggers)
- Marking a release as bad (so it cannot be deployed any more)
- Preventing production deployments until test deployments are complete (gates)
Lifecycles and phases
A lifecycle is made up of a number of phases, each of which specifies triggers and rules around promotion. The simplest lifecycle, which would ship out of the box and be the default, would simply be:
- Allow manual deployment to: all environments
In other words, this lifecycle simply says "Releases can be deployed to any environment, in any order". It's total chaos!
A custom lifecycle might split the world into pre-production and production phases:
- Automatically deploy to: Development
- Allow manual deployment to: UAT1, UAT2, UAT3, Staging
- Minimum environments before promotion: 3
- Automatically deploy to:
- Allow manual deployment to: Production
- Minimum environments before promotion:
Finally, a more structured lifecycle might look like this:
- Automatically deploy to: Development
- Allow manual deployment to:
- Minimum environments before promotion: 1
- Automatically deploy to:
- Allow manual deployment to: UAT1, UAT2, UAT3
- Minimum environments before promotion: 2
- Automatically deploy to:
- Allow manual deployment to: Staging
- Minimum environments before promotion: 1
- Automatically deploy to:
- Allow manual deployment to: Production
- Minimum environments before promotion: 1
Note that the Test phase unlocks 3 different test environments, and users must deploy to at least 2 of them before the release enters the Staging phase.
Assumptions
We're making a few assumptions with this feature, in order to keep it simple.
First, progression through phases is always linear - you start in phase 1, then go to 2, then 3, and so on. You cannot skip a phase, and there is no branching.
Second, the environments that can be deployed to are cumulative as you get further into the lifecycle. For example, if the release is in phase 3 (Staging) in the third example above, you can deploy to Development, UAT1/2/3, or Staging, just not production.
Automatic promotion
Since each phase can be configured to deploy to one or more environments, you can use this option to automate promotion between environments. For example, upon successful deployment to a development environment, you might automatically promote to a test environment.
Keep in mind that you can mix this feature with the existing manual intervention steps system to pause for approval before/after a deployment, and prior to promotion.
Automatic release creation
When you assign a lifecycle to a project, you'll also be able to configure the project to create releases as soon as a new NuGet package is detected.
For now, I think this will be limited only to our built-in NuGet repository (not for packages in external feeds).
When combined with the features above, this is very exciting - from the push of a NuGet package we can create and deploy releases with no external integration.
Flag a problem
Normally, we assume that if a release is deployed successfully, it's ready to be promoted. Just like now, you can use manual steps to force a review/approval as an explicit step at the end of a deployment.
However, sometimes a deployment looks good and gets approved, and only later do you discover a problem - perhaps a terrible bug that deletes customer data. If that happens, you can flag a problem with the deployment:
When a problem is flagged, the deployment doesn't count towards progress through the lifecycle - if we flag a problem with the Staging deployment, we won't be able to promote to Production, even if Staging was successful.
Scenarios enabled
I want to automate the promotion of deployments from Development all the way to Production, just by pushing a NuGet package
- Use the "Automatically create a release" option
- In each phase of the pipeline, set the 'automatically deploy to' environments such that the release automatically progresses through the pipeline
Prevent Production deployments unless you have deployed to Staging
Simply put them in different phases, and don't unlock the Production environment unless there's a successful Staging deployment.
Prevent production deployments even if staging was successful, if we later find a problem with the application
Use the "Flag a problem" feature to prevent the release from progressing to the next phase, or revert it to the previous phase, in the lifecycle.
Lifecycles will consume project groups
Currently, project groups in Octopus are used to organize collections of projects, as well as limit which environments they can deploy to, and to set the retention policy.
When lifecycles are introduced, it's via lifecycles that you'll control which environments a project can be deployed to, and the retention policy to apply. Project groups will just be left to organize collections of projects, and nothing more.
So, what do you think? Is this a feature that will be useful to you? What would your lifecycle look like?