Continuous Integration von Node.js-Projekten mit GitHub und Travis-CI
Bei Travis-CI handelt es sich um einen Online-Build-Dienst, welcher für OpenSource-Projekte kostenlos ist. Aktuell funktioniert das allerdings nur, wenn sich das Source-Code-Repository auf GitHub befindet. Hier eine aus der Online-Dokumentation stammende Liste der unterstützten Programmiersprachen:
- C
- C++
- Clojure
- Erlang
- Go
- Groovy
- Haskell
- Java
- JavaScript (with Node.js)
- Objective-C
- Perl
- PHP
- Python
- Ruby
- Scala
Für Ruby, PHP und Node.js werden mehrere verschiedene Runtime-Versionen angeboten. Alle Einstellungen werden in einer zentralen Konfigurationsdatei .travis.yml
mit der leichtgewichtigen Markup-Sprache YAML erstellt.
Der Travis-CI-Code, vom Blog, über die REST-Api, Web-Site, vielem mehr bis zu den Chef-Cookbooks für die Erzeugung der virtuellen Build-Maschinen, gibt es OpenSource auf https://github.com/travis-ci.
Was kann ich out of the box verwenden?
Die Build-Nodes von Travis-CI basieren auf Ubuntu Server 12.04 LTS und haben mindestens eine Version von Ruby, OpenJDK, Python, Node.js und Go installiert. Zudem ist ein Set an Netzwerktools wie wget
oder curl
verfügbar. Ebenso gibt es make
und noch einige weitere für Build-Prozesse hilfreiche Tools. Es existieren auch noch einige Data Stores, wie MySQL, MongoDB, Redis, Neo4J, uvm. Individuell auf Builds reagieren kann man mit Hilfe einer Menge an Umgebungsvariablen, wie zum Beispiel der abgerufene Branch, das Build-Verzeichnis, die Build-Nummer, und vielen mehr.
Alle Details über die CI-Umgebung können hier nachgelesen werden.
Konfiguration eines Node.js-Projekts
Im weiteren Verlauf zeige ich Schritt für Schritt, wie ein Node.js-Projekt mit Travis-CI automatisiert werden kann.
1. Travis-CI-Account erstellen
Gehe auf https://travis-ci.org und melde dich oben rechts in der Ecke mit dem GitHub-Account an, in welchem das zu bauende Repository liegt.
2. Repository aktivieren
Im Profil kann man nun mit einem Mausklick die Repositories auswählen für die Travis-CI aktiviert wird.
3. .travis.yml anlegen
Im Grunde reicht es in den meisten Fällen aus die folgende Konfiguration in einer Datei mit dem Namen .travis.yml
im Hauptverzeichnis des Repositories abzulegen.
language: node_js
node_js:
- "0.10"
Hier wird definiert, dass Travis-CI als Runtime das aktuelle Stable-Release 0.10.x von Node.js verwendet.
Node.js Build-Vorgang
Bei jedem Node.js-Build-Vorgang werden zwei bestimmte NPM-Kommandos ausgeführt.
npm install
zum Installieren aller für das Projekt notwendigen Abhängigkeitennpm test
zum Ausführen der Unit- und Integration-Tests
Alle weiteren Änderungen können nun direkt in der Datei packages.json
eingestellt werden. Die Verarbeitung und Ausführung geschieht über npm, wie man es von Node.js-Projekten gewohnt ist.
...
"scripts": {
"test": "vows --spec"
},
...
In diesem Beispiel wird nun der Testrunner vows mit dem --spec
-Parameter verwendet.
Build Lifecycle
Wenn man mehr Freitheiten benötigt, kann man auch mithilfe von Scripten an jeder notwendigen Stelle des Build Lifecycles eingreifen. Im nächsten Beispiel ist eine Konfiguration abgebildet, welche diese entsprechenden Stellen verwendet.
language: node_js
node_js:
- "0.10"
before_install: "sudo apt-get update"
install: "sudo apt-get install ..."
before_script: "npm install -g grunt-cli"
script: "npm run-script ci"
after_success:
- "echo Good! :-)"
- "echo Everything seems to work!"
after_failure: "echo Bad! :-("
after_script: "echo Finished!"
Der Ablauf der Build Lifecycles ist hier genau beschrieben.
Stateless
Selbstverständlich wird kein State zwischen den Builds gespeichert. Durch eventuelle Seiteneffekte würde man sich die Garantie nehmen, dass alle Automatisierungsmechanismen existieren um die Anwendung erfolgreich erstellen zu können. Die Maschinen werden bei Travis-CI im Hintergrund mittels VM-Snapshotting nach jedem Build wieder zurückgesetzt werden.
4. Commit & Push
Nun musst du die Travis-Konfiguration nur noch committen und auf GitHub pushen. Die Ergebnisse der vergangenen, sowie Live-Konsolenausgaben des aktuellen Builds kannst du nun auf https://travis-ci.org unter dem Tab "My Repositories" verfolgen. Hier die Ausgaben anhand eines Beispiel-Projektes.
Jeder weitere Push löst automatisch einen Build-Vorgang aus. Auch jeder Pull-Request wird überprüft. Die Build-Ergebnisse werden nachdem die Builds durchgelaufen sind automatisch auf GitHub angezeigt.
Fazit
Wenn du an einem Projekt in einer der oben genannten Sprachen entwickelst, dieses Projekt OpenSource ist und auf GitHub liegt, dann solltest du unbedingt zwei Minuten aufwenden um den Build deines Projektes zu automatisieren. Selten bedarf es für einfache Projekte mehr Aufwand. Kommen nun beispielsweise noch Integrationstests dazu, welche das Deployment von SQL-Scripts, etc. voraussetzen, dann wird der Konfigurationsaufwand zwar selbstverständlich etwas höher, lohnt sich aber immer noch. Somit hat man als Entwickler, aber auch als Anwender immer die Gewissheit eines lauffähigen Projektes.