Versiebeheer van Directus schema met Git en CI
Als er een ding is waar wij dol op zijn is dat efficiente automatisering. In onze workflow is git een gegeven maar daarnaast zijn wij ook dol op woodpecker-ci. Wij werken vaak met klanten aan projecten waar een headless cms een must is. Directus heeft dan onze voorkeur, maar er is een probleem: De database van Directus kan je exporteren naar schema maar dat is optioneel, er is voor de rest (op dit moment) nog geen manier om dit anders te managen. In onderstaande blog lees je onze oplossing om een Directus database met Git en woodpecker-ci te updaten met versiebeheer en onderhouden.
Stap 1. Versiebeheer
Dit kunnen we heel kort en bondig houden door te zeggen dat wij hier Git voor gebruiken. Maar dat is alleenmaar het halve verhaal. Allereerst is het belangrijk om een structuur te definieeren, wij werken veel met microservices en headless systemene en plaatsen alles in aparte repositories. Een monorepo is ook een optie maar heeft intern bij ons geen voorkeur.
Met Directus zijn built in exporter kan je gemakkelijk een schema uitrollen van je database structuur.
npx directus schema snapshot ./schema.yaml --format yaml
Er wordt dan een bestand gegenereerd met de volledige instructies van de huidige directus database. Deze kan je committen en je versiebeheer is helemaal geregeld.
Develop, Commit, Push, Deploy
Stap 2. CI/CD
De volgende stap is misschien wel het belangrijkste. Het automatiseren van de database deployment.
Zoals eerder in dit blog aangegeven werken wij met woodpecker-ci. Woodpecker werkt met pipelines en workflows. Een pipeline is een sequentie van workflows en een workflow is weer een sequentie van stappen. Na de vereiste criteria (bijvoorbeeld een push, PR of issue) maakt woodpecker een agent aan die door deze stappen heen gaat.
We willen natuurlijk niet dat er bij alle evenementen een deploy pipeline afvuurt die de directus productie instantie uitzet, update en weer reboot. Gelukkig heeft woodpecker hier een event filter voor.
Door een event filter op alleen releases te plaatsen kan je de stappen alleen uit laten voeren bij een release. Als je dit liever op een branch filter naar main/ master, PR of iets anders wilt is dit ook allemaal mogelijk.
Laten we voor het gemakt aannemen dat je applicatie wordt gehost op een server waar Directus op draait en je deze via ssh kan benaderen.
Een woodpecker workflow met een deploy step zou er dan als volgt uit kunnen zien:
steps:
deploy:
image: custom-ssh-image:latest
when:
- event: release
commands:
- ssh $$USER@$$HOST "cd $$PATH && git pull && npx directus schema apply --yes ./schema.yaml"
Wij hebben intern een ssh docker image ontwikkeld voor het gebruik met woodpecker, in principe voldoet elke image zolang deze een vorm van de openssh-client package heeft.
De "when" filter specificeert wanneer deze stap wordt uitgevoerd, in ons geval op het moment dat er via de git een release wordt aangemaakt.
Onder commands staat een ssh command die direct naar de juiste folder gaat en hier een pull uitvoert om de nieuwste schema op te halen om deze vervolgens in te laden bij directus. Let op, deze config maken wij gebruik van woodpecker-ci secrets deze zijn gemarkeerd met de prefix "$$". Je kan hier ook hardcoded data inzetten. Dit raden wij echter af, het is een bad practice om gevoelige informatie in een git repo neer te zetten, gebruik hier het liefst secrest of .env files voor.
Stap 3. Release!
Nu is alles klaargezet voor een stressloze deploy van je Directus database. Op deze manier hoef je niet zelf bij elke database update je Directus instantie te benaderen om de aanpassingen in te laden en uit te voeren maar laat je de woodpecker agent het zware werk doen. Je kan dit eventueel nog uitbreiden met een slack message, e-mail of iets dergelijks.
Het enige wat nu nog over blijft is het markeren van je eerste release en de magie waarnemen in je woodpecker dashboard!
Conclusie
In een aantal makkelijke stappen kan je snel een stabiele pipeline uitrollen waardoor je hands of je Directus database in beheer kan houden. Geen handmatige werken aan je schema meer, meer tijd om andere dingen te doen en een hardwerkende agent rijker.

De digital agency voor doelgerichte, innovatieve
en opvallende websites en webapplicaties.
Meld je aan voor updates
Laatste nieuws
Contact gegevens

Beukenlaan 132
2665DR Bleiswijk