Feature Flags
Feature Flags worden industriebreed gezien als de oplossing om deployments van releases te kunnen scheiden.
Om eerst het verschil ertussen duidelijk te maken:
Deployment: het beschikbaar maken van nieuwe 'artifacts' (dll's, exe's, configs e.a.) op een machine. Dit is een onderdeel van een CI/CD pipeline.
Release: Het beschikbaar maken van nieuwe 'functionaliteit' aan gebruikers. Dit releasen wordt doorgaans gedaan door een PO en/of beheerorganisatie (in overleg met de ontwikkelafdeling).
Feature Flags zijn ook bekend onder de naam "Feature Toggle".
Waarom
Wanneer er geen middelen of methoden zijn om nieuwe functionaliteit gefaseerd en/of gecontroleerd beschikbaar te maken aan (één of meerdere) gebruikers, dan is elke nieuwe deployment ook een nieuwe release. Het grote nadeel hieraan is dat bij een fout in een feature er, of een hotfix uitgerold moet worden, of de deployment terug gerold moet worden. Daat laatste kan dan weer onwenselijk zijn als er meer dan één nieuwe fix of feature in een uitrol zit.
Zonder feature flags is elke deployment in feite een 'Big Bang'-release. Zonder deze toggles is een echte CD (Continuous Deployment) niet mogelijk.
Met een feature flag kan een PO en/of beheer organisatie een nieuwe fix of functionaliteit na een deployment 'live' aan- of uitzetten. Dit aanzetten gebeurt uiteraard in nauw overleg met de ontwikkelafdeling.
Hoe
De feature flags zijn binnen een applicatie landschap beschikbaar middels een API. Deze API geeft aan of een feature flag beschikbaar is of niet. Van deze API is een client beschikbaar die met deze API communiceert.
Wanneer een nieuwe functionaliteit of fix ontwikkeld gaat worden, maakt de ontwikkelaar een feature flag aan in de feature flags database. Deze nieuwe vlag staat standaard op "uit".
In applicatie code worden extra code pad aangelegd (met een eenvoudige if-constructie) waarbij, als de vlag bestaat de nieuwe implementatie tak wordt gevolgd. Anders wordt het oude codepad gevolgd.
Nieuwe code wordt dus altijd eerste toegevoegd zonder oude implementaties te verwijderen.
In pseudocode ziet dit er zo uit:
BEFORE Feature Flag
AFTER Feature Flag "MyMethodeFix " is created
Proces-stappen
De ontwikkelaar start een taak om in code een verbetering door te voeren;
De ontwikkelaar maakt in de feature flag database een nieuwe feature flag aan;
De ontwikkelaar maakt in de code een 'knip' aan waarin deze nieuwe verbetering kan worden doorgevoerd.
De unit testen worden nog steeds zonder fouten uitgevoerd (want de nieuwe vlag staat standaard uit);
Dit wordt als een aparte commit (of zelfs PR) aangeboden;
De ontwikkelaar implementeert de verbetering (met unit testen!);
Dit wordt als een aparte PR aangeboden;
Na uitrol (op productie) wordt door een PO/beheer organisatie de betreffende flag aangezet voor één of meerdere tentants;
Wanneer na enige tijd blijkt dat de verbetering voldoet aan de verwachting(en) dan wordt de betreffende flag aangezet voor alle tentants;
Wanneer ook nu blijkt dat de verbetering werkt als gewenst, kan het oude codepad (
MyMethod_Old()) worden verwijderd, inclusief de unit testen die het oude pad testen;Na PR en uitrol kan de feature flag uit de database worden verwijderd.
Functionaliteiten
De feature flag service bevat de volgende functionaliteiten:
De beschikbaarheid van een feature flag kan worden opgevraagd
Een feature flag kan worden toegevoegd (naam vereist)
Een feature flag kan worden verwijderd
Een feature flag kan per tenant worden in-/uitgeschakeld
Een feature flag kan voor alle tenants worden in-/uitgeschakeld
De feature flag service is alleen beschikbaar voor Automate services. Deze is NIET openbaar beschikbaar.
Er is een .NET-client van de feature flag service beschikbaar
Technisch
Service API
De feature flag service bevat de volgende API endpoints:
Is feature flag enabled
GET /featureflags/{name} staan feature flag met [name] aan?
Parameters
Responses
Example cURL
Overige nog te documenteren endpoints, zoals:
POST /featureflagsmaak een nieuwe feature flag aan (standaard 'uit')PATCH /featureflags/{name}/onzet een feature flag aan (voor alle tenants)PATCH /featureflags/{name}/on/{tenantid}zet een feature flag voor één tenant aanPATCH /featureflags/{name}/offzet een feature flag uit (voor alle tenants)PATCH /featureflags/{name}/off/{tenantid}zet een feature flag voor één tenant uitDELETE /featureflags/{name}verwijder een feature flag (die niet meer in gebruik is)
Service database
De feature flags worden opgenomen in de Tenants database. De feature flag ERD is als onderstaand:

In script: