Stasis deploy auf Apache Webserver via git hook post-receive

Ich bin gerade dabei meine Website zu überarbeiten. Bisher läuft die Seite über das PHP Framework Codeigniter, doch für 2 plain HTML Seiten und ein Kontakformular ist das im Grunde völlig überdemensioniert. Daher hab ich beschlossen alles über stink normale statische HTML Dateien abzuwickeln und das Kontaktformular durch eine virtuelle Visitenkarte zu ersetzen. Dafür hab ich mich für das RubyGem Stasis entschieden. Der Vorteil hier ist, dass ich SASS, Cofescript, HAML und Co. schreiben kann und der Stasis Interpreter mir diese in CSS, JS und HTML Dateien umwandelt. Mehr will ich dazu gar nicht sagen, außer, dass es sich bisher großartig und zweckentsprechend einsetzten lässt. Als Versionskontrolle nehme ich – wie bei allen meinen Projekten – GIT.

Stasis erzeugt ein public Verzeichnis, dass alle statischen HTML und konvertierten CSS / JS Dateien beinhaltet. Diese könnte man direkt per FTP auf einen Webhost seiner Wahl schieben und gut wärs. Da ich aber zum einen einen eigenen Server betreibe und per GIT in einem develop und einem master Branch arbeite – und auch beide Stände auf einen Server deployen möchte – ist mit der Weg über FTP zu umständlich. Von Ruby On Rails bin ich dank Capistrano ja auch schon ein wenig verwöhnt. Für die Website wollt ich es allerdings nicht über Capistrano erledigen sondern schlicht und einfach einen Git Hook einsetzen, namendlich, den Post-Receive Hook. Dazu habe ich ein bare Repo auf meinem Server. In dieses Pushe ich meinen lokalen Enwicklungsstand (das stasis Projekt, ohne das von stasis erzeugte public Verzeichnis, das ich auch nicht unter Versionskontrolle genommen habe). Auch im remote bare Repo gibt es die beiden Branches develop und master. Ich möchte das beide in ein, vom Apache erreichbares, Verzeichnis kopiert werden, sobald etwas gepushed wird.

Soweit so gut, doch die Schwierigkeit bestand für mich darin, dass in den Hooks meine RVM (Ruby Manager) Umgebung nicht richtig geladen wird (das mag auch auf eine fehlerhafte RVM Konfiguration zurückzuführen sein, die ich atm allerdings nicht beheben will und kann). Es hat mich einige Zeit gekostet, doch nun habe ich einen post-receive Hook zusammengebaut, der RVM läd (damit auch die Gems Verfügbar macht) und auch noch zwichen develop und master zu unterscheiden weiß:

# File /git-bare-repo/hooks/post-receive
#!/bin/bash

# Läd RVM in die Shell Session (Pfade kontrollieren, ggf. liegt rvm wo anders)
[[ -s "/usr/local/rvm/scripts/rvm" ]] && . "/usr/local/rvm/scripts/rvm" 

# Damit GIT_DIR und GIT_WORK_TREE zurückgesetzt werden und man sich über cd bewegen kann
unset $(git rev-parse --local-env-vars)
cd /pfad/zu/master/worktree

# Liest den branch aus
while read oldrev newrev ref
do
    branch=$ref
done

if [ "$branch" == "refs/heads/develop" ]; then
        cd /pfad/zu/develop/worktree
fi

git reset --hard
git pull origin $branch
# rendert die Files und erzeugt public/ <- ist Apache VirtualHost DocumentRoot
stasis

„/pfad/zu/master/worktree“ und „/pfad/zu/develop/worktree“ sind dabei die Verzeichnisse, unter denen per Stasis der public Ordner angelegt wird, welcher wiederrum als DocumentRoot für Apache dient.

Werbung