Kohei Nozaki's blog 

Mocking a HTTP server with WireMock


Posted on Saturday Feb 22, 2014 at 08:47AM in Technology


Environment

  • WireMock 1.4.3
  • HttpClient 4.2.3
  • Oracle JDK7u51

Resources

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.nailedtothex</groupId>
    <artifactId>wiremock</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>org.hamcrest</groupId>
          <artifactId>hamcrest-core</artifactId>
          <version>1.3</version>
          <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.github.tomakehurst</groupId>
            <artifactId>wiremock</artifactId>
            <version>1.43</version>
            <classifier>standalone</classifier>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>*</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>fluent-hc</artifactId>
            <version>4.3.2</version>
        </dependency>
    </dependencies>

</project>

HttpFetcher.java

package org.nailedtothex.wiremock;

import java.io.IOException;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.fluent.Request;

public class HttpFetcher {

    public String fetchAsString(String url) throws ClientProtocolException, IOException {
        return Request.Get(url).execute().returnContent().asString();
    }
}

HttpFetcherTest.java

package org.nailedtothex.wiremock;

import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.apache.http.client.HttpResponseException;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import com.github.tomakehurst.wiremock.junit.WireMockRule;

public class HttpFetcherTest {

    @Rule
    public WireMockRule wireMockRule = new WireMockRule(18089);

    private HttpFetcher instance;

    @Before
    public void init() {
        instance = new HttpFetcher();
        stubFor(get(urlEqualTo("/hoge.txt")).willReturn(
                aResponse().withStatus(200).withHeader("Content-Type", "text/plain").withBody("hoge")));
        stubFor(get(urlEqualTo("/500.txt")).willReturn(
                aResponse().withStatus(500).withHeader("Content-Type", "text/plain").withBody("hoge")));
        stubFor(get(urlEqualTo("/503.txt")).willReturn(
                aResponse().withStatus(503).withHeader("Content-Type", "text/plain").withBody("hoge")));
    }

    @Test
    public void ok() throws Exception {
        String actual = instance.fetchAsString("http://localhost:18089/hoge.txt");
        String expected = "hoge";
        assertThat(actual, is(expected));
    }

    @Test(expected = HttpResponseException.class)
    public void notFound() throws Exception {
        instance.fetchAsString("http://localhost:18089/NOT_FOUND");
    }

    @Test(expected = HttpResponseException.class)
    public void internalServerError() throws Exception {
        instance.fetchAsString("http://localhost:18089/500.txt");
    }

    @Test(expected = HttpResponseException.class)
    public void serviceUnavailable() throws Exception {
        instance.fetchAsString("http://localhost:18089/503.txt");
    }
}

Remarks

  • To check behavior of the mock with browsers, we can set an breakpoint in the test class to prevent shutdown of the mock HTTP server.
    • I have checked that stub urls are working as I expected with firebug.
  • WireMock dependency brings many its dependencies, but I guess that are not necessary because it is classified as standalone, so I just add exclusions and it is working without any problems anyway.

References

  1. WireMock | WireMock
  2. Apache HttpComponents - Apache HttpComponents


How to deploy an application to WildFly with wildfly-maven-plugin


Posted on Saturday Feb 22, 2014 at 08:39AM in Jenkins


Environment

  • Jenkins 1.551
  • Apache Maven 3.1.1
  • git version 1.8.3.4 (Apple Git-47)
  • Oracle JDK7u51
  • OS X 10.9.1

Consideration of a way to achieve

  • There's the Deploy Plugin of Jenkins, but it only listed JBoss 5.x
  • Thus, I'm going to do deploy through Maven goal with wildfly-maven-plugin, not Jenkins Plugin.

Make pom.xml can deploy

Add wildfly-maven-plugin to pom.xml

  • According to [1], we need plugin definition like that.
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>1.0.1.Final</version>
            </plugin>
  • My whole pom.xml is:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.nailedtothex</groupId>
    <artifactId>hellojenkins</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>1.0.1.Final</version>
            </plugin>
        </plugins>
    </build>
</project>

Run mvn to deploy

According to [1], deploy command is:

mvn wildfly:deploy

Let's try

kyle-no-MacBook:hellojenkins kyle$ mvn clean package wildfly:deploy
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building hellojenkins 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ hellojenkins ---
[INFO] Deleting /Users/kyle/gits1/hellojenkins/hellojenkins/target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hellojenkins ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ hellojenkins ---
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 2 source files to /Users/kyle/gits1/hellojenkins/hellojenkins/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ hellojenkins ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/kyle/gits1/hellojenkins/hellojenkins/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ hellojenkins ---
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/kyle/gits1/hellojenkins/hellojenkins/target/test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ hellojenkins ---
[INFO] Surefire report directory: /Users/kyle/gits1/hellojenkins/hellojenkins/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
Running hellojenkins.HelloBeanTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.043 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] 
[INFO] --- maven-war-plugin:2.2:war (default-war) @ hellojenkins ---
[INFO] Packaging webapp
[INFO] Assembling webapp [hellojenkins] in [/Users/kyle/gits1/hellojenkins/hellojenkins/target/hellojenkins-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp resources [/Users/kyle/gits1/hellojenkins/hellojenkins/src/main/webapp]
[INFO] Webapp assembled in [19 msecs]
[INFO] Building war: /Users/kyle/gits1/hellojenkins/hellojenkins/target/hellojenkins-0.0.1-SNAPSHOT.war
[INFO] 
[INFO] >>> wildfly-maven-plugin:1.0.1.Final:deploy (default-cli) @ hellojenkins >>>
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hellojenkins ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ hellojenkins ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ hellojenkins ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/kyle/gits1/hellojenkins/hellojenkins/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ hellojenkins ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ hellojenkins ---
[INFO] Skipping execution of surefire because it has already been run for this configuration
[INFO] 
[INFO] --- maven-war-plugin:2.2:war (default-war) @ hellojenkins ---
[INFO] Packaging webapp
[INFO] Assembling webapp [hellojenkins] in [/Users/kyle/gits1/hellojenkins/hellojenkins/target/hellojenkins-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp resources [/Users/kyle/gits1/hellojenkins/hellojenkins/src/main/webapp]
[INFO] Webapp assembled in [5 msecs]
[INFO] Building war: /Users/kyle/gits1/hellojenkins/hellojenkins/target/hellojenkins-0.0.1-SNAPSHOT.war
[INFO] 
[INFO] <<< wildfly-maven-plugin:1.0.1.Final:deploy (default-cli) @ hellojenkins <<<
[INFO] 
[INFO] --- wildfly-maven-plugin:1.0.1.Final:deploy (default-cli) @ hellojenkins ---
Downloading: http://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.5/commons-compress-1.5.pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.5/commons-compress-1.5.pom (11 KB at 1.7 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/28/commons-parent-28.pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/commons/commons-parent/28/commons-parent-28.pom (49 KB at 94.7 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/tukaani/xz/1.2/xz-1.2.pom
Downloaded: http://repo.maven.apache.org/maven2/org/tukaani/xz/1.2/xz-1.2.pom (2 KB at 7.3 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/maven-core/3.0.5/maven-core-3.0.5.pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/maven-core/3.0.5/maven-core-3.0.5.pom (6 KB at 20.6 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.0.10/plexus-utils-3.0.10.pom
Downloaded: http://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.0.10/plexus-utils-3.0.10.pom (4 KB at 11.2 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.5/commons-compress-1.5.jar
Downloading: http://repo.maven.apache.org/maven2/org/tukaani/xz/1.2/xz-1.2.jar
Downloading: http://repo.maven.apache.org/maven2/org/sonatype/plexus/plexus-sec-dispatcher/1.3/plexus-sec-dispatcher-1.3.jar
Downloading: http://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.0.10/plexus-utils-3.0.10.jar
Downloading: http://repo.maven.apache.org/maven2/org/jboss/remoting/jboss-remoting/4.0.0.Final/jboss-remoting-4.0.0.Final.jar
Downloaded: http://repo.maven.apache.org/maven2/org/sonatype/plexus/plexus-sec-dispatcher/1.3/plexus-sec-dispatcher-1.3.jar (28 KB at 37.5 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/jboss/xnio/xnio-api/3.2.0.Final/xnio-api-3.2.0.Final.jar
Downloaded: http://repo.maven.apache.org/maven2/org/apache/commons/commons-compress/1.5/commons-compress-1.5.jar (251 KB at 252.3 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/jboss/xnio/xnio-nio/3.2.0.Final/xnio-nio-3.2.0.Final.jar
Downloaded: http://repo.maven.apache.org/maven2/org/tukaani/xz/1.2/xz-1.2.jar (93 KB at 83.0 KB/sec)
Downloaded: http://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.0.10/plexus-utils-3.0.10.jar (226 KB at 157.5 KB/sec)
Downloaded: http://repo.maven.apache.org/maven2/org/jboss/xnio/xnio-nio/3.2.0.Final/xnio-nio-3.2.0.Final.jar (95 KB at 149.7 KB/sec)
Downloaded: http://repo.maven.apache.org/maven2/org/jboss/xnio/xnio-api/3.2.0.Final/xnio-api-3.2.0.Final.jar (480 KB at 162.2 KB/sec)
Downloading: http://repository.jboss.org/nexus/content/groups/public/org/jboss/remoting/jboss-remoting/4.0.0.Final/jboss-remoting-4.0.0.Final.jar
Downloaded: http://repository.jboss.org/nexus/content/groups/public/org/jboss/remoting/jboss-remoting/4.0.0.Final/jboss-remoting-4.0.0.Final.jar (256 KB at 57.1 KB/sec)
2 22, 2014 10:07:18 午前 org.xnio.Xnio <clinit>
INFO: XNIO version 3.2.0.Final
2 22, 2014 10:07:19 午前 org.xnio.nio.NioXnio <clinit>
INFO: XNIO NIO Implementation Version 3.2.0.Final
2 22, 2014 10:07:19 午前 org.jboss.remoting3.EndpointImpl <clinit>
INFO: JBoss Remoting version 4.0.0.Final
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19.107s
[INFO] Finished at: Sat Feb 22 10:07:19 JST 2014
[INFO] Final Memory: 20M/245M
[INFO] ------------------------------------------------------------------------
kyle-no-MacBook:hellojenkins kyle$ 

Log of running WildFly:

10:07:19,623 INFO  [org.jboss.as.repository] (management-handler-thread - 13) JBAS014900: Content added at location /Users/kyle/apps/wildfly-8.0.0.Final/standalone/data/content/74/0b98a41a3c0830172a5df0c5c8d5fdc42be9b6/content
10:07:19,627 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-9) JBAS015876: Starting deployment of "hellojenkins-0.0.1-SNAPSHOT.war" (runtime-name: "hellojenkins-0.0.1-SNAPSHOT.war")
10:07:19,649 INFO  [org.jboss.weld.deployer] (MSC service thread 1-7) JBAS016002: Processing weld deployment hellojenkins-0.0.1-SNAPSHOT.war
10:07:19,661 INFO  [org.jboss.weld.deployer] (MSC service thread 1-2) JBAS016005: Starting Services for CDI deployment: hellojenkins-0.0.1-SNAPSHOT.war
10:07:19,666 INFO  [org.jboss.weld.deployer] (MSC service thread 1-2) JBAS016008: Starting weld service for deployment hellojenkins-0.0.1-SNAPSHOT.war
10:07:19,811 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-6) JBAS017534: Registered web context: /hellojenkins-0.0.1-SNAPSHOT
10:07:19,832 INFO  [org.jboss.as.server] (management-handler-thread - 13) JBAS018559: Deployed "hellojenkins-0.0.1-SNAPSHOT.war" (runtime-name : "hellojenkins-0.0.1-SNAPSHOT.war")

