Maven Elastic Beanstalk Plugin

Hiljattain kirjoittelin Spring Boot projektista, jolla on helppo saada aikaan web sovellus joka tukee Java EE teknologioita mutta pyörii jopa Tomcat serverillä. Yksi hyöty mikä tästä saavutetaan on helppo mahdollisuus tuikata paketti vaikka Elastic Beanstalk-pilveen.

Tässä on Maven plug-in joka hoitaa homman (lisää build-osioon pom.xml:ssä):

<plugin>
 <groupId>br.com.ingenieux</groupId>
 <artifactId>beanstalk-maven-plugin</artifactId>
 <version>1.3.1</version>
 <configuration>
 <s3Bucket>elasticbeanstalk-eu-west-1-11111111111</s3Bucket>
 <s3Key>${project.artifactId}/${project.build.finalName}-${maven.build.timestamp}.war</s3Key>
 <region>eu-west-1</region>
 <!-- will save as s3://[bucket name]/[artifactId]/artifactId-version-TIMESTAMP.war -->
 <autoCreateApplication>true</autoCreateApplication>
 <applicationName>${project.artifactId}App</applicationName>
 <environmentName>${project.artifactId}Env</environmentName>
 <cnamePrefix>${project.artifactId}app</cnamePrefix>
 <versionLabel>${project.version}-${buildNumber}</versionLabel>
 </configuration>
 </plugin>

Luonnollisesti s3 bucket id:t ja regionit kuntoon tuossa. Ja näin aukeaa uusia komentoja:

mvn beanstalk:upload-source-bundle beanstalk:create-application-version beanstalk:create-environment

Ylläoleva luo beanstalkin avulla Amazon AWS klusteriin uuden web serverin pyörittämään softaa.

Tämä taas päivittää softan uuteen versioon, mukava yhdistää esim. mvn clean install käskyihin:

mvn beanstalk:upload-source-bundle beanstalk:create-application-version beanstalk:update-environment

Huom! Nämä kaverit kaipaavat myös autentikointia, se taas onnistuu kun tekee settings.xml tiedostoon .m2 kansioon tällaista:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
 http://maven.apache.org/xsd/settings-1.0.0.xsd">
   <servers>
     <server>
     <id>aws.amazon.com</id>
       <username>AATAJABEETÄJACEETÄ</username>
       <password>HÄRPÄTIHÄRPÄTI</password>
     </server>
   </servers>
 </settings>

Nämä tiedot tietysti löytyvät Amazon AWS alta, ja luonnollisesti salasanasta on parasta käyttää kryptattua muotoa, mitä Maven tukeekin mukavasti. Huom! Tietysti myös ylläolevassa plugin-asetuksessa syytä asettää tuo s3 bucket id oikein.

Lisäksi, jos lisäät tämän plugin-osion configurationin jälkeen, deploy tapahtuu automaattisesti esim. mvn clean install komennolla:

<executions>
  <execution>
    <phase>install</phase>
    <goals>
      <goal>upload-source-bundle</goal>
      <goal>create-application-version</goal>
      <goal>update-environment</goal>
    </goals>
  </execution>
</executions>

No niin, tuossa pluginissa on kuitenkin metka bugi, ainakin nykyversiossa. Jostain syystä create-vaiheessa se vaatii cnamePrefix:in parametrina (ja luo tomcat ympäristön joka ei tue edes Java 7:aa vaan on Java 6 tasossa – kamalaa! – mutta ei vielä se bugi) – mutta update vaiheessa taas tuo cnamePrefix kylmästi ohitetaan ja sen sijaan on jotenkin kovakoodattu artifactId:n käyttö.

Toisin sanoen, fiksuinta on tehdä beanstalkkiin ensin sopiva projekti jossa on oikeasti Java 7 tuki (ja saisi se 8:kin tippua sinne jossain vaiheessa..) – ja pitää huolta että cnamePrefix ja projektin artifactId ovat prikulleen, case-sensitiivisesti samat. Silloin piisaa konfiguraatioksi:

<plugin>
  <groupId>br.com.ingenieux</groupId>
  <artifactId>beanstalk-maven-plugin</artifactId>
  <version>1.3.1</version>
  <configuration>
    <applicationName>NewFacebookApp</applicationName>
     <s3Key>${project.artifactId}/${project.build.finalName}-${maven.build.timestamp}.war</s3Key>
     <s3Bucket>elasticbeanstalk-eu-west-1-1112223333</s3Bucket>
     <region>eu-west-1</region>
     <environmentName>NewFacebookEnvironment</environmentName>
  </configuration> 
</plugin>

Ja tarkista siis, että projektin alussa määritelty artifactId = beanstalkissa oleva url prefix osa, eli se mitä on ennen elasticbeanstalk.com osaa. Sitten toimii.

Eli ei ihan vakaata kamaa tämä plugin. Mutta toimiessaan ihmeellisen ihana.

(kirosanat editoitu pois konfiguraation kommenteista)

 

 

Mainokset

Mikä on suosituin Java EE sovelluspalvelin?

