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.