Feature management (feature flags for user apps, not GitLab itself)
Description
Developer tools have an opportunity not only to provide great functionality, but to promote best practices. One such best practice is to put new features through ever-increasing exposure.
Feature flags allow developers to decouple deployment from delivery. Code can be put into production while the feature is still turned off. Features can then be rolled out to internal users, beta users, a percentage of production users, and then to everyone in ever-increases spheres. Not only does this help facilitate healthy real-world testing, it helps stay true to the premise of continuous integration which is that everything is checked into master
often and deployed. This reduces risk.
Developers can do this today themselves without our help. But let's not just support this flow, but encourage it, and add value to it. I imagine the Features list to not just show me an on/off for each feature, but which stage that feature is in. e.g. off/alpha/beta/ga. And when moving a feature from one stage to another, I imagine something that feels like I’m moving it to the next stage. e.g. Showing a grid of groups that I can enable the feature for, with the groups sorted by stage (or size as a proxy).
I’d like to visually see, at a glance, which features are in private beta, for example. If a product manager tries to turn a feature on for GA, they’ll be non-invasively reminded that they should consider going through private beta first. Heck, even the choice of rollout percentages could be handled this way. e.g. 1%, 5%, 25%, 100% show up as selectable items in columns, giving a reminder of the company policy on rollouts.
If done right, it’ll encourage a good rollout process, and make it trivially easy for users to follow the flow, every time.
My ideal rollout is something like:
- Dev team that created it ->
- internal alpha (all employees minus those giving customer-facing demos) ->
- select beta (~200 people that signed up for this specific feature) ->
- private beta (~1000 people that signed up for general beta) ->
- public beta ->
- 10% rollout ->
- GA
It would be great if you could deploy features with feature toggles and collect KPI's, all in GitLab.
Proposal
- Integrate Feature Flags in an extensible way (so people can implement it however they want, but use a consistent interface for administration)
- Create, view, and toggle feature flags in each environment
- Display diffs between environments
- Tie feature flags related to merge requests
- On merge request view, show events for toggles of related feature flags in each environment
Alternatively, implement full feature flag service ala Launch Darkly or Split
Design
Mockups for MV:
This would allow us to expand feature flags by adding different strategies per flag. We can also extend environments by including different rule sets per flag. Rule sets could include:
-
Status (enabled/disabled)
-
Environment scope
-
Segmented groups
-
Percentage rollouts
The table would need to change as we add more features/the ability to add multiple rule sets per feature flag.
If we need to reduce scope for the first iteration, we can remove the percentage roll out as well as the tabs.