Maven ja Artifactory

Mavenin kanssa peuhatessa tuli mieleen halu pystyttää oma repository Mavenille. Tähän on monia syitä.

Oma repository toimii kätevästi proxynä julkisille repositoryille: kun lataat sen kautta pluginit, ne täytyy ladata vain kerran, ja sitten ne löytyvät läheltä paikallisesti, vaikka koko tiimille tai yritykselle. Kun internet on epävarma nykyisellään aika ajoin, ja kun maven central repositoryt kuten repo1 ovat ylikuormitettuja, tämä voi pelastaa päiväsi.

Toinen syy on tietysti että on mukavaa kun maveniä käyttäessä on julkaisuja varten oma tiimirepository, jossa valmiita snapshot ja muita releaseja voi jaella. Voittaa levynnurkan!

Vertaillessa eri vaihtoehtoja esiin nousi selkeästi kova repository nimeltä Artifactory – sitä löytyy tuen kera kaupallisena, ja avoimen lähdekoodin community editiona. Asennus on helppo: lataat zipin, purat sen haluamaasi paikkaan, ja ajat bin-kansiosta artifactory.bat:in – tai sh:n.

Mitäs sitten? Nyt olisi repository pystyssä, ainakin hetken. Pidemmäksi aikaa sen saa päälle asentamalla sen serviceksi. Tätä ennen on kuitenkin myös syytä asettaa ARTIFACTORY_HOME ympäristömuuttuja, osottamaan johonkin sopivaan olemassaolevaan kansioon. Muuten artifactory luo asetukset ja muut käyttäjäprofiilisi alle. Kun olet tyytyväinen artifactoryn toimintaan, löytyy bin-kansiosta ytimekäs installservice.bat jolla saat ratkaisun pyörimään windows-palveluna (Linux käyttäjät, sorry, joudutte järkeilemään tämän itse, kun omassa koneessani on vain windows 7. Olisiko apua install.sh scriptistä? 😉

Seuraavaksi on syytä kertoa Mavenille että käyttää kaikkiin pyyntöihin vain ja ainoastaan tätä omaa artifactory repositoryä. Tämän voi tehdä käyttäjäkohtaisessa settings.xml tiedostossa profiilien alla, mutta varmaan helpointa on lisätä pom.xml tiedostoon jotain tämäntapaista:

<repositories>
  <repository>
    <id>central</id>
    <url>http://http://localhost:8081/artifactory/repo</url>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
  </repository>
  <repository>
    <id>snapshots</id>
    <url>http://http://localhost:8081/artifactory/repo</url>
    <releases>
      <enabled>false</enabled>
    </releases>
  </repository>
</repositories>
<pluginRepositories>
  <pluginRepository>
    <id>central</id>
    <url>http://http://localhost:8081/artifactory/plugins-releases</url>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
  </pluginRepository>
  <pluginRepository>
    <id>snapshots</id>
    <url>http://http://localhost:8081/artifactory/plugins-snapshots</url>
    <releases>
      <enabled>false</enabled>
    </releases>
  </pluginRepository>
</pluginRepositories>
Ja tuossapa tietysti pidemmän päälle localhostin tilalle todellinen palvelinosoite kun saat sen pysyvämmin pystyyn. Tämä ylikirjoittaa mm. central repositoryt siten että aina mennään artifactoryn kautta. Lisäksi voisit vielä pistää settings.xml tiedostoosi tällaisen:
<mirrors>
  <mirror>
    <id>artifactory</id>
    <mirrorOf>*</mirrorOf>
    <url>http://localhost:8081/artifactory/repo</url>
    <name>Artifactory</name>
  </mirror>
</mirrors>

Ehkä ekstravarovaisuutta – mutta tuo tekee kaikkien osoitteiden eteen taas mirrorin joka menee artifactoryn kautta. Nyt voit kokeilla ottaa käyttöön uuden pluginin ja seurata mavenin log-viestejä: Pyynnöt menevät nyt artifactory proxyn kautta.

Vaihe 2

Kun haluat julkaista tuotoksesi artifactoryyn oman levyn sijasta voit lisätä pom.xml tiedostoon nämä tiedot:

<distributionManagement>
  <snapshotRepository>
    <id>asantala_w7</id>
      <name>asantala_w7-snapshots</name>
      <url>http://localhost:8081/artifactory/libs-snapshots-local</url>
  </snapshotRepository>
  <repository>
    <id>asantala_w7</id>
    <name>asantala_w7-releases</name>
    <url>http://localhost:8081/artifactory/libs-releases-local</url>
  </repository>
</distributionManagement>

Selvää kuin pässi, eikö? Säädämme siis julkaisu-repositoryksi snapshoteille ja aidoille julkaisuille Artifactoryn. Nyt voit tehdä esim.

mvn deploy

Ja katsoa miten projekti paukkuu paikalleen. Repository hallinnasta voi katsella miten omat tuotokset ja proxyn kautta ladatut plug-init siellä muhivat. Jos repository vaatii autentikointia, voit vielä lisätä settings.xml:ään määrityksen em servereille. Tarkista että serverin id täsmää edellämainittuihin säätöihin, ja aseta tunnus ja salasana siten miten olet ne artifactoryssä säätänyt (ethän käytä oletussalasanoja missään palvelimessa, ethän…?)

<servers>
  <server>
    <id>asantala_w7</id>
    <username>admin</username>
    <password>password</password>
  </server>
</servers>

Ensi jaksossa kirjailen siitä miten Maven, Subversion, Artifactory ja SCM plugin ja Release plugin toimivat yksiin – jotta saat automaattisesti snapshoteista julkaisuversioita ja versionumeroita päiviteltyä ilman että täytyy käsin muutella POM tiedostoa joka kerta. Tämä on Maven 2:sen uusi ominaisuus.

Mainokset

Maven ja Subversion

Maven on nykytyökaluistani suosikkini; Lähes joka päivä löytyy uusia työtä helpottavia ja nopeuttavia piirteitä. Nyt on tutkinnan alla Mavenin SCM plugin. Se on ollut teoriatasolla tuttu mutta ei ole ollut syytä käytellä sitä aiemmin. Päätin ottaa härkää sarvista ja pistää sen toimintaan nykyprojekteille.

SCM on plugin joka hoitaa kytkökset Software Configuration Management järjestelmiin kuten CVS, Subversion, Mercurial, Perforce,  jne. Aiemmin tapasin hoitaa lähdekoodin hallinnan ohi Mavenin, esim. IDE:n omilla keinoin. Tämä on täysin mahdollinen vaihtoehto, mutta kun halutaan alkaa hallinnoimaan ohjelmistopaketin versioita Mavenin piirteitä hyödyntäen, SCM plugin on syytä asentaa.

Käytännössä SCM plugin käyttöönotto tapahtuu lisäämällä Mavenin pom.xml:ään sopivaan kohtaan seuraava pätkä:

<scm>
  <connection>scm:svn:svn://10.0.32.1/projects/arto/trunk</connection>
  <developerConnection>scm:svn:svn://10.0.32.1/projects/arto/trunk</developerConnection>
</scm>

Mitä tämä tarkoittaa? Aloitetaanpa sisällöistä. Maven käyttää scm urleissa muotoa:

scm:<scm_provider><delimiter><provider_specific_part>

Eli yllä olevassa esimerkissä scm: aloittaa url osoitteen, sitten tulee svn kertomaan että käytetään Subversion pluginia, sitten tulee delimiter osa, eli : – ja sen jälkeen svn url osoite sisältäen svn protokollan, palvelimen, haaran lähdekoodihallinnassa, sekä jos halutaan, autentikointitiedot.

Maven käyttää erikseen määritystä connection, ja developerConnection. Ensimmäinen on tarkoitettu lukuoperaatioihin, toinen päivityksiin ja lisäyksiin.

Autentikointi pitää tietysti määritellä johonkin. Vaihtoehtona on määritellä se url osoitteisiin, antaa komentoriviltä, tai määritellä se pom.xml plugin määrityksiin.

Komentoriviltä annettaessa käytetään kytkintä -D, esim:

mvn scm:checkout -Dusername=arto -Dpassword=arto

Vaihtoehtoisesti voit konfiguroida autentikointitiedot pom.xml tiedostoon, näin:

<project>
...
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-scm-plugin</artifactId>
<version>1.3</version>
<configuration>
<username>username</username>
<password>password</password>
</configuration>
</plugin>
</plugins>
...
</build>
...
</project>

Huom! Samalla tulet lukinneeksi Maven SCM plugin version, mikä voi olla hyvä tai huono juttu..

Kun scm plugin on näin määritelty käyttöön eli projekti tietää mihin svn repositoryyn ja mihin haaraan se kuuluu liittää, saat käyttöösi komentoriviltä uusia komentoja:

  • scm:add – command to add file
  • scm:bootstrap – command to checkout and build a project
  • scm:changelog – command to show the source code revisions
  • scm:checkin – command for commiting changes
  • scm:checkout – command for getting the source code
  • scm:diff – command for showing the difference of the working copy with the remote one
  • scm:edit – command for starting edit on the working copy
  • scm:status – command for showing the scm status of the working copy
  • scm:tag – command for tagging a certain revision
  • scm:unedit – command to stop editing the working copy
  • scm:update – command for updating the working copy with the latest changes
  • scm:validate – validates the scm information in the pom
  • tässä esimerkki:

    mvn -DstartDate=YYYY-MM-DD -DendDate=YYYY-MM-DD scm:changelog (muutokset aikavälillä)

    Ensi kerralla paneudutaan sitten Mavenin release-pluginin toimintaan.