Automatisches Veröffentlichen einer Webseite mit git

Ich erstelle gerade einen automatischen Ablauf um eine Webseite, welche in einem git-Repository erstellt wird, nachdem sie in ein zentrales Repository gepusht wurde, auf einen Webserver weiterzupushen und dort automatisch in das htdocs-Verzeichnis zu kopieren.

Zunächst ist natürlich ein zentrales Entwicklungsrepository nötig. Dieses wird bei mir von gitolite verwaltet. In diesem muss ein post-receive hook erstellt werden, der dafür sorgt, dass z.B. wenn in master ein neuer Commit empfangen wurde, master an den Webserver gepusht wird.

Auf dem Webserver muss ein post-receive dafür sorgen, dass die Webseite in htdocs aktualisiert wird.

Es werden also zwei unterschiedliche post-receive hooks benötigt, welche an den richtigen Stellen installiert werden müssen. Und der gitolite-Server muss in der Lage sein, post-receive hooks zu installieren.

Zunächst der gitolite Server: Hier findet sich eine recht gute Anleitung. Jetzt kann im gitolite-admin Repository unter dem (anzulegenden) Pfad local/hooks/repo-specific ein Skript angelegt werden, das z.B. deploy heißt. Dieses wird dann in der gitolite.conf mit option hook.post-receive = deploy in den gewünschten Repositories installiert. Es folgt der deploy post-receive hook:

#! /bin/bash
BRANCH="master"

# push to webserver
while read oldrev newrev ref
do
    if [ "$ref" = "refs/heads/$BRANCH" ]
    then
        git push webserver ${BRANCH}
    else
        echo "Ref $ref received. Nothing to do"
    fi
done

Damit das so funktioniert muss natürlich der Webserver als remote bekannt gemacht werden und ein SSH-Key hinterlegt werden. Also dem Repository auf dem gitolite Server mittels git remote add webserver <user>@<webserver>:<path> den Webserver bekannt machen und mit ssh-copy-id <user>@<webserver> den SSH-Zugang ermöglichen. Der gewählte user auf dem Webserver braucht Schreibzugriff auf das Verzeichnis, aus dem die Dateien ausgeliefert werden.

Auf dem Webserver muss nun unter dem zuvor gewählten <path> mit git init --bare ein leeres git Repository erzeugt werden. In dieses wird der folgende post-receive hook eingehängt.

#! /bin/bash
TARGET="/srv/www"
BRANCH="master"

while read oldrev newrev ref
do
        if [ "$ref" = "refs/heads/$BRANCH" ];
        then
                echo "Ref "$ref" received. Deploying ${BRANCH} to htdocs"
                git --work-tree=$TARGET checkout -f $BRANCH -- htdocs
        else
                echo "Ref $ref received. Doing nothing. Only ${BRANCH} will be deployed"
        fi
done;

Ich habe in dem Repository einen Ordner mit dem Namen htdocs, da noch mehr Dinge zu meiner Anwendung gehören. Es sollen natürlich nur diese ausgeliefert werden, daher wird in Zeile 10 nur dieses Verzeichnis in das Verzeichnis /srv/www ausgecheckt.

Wenn alles funktioniert hat, wird nun jedes Mal, wenn etwas in den master branch des gitolite Repositorys gepusht wird, der Inhalt des Verzeichnisses htdocs automatisch auf dem Webserver veröffentlicht.

Git unter Windows und Eclipse

Ich habe für Praktikumspartner im Fach Software Engineering 2 während meines Studiums der Technischen Informatik ein kleine git tutorial geschrieben. Hier nun also sowohl die Latex Quellen als auch das pdf. Das Ding ist noch lange nicht fertig, aber so sieht man schon mal die Anfänge und etwas helfen kann es wohl auch schon.

Desweiteren kann natürlich jeder gerne mitmachen. Ist ja schließlich CC-BY-SA lizensiert.

git-tutorial (nur PDF)

git-tuorial (Archiv mit Latex Quellen und PDF)

btrfs kernel panic

Ich habe mein Netbook mit btrfs als Dateisystem für / und /home aufgesetzt. Dies geschah in dem Wissen, dass fsck.btrfs noch nicht immer funktioniert.
Nun wollte das Ding nicht mehr booten und zeigte nur eine kernel-panic und die dazugehörigen Meldungen an.
Nach etwas Spaß mit Suchmaschinen und einigem Lesen fand ich diesen Eintrag im openSUSE-Forum.

Nachdem ich also von meinem USB Stick openSUSE 12.1 KDE gebootet hatte, besorgte ich mir mittels

su -c 'zypper in git'
git clone git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs.git 

