It took me quite a while to get my Java EE 7 application automatically deployed to a target JBoss EAP 7 server from within Jenkins using Gradle as the build tool and Cargo for managing the deployment. So here’s my final solution for you to use! 😉
build.gradle
dependencies {
classpath 'com.bmuschko:gradle-cargo-plugin:2.2.3'
}
apply plugin: 'com.bmuschko.cargo'
dependencies {
cargo "org.codehaus.cargo:cargo-core-uberjar:1.5.0",
"org.codehaus.cargo:cargo-ant:1.5.0",
"org.wildfly:wildfly-controller-client:8.2.1.Final"
}
cargo {
containerId = 'wildfly10x'
deployable {
context = 'MyContext'
}
remote {
hostname = '10.1.1.1'
username = 'remote'
password = 'remote'
containerProperties {
property 'cargo.jboss.management-http.port', 9990
}
}
}
Jenkinsfile
stage("Deployment") {
bat('gradlew cargoRedeployRemote --stacktrace')
}
Deploying to JBoss EAP 7 is the same as deploying to Wildfly 10
First of all, there’s no Cargo containerId
for JBoss EAP 7. However, you can use Wildfly 10 instead, as you can read here: Codehaus Cargo – WildFly 10.x:
The WildFly 10.x container can be used with the JBoss Enterprise Application Platform (EAP) version 7; i.e. the version released in May 2016
Finding the right versions of Cargo and its Gradle plugin
You need to use the right versions of Cargo and the Cargo Gradle plugin. I’ve found that version 2.2.3 of the Gradle plugin and version 1.5.0 of Cargo itself work fine with Wildfly 10/JBoss EAP 7 (see Execution failed for task ‘:cargoRunLocal’. #152). The latest versions as of this writing of Cargo (1.6.6) and the plugin (2.3) also work in my environment.
If the versions don’t work correctly, you might get an error like this:
> gradle cargoRedeployRemote
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':cargoRedeployRemote'.
> org.codehaus.cargo.container.ContainerException: Cannot create configuration.
There's no registered configuration for the parameters (container [id = [wildfly10x],
type = [remote]], configuration type [runtime]). Actually there are no valid types
registered for this configuration. Maybe you've made a mistake spelling it?
Deploying to JBoss EAP 7 with the Wildfly Controller Client
Cargo needs a controller client to be able to deploy artifacts to a remote Wildfly 10/JBoss EAP 7 as you can read here: Codehaus Cargo – JBoss Remote Deployer. I’ve found that version 8.2.1.Final of the Wildfly Controller Client org.wildfly:wildfly-controller-client
works fine. However, the latest version of org.wildfly.core:wildfly-controller-client
(3.0.10.Final) also works.
You need to add it to cargo.dependencies
in your build script as shown above. Otherwise you might end up with an error message like this:
> gradle cargoRedeployRemote
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':cargoRedeployRemote'.
> org.codehaus.cargo.container.ContainerException: Failed to create deployer
with implementation class org.codehaus.cargo.container.wildfly.WildFly10xRemoteDeployer
for the parameters (container [id = [wildfly10x]], deployer type [remote]).
Changing the JBoss management port
In my case, the target JBoss server uses a different port for remote management. The default is 9990
, but I use 19990
. Simply adding cargo.port = 19990
to the build file didn’t cut it:
> org.codehaus.cargo.util.CargoException: HTTP request failed, response code: -1,
response message: java.net.ConnectException: Connection refused: connect, response body: null
And by adding --info
to the call to gradle
I got:
Starting action 'redeploy' for remote container 'wildfly10x' on 'http://localhost:9990'
It took me a while to find the correct way of telling Cargo to use the custom port. The Cargo documentation (see Codehaus Cargo – JBoss Remote Deployer) states:
WildFly 8.x, 9.x and 10.x use the cargo.jboss.management-http.port port
However, setting this property isn’t as easy as adding cargo.jboss.management-http.port = 19990
to your build file, because this results in:
(cargo.jboss.management - http.port) is a binary expression, but it should be a variable expression
And adding the following lines…
cargo {
jboss {
management-http {
port = 19990
}
}
}
…leads to a different error:
> Could not find method jboss() for arguments [cargo_61gwz9gjyqje40dvlr47klkas$_run_closure3$_closure6@22ff8f9]
on object of type com.bmuschko.gradle.cargo.convention.CargoPluginExtension.
Finally, I’ve found the right way of setting the property in this article: Local redeployment #123
containerProperties {
property 'cargo.jboss.management-http.port', 19990
}
However, if you use the newest versions of Cargo and the plugin cargo.port = 19990
seems to work again.
Example build.gradle using the latest versions of Cargo and the plugin
dependencies {
classpath 'com.bmuschko:gradle-cargo-plugin:2.3'
}
apply plugin: 'com.bmuschko.cargo'
dependencies {
cargo "org.codehaus.cargo:cargo-core-uberjar:1.5.0",
"org.codehaus.cargo:cargo-ant:1.5.0",
"org.wildfly.core:wildfly-controller-client:3.0.10.Final"
}
cargo {
containerId = 'wildfly10x'
port = 9990
deployable {
context = 'MyContext'
}
remote {
hostname = '10.1.1.1'
username = 'remote'
password = 'remote'
}
}
Can you also share how you would use gradle plugin for deployment on JBoss 5+
Unfortunately not. I’m only working with JBoss 7.
Hi expertise i would like to do remote deploy into jboss-eap-6.4 using Jenkins cargo plugin 1.6.7 , Here is my pom.xml configuration while i am trying build from jenkins , i am getting below error . Can you please suggest for jboss eap remote deployment .Is their any bug because as per the article (https://codehaus-cargo.github.io/cargo/JBoss+7.5.x.html) i did all the configurations kindly help me out this .
Caused by: org.codehaus.cargo.container.ContainerException: Failed to create configuration with implementation class org.codehaus.cargo.container.jboss.JBoss7xRuntimeConfiguration for the parameters (container [id = jboss75x, type = remote], configuration type runtime).
org.codehaus.cargo
cargo-maven2-plugin
1.6.7
jboss75x
/opt/jboss/jboss-eap-6.4
remote
500000
runtime
<cargo.jboss.configuration>standalone</cargo.jboss.configuration>
<cargo.logging>high</cargo.logging>
<cargo.hostname>X.X.X.X</cargo.hostname>
<cargo.jboss.management-native.port>9999</cargo.jboss.management-native.port>
<cargo.remote.username>jbossapp</cargo.remote.username>
<cargo.remote.password>jboss123!@#</cargo.remote.password>
<cargo.servlet.port>8080</cargo.servlet.port>
<cargo.jboss.ajp.port>8009</cargo.jboss.ajp.port>
<cargo.jvmargs>
-javaagent:/home/selenium/jacoco/org.jacoco.agent-0.7.8.jar=destfile=${sonar.jacoco.itReportPath}
-Xms4096m -Xmx4096m -XX:PermSize=256m -XX:MaxPermSize=2048m
</cargo.jvmargs>
start-container
pre-integration-test
start
Thank you,
Kumar