Drie minuten buildtijd voor een platform met 200.000 gebruikers
Snelheid en betrouwbaarheid kunnen elkaar versterken, als je ontwikkelaanpak daarop gebouwd is. Onze developer Bert legt uit hoe het team van Flex Income Plan dat doet.
Wij werken al 8 jaar met een team van 5 mensen aan Flex Income Plan (FIP) voor SD Worx. FIP is het grootste cafetariaplan-platform van België en bedient meer dan 200.000 gebruikers. Een bedrijfskritische gebruikersgroep van die omvang vraagt om infrastructuur die overeind blijft en een ontwikkelcyclus die vooruit kan.
De motor: 40 Docker-agents, builds van 3 minuten
We beheren onze eigen vloot van 40 op Docker gebaseerde build-agents, en die bouwt onze volledige applicatiestack in 3 minuten.
Die snelheid draagt direct bij aan de kwaliteit. We krijgen meteen feedback, draaien duizenden tests tegelijk en deployen een fix of een feature wanneer die klaar is, in plaats van wanneer de pipeline toevallig vrij is.
Hoe we veilig snel gaan: SDLC en Azure DevOps
Een build van 3 minuten is pas nuttig als wat eruit komt veilig naar productie kan. Bij een platform zo complex als FIP vraagt dat een strikte Software Development Lifecycle (SDLC), en we hebben de vijf fasen daarvan rechtstreeks gekoppeld aan de Azure-toolset.
Het bijzondere zit in hoe ver we de automatisering hebben doorgetrokken. Een wijziging gaat niet "gewoon door de pipeline": ze passeert peer review, automatische tests, security- en licentiechecks en quality gates, en komt er als geversioneerd artifact uit voor ze richting productie gaat.
.NET Aspire stroomlijnt lokale ontwikkeling
Voor onze code Azure DevOps bereikt, moet een ontwikkelaar features efficiënt kunnen bouwen, testen en debuggen op zijn eigen machine. FIP is een gedistribueerd systeem met verschillende API's, front-ends, databases en afhankelijkheden, en zulke systemen eindigen al snel met ingewikkelde handleidingen en het bekende "op mijn machine werkt het wel".
We gebruiken .NET Aspire om onze lokale ontwikkelomgevingen te orkestreren, om drie redenen.
Een ontwikkelaar start de volledige stack, inclusief alle nodige externe afhankelijkheden, met één commando of een druk op F5, in plaats van te jongleren met terminalvensters, complexe scripts en handmatige Docker Compose-setups.
De lokale architectuur wordt centraal gemodelleerd in een C# AppHost-project, zodat iedereen met exact dezelfde topologie werkt. Aspire beheert de poorten, injecteert de juiste connectiestrings en regelt de service discovery, waardoor er lokaal niets handmatigs meer te configureren valt.
Aspire levert meteen een lokaal developer-dashboard met realtime gedistribueerde traces, gestructureerde logs en metrics van elke actieve service. Dat leest een stuk beter dan gefragmenteerde console-output, dus we debuggen complexe interacties tussen microservices snel en leveren degelijke code op voor onze build-agents ermee aan de slag gaan.
AI-gestuurde engineering: kwaliteit verhogen met Claude
Naast het automatiseren van onze infrastructuur hebben we Claude diep in onze dagelijkse engineering-workflow geïntegreerd.
Onze ontwikkelaars gebruiken Claude Code om rechtstreeks met onze repositories te werken, wat zowel featureontwikkeling als complexe refactoring versnelt.
AI-context behandelen we als code: Markdown-bestanden met instructies voor Claude staan in de Git-repositories zelf, met onze architectuurrichtlijnen, codeerstandaarden en businesscontext, zodat de ondersteuning past bij FIP en niet bij een willekeurig .NET-project.
We zetten Claude ook in om complexe technische documenten te analyseren en om uitgebreide, geautomatiseerde reviews van onze codebase te draaien. Zo komen subtiele edge-cases, beveiligingsoverwegingen en architecturale verbeterpunten vroeg boven.
Waarom integreren we AI zo diep in een gestructureerde SDLC? Omdat het werkt als een onvermoeibare pair-programmer en als een extra kritische laag bij peer reviews. Standaarden afdwingen en nuances vroeg herkennen betekent dat de code die bij onze build-agents aankomt al beter is. Dat scheelt herstelwerk en houdt onze ontwikkelsnelheid hoog.
Binnen de pipeline: kwaliteit automatiseren
Zodra de lokale ontwikkeling gepusht is, neemt onze build-infrastructuur het poortwachterswerk over. Elke keer dat er code wordt ingediend, draait de pipeline binnen enkele minuten een uitgebreide reeks controles:
SonarCloud voert statische analyse uit op kwetsbaarheden en code smells. Wordt de vooraf ingestelde quality gate niet gehaald, dan faalt de build meteen.
FOSSA scant de dependencies op licentienaleving en beveiligingsrisico's.
Duizenden unit- en integratietesten draaien gelijktijdig, en dat is wat refactoren veilig maakt en bugs vroeg zichtbaar.
Gecertificeerde builds worden opgeslagen als onveranderlijke artifacts, zodat exact de versie die getest is ook de versie is die live gaat.
Samenwerking en gefaseerde omgevingen
Waar meerdere ontwikkelaars tegelijk aan één codebase werken, zijn precieze afspraken nodig. We gebruiken Git binnen Azure DevOps om parallelle workflows te beheren: geïsoleerde feature-branches en een strikt pull request-proces, zodat elke wijziging langs een peer review passeert voor ze überhaupt een build-agent activeert.
Na het builden valideren we elke update in vier omgevingen:
Feature: Voor het geïsoleerd testen van nieuwe functionaliteiten.
Staging: Voor uitgebreide interne functionele testen en regressietesten.
Acceptatie (UAT): Specifiek bedoeld voor het testen van integraties met externe derde partijen.
Productie: De liveomgeving voor meer dan 200.000 gebruikers.
Veilige deployment en infrastructuur
Een build van 3 minuten is alleen waardevol als de stap naar productie even betrouwbaar is. Daarom draait ons releaseproces evenzeer om controle, schaalbaarheid en zichtbaarheid.
We definiëren onze infrastructuur als code. Omgevingen worden geprovisioneerd via ARM-templates binnen de beveiligde Enterprise-Scale Landing Zone (ESLZ) van SD Worx, en die infrastructuur valt onder hetzelfde versiebeheer en dezelfde peer reviews als onze software. Zo vermijden we handmatige configuratiefouten en environment drift, en is de omgeving waarin we testen identiek aan productie. Database-updates verlopen even voorspelbaar, als onderdeel van dezelfde geautomatiseerde releasecyclus.
Na deployment willen we niet alleen weten of het systeem draait, maar ook hoe. Met Serilog, Application Insights en OpenTelemetry traceren we requests over microservices heen, raadplegen we gestructureerde logs en volgen we gebruikersevents en auditlogs op. Voor een platform dat gevoelige financiële gegevens van werknemers verwerkt is die traceerbaarheid essentieel: ze toont prestatieknelpunten vroeg, verkort het debuggen van complexe gedistribueerde transacties en legt precies vast wie wat wanneer heeft gedaan.
Ook schaalbaarheid richten we bewust in, want niet elke component heeft dezelfde belasting of dezelfde impact op de gebruiker. Onze applicaties staan verdeeld over verschillende App Service Plans, elk met eigen schaalregels. De FIP Shop, de front-end die werknemers zelf gebruiken, schaalt snel en agressief op om pieken op te vangen tijdens de inschrijfperiodes van het cafetariaplan. Achtergrondprocessen en interne administratieve componenten schalen conservatiever. Zo houden we de prestaties op peil waar gebruikers het merken, voorkomen we dat een piek in het ene onderdeel het andere raakt, en betalen we niet voor capaciteit die we niet nodig hebben.
Tot slot bewaken we de beschikbaarheid continu, ook omdat we strikte SLA's hebben. Elke component krijgt een eigen health probe die actief de status van de onderliggende afhankelijkheden verifieert, en het volledige ecosysteem wordt 24/7 gemonitord door UptimeRobot. Zo blijft downtime beperkt, ook wanneer duizenden gebruikers tegelijk transacties uitvoeren.
Beveiliging en incidentbeheer
Onze geautomatiseerde pipelines en observability vangen kwetsbaarheden en bugs vroeg op. De gegevens van meer dan 200.000 gebruikers beschermen vraagt continue validatie door experts.
Elk jaar geven we gespecialiseerde, onafhankelijke beveiligingsbedrijven de opdracht om uitgebreide pentests uit te voeren op onze verdediging, architectuur en code, getoetst aan de recentste aanvalsvectoren. Daarnaast nemen we actief deel aan het bug bounty-platform Intigriti, waar een wereldwijde gemeenschap van gescreende ethische hackers onze systemen continu test. Daar komen complexe, specifieke logische fouten boven, en we kunnen ze patchen lang voor kwaadwillenden er misbruik van maken.
Gebeurt er toch een beveiligingsincident of datalek, dan is het protocol helder en direct. We melden het onmiddellijk en dragen over aan de gespecialiseerde security-taskforce van SD Worx, die zorgt voor snelle indamming, risicobeperking en wettelijke rapportage.
Conclusie: Snelheid zonder compromissen
Bij bedrijfskritische software zoals Flex Income Plan kiezen we niet tussen snelheid en stabiliteit. Het proces is zo ontworpen dat het ene het andere versterkt, en elke tool erin heeft een specifieke taak.
.NET Aspire en Claude laten onze ontwikkelaars lokaal sterk geoptimaliseerde code schrijven en valideren. Azure DevOps en onze vloot van 40 Docker-agents testen, verifiëren en builden die code in 3 minuten. Infrastructure as Code, gerichte autoscaling, observability en continue beveiligingstesten houden het platform daarna veilig, kostenefficiënt en beschikbaar voor meer dan 200.000 gebruikers.
Die volledige cyclus zelf in handen hebben is wat ons toelaat om aan dit tempo te blijven releasen op een platform waar mensen elke dag op rekenen.
Van gedachten wisselen met Bert over de aanpak van het FIP-team? Contacteer Bert via bert@tealpartners.com.