die aktuellen Quellen der btrfs-progs.
Um diese zu kompilieren müssen mindestens folgende Pakte installiert werden:
libuuid-devel, libattr-devel, gcc, make, zlib-devel
Nun kann mittels

make
make btrfs-zero-log

das benötigte Tool erstellen.
Nur noch mit

btrfs-zero-log /dev/sdXY

ausführen (wobei X und Y entsprechend ersetzt werden müssen) und neu booten.
So ließ sich mein Netbook wieder booten. Allerdings könnte da immer noch ein Problem sein. Ich werde es im Auge behalten.

Symbian und SQLite

Ich hatte ja schon lange vor, eines meiner Programme auf meinem Symbian Telefon (N97) zum laufen zu bringen.

Dank Qt ist das auch sehr einfach. ich musste im Grunde nur einige kleine Anpassungen am Hauptfenster vornehmen und etwas Kram in die Projektdatei einfügen.

Alles kein Problem. Auch Qt auf das Telefon zu bekommen ist sehr einfach, da man auch ein sogenanntes smart installer Paket erstellen kann, welches eine aktuelle Qt-Version aus dem Netz lädt und installiert.

Das größte Problem war, dass auf die zu dem Programm gehörende SQLite Datenbank nicht zugegriffen werden konnte.

Ich hatte schon befürchtet, dass diese überhaupt nicht in dem Paket enthalten sei, doch nach einigem probieren mit dem Simulator war klar, dass die Datei auf dem Telefon sein sollte.

Da das N97 zwar an sich ein schönes Gerät ist, aber ein paar gravierende Designfehler hat, wie zum Beispiel die viel zu kleine Systempartition, habe ich mir angewöhnt alle Anwendungen auf den großen Massenspeicher zu installieren, tat ich das auch mit meinem kleinen Programm. Das dazugehörige Qt muss aber auf den Systemspeicher, daher wird auch nicht gefragt, wo das installiert werden soll.

Ich weiß im Moment nicht mehr, ob die SQLite3 Bibliothek auch vom Smart Installer installiert wurde oder schon auf dem Telefon vorinstalliert war, wie dem auch sei: Bei mir befindet sich diese auf der Systempartition und es scheint nun der Fall zu sein, dass auf diese nur zugegriffen werden kann, wenn das Programm auf der selben Partition wie die SQLite3 Bibliothek installiert ist.

Das könnte ich ja noch verstehen, wenn man denn eine sinnvolle Fehlermeldung bekäme….

So habe ich etwa einen halben Tag an einem funktionierenden Programm herumgefrickelt…

Es gilt also für die Nachwelt festzuhalten: Wenn ein Programm unter Symbian^1 SQLite3 nutzen soll, so muss beides auf der selben Partition installiert werden!!!

Grub mit openSUSE DVD reparieren

Dies ist zwar eigentlich nur ein Backup für mich, um beim nächsten Mal nicht suchen zu müssen, aber vielleicht hilft es ja auch noch jemandem.

Mein Rechner hat in letzter Zeit viele Probleme gemacht. Mittlerweile bin ich mir relativ sicher, dass es an der alten Audigy2 Soundkarte lag, aber Hard Freezes sind kein Spaß und die Ursachenforschung ist anstrengend und auch die Konsequenzen manchmal etwas nervig (mysql verträgt Abstürze manchmal gar nicht gut, aber dazu später mehr.). Das Problem, dem ich mich in diesem Eintrag widmen will ist die Wiederherstellung von grub mit Hilfe der openSUSE DVD (11.4 in meinem Fall, sollte aber mit jeder Linux LiveCD funktionieren)

Als erstes sollte man das LiveSystem booten, wenn man die openSUSE DVD nutzt, so bootet man das Rettungssystem. Wenn das geschen ist, meldet man sich als root an. Normalerweise geschieht dies einfach durch die Eingabe von „root“. Falls ein Passwort gebraucht wird, so erfährt man dieses von der Homepage der genutzten LiveCD. Sodann muss man herausfinden welches Laufwerk die root („/“) Partition enthält und, falls man eine seperate /boot Partition nutzt muss man auch dieses Laufwerk kennen. In meinem Fall waren es /dev/sdb3 für / und /dev/sda1 für /boot.

Sodann mountet man die root Partition nach /mnt, bindet in diese /dev und/proc ein, wechselt das root Verzeichnis nach /mnt und mountet dort /sys und eventuell /boot. Dies geschieht mit folgenden Befehlen:

mount /dev/sdXY /mnt
mount -o bind /dev/ /mnt/dev/
mount -o bind /proc/ /mnt/proc/
chroot /mnt/ /bin/bash
mount /sys
mount /dev/sdXY /boot

