Ant-Deploy zu Artifactory

View over Jerusalem, by Christoph Burmeister (own photo)

View over Jerusalem, by Christoph Burmeister (own photo)


Der integrierte Deploy-Mechanismus von Maven ist ja eine feine Sache, um die gebauten Artifacts zentral auf einem Repo zu lagern. Mit Ivy gibt es so eine Möglichkeit auch für Ant. Aber neben einer Maven- und Ant-Installation noch eine Ivy-Installation aufsetzen, aktualisieren und warten? Geht auch anders 🙂

Artifactory ist ein zentrales Artifact-Repository, also einfach gesagt, ein zentraler Ablage-Ort für alles Mögliche. Die einfache Installation (aktuell die 2.4.2) besteht darin, das OSS-Zip herunterzuladen, zu entpacken, zu konfigurieren und Artifactory als Dienst zu installieren (Achtung, unter Win7 resp Win2k8 muss der Dienst dann mit einem User-Account gestartet werden).

Die Konfiguration besteht im einfachsten Fall darin, den Port in der etc/jetty.xml zu ändern. Per default wird eine Derby-DB als Datenbackend verwendet. Nach dem ersten Start des Dienstes werden unter Admin>>Configuration>>Repositories zuerst die ganzen virtuellen und die vordefinierten Repos rausgeworfen und eigene lokale Repos angelegt. Lokale Repos sind der Ablage-Ort, wo selbst-deployte Artifacts liegen. Ich lege erstmal 3 Stück an: artifactory-releases (für Release-Deployments), artifactory-snapshots (für Snapshot-Deployments) und custom-added-libs (für alle Artifacts, die nicht von anderen Repos gespiegelt werden können, bspw. geschützte und eingekaufte oder schwer verfügbare).

In den Eigenschaften der Repos muss dann jeweils angegeben werden, welche Artifacts es handlen soll (Handle Releases oder Snapshots).

Nach der Erstellung der Repos wird der User „maven“ mit Deploy-Rechten für die Repos angelegt (Admin >> Security >> Users). Im einfachsten Fall hat der erstmal Admin-Rechte, die später noch eingeschränkt werden können.

So, das war’s eigentlich schon. Einmal vorsichtshalber durchstarten und dann wird eine maven-settings für die angeschlossenen Maven-Arbeitsplätze erstellt : Home >> Client Settings >> Maven Settings. Dort können die Default-Werte belassen werden und per „Generate settings“ wird die komplette settings.xml fertig erstellt und zum Download angeboten.Nach dem Download muss nur noch im servers-Abschnitt der eben erstellte maven-Account eingetragen werden und optionalerweise das localRepository auf ein anderes Verzeichnis als das standardmäßige ~userhome/.m2-Verzeichnis. Die ganze settings.xml sieht dann so aus:

<?xml version="1.0" encoding="UTF-8"?>
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

	<localRepository>d:/dev/apache-maven-repo</localRepository>

	<servers>
		<server>
			<id>central</id>
			<username>maven</username>
			<password>test-123</password>
		</server>
		<server>
			<id>snapshots</id>
			<username>maven</username>
			<password>test-123</password>
		</server>
	</servers>
	<profiles>
		<profile>
			<repositories>
				<repository>
					<id>central</id>
					<url>http://localhost:10000/artifactory/repo</url>
					<releases>
						<enabled>true</enabled>
					</releases>
					<snapshots>
						<enabled>false</enabled>
					</snapshots>
				</repository>
				<repository>
					<id>snapshots</id>
					<url>http://localhost:10000/artifactory/repo</url>
					<releases>
						<enabled>false</enabled>
					</releases>
					<snapshots>
						<enabled>true</enabled>
					</snapshots>
				</repository>
			</repositories>
			<pluginRepositories>
				<pluginRepository>
					<id>central</id>
					<url>http://localhost:10000/artifactory/repo</url>
					<releases>
						<enabled>true</enabled>
					</releases>
					<snapshots>
						<enabled>false</enabled>
					</snapshots>
				</pluginRepository>
				<pluginRepository>
					<id>snapshots</id>
					<url>http://localhost:10000/artifactory/repo</url>
					<releases>
						<enabled>false</enabled>
					</releases>
					<snapshots>
						<enabled>true</enabled>
					</snapshots>
				</pluginRepository>
			</pluginRepositories>
			<id>artifactory</id>
		</profile>
	</profiles>
	<activeProfiles>
		<activeProfile>artifactory</activeProfile>
	</activeProfiles>
