Buildscripts mit PHING – Teil 3

Avatar von Alberto Assmann

Im zweiten Teil wurde die Hauptaufgabe, das Zusammenführen aller SQL-Files, durch einen eigenen Task gelöst.
Nun fehlen noch die letzten Schritte, das Bereinigen und Zusammenpacken der Projektdateien und das anschließende Bilden einer Prüfsumme.
Anschließend müssen alle Ausgaben nur noch zusammengefasst ausgeführt werden, um einen Deployfähigen Zustand zu erhalten.
Damit am Schluss alle Aufgaben nur noch zusammengefasst ausgeführt werden müssen, um ein Deployfähigen Zustand zu erhalten.

Starten wir mit dem Löschen aller Dateien die unter UNIX unsichtbar sind, also mit einem Punkt beginnen.
Dazu nutzen wir den delete Task, welcher ein Fileset enthalten kann oder einfach nur auf eine Datei, bzw. einen Ordner angewendet wird.

Das Löschen einer einzelnen Datei oder eines Ordners geschieht durch Angabe des file Attributs, bzw. des dir Attributs innerhalb des delete Tags:


oder


für einen Ordner.
Beim Löschen des Ordners können noch weitere Parameter angegeben werden, etwa dass leere Ordner ebenfalls gelöscht werden sollen (includeemptydirs), dass kein Fehler ausgegeben wird, sollte der angegebene Ordner nicht existieren (quiet) und dass bei einem Fehler das Script abgebrochen wird (failonerror).

Nun ist es mühselig für komplexe Ordnerstrukturen eine Abbildung auf den delete Task zu finden.

Hier schaffen Filesets Abhilfe.
Filesets sind Tags die in einem delete Task verschachtelt werden können und beschreiben nach welchem Muster Dateien und Ordner gelöscht, bzw. vom Löschen ausgenommen werden sollen.
Filesets haben dabei immer einen Pfad auf den sich die Include und Exclude Angaben beziehen.
Um alle mit einem Punkt beginnenden Dateien zu Löschen, müssen sowohl alle Unterordner aufgenommen werden, die wird mit **/.* erreicht, sowie der alle entsprechenden Dateien im Hauptordner (.*).
Die Sterne sind dabei Platzhalter.
Ein Stern steht wie üblich für eine beliebige Zeichenfolge und zwei Sterne, gefolgt von einem Slash, stehen für alle Verzeichnisse, inklusive ihrer Unterverzeichnisse.
Einzige Ausnahme vom Löschen soll die .htaccess Datei im public Ornder darstellen, welche nicht gelöscht wird.
Ebenfalls gelöscht werden soll der tests und der data Ordner.

Das Target sieht also wie folgt aus:


    
        
            
            
            
        
    
    
    

Das nun bereinigte Projekt könnten wir theoretisch so an den Kunden ausliefern.
Jedoch ist das Senden vieler Dateien sehr umständlich und der Kunde hat am Ende keinerlei Sicherheit ob alles bei ihm angekommen ist.

Um dieses Problem zu lösen packen wir alle Projektdateien in ein Archiv und bilden eine Prüfsumme über dieses.
So muss der Kunde nur noch die Prüfsumme gegen das Archiv prüfen und bei Übereinstimmung das Paket am Zielort entpacken.
Das SQL-File sollte vorher eingespielt werden, kann jedoch auch völlig unabhängig von dem eigentlichen Paket behandelt werden.

Um ein Archiv zu erzeugen bringt PHING den Zip und den Tar Task mit.
Wir werden uns auf den Tar Task konzentrieren da Tar-Archive im Serverumfeld verbreiteter sind als Zip-Archive.

Der Task zum Archivieren nimmt ähnlich wie der delete Task einen Ordner an, welcher gepackt werden soll oder alternativ ein Fileset.
Zudem wird ein Zielarchiv angegeben und die Kompression.
Das Target zum Packen sieht dann folgendermaßen aus:


    
        
            
        
    

Um eine Prüfsumme über das Archiv zu bilden, bedienen wir uns des filehash Tasks, welchem wir das Tar-Archiv mitgeben.
Anschließend erstellen wir eine neue Datei mit dem Namen md5-hash, in welche wir den zuvor generierten Hash ausgeben.
Für diese Aufgabe nutzen wir den touch Task, welchem wir die zu erzeugen Datei mitgeben.
Mit dem echo Task, schreiben wir den MD5-Hash in die zuvor erzeugte Datei, indem wir die zu schreibende Datei angeben.


    
    
    

Nun haben wir jede Menge Tasks, die wir theoretisch nacheinander ausführen können.
Da es aber mühselig ist jedes Target per Kommandozeile einzeln aufzurufen und der Idee der Automatisierung widersprechen würde erstellen wir ein neues Target, welches ausschließlich die anderen Targets aufruft.
Um ein anderes Target aufzurufen bietet PHING den phingcall Task, welchem das Ziel Target und je nach aufzurufenden Target verschiedene Properties mitgegeben werden.
Unseren neuen Task reichern wir noch um einige einfache Ausgaben an, damit der Nutzer weiß was gerade passiert.
Hierfür eignet sich der schon angesprochene echo Task, dem diesmal nur ein String im msg Attribut mitgegeben wird.


    
    
    
    
    
    
    
    
    
    
    
    
    
 

Nun sprechen wir das Build Target Standardmäßig an, so dass mit einem einfachen Aufruf von:

phing

im Ordner in welchem das Buildscript liegt, ein kompletter Build ausgelöst wird.

Am Ende sollte das Buildscript wie folgt aussehen:



    
        
        
        
         
    
    
        
    
    
        
    
    
        
            
                
            
        
    
    
        
            
                
                
                
            
        
        
        
    
    
        
        
        
    

Wie hoffentlich zu sehen ist lassen sich so mit PHING innerhalb kurzer Zeit komplexere Buildprozesse automatisieren.
Dies bedeutet gerade in Projekten, in denen häufig veröffentlicht wird, eine enorme Zeitersparnis.
Zumal die vorgestellten Tasks noch längst nicht alles sind was PHING bietet.
Wessen Interesse geweckt wurde, dem sei die PHING Dokumentation ans Herz gelegt die sehr Ausführlich ist.

Einziger Nachteil an Phing ist die schlechte Debugging Möglichkeit.
Auch mit -debug Option kann man nur schwer anhand der Fehlermeldungen nachvollziehen was schief gegangen ist, so dass sich die Fehlersuche als sehr mühsam herausstellt.

Nichts desto trotz kann mit PHING sehr viel Handarbeit automatisiert werden, auch ohne Java lernen zu müssen, und so viel Ärger mit dem Kunden wegen schief gegangener Deployments vermieden werden.

Avatar von Alberto Assmann

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.