Wer Continuous-Integration-Systeme für Flash- bzw. ActionScript-Projekte verwendet, wie beispielsweise Bitbucket und Bamboo aus dem Atlassian-Universum, möchte auch Unit-Tests (FlexUnit) etc. auf dem Server ausführen lassen. Das ist nicht ganz einfach, da der flashplayerdebugger ein X-Display braucht und nur als 32bit-Variante vorliegt. Ich beschreibe hier die Minimal-Variante mit der wir es unter Debian Wheezy zum Laufen gebracht haben.

Display zur Verfügung stellen

Grundsätzlich gibt es 2 Möglichkeiten FlexUnit „headless“ zu betreiben. Erstens kann man den FlexUnit ANT-Task mittels eines VNC-Servers ein entsprechendes Display bereitstellen und damit arbeiten. Zweitens kann man auch ein Framebuffer-Device per Xvfb bereitstellen, auf dem gearbeitet wird. Nach Beleuchtung beider Mechanismen wurde Xvfb als brauchbarer erachtet:

apt-get install xvfb

Das Paket bietet einerseits das Xvfb-Binary, welches dauerhaft ein Display bereitstellt und das Wrapper-Skript „xvfb-run“, mit dem man Programme in einem separaten Display starten kann (beispielsweise xvfb-run xterm ). Für CI-Umgebungen verwenden wir Xvfb als permanentes Display, da das am ressourcenschonendsten ist. Zu beachten ist, dass Xvfb am besten als der User gestartet wird, unter dem später auch die Tests laufen. Ein entsprechendes Init-Skript erledigt das:

#! /bin/bash
#
### BEGIN INIT INFO
# Provides:             Xvfb framebuffer device
# Required-Start:       $local_fs
# Required-Stop:        $local_fs
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Xvfb framebuffer device
### END INIT INFO

USER="ciuser"
XVFB=/usr/bin/Xvfb
XVFBARGS=":0 +extension RANDR"
PIDFILE=/var/run/Xvfb/xvfb.pid

do_start () {
        echo -n "Starting virtual X frame buffer: Xvfb ..."
        su - ${USER} -c "/sbin/start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $XVFB -- $XVFBARGS"
        echo "."
}

do_stop () {
        echo -n "Stopping virtual X frame buffer: Xvfb ..."
        su - ${USER} -c "/sbin/start-stop-daemon --stop --quiet --pidfile $PIDFILE"
        echo "."
}

case "$1" in
                start)
                                do_start
                                ;;
                stop)
                                do_stop
                                ;;
                restart)
                                do_stop
                                do_start
                                ;;
                *)
                                echo "Usage: $0 {start|stop|restart}"
                                exit 3
                                ;;
esac

Im Profil des Users kann man nun die Umgebungsvariable gesetzt werden:

# Xvfb display
if [ -f /var/run/Xvfb/xvfb.pid ] && kill -0 "$(cat /var/run/Xvfb/xvfb.pid)" > /dev/null 2>&1; then
        export DISPLAY=:0
fi
EOF

Voraussetzung für letzteres ist, dass der Prozess auch dem User gehört, da ansonsten das „kill -0“ fehlschlägt und die Variable nicht gesetzt wird.

Bibliotheken installieren

Da der flashplayerdebugger nur als 32bit-Binary zur Verfügung steht, braucht man noch die entsprechenden Libraries. Diese lassen sich recht einfach mit ldd herausfinden und nachinstallieren:

$ dpkg --add-architecture i386
$ apt-get update
$ apt-get install libc6-i386 libglib2.0-0:i386 libx11-6:i386 libxext6:i386 libxt6:i386 libxcursor1:i386 libxrender1:i386 libnss3:i386 libnspr4:i386 libgtk2.0-0:i386 libatk1.0-0:i386  libgdk-pixbuf2.0-0:i386  libcairo2:i386  libfreetype6:i386 libfontconfig1:i386 libglib2.0-0: libc6:i386 xfonts-base libcurl3:i386

Wrapper bauen

Anschließend wird noch ein Wrapper-Skript benötigt, welches sowohl die Display-Variable, als auch den Library-Pfad setzt. Dieses Skript kann dann im CI-Server hinterlegt werden:

#!/bin/sh
# The Flash Player Debugger binary
FLASHPLAYERDEBUGGER_BINARY="/pfad/zum/flashplayerdebugger"
# Set path to the 32-bit libraries as environment variable
export LD_LIBRARY_PATH=/usr/lib32
# Set display for execution as environment variable
export DISPLAY=:0
# Run Flash Player Debugger
exec $FLASHPLAYERDEBUGGER_BINARY "$@"

Nächster Beitrag Vorheriger Beitrag