The application works:

This works too if there's application already deployed which have same name.

Commit to repository

  • Commit changes of pom.xml so that Jenkins can execute the goal that tested above.

Make a Jenkins job

  1. Copy a job that created in previous post
  2. Edit the job that copied
    • Add maven goal “wildfly:deploy”
  3. Click “保存” in the bottom of the page

Run the job

  • I got some errors.
[INFO] XNIO version 3.2.0.Final
[INFO] XNIO NIO Implementation Version 3.2.0.Final
[INFO] JBoss Remoting version 4.0.0.Final
Authenticating against security realm: ManagementRealm
[ERROR] JBREM000200: Remote connection failed: javax.security.sasl.SaslException: Authentication failed: the server presented no authentication mechanisms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 48.038s
[INFO] Finished at: Sat Feb 22 13:44:10 JST 2014
[INFO] Final Memory: 20M/249M
[INFO] ------------------------------------------------------------------------
Jenkins????????????????
[ERROR] Failed to execute goal org.wildfly.plugins:wildfly-maven-plugin:1.0.1.Final:deploy (default-cli) on project hellojenkins: Could not execute goal deploy on /Users/Shared/Jenkins/Home/jobs/DeployToWildFly/workspace/hellojenkins/target/hellojenkins-0.0.1-SNAPSHOT.war. Reason: I/O Error could not execute operation '{
[ERROR] "operation" => "read-attribute",
[ERROR] "address" => [],
[ERROR] "name" => "launch-type"
[ERROR] }': java.net.ConnectException: JBAS012174: Could not connect to http-remoting://127.0.0.1:9990. The connection failed: Authentication failed: the server presented no authentication mechanisms
[JENKINS] Archiving /Users/Shared/Jenkins/Home/jobs/DeployToWildFly/workspace/hellojenkins/pom.xml to org.nailedtothex/hellojenkins/0.0.1-SNAPSHOT/hellojenkins-0.0.1-SNAPSHOT.pom
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
channel stopped
成果物を保存中
Finished: FAILURE

