Continuous Integration von Node.js-Projekten mit GitHub und Travis-CI

3 Minuten Lesezeit

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:

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.

Travis-CI Repositories

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.

  1. npm install zum Installieren aller für das Projekt notwendigen Abhängigkeiten
  2. npm 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.

GitHub Pull-Request CI

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.


comments powered byDisqus