<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Gridshore &#187; continuous integration</title>
	<atom:link href="http://www.gridshore.nl/tag/continuous-integration/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gridshore.nl</link>
	<description>A weblog about software engineering, Architecture, Technology an other things we like.</description>
	<lastBuildDate>Tue, 13 Dec 2011 15:36:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Building Spring DM server compliant OSGi bundles with Maven</title>
		<link>http://www.gridshore.nl/2009/01/03/building-spring-dm-server-compliant-osgi-bundles-with-maven/</link>
		<comments>http://www.gridshore.nl/2009/01/03/building-spring-dm-server-compliant-osgi-bundles-with-maven/#comments</comments>
		<pubDate>Sat, 03 Jan 2009 11:54:36 +0000</pubDate>
		<dc:creator>Allard</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[felix]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[OSGi]]></category>
		<category><![CDATA[Spring Dynamic Modules]]></category>
		<category><![CDATA[spring framework]]></category>

		<guid isPermaLink="false">http://www.gridshore.nl/?p=594</guid>
		<description><![CDATA[<p> <p>Recently, SpringSource released the first version of their DM server. The SpringSource DM Server provides the ability to build enterprise web applications. In the basis, S2DM is a fine mixture of Equinox and Tomcat.</p> <p>Building OSGi-based web applications was already possible, but it is tedious and error prone work. The typical hello-world example [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.gridshore.nl/wp-content/uploads/s2-logo.png" alt="s2-logo" title="s2-logo" width="213" height="66" class="alignleft size-full wp-image-605" />
<p>Recently, SpringSource released the first version of their DM server. The SpringSource DM Server provides the ability to build enterprise web applications. In the basis, S2DM is a fine mixture of Equinox and Tomcat.</p>
<p>Building OSGi-based web applications was already possible, but it is tedious and error prone work. The typical hello-world example was easy to get going, but as soon as Hibernate or any other framework that helps in larger applications show up, so do your good old class loading problems. For classes to be visible in OSGi, a bundle must declare an Import-Package entry in the Manifest file. Chances are small that Hibernate (even if it were packaged as an OSGi bundle) has these entries for your persistent classes. This is where S2DM server comes in. It allows the more-than-hello-world web applications to be deployed in an environment where you can benefit from the best of OSGi, without the class loading misery. To do this, they have included some extra Manifest entries that are translated to OSGi-compliant directives at load time.</p>
<p>Comparable to the WAR, or better, EAR file, S2DM server supports the PAR file. A PAR file is much like a Jar, with some special headers in the Manifest file, containing all your bundle jars. Some of these jars may contain web bundles, while other typically contain domain classes or the service layer implementation. Contrary to EAR files, a PAR should only contain your own code. It is best practice to deploy frameworks and third party libraries separately. I&#8217;ll explain why later on.</p>
<p>With enterprise applications come enterprise development processes, using continuous integration, build servers and maven. In this post, I&#8217;ll lay out what you need to get maven to build S2DM server compliant bundles, and better, PAR files.</p>
<p><span id="more-594"></span></p>
<p><strong>OSGi manifest headers</strong></p>
<p>But before we move straight to maven, let&#8217;s have a look at what a Spring DM bundle looks like. Basically, a Spring DM bundle is an ordinary OSGi bundle. It has the same requirements for the MANIFEST.MF file, of which the major headers are listed below:</p>
<ul>
<li>
<div><code>Bundle-SymbolicName</code> is the only mandatory manifest header. It represents the technical name of your bundle. This value, in combination with the Bundle-Version, if present, must be unique.</div>
</li>
<li>
<div><code>Bundle-Version</code> is not mandatory, but defaults to 0.0.0, which isn&#8217;t a meaningful version. An OSGi compatible version number has the format: &lt;<em>major</em>&gt;.&lt;<em>minor</em>&gt;.&lt;<em>micro</em>&gt;-&lt;<em>classifier</em>&gt;.</div>
</li>
<li>
<div>The <code>Import-Package</code> header allows you to specify a list of packages that your bundle requires to operate. It is also possible to specify version ranges and that some packages are optional.</div>
</li>
<li>
<div><code>DynamicImport-Package</code> can be used to dynamically import packages at the moment they are required. Use a wildcard (*) to set package patterns to limit the dynamic import to.</div>
</li>
<li>
<div>The last entry I&#8217;ll mention here is <code>Export-Package</code>. It specifies the packages of the current bundle that form its API. Classes in these packages are available for other bundles to use.</div>
</li>
</ul>
<p>For more details about OSGi manifest headers, see the <a title="OSGi R4.1 specification download page" href="http://www.osgi.org/Download.Release4V41" target="_blank">OSGi-core specification</a>, section 3.2.</p>
<p>The OSGi specification requires you to import a package (which has to be exported by another bundle) for a class loader to find it. This lead to problems when using frameworks such as Hibernate, which has to instantiate classes from your application. There is no way a Hibernate OSGi bundle can know beforehand which classes it will instantiate. Another problem is that the number of packages you will have to import is probably very large. Frameworks sometimes offer large amounts of classes that have been grouped into numerous packages. To mention each of those packages in your <code>Import-Package</code> manifest header is a lot of work. You could use the <code>DynamicImport-Package</code> to import all packages you require, but that will create as many problems as it solves. OSGi is designed to only resolve bundles when all requirements have been met. By dynamically importing packages, the OSGi framework has no way to know whether requirements are met, and will resolve your bundle. During runtime, you could get class loader exceptions.</p>
<p><strong>Spring DM specific manifest headers</strong></p>
<p>To counter both the large number of imports and the class loading problems, Spring DM introduced some additional manifest headers. Not that these are not (yet) official OSGi compatible headers and are only evaluated by Spring DM compatible OSGi environments, such as <a href="http://www.springsource.com/products/suite/dmserver">Spring DM Server</a>, for which there is a community and an enterprise version.</p>
<p>The most important additional Spring DM manifest headers for bundles are:</p>
<ul>
<li>
<div><code>Import-Library</code> can be used to import a library. A library is a specification of a set of bundles that should be imported as a whole. Examples of libraries are Hibernate and the Spring Framework.</div>
</li>
<li>
<div><code>Import-Bundle</code> is used to import all the packages from a specific bundle, such as Spring-Core. Typically, this header is used in library specifications, but it may also be used in bundles manifests.</div>
</li>
<li>
<div><code>Module-Type</code> specifies the type of this bundle. At the time of writing, only &#8220;Web&#8221; is supported. When adding this header to the manifest, you indicate that this bundle is to be treated as a Web Module.</div>
</li>
<li>
<div><code>Web-context path</code> specifies the URL in which a Web Module must be deployed. It default to the module&#8217;s file name minus the extension.</div>
</li>
<li>
<div><code>Web-FilterMappings</code> is used to specify the filter names (that reference spring bean names) and their URL mappings</div>
</li>
<li>
<div><code>Web-DispatcherServletUrlPatterns</code> indicates the URLs that have to be mapped to the DispatcherServlet. In Spring DM, a dispatcher servlet is automatically initialized with the context files in <code>META-INF/spring/*.xml.</code></div>
</li>
</ul>
<p><strong>Creating an OSGi bundle with maven</strong></p>
<p>Now that we know which headers have to be generated, lets move on to maven to find how we can generate a manifest file for them. Obviously, you could generate one yourself. This is, however, tedious and error prone. It is best to conform yourself to some design standards, such as using <code>.internal</code> or <code>.impl</code> packages to store classes that are not part of your public API. When you do so, the maven-bundle-plugin.</p>
<p>The maven-bundle-plugin is used to generate an OSGi bundle from your module. In order to make it work, you have to make a few modifications to an otherwise normal <em>pom.xml</em>file:</p>
<ol>
<li>
<div>The &lt;packaging&gt; element value must be set to bundle: <code>&lt;packaging&gt;bundle&lt;packaging&gt;</code></div>
</li>
<li>
<div>Configure the org.apache.felix:maven-bundle-plugin</div>
</li>
</ol>
<p>
<pre class="brush: xml; title: ; notranslate">
&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.apache.felix&lt;/groupId&gt;
            &lt;artifactId&gt;maven-bundle-plugin&lt;/artifactId&gt;
            &lt;extensions&gt;true&lt;/extensions&gt;
            &lt;configuration&gt;
                &lt;instructions&gt;
                    ...
                &lt;/instructions&gt;
            &lt;/configuration&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;
</pre>
</p>
<p>This configuration will generate OSGi compliant manifest files. The <code>Bundle-SymbolicName</code> will be formed from your modules groupId and artifactId and the <code>Bundle-Version</code> will be set to you module&#8217;s version. By default, all packages that are mentioned in your source code&#8217;s import statements will be imported by your bundle, even if these packages are also included in your bundle (see this <a href="http://www.osgi.org/blog/2007/04/importance-of-exporting-nd-importing.html" target="_blank">post</a> on the OSGi Alliance website). Furthermore, all packages available in your bundle will be exported, even the <code>.impl</code> and <code>.internal</code> packages.</p>
<blockquote><p><code>Manifest-Version: 1.0<br />
Export-Package: springdm.domain;uses:="javax.persistence",springdm.per<br />
&nbsp;sistence.impl;uses:="springdm.domain,org.springframework.transaction.<br />
&nbsp;annotation,springdm.persistence,javax.persistence,org.springframework<br />
&nbsp;.beans.factory",springdm.persistence;uses:="springdm.domain"<br />
Private-Package: springdm.*.impl.*<br />
Built-By: allard<br />
Tool: Bnd-0.0.255<br />
Bundle-Name: Spring DM Persistence<br />
Import-Library: org.hibernate.ejb;version="[3.3.2.GA,3.3.2.GA]"<br />
Created-By: Apache Maven Bundle Plugin<br />
Import-Bundle: org.springframework.orm;version="[2.5.6.A,2.5.6.A]"<br />
DynamicImport-Package: *<br />
Build-Jdk: 1.6.0_06<br />
Bundle-Version: 1.0.0.SNAPSHOT<br />
Bnd-LastModified: 1230983705375<br />
Bundle-ManifestVersion: 2<br />
Bundle-SymbolicName: springdm.persistence<br />
Import-Package: com.mysql.jdbc.jdbc2.optional,javax.persistence,javax.<br />
&nbsp;sql,org.hibernate.jdbc,org.springframework.beans.factory,org.springfr<br />
&nbsp;amework.transaction.annotation,springdm.domain,springdm.persistence,s<br />
&nbsp;pringdm.persistence.impl<br />
</code></p></blockquote>
<p>I am not going into more detail about how to configure the bundle plugin to keep implementation packages private. See the felix <a href="http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html" target="_blank">documentation</a> for more information about that.</p>
<p><strong>Adding Spring DM manifest headers</strong></p>
<p>Well, that actually quite easy. All you have to do is specify the name of the header as a sub element in the <code>&lt;instructions&gt;</code> element and the value of the header as the value of that element, for example: </p>
<blockquote><p><code>&lt;Import-Bundle&gt;org.springframework.orm;version="[2.5.6.A,2.5.6.A]"&lt;/Import-Bundle&gt;</code></p></blockquote>
<p>The problem is to find out which bundles or libraries there are to import, and which versions they have. That&#8217;s why Spring started the <a href="http://www.springsource.com/repository/app/" target="_blank">Spring DM bundle repository</a>. You can use it to find libraries and OSGi bundles for most commonly used frameworks. For each of thus libraries or bundles, it will tell you which maven dependency to use (for compilation) and which manifest entry has to be added to your bundle. Make sure that your maven dependencies and manifest entries are updated, otherwise you could run into problems at runtime.</p>
<p>For maven to find the artifacts in the bundle repository, you have to configure some repositories. You can find them <a href="http://www.springsource.com/repository/app/faq#q8" target="_blank">here</a>.</p>
<p>If your bundle is a Web Bundle, add the required <code>&lt;Module-Type&gt;Web&lt;/Module-Type&gt;</code> element to the instructions, as well as any other required Web-* headers.</p>
<p>That&#8217;s actually it. That&#8217;s all it takes to generate Spring DM specific manifest entries.</p>
<p><strong>Creating a PAR deployment unit</strong></p>
<p>The PAR file is the deployment unit for Spring DM applications. It is a Jar file with special manifest headers that contains all application specific bundles. You should never include framework bundles in the par file. In conventional environments, class loaders would prevent you from having different versions of the same class on your class path. Therefore, you had to add frameworks to the WAR file, to prevent version conflicts with other applications. In OSGi, there is no problem with having the same class multiple times. You just specify a version restriction in your import headers and OSGi takes care of the resolution process. To keep PAR files small, you can deploy required libraries and bundles in the /repository/libraries/usr and /repository/bundles/usr folders respectively. Any application can reuse any existing framework bundles.</p>
<p>The PAR file has another advantage. Spring DM Server prevents bundles from outside the PAR file from accessing bundles inside the PAR file. This way, you can deploy applications without running the risk of classes and services intermingling.</p>
<p>Now, let&#8217;s get back to maven to create ourselves a par file. First, create a new module in your maven project. This module&#8217;s pom file should have <code>&lt;packaging&gt;</code> set to <code>par</code>. Next, add dependencies to each module you want to be included in the par file. The par plugin does not include transitive dependencies, since framework bundles should not be included. Finally, add the maven-par-plugin to your plugin configuration.</p>
<p>
<pre class="brush: xml; title: ; notranslate">
&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
            &lt;artifactId&gt;maven-par-plugin&lt;/artifactId&gt;
            &lt;version&gt;0.2.0&lt;/version&gt;
            &lt;extensions&gt;true&lt;/extensions&gt;
            &lt;configuration&gt;
                &lt;fqn&gt;true&lt;/fqn&gt;
                &lt;applicationSymbolicName&gt;gridshore.samples.springdm&lt;/applicationSymbolicName&gt;
                &lt;applicationVersion&gt;1.0.0&lt;/applicationVersion&gt;
                &lt;applicationDescription&gt;Gridshore Spring DM sample&lt;/applicationDescription&gt;
                &lt;applicationName&gt;Gridshore Spring DM sample&lt;/applicationName&gt;
            &lt;/configuration&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;par&lt;/goal&gt;
                    &lt;/goals&gt;
                    &lt;phase&gt;package&lt;/phase&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;
</pre>
</p>
<p>You probably need to configure a repository to find this plugin: <a href="http://repo.steademy.com/beta/maven2">http://repo.steademy.com/beta/maven2</a>. You can find documentation of the maven-par-plugin <a href="http://blog.steademy.com/2008/05/29/maven-par-plugin/" target="_blank">here</a>.</p>
<p>Now run <code>mvn install</code> and see your PAR being created for you. Since your PAR does not contain framework bundles, you have to install them separately. To make sure that all dependencies are available, you can use the maven-assembly-plugin to create a zip file with the PAR file as well as all the framework bundles you require.</p>
<p>Have fun!</p>
<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http%3A%2F%2Fwww.gridshore.nl%2F2009%2F01%2F03%2Fbuilding-spring-dm-server-compliant-osgi-bundles-with-maven%2F&amp;title=Building%20Spring%20DM%20server%20compliant%20OSGi%20bundles%20with%20Maven&amp;t=2' height='25' width='155' frameborder='0' scrolling='no'></iframe></div></div><div style='clear:both'></div></div><!-- Social Buttons Generated by Digg Digg plugin v4.5.3.4, 
    Author : Yong Mook Kim
    Website : http://www.diggdigg2u.com -->]]></content:encoded>
			<wfw:commentRss>http://www.gridshore.nl/2009/01/03/building-spring-dm-server-compliant-osgi-bundles-with-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Continuous Integration (Again)</title>
		<link>http://www.gridshore.nl/2008/08/29/continuous-integration-again/</link>
		<comments>http://www.gridshore.nl/2008/08/29/continuous-integration-again/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 12:55:56 +0000</pubDate>
		<dc:creator>jettro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[artifactory]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[JTeam]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[teamcity]]></category>

		<guid isPermaLink="false">http://www.gridshore.nl/?p=215</guid>
		<description><![CDATA[<p> <p>This blog item gives you an inside scoop into the continuous integration environment at JTeam. You’ll learn about the why, what and how of continuous integration. The tools we use are mainly open source.</p> Why continuous integration? <p> A number of years a go not many people new the term continuous integration. That [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.gridshore.nl/wp-content/uploads/jteamlogoallsmall.png" alt="jteamlogoallsmall.png" border="0" width="186" height="120" align="left" />
<p>This blog item gives you an inside scoop into the continuous integration environment at JTeam. You’ll learn about the why, what and how of continuous integration. The tools we use are mainly open source.</p>
<h2>Why continuous integration?</h2>
<p> A number of years a go not many people new the term continuous integration. That has changed a lot. All people at JTeam know what it is about and all projects use an environment that is set up to actually do continuous integration. For those that do not know what continuous integration is and those that need a short recap, we briefly explain what we think continuous integration is. Let’s start with the definition from Martin Fowler: </p>
<p><cite> Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least dail￼y &#8211; 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 </cite></p>
<p> Key to continuous integration is delivering high quality artifacts. It is not the silver bullet, developers still need to create great code, but using a good continuous integration process helps finding bugs. Checking your quality standards a long the way increases the effect. Of course extra actions are still necessary. You can think about actions like: manual code reviews, performance tests, functional tests, etc.</p>
<p>JTeam has been using continuous integration from the start. Recently we implemented the second version of our continuous integration environment. We introduced new tools, the process however stayed the same.</p>
<p><span id="more-215"></span><br />
<h2>What do you need?</h2>
<p><img src="http://www.gridshore.nl/wp-content/uploads/maven-feather.png" alt="maven-feather.png" border="0" width="90" height="30" align="right" />Continuous integration is about a lot of different things. So lets review them here. First of all, we have sources and a build. We tend to write a lot of java code, but we also need configuration files, html, style sheets, etc. With maven the way to structure your files has been standardized. We are using <a href="http://maven.apache.org">￼maven 2</a> for all our projects. Maven makes the life of a developer a lot more efficient while doing the normal tasks. Team leads and project leads also have reasons to implement maven in there projects. Maven has a lot of plugins that enable the projects spectators to see what is happening at the project. </p>
<p> Most of our projects are executed by more than one person, therefore a good source repository becomes very important. The source repository gives us more advantages, which I’ll talk about later. Within JTeam we have chosen to use <a href="http://subversion.tigris.org">subversion</a> for storing the sources of the projects. </p>
<p><img src="http://www.gridshore.nl/wp-content/uploads/artifactorylogo.png" alt="artifactorylogo.png" border="0" width="151" height="35" align="left" />You can share sources and you have an automated build. Of course maven integrates very well with some IDE’s and it integrates kinda with some others. One of the important features of Maven is that it downloads dependencies from an online repository. Dependencies are libraries your project depends on. To limit network bandwidth, to store locally created libraries and to make libraries that are not available in an online repository accessible, you can connect to an internal repository. In maven this is called a proxy or a mirror. At JTeam we use a repository called <a href="http://www.jfrog.org/sites/artifactory/latest/">Artifactory</a>. Artifactory is a product from jfrog.</p>
<p> Having an automated build is not enough for good continuous integration. The automated build must be a continuous build. There are a lot of tools available that can give you continuous build. Some examples are : <a href="https://hudson.dev.java.net/">Hudson</a>, <a href="http://cruisecontrol.sourceforge.net/">CruiseControl</a> and <a href="http://luntbuild.javaforge.com/">Luntbuild</a>. We use <a href="http://www.jetbrains.com/teamcity/index.html">Teamcity</a> from Jetbrains to integrate all subversion checkins, run all the tests and every night run the maven reports. These maven reports are then published on a server so everybody can check the current status of the project. Teamcity is not open source and, there is a free license available, we use the commercial license. I explain later on why. </p>
<p> The following image gives you an overview of all services you need to have available for you to use in your project. The image shows more tools then I have discussed so far. They are not directly related to continuous integration, still they are very important for you when doing projects. Jira is about keeping track of requirements, issues and time estimations as well as time spend. Confluence is our knowledge base in which we document all our knowledge we gather while doing projects. Both jira and confluence are products from <a href="http://www.atlassian.com/">atlassian</a> and very well known. </p>
<p><img src="http://www.gridshore.nl/wp-content/uploads/diagrams-applicationlandscape.png" alt="Diagrams-applicationlandscape.png" border="0" width="549" height="520"/></p>
<p>A last thing I would like to mention is a plugin for maven, the dashboard plugin. We are using this plugin now for a few projects and it gives some nice overviews. Graphical views of checkstyle, pmd, cobertura. When combining it with a database there is also the possibility of historical data, which is working very nice as well. You can find more information on the website including a lot of sample reports. <a href="http://mojo.codehaus.org/dashboard-maven-plugin/">http://mojo.codehaus.org/dashboard-maven-plugin/</a></p>
<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http%3A%2F%2Fwww.gridshore.nl%2F2008%2F08%2F29%2Fcontinuous-integration-again%2F&amp;title=Continuous%20Integration%20%28Again%29&amp;t=2' height='25' width='155' frameborder='0' scrolling='no'></iframe></div></div><div style='clear:both'></div></div><!-- Social Buttons Generated by Digg Digg plugin v4.5.3.4, 
    Author : Yong Mook Kim
    Website : http://www.diggdigg2u.com -->]]></content:encoded>
			<wfw:commentRss>http://www.gridshore.nl/2008/08/29/continuous-integration-again/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JetBrains Teamcity &#8211; your continuous build to the next level</title>
		<link>http://www.gridshore.nl/2008/02/05/jetbrains-teamcity-your-continuous-build-to-the-next-level/</link>
		<comments>http://www.gridshore.nl/2008/02/05/jetbrains-teamcity-your-continuous-build-to-the-next-level/#comments</comments>
		<pubDate>Tue, 05 Feb 2008 20:30:30 +0000</pubDate>
		<dc:creator>jettro</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[intellij]]></category>

		<guid isPermaLink="false">http://www.gridshore.nl/2008/02/05/jetbrains-teamcity-your-continuous-build-to-the-next-level/</guid>
		<description><![CDATA[<p>As a lot of you, I am working on larger projects with more than 10 developers, most of the time there are some offshore resources as well. Of course we are using continuous integration, we program our unit tests and run them on every build. Still it happens that people do a mvn clean [...]]]></description>
			<content:encoded><![CDATA[<p><img height="44" style="margin: 5px; float: left" width="124" alt="" src="http://www.gridshore.nl/wp-content/logo.gif" />As a lot of you, I am working on larger projects with more than 10 developers, most of the time there are some offshore resources as well. Of course we are using continuous integration, we program our unit tests and run them on every build. Still it happens that people do a mvn clean install before checking in and after checking in the build fails. Now Teamcity offers a very nice way to execute a build before the actual commit takes place. And you know what, it actually works. When everybody uses the pre-commit build on server, you can also have a look at pending changes. So you know what is coming, and therefore can anticipate on merge problems or test conflicts.</p>
<p>Some of the things I like so far:</p>
<ul>
<li>Support for multiple runners like ant and maven2 but also some .Net things.</li>
<li>Good integration with version control system, able to see change sets, who did what, etc.</li>
<li>Very nice and intuitive interface.</li>
<li>Historical view on all builds including results like build log and test results.</li>
<li>Good integration with IntelliJ (there is also a plugin for eclipse but I have not tested it yet). With the plugin you can execute builds, watch pending changesets, initiate a remote pre-commit build. This is integrated with the source control plugin, so you can push the button run pre-commit while in the same screen as you were before. The image below gives you a nice view of the running build (if you put on your glasses).</li>
</ul>
<p><img height="233" style="margin: 5px" width="600" alt="" src="http://www.gridshore.nl/wp-content/screenteamcityplugin.jpg" /></p>
<p>The next image gives you an impression of the build overview screen. You can see a difference between builds initiated on the server and the ones initiated from intellij. The ones from intellij have a small pictogram of a person below the build number.</p>
<p><img height="407" style="margin: 5px" width="700" alt="" src="http://www.gridshore.nl/wp-content/screenteamcitywebsite.jpg" /></p>
<p>The best part, you can use Teamcity free of charge with some limitations in the amount of builders, or agents (3) and the amount of users (20). Still this gives you an excellent opportunity to do a test drive.</p>
<p>If you want more information or want to try it out yourself, go to the following website: <a href="http://www.jetbrains.com/teamcity/">http://www.jetbrains.com/teamcity/</a></p>
<p style="color:#008;text-align:right;"><small><em>Powered by</em> <a href="http://www.qumana.com/">Qumana</a></small></p>
<div class='dd_post_share'><div class='dd_buttons'><div class='dd_button'><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http%3A%2F%2Fwww.gridshore.nl%2F2008%2F02%2F05%2Fjetbrains-teamcity-your-continuous-build-to-the-next-level%2F&amp;title=JetBrains%20Teamcity%20-%20your%20continuous%20build%20to%20the%20next%20level&amp;t=2' height='25' width='155' frameborder='0' scrolling='no'></iframe></div></div><div style='clear:both'></div></div><!-- Social Buttons Generated by Digg Digg plugin v4.5.3.4, 
    Author : Yong Mook Kim
    Website : http://www.diggdigg2u.com -->]]></content:encoded>
			<wfw:commentRss>http://www.gridshore.nl/2008/02/05/jetbrains-teamcity-your-continuous-build-to-the-next-level/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

