AutoMate Technisch Help

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

public class MyClass { public void MyMethod() { // flawed implementation } }

AFTER Feature Flag "MyMethodeFix " is created

public class MyClass { private readonly IFearureFlagClient _client public MyClass(IFearureFlagClient client)=> _client = client; public void MyMethod() { if(_client.HasFlag("MyMethodeFix")) { MyMethod_Fixed(); } else { MyMethod_Old(); } } private void MyMethod_Old() { // The old method body is moved here // the implementation is flawed } private void MyMethod_Fixed() { // The new and fixed implementation is here // the flawless implementation } }

Proces-stappen

  1. De ontwikkelaar start een taak om in code een verbetering door te voeren;

  2. De ontwikkelaar maakt in de feature flag database een nieuwe feature flag aan;

  3. De ontwikkelaar maakt in de code een 'knip' aan waarin deze nieuwe verbetering kan worden doorgevoerd.

  4. De unit testen worden nog steeds zonder fouten uitgevoerd (want de nieuwe vlag staat standaard uit);

  5. Dit wordt als een aparte commit (of zelfs PR) aangeboden;

  6. De ontwikkelaar implementeert de verbetering (met unit testen!);

  7. Dit wordt als een aparte PR aangeboden;

  8. Na uitrol (op productie) wordt door een PO/beheer organisatie de betreffende flag aangezet voor één of meerdere tentants;

  9. Wanneer na enige tijd blijkt dat de verbetering voldoet aan de verwachting(en) dan wordt de betreffende flag aangezet voor alle tentants;

  10. 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;

  11. 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 /featureflags maak een nieuwe feature flag aan (standaard 'uit')

  • PATCH /featureflags/{name}/on zet een feature flag aan (voor alle tenants)

  • PATCH /featureflags/{name}/on/{tenantid} zet een feature flag voor één tenant aan

  • PATCH /featureflags/{name}/off zet een feature flag uit (voor alle tenants)

  • PATCH /featureflags/{name}/off/{tenantid} zet een feature flag voor één tenant uit

  • DELETE /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:

Feature flag ERD

In script:

CREATE TABLE [dbo].[Tenants] -- Asumming this table already exists ( Id UNIQUEIDENTIFIER NOT NULL , MicrosoftTenantId UNIQUEIDENTIFIER NULL , Name NVARCHAR(255) NOT NULL , TenantTypeId INT NOT NULL , MicrosoftPartnerId UNIQUEIDENTIFIER NULL , CONSTRAINT [PK_Tenants] PRIMARY KEY (Id) -- other contraints ); CREATE SCHEMA [Flags] GO CREATE TABLE Flags.FeatureFlags ( Id INT NOT NULL IDENTITY(1, 1) , Name NVARCHAR(255) NOT NULL , Description NVARCHAR(255) NULL -- Optional, refer to task/feature/epic nr or title , IsEnabled BIT NOT NULL DEFAULT(0) , ForAllTenants BIT NOT NULL DEFAULT(0) , CONSTRAINT [PK_Flags_FeatureFlags] PRIMARY KEY (Id) , CONSTRAINT [UQ_Flags_FeatureFlags_Name] UNIQUE (Name) ); GO CREATE TABLE Flags.FeatureFlagTenants ( FlagId INT NOT NULL , TenantId UNIQUEIDENTIFIER NOT NULL , CONSTRAINT [PK_Flags_FeatureFlagTenants] PRIMARY KEY (FlagId, TenantId) , CONSTRAINT [FK_Flags_FeatureFlagTenants_FeatureFlags] FOREIGN KEY (FlagId) REFERENCES Flags.FeatureFlags(Id) , CONSTRAINT [FK_Flags_FeatureFlagTenants_Tenants] FOREIGN KEY (TenantId) REFERENCES dbo.Tenants(Id) ); GO
Last modified: 23 March 2026