Bei /dev/sdXY müssen natürlich noch XY durch die tatsächlichen Werte ersetzt werden.

Danach kann man mit „yast2 bootloader“ den Bootloader konfigurieren. Am besten läßt man sich von yast eine neue Konfiguration vorschlagen (Alt+e, Alt+p) und bestätigt diese (Alt+o).

Die Kommandos sind schamlos von niczsoft.com/ abgeschrieben

Festplatten und Partitionierung

Man liest des öfteren in IRC Chats, dass einige Hilfesuchende nicht wissen, was Partitionen sind. Das größte Problem scheinen die „Laufwerke“ in Microsoftbetriebssystemen zu sein. Dort wird jeder Partition, jedem externen Laufwerk und auch „Netzlaufwerken“ ein Buchstabe zugeordnet. Die Systempartition von Windows (und auch DOS) heißt normalerweise C:. Das liegt daran, dass A: und B: für Diskettenlaufwerke reserviert waren.

Diese Einteilung ist allerdings etwas irreführend, denn es handelt sich nicht zwingend um ganze Festplatten. Eine solche kann nämlich in Partitionen aufgeteilt sein. Vor allem bei modernen Festplatten macht es Sinn, mehrere Partitionen auf einer Platte einzurichten, um besser die Übersicht zu behalten, aber auch um z.B. Defragmentationen besser planen zu können.

In unixoiden Betriebssystemen wird die Festplatte meist in mindestens drei oder mehr Partitionen aufgeteilt, nämlich eine root Partition, welche das System, alle Programme und das Wurzeldateisystem enthält. In dieses werden die anderen Partitionen „gemountet“, also eingehängt. Diese root Partition ist eigentlich ausreichend, doch erstellt man für Desktoprechner meistens noch mindestens eine /home Partition, die alles unterhalb des Verzeichnisses „/home“ beinhaltet, damit man bei Neuinstallationen die Benutzereinstellungen behalten kann und nur die root Partition formatieren muss. Bei Servern nutzen viele noch eine eigene Partition für /var, wo z.B. Emails, Druckerwarteschlangen und andere Dinge die sich schnell ändern, wie logs gespeichert werden. Zusätzlich gibt es noch eine sog. Swap Partition, die die gleiche Aufgabe erfüllt wie die Auslagerungsdatei in Windows.

Bis auf Swap Partitionen werden alle Partitionen in des Wurzeldateisystem eingebunden, sind also Unterverzeichnisse. Dies ist in Windows auch möglich, wird aber selten genutzt.

Es gibt zwei Arten von Partitionen: Primäre und Erweiterte. Pro Festplatte kann es maximal vier Partitionen geben. Um mehr zu erhalten, muss man eine dieser vier als erweiterte Partition erstellen und kann dann in dieser beliebig viele „logische Partitionen“ erstellen. Diese Begrenzung liegt daran, dass die Partitionstabelle nur eine feste größe am Anfang der Festplatte zur Verfügung hat. In dieser Tabelle werde Partitionsart und der Anfangs- und Endpunkt festgehalten.

Jede Partition kann wiederum mit einem Dateisystem formatiert werden. Windows nutzt heutzutage meist NTFS, versteht aber auch das ältere und nicht mehr zu empfehlende FAT32. GNU/Linux kann NTFS und FAT32 zwar lesen und beschreiben, doch fehlen einige wichtige Funktionen wie Benutzerrechte und NTFS ist proprietär und somit nicht vollständig bekannt, weshalb GNU/Linux z.B. korrupte NTFS Partitionen nicht säubern kann. Das verbreitetste Dateisystem in GNU/Linux ist wohl ext4 und dessen Vorgänger ext3. Beide sind sog. „Journaling Filesystems“, wie NTFS. Desweiteren kann man aber auch eine Reihe weiterer Dateisysteme nutzen, die je nach Gebrauch Vor- und Nachteile bringen.

Partitionen sind also nur Teile einer Platte, wenn auch eine Platte nur eine Partition beinhalten kann. Natürlich kann man auch USB Sticks in mehrere Partitionen unterteilen. Leider kann Windows dann nur die Erste lesen, und auch nur wenn es sich um eine mit NTFS oder FAT32 formatierte Partition handelt.

GNU/Linux und das Installieren von Software

