0

Continuous Integration mit Hudson auf Windows

Das Ziel: zwei erfolgreiche Hudson Jobs (mit Git & Subversion verwaltet)

Continuous Integration ist eher ein Thema welches nicht auf Windows zu Hause ist. Wenn man viel mit Windows arbeitet (n muss) und es auch als Testsystem nutzt, kann es Sinn machen eine Continuous Integration Umgebung mit Hudson zu installieren. Ich habe mich entschieden diese Hudsonumgebung und mit zwei verschiedenen Code Revision Systemen und Maven als Buildtool zu verbinden.

Ich habe folgendes set up gewählt:

Diese Komponenten waren ‘vorinstalliert’:

  • Java (JRE & JDK 1.6.0_21)
  • Netbeans 7.0.1
  • Maven 3.0.3

Diese Komponenten habe ich im Laufe der Tests installiert:

  • Hudson 2.1.1
  • Git 1.7.6
  • Subversion server 1.6.17
  • TortoiseSVN 1.6.16

Erster Schritt ist die Hudsoninstallation. Zum Zeitpunkt des Schreibens dieses Artikels war die aktuelle Hudsonversion 2.1.1. (http://hudson-ci.org).  Ältere Versionen standen auf dieser Seite nicht immer als war-file download bereit. Die Dateiendung musste in diesen Fällen manuell von ‘*.zip’ in ‘*.war’ geändert werden. Die Hudson Installation sind hier (http://www.torsten-horn.de/techdocs/maven.htm#Hudson) gut beschrieben. In den Hudson settings müssen nun das JDK, Git & Maven bekannt gemacht werden:

hudson config jdk git

hudson config maven3

Der nächste Schritt stellt die Git Installation dar. Ich habe mich für git bash 1.7.6-preview20110708 entschieden, die hier (code.google.com/p/msysgit/) heruntergeladen werden kann. Die Installation ist selbsterklärend und windows typisch: “weiter, weiter, fertig stellen”. Üblich ist, nach der Installation einen Git user namen und email zu definieren, nötig ist das jedoch nicht.

Ein weiterer Instalationsschritt für diesen Artikel ist nun die Subversion Server Installtion. Eine gute Installationanleitung habe ich hier (www.nddesign.de/news/2008/01/09/SVN-Server_unter_Windows_installieren) gefunden. Die Anleitung ist etwas älteren Datums was auch der Grund sein dürfte, dass einige Links so nicht mehr korrekt sind. Eine Liste der verfügbaren Subversionserver Installationsdateien fand ich unter: subversion.apache.org/packages.html ; gewählt habe ich diesen sourceforge.net/projects/win32svn/.

Letzter Installationsschritt, auch weil leider ein Windows Neustart erforderlich ist, soll die TortoiseSNV Installation sein. Ich habe die Installationsdatei hier (tortoisesvn.net/downloads.html) heruntergeladen und ohne weitere Modifizierung installiert. Wie gesagt, ein Neustart des Windows Systems ist nun erforderlich.

Danach werden beide Server (Subversion und Hudson) mittels jeweils einer *.bat Datei gestartet. Subersion Server Start Bat Datei Hudson Server Start Bat Datei

Nun sind alle benötigten Komponenten installiert und die beiden Server Hudson & Subversion laufen.

Maven3 übernimmt nun die Aufgabe insgesamt zwei Hello World Java Programme zu generieren.

Den Anfang soll das mit Git verwaltete Projekt machen, dementsprechend wird als Name bzw. artifactId maven_git gewählt.

mvn archetype:generate -DgroupId=com.examples -DartifactId=maven_git -DarchetypeArtifactId=maven-archetype-quickstart

Maven3 generates Hello World Java project (to be controled by Git)
Das obere Maven Kommando generiert aus der Eingabeaufforderung das Java Hello World im gewählten Verzeichnis, welches im Git repository gehalten werden soll.
Im gleichen Verzeichnis ist nun die Git Shell zu starten und mit folgenden zwei Zeilen ein lokales Git repository zu erstellen:

cd maven_git
git init

Die Antwort von Git sollte in etwa so aussehen:

# Initialized empty Git repository in c:/Users/lothar/Documents/NetBeansProjects/hudson_maven_git_subversion/maven_git/.git/

Im Java code editor meiner Wahl -> Netbeans habe ich den Java code modifiziert:
“Hello World!” -> “Hello World_!”.
Hello World (Git) Das Projekt wurde dann in Netbeans gestartet um zu überprüfen, ob der Code compiliert und lauffähig ist
(im screenshot ist auch schon das prinzipiell gleich Hello World für Subversion zu sehen). Das gleiche wurde auf Maven Ebene durchgeführt:

mvn clean install
mvn exec:java -Dexec.mainClass="com.examples.App"

Die erwartete Ausgabe:

maven run hello world
Mit git status ist nun zu sehen wie sich die Änderungen aufs Git repository auswirken:

git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#       nbactions.xml
#       pom.xml
#       src/
#       target/
nothing added to commit but untracked files present (use "git add" to track)

Nun können mit git add * die Dateien hinzugefügt werden und mit git commit ins repository eingefügt.

git add *
git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached ..." to unstage)
#
#       new file:   nbactions.xml
#       new file:   pom.xml
#       new file:   src/main/java/com/examples/App.java
#       new file:   src/test/java/com/examples/AppTest.java
#       new file:   target/classes/com/examples/App.class
#       new file:   target/maven-archiver/pom.properties
#       new file:   target/maven_git-1.0-SNAPSHOT.jar
#       new file:   target/surefire-reports/TEST-com.examples.AppTest.xml
#       new file:   target/surefire-reports/com.examples.AppTest.txt
#       new file:   target/test-classes/com/examples/AppTest.class

git commit -m "Initialer commit"
#[master (root-commit) 79b8e5e] Initialer commit
#The file will have its original line endings in your working directory.
# 10 files changed, 156 insertions(+), 0 deletions(-)
# create mode 100644 nbactions.xml
# create mode 100644 pom.xml
# create mode 100644 src/main/java/com/examples/App.java
# create mode 100644 src/test/java/com/examples/AppTest.java
# create mode 100644 target/classes/com/examples/App.class
# create mode 100644 target/maven-archiver/pom.properties
# create mode 100644 target/maven_git-1.0-SNAPSHOT.jar
# create mode 100644 target/surefire-reports/TEST-com.examples.AppTest.xml
# create mode 100644 target/surefire-reports/com.examples.AppTest.txt
# create mode 100644 target/test-classes/com/examples/AppTest.class

git status
# On branch master
# nothing to commit (working directory clean)
# nothing added to commit but untracked files present (use "git add" to track)

Im Anschluß daran wird nun ein neuer Job in Hudson angelegt.

hudson job anlegen maven git

Dieser Job muss dann konfiguriert werden indem das Git repository definiert wird:

hudson config maven git project

ebenso wie die Maven goals:

hudson config maven git projekt

Mit “Jetzt bauen” den Job in Hudson starten. Der Fortschritt kann dann über die Konsolenansicht in Hudson betrachtet werden. Im wesentlichen sollte die Konsolenausgabe mit diesen Ausgaben enden:

[INFO]
[INFO] >>> exec-maven-plugin:1.2:java (default-cli) @ maven_git >>>
[INFO]
[INFO] <<< exec-maven-plugin:1.2:java (default-cli) @ maven_git <<<
[INFO]
[INFO] --- exec-maven-plugin:1.2:java (default-cli) @ maven_git ---
Hello World !
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 16.812s
[INFO] Finished at: Thu Sep 15 09:05:14 CEST 2011
[INFO] Final Memory: 11M/26M
[INFO] ------------------------------------------------------------------------
[DEBUG] Closing connection to remote
[DEBUG] Waiting for process to finish
[DEBUG] Result: 0
[DEBUG] Skipping watched dependency update; build not configured with trigger: maven_git #1
Finished: SUCCESS

Git Job Erfolgreich

Der Git Teil dieses Artikels ist damit beendet und Subversion ist an der Reihe. Die folgenden Schritte sind im Prinzip ananlog zu Git Projekt bzw. zu den Schritten die mit Git ausgeführt werden mussten.
Analog zum mit Git verwaltete Projekt wird nun das mit Subversion verwaltete Projekt als Name bzw. artifactId maven_svn gewählt.

mvn archetype:generate -DgroupId=com.examples -DartifactId=maven_svn -DarchetypeArtifactId=maven-archetype-quickstart

Diese Ausgabe sollte prinzipiell so aussehen:

Maven3 generates Hello World Java project (to be controled by Subversion)

Nun erfolgt der initiale checkout in das Verzeichnis in welches gerade das Java Projekt maven_svn generiert wurde. Subversion Initial CheckoutDementspreched kann die Fehlermeldung, dass in einen nicht leeren Ordner ausgechecked wird, ignoriert werden.

In Netbeans wird das Java Programm wieder beispielhaft modifiziert “Hallo World!” -> “Hallo World !”. Danach wird der Code gestartet, um zu überprüfen, ob er lauffähig ist:

Netbeans Maven Hello World Subversion

Mit Maven wird das Projekt ebenfalls ausgeführt:

mvn exec:java -Dexec.mainClass="com.examples.App"

Maven Run Hello World Subversion

Ein Subversion Checkin wäre in Netbeans und TortoiseSVN möglich. Vorher füge ich den target folder jedoch zu SVN ignore zu, welches mit Tortoise so aussieht:

Subversion add to ignore

So werden die Änderungen gleich im Anschluß daran in Tortoise commited.

In Hudson wird nun ein neuer Job angelegt:

hudson job (maven subversion) anlegen

und configuriert:

(Subversion)

hudson job maven subversion config 01

(Maven)

hudson job maven subversion config 02

Nun wird der Job gestartet und liefert prinzipiell am Ende der Konsolenausgabe in Hudson diese Ausgabe:

[INFO] Building jar: C:\ContIntegrHudson\hudsonHome\jobs\maven_subversion\workspace\target\maven_svn-1.0-SNAPSHOT.jar [INFO] [INFO] --- maven-install-plugin:2.3.1:install (default-install) @ maven_svn --- [INFO] Installing C:\ContIntegrHudson\hudsonHome\jobs\maven_subversion\workspace\target\maven_svn-1.0-SNAPSHOT.jar to C:\Users\lothar\.m2\repository\com\examples\maven_svn\1.0-SNAPSHOT\maven_svn-1.0-SNAPSHOT.jar [INFO] Installing C:\ContIntegrHudson\hudsonHome\jobs\maven_subversion\workspace\pom.xml to C:\Users\lothar\.m2\repository\com\examples\maven_svn\1.0-SNAPSHOT\maven_svn-1.0-SNAPSHOT.pom [INFO] [INFO] >>> exec-maven-plugin:1.2:java (default-cli) @ maven_svn >>> [INFO] [INFO] <<< exec-maven-plugin:1.2:java (default-cli) @ maven_svn <<< [INFO] [INFO] --- exec-maven-plugin:1.2:java (default-cli) @ maven_svn ---
Hello World ! [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 11.323s [INFO] Finished at: Thu Sep 15 22:18:02 CEST 2011 [INFO] Final Memory: 11M/26M [INFO] ------------------------------------------------------------------------ [DEBUG] Closing connection to remote [DEBUG] Waiting for process to finish [DEBUG] Result: 0
[DEBUG] Skipping watched dependency update; build not configured with trigger: maven_subversion #1
Finished: SUCCESS

beide Jobs Erfolgreich Gelaufen

Das Ziel ist damit erreicht: Eine Continuous Integration Umgebung mit Hudson wurde auf Windows installiert und mit zwei verschiedenen Code Revision Systemen und Maven als Buildtool integriert.

Lothar Schulz

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.