четвер, 8 липня 2010 р.

Будуємо мурашкою

У цьому дописі акцент робиться на:
1) білді антом після успішного проходження юніт тесту
2) автоматична генерація номера білда/допис дати/тощо з подальшим доступом до цих мета-даних білда з коду

Юніт тести виглядає цілком логічним проганяти перед кожним білдом, тому в антовському build.xml цілком логічно написати щось назразок:

  1. <target name="test" depends="compile-test">
  2.    <junit failureProperty="tests.failed">
  3.    <classpath refid="classpath.libs" />
  4.    <classpath>
  5.   <pathelement path="build"/>
  6.   </classpath>
  7.     <formatter type="brief" usefile="false" />
  8.     <test name="my.own.TweetProducerTest" />
  9.    </junit>
  10. </target>
* This source code was highlighted with Source Code Highlighter.

Де compile-test таска для компілу юніт-тестів, а "зміна" tests.failed слугує якраз для відслідковування вдалого проходження тест-кейсу. Лише за умови вдалого проходження тестів таска, що збирає джар:

  1. <target name="build" depends="test" unless="tests.failed">
  2.   <antcall target="jar"/>
  3. </target>
* This source code was highlighted with Source Code Highlighter.

А ось і ця таска, описую також створення маніфесту

  1. <target name="jar" depends="compile">
  2.     <delete file="tweet.jar"/>
  3.     <property name="version.num" value="1.0"/>
  4.     <tstamp>
  5.       <format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" />
  6.   </tstamp>
  7.      <buildnumber file="build.num"/>
  8.     <manifest file="MANIFEST.MF">
  9.       <attribute name="Built-By" value="${user.name}"/>
  10.       <attribute name="Implementation-Version"
  11.            value="${version.num}-${build.number}"/>  
  12.       <attribute name="Built-Date" value="${TODAY}"/>   
  13.   </manifest>
  14.     <jar destfile="tweet.jar"
  15.       basedir="build"
  16.        includes="**/*.class"
  17.        excludes="**/*Test*.class"
  18.        manifest="MANIFEST.MF"
  19.     />
  20. </target>
* This source code was highlighted with Source Code Highlighter.
Цей код заслуговує на більш детальний розбір. Почнемо з кінця - створення джару - до нього пакуються усі класс-файли за викюченням тих, імена яких закінчуютсья на Test - це юніт-тести і вони нам не потрібні в нашій джарці.

Загадковий  посилається до відповідного файлу на файловій системі (який модифікувати/видаляти треба обережно) і забезпечує нам номер білду.

Найцікавішою частиною звісно є опис файлу маніфесту, який дозволяє нам задати наші додаткові атрибути. Імена атрибутів цілком описують їх значення... Файл маніфесту вийде приблизно таким:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 14.1-b02 (Sun Microsystems Inc.)
Build-By: kostya
Implementation-Version: 1.0-5
Build-Date: 2010-06-12 18:47:34

Для читання цих даних можна використати наступний код (Groovy):

Enumeration e = Thread.currentThread().getContextClassLoader().getResources("META-INF/MANIFEST.MF");
while (e.hasMoreElements()){
JarURLConnection jarConnection = (JarURLConnection)(e.nextElement().openConnection());
Manifest mf = jarConnection.getManifest();
Attributes attr = mf.getMainAttributes();
String libraryFor = attr.getValue("LibraryFor");
attr.getValue("Implementation-Version");
String version = attr.getValue("Implementation-Version");