Mit Ant ein Tar-Archiv erstellen

Mit Hilfe von Ant ein Tar-Archiv zu erstellen wäre an sich ganz einfach. Hat man am Ende das gewünschte Resultat erreicht, ist auch klar was die Dokumentation genau meinte. Bis es so weit ist, kann man aber viel Zeit verlieren.

 
Motivation: Weniger Arbeit beim nächsten Release
Für AtaraxiS haben wir bisher jeweils ein Zip- und ein Tar-Archiv angeboten. Das Tar nutzen wir um die Dateirechte auf Linux so setzen zu können, dass man die Dateien ausführen kann. Dabei sind wir nach diesem Ablauf vorgegangen:

  1. mit Ant-Task wird das Zip erzeugt
  2. das Archiv auf ein Linux-System kopieren und entpacken
  3. das Executable-Flag für die Shellscripte setzen
  4. Daten als Tar verpacken

Das alles ist zwar nicht kompliziert, doch muss es neben dem Release auch für die Tests gemacht werden. Es wäre praktisch, wenn dies gleich von Ant in einem einzigen Durchgang gemacht werden könnte.

 
Ein Verzeichnis archivieren
Ant hat einen Tar Task, mit dem man ein Verzeichnis in ein Tar-Archiv packen kann. Um den Ordner inputDir in das Archiv test.tar.gz zu packen und dabei gleich zu komprimieren, kann man dieses Target in der build.xml definieren:

<target name="tarTest" description="Test Tar Task">
	<tar longfile="gnu" destfile="./test.tar.gz" compression="gzip" basedir="inputDir">
	</tar>
</target>

So genügt nun ein Aufruf von ant tarTest und der Ordner wird archiviert.

 
Rechte für einzelne Dateien setzen
Für unseren Anwendungsfall müssen allerdings die Executable-Flags für alle *.sh und *.command Dateien gesetzt werden. Unter Linux kann man dies mittels chmod und der Oktalzahl 755 machen. Beim Tar Task lässt sich dies auf die gleiche Weise setzen. Die Dateiauswahl geschieht mittels tarfileset, bei der man über filemode die Rechte setzen kann:

<tarfileset dir="inputDir" filemode="755" prefix="AtaraxiS" >
	 <include name="*.command"/>
	 <include name="*.sh"/>
</tarfileset>

Allerdings kann man nun nicht einfach diesen Teil nehmen und in den tar-Block einfügen. So würden die Dateien doppelt kopiert und es gewinnt frei nach Murphy die Datei ohne die gesetzten Rechte.
So wie man bei einem fileset Dateien hinzufügen kann, kann diese auch ausschliessen. Um den Task einheitlicher zu gestalten, nutze ich für den Ausschluss ebenfalls ein fileset:

<target name="tarTest2" description="Test with exclude">
  <tar longfile="gnu" destfile="./test.tar.gz" excludes="**" compression="gzip" basedir="inputDir">
	<tarfileset dir="inputDir" prefix="AtaraxiS">
		<include name="**"/>
		<exclude name="*.command"/>
		<exclude name="*sh"/>
	</tarfileset>
	<tarfileset dir="inputDir" filemode="755" prefix="AtaraxiS" >
		<include name="*.command"/>
		<include name="*.sh"/>
	</tarfileset>
  </tar>
</target>

Damit dies funktioniert muss unbedingt auch auf dem Tar Task alle Dateien ausgeschlossen werden (excludes=“**“). Ansonsten ist man wieder gleich weit und Dateien werden doppelt kopiert.
Die Option prefix=““ legt fest, wo im Archiv die Daten abgelegt werden sollen. In meinem Beispiel wird alles ins Verzeichnis AtaraxiS kopiert. Wenn man dies nicht benötig, kann man die Option einfach weglassen.

 
Fazit
Es könnte so einfach sein. Geht man schrittweise vor und löst eine Teilaufgabe nach der anderen, kommt man zügig voran. Ich machte den Fehler und versuchte mehrere Teile auf einmal zu erledigen. Zudem kamen mir noch die vorhergehenden Tasks in die Quere. Diese setzten die Berechtigung ebenfalls und verwirrten so noch zusätzlich. Dies alles kostete Zeit und Nerven, aber so gibt es nun diesen Blogeintrag.

Ein Gedanke zu „Mit Ant ein Tar-Archiv erstellen“

Kommentare sind geschlossen.