Es fällt mir immer öfter auf, dass offensichtlich viele Windows zu Linux Umsteiger versuchen, Software genau so zu installieren, wie sie es schon unter Windows gelernt haben: Browser öffnen, Software suchen und den Downloadlink drücken; danach doppelt auf die heruntergeladene Datei klicken. Mit etwas Glück ist es immerhin keine .exe oder .msi Datei. Wenn man dann im openSUSE IRC channel (#suse auf irc.freenode.net) darauf hinweist, dass das heruntergeladene Programm so nicht funktionieren wird, sieht man sich nicht selten mit Unverständnis konfrontiert.

Doch ist meiner Meinung nach gerade das Softwaremanagement eine der großen Stärken von GNU/Linux. Man muss eben nicht selber das gesamte Internet durchsuchen und in regelmäßigen Abständen sicherstellen, dass die Programme wenigstens auf einem halbwegs aktuellen Stand sind. Eine kurze Suche mit YaST oder zypper, oder welches System die genutzte Distribution auch verwendet, und das gesuchte Programm ist mit einem Häkchen installiert.

Das ist natürlich nur dann der Fall, wenn das gesuchte Programm im Hauptrepository zu finden ist. In dem Fall reicht es sogar, nur zu Wissen, was man eigentlich will, um mit geeigneten Stichwörtern sogar die Beschreibungen der im Repository befindlichen Programme zu durchsuchen.

Etwas schwieriger wird es, wenn nichts im Hauptrepository den Anforderungen entspricht. Wenn man nun weiß, wie das gesuchte Stück Software heißt, kann man auf opensuse.org fündig werden. Diese Suchmaschine durchsucht allerdings nur den Open Build Service und die Repositories der gewählten Version. Um auch das (großartige) Packman Repository und andere zu durchsuchen, sollte man packages.opensuse-community.org ausprobieren. Für diejenigen, die gerne mit der Shell arbeiten, empfehle ich das kleine Programm „webpin“, welches im Open Build Service zu finden ist.

Was aber macht man, wenn man das entsprechende Programm gefunden hat? Einfach auf „Download“ drücken ist auch hier wenig ziel-führend. Am Besten ist es wohl, das Repository in das Softwaremanagement einzupflegen. Mittels „zypper ar <url> <alias>“ ist das recht einfach. In YaST gibt es auch eine grafische Oberfläche. Danach sollte das gesuchte Programm mittels YaST oder zypper zu finden und zu installieren sein.

Und was, wenn das installierte Programm nicht gefällt und das, was man jahrelang unter Windows verwendet hat viel besser ist?

  1. Hat man sich damit ja auch schon eingearbeitet
  2. Sind einige FOSS-Programme deutlich anders zu bedienen als Kommerzielle
  3. Bedeutet eine andere Oberfläche nicht zwingend, dass eine besser ist

Gerade wenn es um GIMP geht, meckern viele Umsteiger gleich, denn es sieht ja deutlich anders aus als Photoshop, und das kann ja nur schlecht sein. Allerdings gibt es unter GNU/Linux ja virtuelle Arbeitsflächen, wovon man ja eine ausschließlich für GIMP nutzen kann. So finde ich es sogar sehr nützlich, dass ich die einzelnen Fenster einzeln minimieren und platzieren kann und ab 2.8 soll es ja nun auch eine Photoshop-ähnliche Oberfläche geben. Auch sollte der Funktionsumfang für die Meisten locker ausreichen. So viele professionelle Designer, wie sich im IRC oder in Foren über Gimp beschweren, die auch noch auf Linux umsteigen wollen, kann es gar nicht geben.

Aber ich habe auch schon von vielen gehört, dass sie unbedingt einen bestimmten Instantmessenger bräuchten oder einen bestimmten IRC-Client oder einen bestimmten Mediaplayer oder etwas ähnlich banales oder alles auf einmal. Und diese benötigten Dinge gibt es dann eben nur für Windows. Da frage ich mich meist zuerst, warum derjenige denn nun auf GNU/Linux umsteigen will, wenn er doch nur Windowsprogramme nutzen will. Dann kommt meist sofort die Frage, wie wine denn funktioniere. Es ist ja ganz nett, dass einige Windowsprogramme mit wine tatsächlich funktionieren, aber sollte man wine nutzen, wenn es genug native Alternativen gibt, wie bei obigen Beispielen? Ich befürchte, dass das eher Probleme mit sich bringt, zumal solche Anwendungen nicht von dem Softwaremanagement profitieren und man sich doch wieder selber um neue Versionen für jedes so installierte Programm kümmern muss.

Fazit: Warum sollte man alle Vorteile von GNU/Linux opfern, nur um bestimmte (Windows)Programme weiter zu nutzen? Dann kann man gleich bei Windows bleiben. Ein Wechsel des Betriebssystems beinhaltet eben auch, dass man neue Programme lernen muss.