Direct naar de tekst

Automatische deployment na een SVN commit

Subversion post commit update op test website

Geschreven door Dennis Burger op

Dit is een vervolg op het artikel over Subversion versie beheer op Mac OS X. Dit artikel gaat er vanuit dat je Subversion hebt geinstalleerd en een beetje overweg kan met de working copies en de Apache webserver. Dit artikel zal hoogstwaarschijnlijk ook werken op Linux servers.

Inspiratie

De werking van deze truuk heb ik niet zelf verzonnen. Het is geinspireerd op een praktijk ervaring met Microsoft Visual Source Safe’s Shadow directory feature. De oplossing is geinspireerd op de website van Netmojo.ca met soortegelijke insteek.

Het doel

Als voorbeeld nemen we een website. Deze website staat onder Subversion versie beheer. We willen een automatische update van de website naar een andere map, een test website. Deze map is bijvoorbeeld een Apache virtual-host (met webadres) waarnaar een kant kan kijken.

Je kunt deze opzet natuurlijk ook gebruiken op niet-websites maar op andere bestanden waarvan je altijd een copy (mirror) wilt hebben op een andere locatie. Bijvoorbeeld een backup server of een externe harde schijf, voor backup.

Auto update een andere checkout working copy

Het komt vaak voor in webdesign / webdevelopment dat je op je eigen computer aan een website werkt, bijvoorbeeld met XHTML, Css en PHP scripts … zodra je de benodigde aanpassingen aan de website hebt gemaakt wil je een commit actie uitvoeren (een nieuwe revisie toevoegen aan de Subversion repository). En er voor zorgen dat diezelfde update die je zojuist gemaakt hebt ook elders direct geupdate wordt.

Hooks

Subversion heeft een aantal features, genaamd hooks. Met deze hooks kun je acties ondernemen als er bepaalde dingen gebeuren in de repository. In dit artikel gaan we het volgende opzetten:

Twee checkout directories

De eerste staat op onze eigen Mac waarmee we werken en de website aanpassingen in maken: de working copy.

De tweede checkout van de repsository werken we eigenlijk niet aan. Dit is altijd de head-revision (laatste of jongste revisie) van de repository. Deze checkout staat in een Apache virtual host welke door bijvoorbeeld de klant te bezichten is via een test URL.

De opzet

Zet de website eerst in een Subversion repository (zie artikel Subversion versie beheer op Mac OS X) Maak een eigen working copy op je Mac.

Apache Virtual-host

Maak een Apache virtual host aan in een andere map op je Mac. Deze fungeert als test site waar de klant naar kijkt. Hiervoor heb je wel een DNS server nodig zodat je bijvoorbeeld subdomeinen kunt aanmaken. Daar is dit artikel niet voor bedoelt.

Deze virtual-host opzet is natuurlijk niet perse nodig maar komt vaak voor in de praktijk.

svn post commit

Blader met de Mac OS X Finder naar de map waar de Subversion repository bewaard wordt. Daarin staat een map genaamd hooks. Bestanden (Unix shell scripts of bijvoorbeeld perl / python programma’s) die hierin geplaats worden, met een specifieke naam, worden uitgevoerd nadat er een corresponderende actie gebeurt in de repository.

Wat wel willen bereiken is dat als er een commit gemaakt wordt in de repository dat een script gestart wordt die een update uitvoert in een andere map (de test website wordt geupdate).

In deze map staan templates, voorbeelden, hoe je ze kunt gebruiken. Kopieer het volgende bestand.

post-commit.tmpl

Hernoem het bestand naar …

post-commit

Open dit bestand daarna in bijvoorbeeld TextWrangler (of BBEdit) of een andere tekst-editor. Verwijder alles wat hierin staat, dit is toch maar een voorbeeld.

Unix bash shell script

Plaats vervolgens dit stuk script hierin.

#!/bin/sh

REPOS="$1"
REV="$2"

# Export an update on working copy
export LANG="en_US.UTF-8"
umask 002
cd /Library/WebServer/vhosts/vogelfotografie_demo/httpdocs
/usr/local/bin/svn cleanup
/usr/local/bin/svn -q --non-interactive update

Dit is een klein stukje Unix bash shell scripting. Het enige wat het doet is naar een bepaalde map gaan, dan een svn cleanup actie uitvoeren een svn update naar de laaste (head) revisie uitvoeren op de desbetreffende working copy.

Verander het script

In het klein stukje script wordt verwezen naar een bepaalde map, namelijk:

cd /Library/WebServer/vhosts/vogelfotografie_demo/httpdocs

Dit pad moet je natuurlijk veranderen naar het pad waar je de test website hebt staan, ofwel de tweede checkout. In dit voorbeeld een Apache virtual-host.

Unix executable rechten geven

Het Unix bash script moet nu nog voorzien worden van de correcte uitvoer rechten (chmod). Zodat Subversion dit script ook mag uitvoeren op de Mac. Open de Terminal (/Applications/Utitilies/Terminal) en typ het volgende in.

Met spatie erachter:

cd 

Sleep nu de hooks map (die in de repository map staat) op het Terminal venster en druk op enter. Dit is een snelle manier om met de Terminal naar een bepaalde map te gaan (in plaats van het cd commando).Typ nu het volgende in om het post-commit bestand Unix uitvoer rechten te geven.

sudo chmod ugo+x post-commit

Wat betekend dit hierboven allemaal?

Met sudo wil je (tijdelijke voor deze actie) administrator rechten op het Unix systeem, waardoor je dus een administrator password moet invullen. Met chmod wil je de rechten veranderen van de type gebruikers users, groep en others, je wil execute rechten toevoegen (+) aan het bestand post-commit.

Dit betekend dus dat het bestand uitgevoerd mag worden. Met andere woorden het script mag gedraaid worden als Subversion dit start.

Automatische update op de test website

Zodra er nu een svn commit gemaakt wordt (bijvoorbeeld met gratis Mac OS X programma’s als svnX of ZigVersion) zal dit scirpt gestart worden. En een nieuwe update wordt gemaakt op de test website / map.