Why error?

  • In this setup, Jenkins and WildFly are running in different users
  • According to [7], there's an authentication mechanism called “JBoss Local User”, and maybe it can be used with same machine and user, and we might have been used it
  • But Jenkins has its own user in this setup
  • So, we may need another authentication mechanism.

Add a management user to WildFly

  • According to [7], properties file based authentication is enabled by default
  • We can use that command named “add-user” in $WILDFLY_HOME/bin to add a pair of username and password to properties file. usage:
./add-user.sh [USERNAME] [PASSWORD]
  • So let's make it one:
kyle-no-MacBook:bin kyle$ ./add-user.sh admin ***
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
Added user 'admin' to file '/Users/kyle/apps/wildfly-8.0.0.Final/standalone/configuration/mgmt-users.properties'
Added user 'admin' to file '/Users/kyle/apps/wildfly-8.0.0.Final/domain/configuration/mgmt-users.properties'
kyle-no-MacBook:bin kyle$
  • Restart of WildFly is not mandatory.

Edit and commit pom.xml

  • We have to add configuration element as a child of plugin element
                <configuration>
                    <username>USERNAME</username>
                    <password>PASSWORD</password>
                </configuration>
  • Now it is:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.nailedtothex</groupId>
    <artifactId>hellojenkins</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>1.0.1.Final</version>
                <configuration>
                    <username>USERNAME</username>
                    <password>PASSWORD</password>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  • After edit, we have to commit it again.
  • I guess it is not good to write that environment specific variables like username and password in pom.xml, but I couldn't be found other better idea, so I just go this way this time.

A way to specify that username and password in the MAVEN_OPTS

  • According to [10], entries that wrote “User property is:” are can be specified in the MAVEN_OPTS. like that:
    • That configuration can be set after click “Advanced…” in the build section of configuration page of a project.
    • Now, we don't need to specify authentication information in pom.xml.