</settings>

Maven-Projekte werden mit „mvn deploy“ gestartet und müssen jetzt in der pom.xml folgenden Abschnitt einfügen:

	<distributionManagement>
		<repository>
			<id>central</id>
			<url>http://localhost:10000/artifactory/artifactory-releases</url>
		</repository>
		<snapshotRepository>
			<id>snapshots</id>
			<url>http://localhost:10000/artifactory/artifactory-snapshots</url>
			<uniqueVersion>false</uniqueVersion>
		</snapshotRepository>
	</distributionManagement>

Soweit so gut, aber wie kommt nun Maven’s kleiner Bruder Ant in den Genuss des Artifactory-Deployments? Dafür muss ein Target her:

<project name="testArtifactoryDeploy" basedir=".">
	<description>
        simple ant project for having a deployment to artifactory
	</description>

	<!-- the file that will be deployd as artifact -->
	<property name="mvn.file"		value="mysql-connector-java-5.1.18-bin.jar" />

	<!-- maven-coordinates of the artifact -->
	<property name="mvn.groupId" 		value="org.mysql"/>
	<property name="mvn.artifactId" 	value="mysql-connector"/>

	<!-- version of the artifact -->
	<property name="mvn.version"  		value="5.1.19"/>

	<!-- packaging of the artifact -->
	<property name="mvn.packaging"		value="jar" />

	<!-- the id of a repository that matches a <server>-id in maven-settings.xml -->
	<property name="mvn.repositoryId"	value="central" /> 

	<!-- the url of the specific repo on artifactory: http://<artifactory-url>/<repo-name> -->
	<property name="mvn.url"		value="http://localhost:10000/artifactory/custom-added-libs" />

	<!-- accessing environment-variables -->
	<property environment="env"/>


	<!-- call of "mvn deploy:deploy-file -DgroupId=org.mysql -DartifactId=mysql-connector -Dversion=5.1.18 -Dpackaging=jar -Dfile=mysql-connector-java-5.1.18-bin.jar -DrepositoryId=central -Durl=http://localhost:10000/artifactory/custom-added-libs -DgeneratePom=true" -->
	<target name="deploy">
		<exec executable="${env.MVN_HOME}\bin\mvn.bat">
			<arg value="deploy:deploy-file"/>
			<arg value="-e"/>
			<arg value="-Dfile=${mvn.file}"/>
			<arg value="-DgroupId=${mvn.groupId}"/>
			<arg value="-DartifactId=${mvn.artifactId}"/>
			<arg value="-Dversion=${mvn.version}"/>
			<arg value="-Dpackaging=${mvn.packaging}"/>
			<arg value="-DrepositoryId=${mvn.repositoryId}"/>
			<arg value="-Durl=${mvn.url}"/>
			<arg value="-DgeneratePom=true"/>
		</exec>
	</target>
</project>

Der Aufruf „ant deploy“ startet dann das Antscript, welches durch den exec-Task seinerseits „mvn deploy:deploy-file“ mit einigen Parametern aufruft. Natürlich könnte man auch über Ivy gehen oder die Ant-Maven-Tasks verwenden, aber warum mehr libraries nutzen, als unbedingt nötig?
Das Ergebnis sieht dann ganz brauchbar aus und das ganze Team kann den mysql-connector nutzen, ohne den immer von der MySQL-Seite herunterzuladen.