Configuring "Cruise Control" with "Maven2" and "Subversion 1.4.6" for continuous build environment

Continous Integration build system is very useful in a software development company where members of a team integrate their work frequently. It reduces the wastage of time and at the same time it helps us to maintain all the builds up to date. Previous week we also configured a continous build flow in our R&D division using Cruise Control, Maven and Subversion.  For this what we did is, we  created our project module builds in MAVEN2 (Using the latest technology which gives us more options and easiness to handle projects). Created a new SVN environment and Configured the SVN with Cruise Control.

Here In this post I am describing about the Configuration of Cruise control with Maven and Subversion.

Versions Used:

Subversion : 1.4.6

Maven  : 2.0

Cruise Control : 2.7.2

What is Cruise Control?

CruiseControl is a popular open source tool for implementing Continuous Integration (CI) of Java applications. The idea behind CI is; Build, regression test, and deploy your software application to a test environment every time a code change is committed to version control. If the code change causes the build to break, the regression test to fail, or a problem with the deployment, identify and correct the problem promptly. CruiseControl is ideally suited for CI. It is a reliable tool that provides real value to Java development teams of any size.

What is Continuous Integration?

Continuous Integration is a software development practice where members of a team integrate their work frequently; usually each person integrates at least daily – leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly.

What is the goal which we want to acheive from this process?

Using maven we are maintaining a Center repository for the JARs and trying to avoid the famous Java programers error word.. “Its working in my machine but I dont know why its not in yours”. Maven will give an Object oriented way to our build system and will give a lot of plugins to make it more advanced and useful.

The cruise control will build automatically when we update any new code to the SVN and will send emails to the respective persons about the build’s  success or failures. It will give the name of the programmer who is checked in the code to SVN and also the files where the code is failing.

1. Installing and running Cruise Control

Step 1:

Download the latest version of Cruise Control from the following link. http://cruisecontrol.sourceforge.net/download.html

Step 2:

Extract the files in to a specific location where you want to install the CruiseControl. For Example: C:\CruiseControl2.7.9

Step 3:

In the Cruise control installation directory we have a batch file called cruisecontrol.bat. Double click on this will start the cruise control in port 8080. Internally a jetty Server is running… We can change the port by editing the batch file.

2. Configuring Cruise Control for Maven2 and Subversion1.4.6.

Prerequisites:

  1. Apache Maven2 should be installed in the server where we are installing and configuring CruiseControl
  2. Subversion should be installed and running on the server.

Follow the two Steps below to configure a new project in Cruise control.

  1. Configuring in config.xml file.

This is the main part of configuring a project in the cruise control. Here we are giving the necessaey informations about the project, the Scheduling the time, configuring the bootstrappers, giving the location of the local copy, Giving the SVN location, specifing the MAVEN or ANT commands which we have to run in scheduled time etc. Please find the comments written in each part for more information.

Here in this I had configured all the common parameters at the TOP of the config.xml for reusability.

<! — Project Configurations –>

<property name=”log.dir” value=”./logs/${project.name}”/>

<property name=”projects.dir” value=”./projects”/>

<property name=”projects.checkout.dir” value=”${projects.dir}”/>

<property name=”project.log.dir” value=”${projects.dir}/logs/${project.name}”/>

<! — Repository configurations for that project — >

<property name=”svn.repository” value=”< Repository URL>“/>

<property name=”svn.portal.project” value=”${svn.repository}/<Project name Here>“/>

<property name=”svn.user” value=”<username here>“/>

<property name=”svn.password” value=”<password here>“/>

<! — Build Specific Configurations –>

<property name=”maven.home” value=”E:\Apache\apache-maven-2.0.8″/>

<property name=”ant.home” value=”E:\cruisecontrol-bin-2.7.1\apache-ant-1.7.0″/>

<! — Cruise Control – Scheduler Specific Configurations–>

<property name=”schedule.interval” value=”600″/>

<property name=”quiet.period” value=”300″/>

<! — Mail configurations –>

<property name=”buildresults.url” value=”http://localhost:8080/buildresults/${project.name}”/>

<property name=”css.location” value=”E:\cruisecontrol-bin-2.7.1\docs\cruisecontrol.css”/>