Run the job again

[INFO] --- maven-war-plugin:2.2:war (default-war) @ hellojenkins ---
[INFO] Packaging webapp
[INFO] Assembling webapp [hellojenkins] in [/Users/Shared/Jenkins/Home/jobs/DeployToWildFly/workspace/hellojenkins/target/hellojenkins-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Webapp assembled in [3 msecs]
[INFO] Building war: /Users/Shared/Jenkins/Home/jobs/DeployToWildFly/workspace/hellojenkins/target/hellojenkins-0.0.1-SNAPSHOT.war
[WARNING] Failed to getClass for org.wildfly.plugin.deployment.DeployMojo
[INFO] 
[INFO] <<< wildfly-maven-plugin:1.0.1.Final:deploy (default-cli) @ hellojenkins <<<
[INFO] 
[INFO] --- wildfly-maven-plugin:1.0.1.Final:deploy (default-cli) @ hellojenkins ---
[INFO] XNIO version 3.2.0.Final
[INFO] XNIO NIO Implementation Version 3.2.0.Final
[INFO] JBoss Remoting version 4.0.0.Final
Authenticating against security realm: ManagementRealm
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.672s
[INFO] Finished at: Sat Feb 22 14:37:01 JST 2014
[INFO] Final Memory: 21M/317M
[INFO] ------------------------------------------------------------------------
[JENKINS] Archiving /Users/Shared/Jenkins/Home/jobs/DeployToWildFly/workspace/hellojenkins/pom.xml to org.nailedtothex/hellojenkins/0.0.1-SNAPSHOT/hellojenkins-0.0.1-SNAPSHOT.pom
channel stopped
成果物を保存中
Finished: SUCCESS
  • Succeed but weird warning “Failed to getClass for org.wildfly.plugin.deployment.DeployMojo” remained.
    • I have googled it but there's no information about it.

Remarks

  • Maybe a way introduced at [8] can be a good idea to achieve that switch various deployment destinations.
    • We can switch the destination easily through use of Maven profiles
  • If you don't want to deploy when test failed, follow steps in [9] , and set parameter “-Dmaven.test.failure.ignore=false” to the MAVEN_OPTS.
  • When we have to deploy to remote Unix systems, Publish Over SSH Plugin[11] sounds very useful than the procedure of this post.

References

  1. WildFly Maven Plugin - Deploy/Undeploy Examples
  2. Eclipse Community Forums: Hudson » Deploy to Wildfly (jBoss 8.x?)
  3. The 10 Most Important Projects Hosted On Codehaus.org
  4. Deploy Plugin - Jenkins - Jenkins Wiki
  5. JenkinsでJBossAS7にデプロイしようと思ったので - 日々常々
  6. WildFly Maven Plugin - Deploy/Undeploy Examples
  7. Security Realms - WildFly 8 - Project Documentation Editor
  8. Jboss / Wildfly maven plugin to deploy on localhost/remote server
  9. [#JENKINS-959] hudson deploys maven artifact even if test has failed - Jenkins JIRA
  10. WildFly Maven Plugin - wildfly:deploy
  11. Publish Over SSH Plugin - Jenkins - Jenkins Wiki


How to specify a Git tag to be processed with Jenkins


Posted on Friday Feb 21, 2014 at 08:35PM in Jenkins


Environment

  • Jenkins 1.551
  • Apache Maven 3.1.1
  • git version 1.8.3.4 (Apple Git-47)
  • Eclipse Kepler SR1
  • Oracle JDK7u51
  • OS X 10.9.1

Create a tag

  1. Open context menu of the project - Team - Advanced - Tag

  2. Enter tag name and Tag message, then click OK

  3. To check created tag, Open context menu of the project - Team - Show in Repositories View

  4. Confirm it appeared.

Modify a resource of HEAD

  • In order to check that build will processed with the tag specified, so just do some modify a resource of HEAD.
    • Make sure that you are in the master branch.
    • Procedure to switch: Team - Switch To - master
  • I have modified a resource that returns a message to Servlet. now it shows like that:
  • After modify, we have to commit it.

Install Git Parameter Plugin

I got trouble that the plugin not showing any tags, so I have stopped using this plugin. there are some people who reporting same problem[6]. If skipped this, we can't see the list of tags in the repository, but we can specify a tag manually.

This plugin makes easy that specify a tag to be processed.

Make a Jenkins job

  1. Copy a job that created in previous post
  2. Check “This build is parameterized”
  3. Click “Add Parameter”
  4. Click “Git Parameter”
  5. Enter “tag” to “Name”
  6. Enter “*/master” to “Branch”
  7. Find the section named “Source Code Management”
  8. Enter “${tag}” to “Branch Specifier”
  9. Click “Save”

Try Parameterized build

  1. Click this:
  2. Select a tag that created above
  3. Click “ビルド”

Check console output of Jenkins

ユーザーanonymousが実行
ビルドします。 ワークスペース: /Users/Shared/Jenkins/Home/jobs/DeploySpecifiedTag/workspace
Fetching changes from the remote Git repository
Fetching upstream changes from file:///Users/kyle/gits1/hellojenkins
Checking out Revision 9d88b2abe381c6e2c915bbbf0ddeec09119b6f04 (v1.0)
Parsing POMs
...
  • We can see that build was processed with tag named “v1.0”

References

  1. Can I get Jenkins to build a git tag from a passed in parameter? - Stack Overflow
  2. Jenkins and the Git Branch Selection - Sourceprojects.org
  3. Git Parameter Plugin - Jenkins - Jenkins Wiki
  4. Jenkinsで外部パラメータで与えたブランチを対象にビルドできるようにしておくと凄惨性あがって墓ドル - ( ꒪⌓꒪) ゆるよろ日記
  5. Hudson Growl Pluginでビルド結果をGrowlへ通知 | skmks
  6. Doesn't show any tags or revisions · Issue #2 · lukanus/git-parameter


How to make git commit to trigger run a Jenkins job


Posted on Friday Feb 21, 2014 at 06:02PM in Technology


Environment

  • Jenkins 1.551
  • git version 1.8.3.4 (Apple Git-47)
  • OS X 10.9.1

Try using curl

  • In this setup, there is no authentication at Jenkins.
curl -X POST http://localhost:18080/job/BuildAndTestHead/build
  • Let's try with dump-header option.
kyle-no-MacBook:Jenkins kyle$ curl -D - -X POST http://localhost:18080/job/BuildAndTestHead/build
HTTP/1.1 201 Created
Location: http://localhost:18080/queue/item/4/
Content-Length: 0
Server: Jetty(8.y.z-SNAPSHOT)

kyle-no-MacBook:Jenkins kyle$ 

Configure a hook of repository

  • Create a file named “post-commit” in .git/hooks directory.
kyle-no-MacBook:hooks kyle$ pwd
/Users/kyle/gits1/hellojenkins/.git/hooks
kyle-no-MacBook:hooks kyle$ ls -l
total 8
-rwxr-xr-x+ 1 kyle  staff  73  2 23 10:50 post-commit
kyle-no-MacBook:hooks kyle$ cat post-commit 
#!/bin/sh
curl -X POST http://localhost:18080/job/BuildAndTestHead/build
kyle-no-MacBook:hooks kyle$ 
  • Now it runs automatically when we commit using git command from cli.

Remarks

  • According to [3], It doesn't work when we commit with Eclipse.
  • So, we might have to config Jenkins to poll the repository periodically.

References

  1. Remote access API - Jenkins - Jenkins Wiki
  2. gitリポジトリの仕込み方 - はこべブログ ♨
  3. eclipse - EGit and post-commit hook - Stack Overflow


How to install, git clone, build and test


Posted on Thursday Feb 20, 2014 at 06:01PM in Technology


Just try to make Jenkins work, and do some typical works (git clone, build, test) with Git and Maven.

Environment

  • Jenkins 1.551
  • Apache Maven 3.1.1
  • git version 1.8.3.4 (Apple Git-47)
  • Oracle JDK7u51
  • OS X 10.9.1

Download and Install

  • OS X Native package is available at [1].
  • The package is a pkg file.
  • Install is easy. we can just open the package and follow instructions.
  • When installation finishes, Jenkins will run automatically at port 8080 and browser will open and going to show localhost:8080, so we have to stop any application servers ran at port 8080 before we start installation.
    • If you missed that point, Jenkins will run automatically after you have stop the application server.
  • Followed this instruction, Jenkins will be installed as a service of OS X so it will be launched every time at system boot.

Configuration of platform specific matters

Change ports of Jenkins

  • I have been used port 8080 for application server, so I don't want to give it to Jenkins.
  • According to [3], this will make Jenkins to use other ports on OS X.
sudo defaults write /Library/Preferences/org.jenkins-ci httpPort 18080
sudo defaults write /Library/Preferences/org.jenkins-ci ajp13Port 18009

Avoid garbled characters for Multi-byte environment

  • This is for Japanese OS X environment
  • Add this line to “/Library/Application Support/Jenkins/jenkins-runner.sh”
export LANG=ja_JP.UTF-8

Use English as UI Language

  • As default, Jenkins use browser's language for UI.
  • Locale Plugin[7] allows to specify language.
  • I prefer English at Jenkins so I have installed it.
  • After plugin installed, go to Configure System
    • Enter “ENGLISH” to Default Language
    • Check “Ignore browser preference and force this language to all users”
    • Click “Save” in the bottom of the page

Restart Jenkins

  • To affect these changes, we have to restart Jenkins.
sudo launchctl stop org.jenkins-ci
sudo launchctl start org.jenkins-ci
  • Now we got to run Jenkins at 18080 port.

Configuration

Make sure that “git” and “mvn” command are installed

kyle-no-MacBook:~ kyle$ which git
/usr/bin/git
kyle-no-MacBook:~ kyle$ git --version
git version 1.8.3.4 (Apple Git-47)
kyle-no-MacBook:~ kyle$ which mvn
/Users/kyle/apps/apache-maven-3.1.1/bin/mvn
kyle-no-MacBook:~ kyle$ mvn --version
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-18 00:22:22+0900)
Maven home: /Users/kyle/apps/apache-maven-3.1.1
Java version: 1.7.0_51, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.9.1", arch: "x86_64", family: "mac"
kyle-no-MacBook:~ kyle$ 

Install the Git Plugin of Jenkins

  1. Open the Jenkins page.
  2. Click “Jenkinsの管理” (in Japanese messages)
  3. Click “プラグインの管理”
  4. Click “利用可能”
  5. Enter “git plugin” to filter field.
  6. Check “Git Plugin”
  7. Click “ダウンロードして再起動後にインストール”
  8. Installation progress page will be shown.
    • It seems to a static page at first, but it updates on the progress for dynamically so just wait for a while.
    • It takes several minutes for complete.
  9. Confirm all processes are completed
  10. Restart the Jenkins.

Set JAVA_HOME

  • Output of this command would be help for OS X users.
kyle-no-MacBook:~ kyle$ /usr/libexec/java_home -V
Matching Java Virtual Machines (3):
    1.7.0_51, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home
    1.6.0_65-b14-462, x86_64:   "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-462, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home
kyle-no-MacBook:~ kyle$
  1. Click “Jenkinsの管理”
  2. Click “システムの設定”
  3. Find JDK section.
  4. Click “JDK追加”
  5. Uncheck “自動インストール”
  6. Enter “名前”
  7. Enter “JAVA_HOME”
  8. Click “保存” at the bottom of the page.

Set Path to Maven executable

  1. Click “Jenkinsの管理”
  2. Click “システムの設定”
  3. Find Maven section.
  4. Click “Maven追加”
  5. Uncheck “自動インストール”
  6. Enter MAVEN_HOME
  7. Click “保存” at the bottom of the page.

Make a job

  • At first, we assume that a example maven project is committed to a local repository. it is better if the project contains some JUnit test classes. I have created a project which contains a servlet, a CDI managed bean and a test class for it.
  • This job will do:
    • Retrieve the source tree of a maven project from the Git repository in local filesystem
    • Build a WAR file
    • Run JUnit test

Procedures:

  1. Click “新規ジョブ作成”
  2. Enter “MyJob001” to “ジョブ名”
  3. Check “Maven2/3プロジェクトのビルド”
  4. Click “OK”
  5. Find “ソースコード管理” section.
  6. Check “Git”
  7. Enter “Repository URL”
  8. Find “ビルド” Section
  9. Enter “ルートPOM'
  10. Enter “ゴールとオプション”
  11. Find “ビルド後の処理” Section
  12. Click “ビルド後の処理の追加”
  13. Click “成果物を保存”
  14. Enter “保存するファイル”
  15. Click “保存”
  16. Now I got a job “MyJob001”

Build

  1. Open the job “MyJob001”
  2. Click “ビルド実行”
  3. Wait for a while.
    • It takes really long time for the first time because there are many new dependencies. maybe we should check the console output of Jenkins.
  4. Some minutes later, we got to see fine mark in the dashboard.
  5. Detail page is interesting, we can see that all tests are passed and deliverables at once.
  6. Check the WAR file which have built by Jenkins.
kyle-no-MacBook:hellojenkins kyle$ unzip -l /Users/Shared/Jenkins/Home/jobs/MyJob001/lastSuccessful/org.nailedtothex\$hellojenkins/archive/org.nailedtothex/hellojenkins/0.0.1-SNAPSHOT/hellojenkins-0.0.1-SNAPSHOT.war 
Archive:  /Users/Shared/Jenkins/Home/jobs/MyJob001/lastSuccessful/org.nailedtothex$hellojenkins/archive/org.nailedtothex/hellojenkins/0.0.1-SNAPSHOT/hellojenkins-0.0.1-SNAPSHOT.war
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  02-21-14 11:24   META-INF/
      132  02-21-14 11:24   META-INF/MANIFEST.MF
        0  02-21-14 11:24   WEB-INF/
        0  02-21-14 11:24   WEB-INF/classes/
        0  02-21-14 11:24   WEB-INF/classes/hellojenkins/
      477  02-21-14 11:24   WEB-INF/classes/hellojenkins/HelloBean.class
     1169  02-21-14 11:24   WEB-INF/classes/hellojenkins/HelloServlet.class
        0  02-21-14 11:24   META-INF/maven/
        0  02-21-14 11:24   META-INF/maven/org.nailedtothex/
        0  02-21-14 11:24   META-INF/maven/org.nailedtothex/hellojenkins/
     1053  02-21-14 11:21   META-INF/maven/org.nailedtothex/hellojenkins/pom.xml
      122  02-21-14 11:24   META-INF/maven/org.nailedtothex/hellojenkins/pom.properties
 --------                   -------
     2953                   12 files
kyle-no-MacBook:hellojenkins kyle$ 

Remarks

  • I would also try that other operations such as automated execution or deploy later.

References

  1. Welcome to Jenkins CI! | Jenkins CI
  2. Jenkins を Mac で使う | Hazi.tech
  3. Jenkins Mac OS X InstallerでJenkinsを入れる - IwazerReport
  4. Jenkins の git plugin と git-client plugin の相性に注意 - diary.sorah
  5. Git Plugin の導入に躓いた - おこらない日記
  6. githubとAndroidとJenkinsの素敵な関係 | GeNERACE labo
  7. Locale Plugin - Jenkins - Jenkins Wiki
  8. The Locale plugin - Howto