[CloudBees] Déployer sur Google App Engine avec le même numéro de version que dans le Pom.xml Maven

cloudbees-logo

Connaissez-vous CloudBees ? C’est un outil super (Une de ses fonctionnalités, les ClickStart, présentée ICI), qui est dans la mouvance des PaaS, et qui a la particularité de proposer un service qu’ils appellent « Dev@Cloud ». Concrètement qu’est ce que c’est ? Un repository Git privé, un Jenkins rien que pour nous, qui nous permet de builder, ou de déployer nos projets Java ou NodeJS sur leur partie « Run@Cloud » (concrètement des instances Amazon). Bref, CloudBees fournit une usine de développement pour de l’intégration continue. (Nous pouvons bien entendu brancher notre Jenkins vers n’importe quel repository git, genre Github).

Depuis quelques temps, CloudBees permet de déployer aussi sur Google App Engine, et c’est à cette fonctionnalité que nous allons nous intéresser.

Une fois que nous nous sommes authentifiés à travers https://appengine.cloudbees.com/index.html, il suffit de suivre le workflow pour déployer son application immédiatement.

Configuration Jenkins

Allons voir ce qui se passe, et comment Jenkins déploie sur Google App Engine.
Un plugin est là, en post-build, pour faire le boulot.

jenkins-appengine

Le Besoin

Nous voyons que nous pouvons surcharger le numéro de version de l’application. Par défaut dans la configuration CloudBees, le numero de version est surchargé par le numéro de build. C’est à dire qu’à chaque fois que l’on build son application, une nouvelle version est déployée sur Google App Engine. Bon, pourquoi pas…

Mais nous avons un POM.xml qui contient déjà un numéro de version du projet. Comment l’utiliser ?

Solution

Première étape : enlevons la surcharge faite par Jenkins (cf capture d’écran). Dans ce cas-là, c’est le numéro de version contenu dans le fichier appengine-web.xml qui sera utilisé.

<application>monapplication</application>
    <version>${appengine.app.version}</version>
    <threadsafe>true</threadsafe>
</appengine-web-app>

Au moment du build Maven, nous remplissons automatiquement la variable appengine.app.version avec le numéro de version du projet. Pour ce faire, dans le POM.xml, nous définissons simplement:

<properties>
    <appengine.app.version>${project.version}</appengine.app.version>
    <appengine.target.version>1.8.1</appengine.target.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

Dans l’idée, ça devrait fonctionner.

Problème : Google App Engine n’accepte ni les majuscules, ni les « point » dans ses numéros de version. Autant dire que 1.0.0-SNAPSHOT ne colle pas trop à la spécification 🙂
https://developers.google.com/appengine/docs/java/config/appconfig?hl=fr )

Solution : Utilisation du plugin maven gmaven-pugin, dans la phase « Initialize », pour changer un peu le numéro de version afin qu’il soit accepté par Google App Engine.

<plugin>
    <groupId>org.codehaus.gmaven</groupId>
    <artifactId>gmaven-plugin</artifactId>
    <version>1.5</version>
    <executions>
        <execution>
            <!--<id>properties</id>-->
            <phase>initialize</phase>
            <goals>
                <goal>execute</goal>
            </goals>
            <configuration>
                <source>
                    <!-- version pattern : 1.0.2-snapshot -->
                    project.properties["appengine.app.version"] = project.version.replace(".","-").toLowerCase()
                </source>
            </configuration>
        </execution>
    </executions>
 </plugin>

On remplace les point par des tirets, le tout en minuscule et nous voilà App Engine Compliant.

Conclusion

Maven est tout à fait capable de gérer différents profils, des configurations, et il est de notre intéret de garder cette logique pour gérer son versioning. Un petit plugin muni d’un script Groovy pourra nous aider à passer quelques obstacles simplement.

LB.