<property name=”xsl.dir” value=”E:\cruisecontrol-bin-2.7.1\webapps\cruisecontrol\xsl”/>

<property name=”mail.host” value=”<mail server name>“/>

<property name=”build.url” value=”<The url where Cruise control is running>“/>

<property name=”mail.subject.prefix” value=”[Cruise Control] Project [${project.name}]”/>

<property name=”cc.mail.username” value=”<mail username here>“/>

<property name=”cc.mail.password” value=”< mail password here>“/>

<property name=”return.name” value=”Cruise Control Agent”/>

<! — Always send addresses –>

<property name=”mail.address.buildmanager” value=”<mail address here>“/>

<! — Failure addresses –>

<property name=”mail.address.ifFails” value=”<mail address here>“/>

<! — Success addresses –>

<property name=”mail.address.ifSuccess” value=”<mail address here>“/>

<! — Return Address –>

<property name=”mail.address.return” value=”<mail address here>“/>

<! — Starting the Project Specific information –>

<project name=”<Give project name here>“>

<! —Specifying the cruise control plug-ins information [It’s optional] –>

<plugin name=”svn” lassname=”net.sourceforge.cruisecontrol.sourcecontrols.SVN”/>

<plugin name=”svnbootstrapper” classname=”net.sourceforge.cruisecontrol.bootstrappers.SVNBootstrapper”/>

<! — This writes a build status snippet to the file system. –>

<listeners>

<currentbuildstatuslistener file=”logs/${project.name}/status.txt”/>

</listeners>

<! — This bootstraps resources from Subversion. –>

<bootstrappers>

<svnbootstrapper LocalWorkingCopy=”projects/${project.name}” />

<bootstrappers>

<! — A container element for a set of modifications collected from all included SourceControl elements.<modificationset> can contain multiple elements which can be useful to check only parts of a large Project rather than checking all files every time. –>

<modificationset quietperiod=”${quiet.period}”>

<svn Localworkingcopy=”projects/${project.name}” RepositoryLocation=”${svn.portal. project}”

useLocalRevision=”true”/>

<maven2snapshotdependency pomfile=”projects/${project.name}/pom.xml” user=”<SVN username here>“/>

</modificationset>

<! — This is the main part. Here the first ant task will copy the current data from the SVN to the local project folder.

The second task is doing scm update, clean and install goals of maven–>

<schedule interval=”${schedule.interval}”>

<composite>

<ant anthome=”${ant.home}” buildfile=”projects/${project.name}/cc-build.xml[l1] ” />

<maven2 mvnhome=”${maven.home}” pomfile=”projects/${project.name}/pom.xml” goal=”clean install site:site site:deploy”/>

</composite>

</schedule>

<! — In this part we are configuring the mail related information. To whom we need to send mails, what structure etc… etc –>

<publishers>

<onsuccess>

<artifactspublisher dest=”artifacts/${project.name}” file=”projects/${project.name}/target/${project.name}.jar”/>

</onsuccess>

<htmlemail mailhost=”${mail.host}” subjectprefix=”${mail.subject.prefix}” returnaddress=”${mail.address.return}”

buildresultsurl=”${build.url}/${project.name}” css=”${css.location}” xsldir=”${xsl.dir}”

xslfilelist=”header.xsl,buildresults.xsl” returnname=”${return.name}” skipusers=”false” spamwhilebroken=”false”

username=”${cc.mail.username}” password=”${cc.mail.password}” >

<always address=”${mail.address.buildmanager}”/>

</htmlemail>

</publishers>

</project>

Main points to note:

1. Schedule Time Interval : This is the time period in which cruise control is checking the SVN for updation.

2. ANT script in schedule composite tag: Which is used to copy the SVN updated files.

3. MAVEN goals: mvn clean compile site:site site:deploy This we used to clean and compile the code. Then it will create the site related files for that project and deploy it in a server which we specified in that POM file

If you have to configure more options please refer this link: http://cruisecontrol.sourceforge.net/main/configxml.html#modificationset

2. Create a local copy of the project in the Projects folder of the Cruise Control. Follow the following steps for that.

  • Copy the entire project folder from our eclipse workspace in to the “Projects” folder.
  • Make sure that that copy contains the correct SVN information also.
  • Create a ANT build file with the following information and store it in Projects> [Current Project folder]