Se näyttää olevan ei Java EE sovelluspalvelinta ensinkään, ainakin New Relic nimisen pajan tekemän tutkimuksen perusteella. Tutkimus koskee toki vain heidän omaa asiakaskuntaansa ja vieläpä jenkeissä pääosin, mutta yhdistettynä muihin viime aikaisiin reportteihin yksi asia näyttäisi varmalta: Open source alustat ovat vahvasti nousussa, ja kevyet serverit kuten Tomcat ja Jetty ehkäpä eniten suosiossa. Tässä tutkimuksessa kuitenkin jopa Glassfish hakkaa esim. Webspheren. Itse muistan ajan jolloin Websphere ja Weblogic jakoivat Suomen markkinoilla sovelluspalvelinkentän jotakuinkin kahdestaan.

Tomcat on aika kevyt serveri, siinä ei ole esim. ejb tukea, ei jms tukea, jonkunmoista jndi tai transaktioratkaisua saa virittelemällä, ja toki kirjastoja lisäämällä saa esim. jpa ja jsf jutut toimimaan. Nykyään kun kuitenkin voi tupauttaa serverin päälle esim. koko Spring Frameworkin, tai tuottaa ratkasunsa Scala+Play yhdistelmällä tai Grailsillä, niin Tomcatkin riittää hienosti. Yksinkertainen on aina helpompaa hallita. Myös JBOSS oli päässyt kolmen kärkeen, siinähän on Tomcat + loput EE stackistä. Uutena tulokkaana TomEE ei vielä näy tilastoissa, paitsi ehkä kohdassa Other. Weblogic ja Websphere näyttävät tuossa asiakaskunnassa edustavan sinnikästä vahvaa 2.17% osuutta – Suomessa kenties vähän suurempi luku. Glassfish edusti yksinäänkin yhtä paljon kuin Weblogic ja Websphere yhteensä.

Tämä siis vain yksi tutkimus, mutta on noita osunut silmiin muitakin viime aikoina. Open source on kaiken hypetyksen jälkeen alkanut jyräämään vakavasti otettavana valintana. Tomcat on erityisen mielenkiintoinen valinta koska siihen ei ole olemassa virallista business mallia tai tuki-organisaatiota. Got a problem? Google it up!

 

 

Ja lähdelinkki:

http://blog.newrelic.com/2012/01/10/infographic-oss-java-wins-in-the-cloud-era/

Testauksesta ja Tomcatistä

No niin, tämä viikko sujuu sitten kiireen merkeissä joten ei ole paljoa uutta kirjoiteltavaa.. Mutta muutama asia on silti mielessä.

 

Olen miettinyt paljon yksikkötestauksen käyttöä ohjelmistokehityksessä Test Driven tapaan. Äärimmäisen harva sovelluskehitystiimi voi kerskua sillä että tekee TDD tapaan 100% kattavuudella eli yksikkötestaa tietokantakerroksen, liiketoimintakerroksen ja web käyttöliittymäkerroksen eristetyin testein joita on nopea ajaa, ja jotka kehitetään Test First periaattein, siten että testit toimivat suunnitteluvälineenä. Ei ole mitään estettä miksei tätä voisi teknisesti tehdä, mutta se on vain työlästä kun se tehdään oikein. Sensijaan integraatiotestit jotka testaavat moduulia ympäristössään ja ovat hitaampia ajaa, ovat myös halvempia tehdä ajankäytöllisesti, ja niitä voi rakentaa samoilla yksikkötestausvälineillä (JUnit ja Mockito ovat kovia tässä).

Oli miten oli, TDD ajatuksessa on kuitenkin jotain filosofisesti hyvin puhuttavaa. Testattava koodi on avointa ja tasarakenteista koodia, ja miten voisi paremmin tehdä funktion kuin ensin miettimäll ämistä tietää että se toimii? Ja mikä parasta, nimeämällä testit fiksusti testikoodi on melkeinpä luettavaa speksiä. Mockitoa koodatessakin käytännössä kirjoitetaan speksejä englanniksi – mutta näitä speksejä voi nappia painamalla tarkistaa milloin vain haluaa.

Ja tästä päästiinkin viikon linkkivinkkiin, eli http://www.dzone.com/links/r/10_steps_to_more_readable_tests.html

Toinen huomio: Tomcat 7 on saavuttanut enemmän tai vähemmän vakaan tason ja päässyt ulos betasta. Tomcat taitaa olla edelleenkin suosituimpia alustoja joissa java web sovelluksia ajetaan (huomioiden että JBOSS ajaa myös Tomcatiä), ja kun uusin versio on jälleen uusi Java EE 6 alusta, se herättää heti mielenkiinnon. Yksi muutos on Servlet 3.0 tuki – hyvästit XML:lle jos niin haluat. Tervetuloa asynkroniset kutsut. Lopulta Tomcat 7:ssä on myös korjattu aiempia muistivuoto-oireita, eli se tarjoaa kiinnostavan alustan testata myös vanhoille sovelluksille. EJB Lite ei valitettavasti onnistu vieläkään – mutta sitä varten on JBOSS 6…