Okay, how do we deploy to glassfish from maven on jenkins? Let’s try org.glassfish.maven.plugin:maven-glassfish-plugin first.
pom.xml
<plugin>
<groupId>org.glassfish.maven.plugin</groupId>
<artifactId>maven-glassfish-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
</plugin>
~/.m2/settings.xml
<profile>
<id>glassfish</id>
<activation>
<activeByDefault>false</activeByDefault>
<property>
<name>glassfish.version</name>
<value>3.1</value>
</property>
</activation>
<properties>
<glassfish.home>/opt/servers/glassfish-3.1</glassfish.home>
</properties>
</profile>
Unfortunately, maven tries to go to http://maven.ocean.net.au/external which is returning 503’s today. After some hoops and loops it still doesn’t work, so let’s try a different approach.
pom.xml, revisited
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.1.1</version>
<configuration>
<!-- Do not wait after the container is started -->
<wait>false</wait>
<container>
<containerId>glassfish-3x</containerId>
<home>/opt/servers/glassfish-3.1</home>
<output>${project.build.directory}/glassfish/container.log</output>
<append>false</append>
<log>${project.build.directory}/glassfish/cargo.log</log>
</container>
<configuration>
<deployable>
<groupId>com.example</groupId>
<artifactId>application-web</artifactId>
<type>war</type>
<properties>
<context>/</context>
</properties>
</deployable>
</configuration>
</configuration>
</plugin>
It works, deploys, undeploys, but requires setting app server each time. Plus by going against maven plugin shorthand naming, requires an excruciatingly tedious
m3 -DskipTests clean package org.codehaus.cargo:cargo-maven2-plugin:undeploy \ org.codehaus.cargo:cargo-maven2-plugin:stop \ org.codehaus.cargo:cargo-maven2-plugin:start \ org.codehaus.cargo:cargo-maven2-plugin:deploy
to run.
AAAAAAAAA! I feel I’m doing something wrong here, so… is there another way? Yes! 🙂
Actually, since I am using Glassfish and it includes a first-class CLI tool called asadmin (short from Application Server admin, as Glassfish used to be called Sun Application Server), let’s use it.
#!/bin/bash asadmin="/home/glassfish/glassfish/bin/asadmin" $asadmin undeploy dashboard-web-0.1-SNAPSHOT $asadmin restart-domain domain1 $asadmin deploy $WORKSPACE/application/application-web/target/application-web-0.1-SNAPSHOT.war
Put that as a script somewhere and execute as a post-build step after a successful build in Jenkins et voila, a contiuously deployed dev version.
Why is it inportant to undeploy first, and then redeploy?
Can’t u just deploy and let glassfish take care of it?
Simple answer is: because the app was a bit messy ;(
When we cleared this up, we started to do redeploy without the restart each time 🙂