Name it as cc-build.xml as we mentioned in the config.xml of Cruise oontrol.

<project name=”Project” default=”update-src” basedir=”.” >

<property name=”base.dir” value=”.” />

<target name=”update-src”>

<echo>Updating source from Subversion</echo>

<exec executable=”svn” dir=”${base.dir}”>

<arg line=”up” />

</exec>

</target>

</project>


[l1]This is the ANT script which is copying all the SVN updated data in to the Local copy. So we need to copy that ANT build file in to the Local projects folder.

31 thoughts on “Configuring "Cruise Control" with "Maven2" and "Subversion 1.4.6" for continuous build environment

  1. Hi Lijin,

    This site is great! Thanks for posting so much valuable information. I’m fairly new to deployment methodologies but have decided to go with maven2. I have a few questions I was hoping you wouldn’t mind answering for me. First off, I have a Java Enterprise application that I need to deploy to a glassfish server for both development and production environments. Currently, we are using svn for our version control and netbeans 6.5 for our ide. So obviously this blog interested me. I actually haven’t heard of Cruise Control and was wondering if you can check the files out of svn and build/deploy them from maven without using cc? Also, since we are just now implementing maven, what you suggest the best way to create poms for the existing project be. I know netbeans has a maven plugin, but I haven’t had much time to play with it yet. Thank you so much!

    1. @Taresa

      Q1. I actually haven’t heard of Cruise Control and was wondering if you can check the files out of svn and build/deploy them from maven without using cc?

      Cruise Control is using for Continuous Integration. If you want to keep track your Build system then u can use CC. You can schedule your builds in this. For example while checking in some files, after a certain time etc. Configure emails also regarding with this build result. A lot more to say about this…

      Q2. since we are just now implementing maven, what you suggest the best way to create poms for the existing project be

      Plugins will be very useful in this case. Now we have so many maven plugins for eclipse and netbeans also. If you are starting a new project then this plugin will create you a template and you need to add more dependencies. If you are changing an existing project to maven then you need to spend some time to create POM. The Parent option will helpful to you to reduce POM works for the Child projects.

  2. Here goes the config.xml..the site removed the stuff within

    (project name=”myproj” buildafterfailed=”false”)

    (property name=”log.dir” value=”./logs/${project.name}”/)
    (property name=”projects.dir” value=”./projects”/)
    (property name=”projects.checkout.dir” value=”${projects.dir}”/)
    (property name=”project.log.dir” value=”${projects.dir}/logs/${project.name}”/)
    (property name=”maven.home” value=”/xxx/apache-maven-2.0.9″/)
    (property name=”ant.home” value=”/xxx/cruisecontrol-bin-2.8.2/apache-ant-1.7.0″/)
    (property name=”schedule.interval” value=”600″/)
    (property name=”quiet.period” value=”300″/)
    (schedule interval=”120″)
    (composite)
    (exec command=”/xxx/envsetup.sh” workingdir=”/xxx/cruisecontrol-bin-2.8.2/”/)

    (maven2 mvnhome=”${maven.home}” pomfile=”projects/${project.name}/pom.xml” goal=”clean install”/)

    (/composite)

    (/schedule)

  3. Hi,

    First of all, let me thank you for sharing this guide.

    I am facing some issues and hope that someone will help me out here :

    My requirement : I need to set a few path variables before kicking of my maven build.
    So here is my config.xml

    What s happening is that the script seems to have run, but the props are not set because my build fails and says ${version} not set.(this is one of the path variables in envsetup.sh).

    If I replace the exec command with

    OR

    It still fails, could someone pls help me out here

    TIA
    vck

  4. Anyone has any idea why the “Date of Build” is in GMT? I verified the java default timezone is correctly defined, but the build still show GMT. I have CC 2.8.2 and Maven2. Thank you,

  5. This site removes stuff that looks like HTML. I’ll try again:

    (exec command=”svn” args=”update” workingdir=”${project.dir}/xyz”/)

    replace the () with angle brackets.

  6. Hi,

    Where is the build label specified?

    The default Cruise COntrol label is Build 1, Build 2, etc.

    Is it possible to set the build label = to the most recent rtag on a particular project?

Leave a reply to vck Cancel reply