Artikelformat

GWT – den CI Build beschleunigen

Um ein CI-System sinnvoll zu nutzen, muss der Build möglichst schnell laufen. Dazu gehören neben dem Unittests auch der GWT Compiler und an beiden Stellen gibt es einige Optimierungsmöglichkeiten die wir heute mal betrachten werden.

GWTTestCase auf gwt-unit-test migrieren
GWT bietet GWTTestCase um UnitTests zu programmieren. Der Nachteil an dieser Methode ist jedoch, dass so bei einem UnitTest extra ein TomCat Server gestartet werden muss. Dies ist relativ zeitaufwändig und kann durch die Benutzung der gwt-test-utils verbessert werden. Die gwt-test-utils wurden bereits vorgestellt. Die Funktionsweise ist so, dass der Teil der möglichst dicht am Javascript liegt durch sogenannte Patcher überschrieben wird. Das heißt, dass für die Testdurchführung nur noch Java benutzt werden muss. Kritisch an diesem Verfahren ist, dass man so nicht dem compilierten Code testet. Man sollte aber in GWT soviel Vertrauen haben, dass der GWT-Compiler den Java Code ordnungsgemäß in JavaScript-Code transformiert. Auf der anderen Seite kann man so neben der von Google gepatchten Emma Version auch Cobertura nutzen, um die Testabdeckung zu bestimmen. Insbesondere die Auswertung im Hudson/Jenkins CI finde ich persönlich bei Cobertura übersichtlicher.

Junit-Test in einer VM ausführen – forkmode sinnvoll nutzen
JUnit hält 3 Optionen bereit wie die Erzeugung neuer VMs verwaltet wird. So kann in einem Batch, einem Test oder für den gesamten Testlauf eine neue VM erzeugt werden. Die Standard-Einstellung ist per Test, was bedeutet, dass jeder Test eine eigene VM nutzt. Diese muss als erzeugt und nach dem Test verworfen werden. Wenn man am Class-Loader keine größeren Manipulationen vornimmt, kann man aber auch mehr Test in einer VM durchführen. So spart man sich insbesondere bei vielen Test die Erzeugung und das Verwerfen von neuen VMs. Aus persönlicher Erfahrung kann ich sagen, dass dies wirklich sehr viel Zeit einsparen kann. So konnte ein Testdurchlauf nur durch diese Option von über 45 Minuten auf weniger als 5 Minuten reduziert werden.

SoftPermutations
GWT compiliert für jede Sprache und für jeden Browser eine eigene JavaScript-Datei, sodass ein Benutzer nur den relevanten Code herunterladen muss. Lokal compilieren daher viele Entwickler eine spezialisierte Version, die nur in diesem lokalen Umfeld nutzbar sind. Zum Beispiel eine deutsche Version die für den Firefox optimiert ist. Auf dem CI-System ist dies aber zu speziell und man benötigt hier die Versionen für alle Browser. Es gibt aber die Option „collapse-all-properties„, welche für das CI-Sytem sehr gut geeigent ist. Dadurch wird statt vieler verschiedender JavaScript Dateien eine große Datei compiliert und die Optimierungen durch Factories realisiert. D.h. es wird eine spezialisierte Version benutzt, wenn dies vom Browser her erforderlich ist. So wird das Deferred Binding nun realisiert. Der Vorteil ist, dass auf diese Art die Build-Geschwindigkeit weiter verbessert wird. Von ca 30 Minuten konnten wir den GWT-Compiler so auf wenige Minuten reduzieren.

Fazit:
Mit diesen 3 Änderungen ist es möglich einen langlaufenden Build wieder in einen annehmbaren Zeitbereich zu überführen. In einem Projekt von ca 2,5 Stunden auf 15 Minuten.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.