<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>println it</title>
	
	<link>http://evgeny-goldin.com/blog</link>
	<description>Software blog about tools, builds and making it all work</description>
	<lastBuildDate>Mon, 24 Sep 2012 22:42:10 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/GoldinTheJunior" /><feedburner:info uri="goldinthejunior" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>GoldinTheJunior</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2FGoldinTheJunior" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>3 new plugins! Gradle Kotlin, Gradle TeamCity, TeamCity Console</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/sNBrY1QwvJ4/</link>
		<comments>http://evgeny-goldin.com/blog/gradle-kotlin-teamcity-console/#comments</comments>
		<pubDate>Thu, 16 Aug 2012 18:14:08 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Gradle]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[TeamCity]]></category>
		<category><![CDATA[Kotlin]]></category>
		<category><![CDATA[teamcity]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=5480</guid>
		<description><![CDATA[I&#8217;ve been working on a number of plugins lately which are now open to public use. Please, give them a warm welcome! Gradle Kotlin plugin allows to compile Kotlin sources using Gradle. It is also possible to compile Kotlin and Java/Groovy/Scala sources kept in the same module, see the documentation for more details. Gradle TeamCity [...]]]></description>
				<content:encoded><![CDATA[<p><br/><br />
I&#8217;ve been working on a number of plugins lately which are now open to public use. Please, give them a warm welcome!</p>
<ul>
<li><a href="http://evgeny-goldin.com/wiki/Gradle-Kotlin-plugin"><strong>Gradle Kotlin plugin</strong></a> allows to compile Kotlin sources using Gradle. It is also possible to compile Kotlin and Java/Groovy/Scala sources kept in the same module, see the <a href="http://evgeny-goldin.com/wiki/Gradle-Kotlin-plugin#Compiling_Kotlin_and_Java_in_the_same_module">documentation</a> for more details.</li>
<li><a href="http://evgeny-goldin.com/wiki/Gradle-TeamCity-plugin"><strong>Gradle TeamCity plugin</strong></a> allows to build and archive TeamCity plugins using Gradle. Following the <a href="http://youtrack.jetbrains.com/issue/TW-10625">long-awaited need</a>, TeamCity dependencies were deployed to a Maven repository at <a href="http://evgenyg.artifactoryonline.com/evgenyg/teamcity/">Artifactory Online</a>. So working on TeamCity plugins should be much easier now, at least from the build point of view. To make sure it works I&#8217;ve ported builds of <a href="https://github.com/evgeny-goldin/teamcity-artifactory-plugin/blob/master/build.gradle">teamcity-artifactory-plugin</a> and <a href="https://github.com/evgeny-goldin/teamcity-nuget-support/blob/master/build.gradle">teamcity-nuget-support</a> to Gradle.</li>
<li><a href="http://evgeny-goldin.com/wiki/TeamCity_Console"><strong>TeamCity Console plugin</strong></a> is a Groovy console for TeamCity admins. Think <a href="https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+Script+Console">Jenkins Script Console</a> or <a href="http://groovyconsole.appspot.com/">Groovy Web Console</a> but for TeamCity. It allows you to run a Groovy script in TeamCity run-time environment and displays a content of all Spring contexts linked to <a href="http://javadoc.jetbrains.net/teamcity/openapi/current/">Open API Javadocs</a>, letting you see what&#8217;s in there and what can be injected into your Spring beans.</li>
</ul>
<p>Try them out and let me know how it works. Bugs, feedbacks, complains, suggestions &#8211; I&#8217;m all ears.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=sNBrY1QwvJ4:xr5hG6t6_vc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=sNBrY1QwvJ4:xr5hG6t6_vc:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=sNBrY1QwvJ4:xr5hG6t6_vc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/sNBrY1QwvJ4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/gradle-kotlin-teamcity-console/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/gradle-kotlin-teamcity-console/</feedburner:origLink></item>
		<item>
		<title>Get TeamCity artifacts using HTTP, Ant, Gradle and Maven</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/FqUqmBgU3GE/</link>
		<comments>http://evgeny-goldin.com/blog/teamcity-ivy-gradle-maven/#comments</comments>
		<pubDate>Tue, 22 May 2012 12:04:24 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Gradle]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[TeamCity]]></category>
		<category><![CDATA[Ant]]></category>
		<category><![CDATA[Ivy]]></category>
		<category><![CDATA[teamcity]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=5055</guid>
		<description><![CDATA[In how many ways can you retrieve TeamCity artifacts? I say plenty to choose from! If you&#8217;re in a world of Java build tools then you can use plain HTTP request, Ant + Ivy, Gradle and Maven to download and use binaries produced by TeamCity build configurations. How? Read on. Build Configuration &#8220;id&#8221; Before you [...]]]></description>
				<content:encoded><![CDATA[<p><br/><br />
In how many ways can you retrieve TeamCity artifacts? I say <em>plenty to choose from</em>! If you&#8217;re in a world of Java build tools then you can use plain HTTP request, Ant + Ivy, Gradle and Maven to download and use binaries produced by TeamCity build configurations. How? Read on.</p>
<h2>Build Configuration &#8220;id&#8221;</h2>
<p>Before you retrieve artifacts of any build configuration you need to know its <a href="http://confluence.jetbrains.net/display/TCD7/Build+Configuration#BuildConfiguration-buildconfigurationID"><strong><code>"id"</code></strong></a> which can be seen in a browser when corresponding configuration is browsed. Let&#8217;s take <a href="http://teamcity.jetbrains.com/project.html?projectId=project66&amp;guest=1">IntelliJ IDEA Community Edition</a> project hosted at <a href="http://teamcity.jetbrains.com/?&amp;guest=1">teamcity.jetbrains.com</a> as an example. Its &#8220;Community Dist&#8221; build configuration provides a number of artifacts which we&#8217;re going to play with. And as can be seen on the screenshot below, its <strong><code>"id"</code></strong> is <strong><code>"bt343"</code></strong>.</p>
<p><a href="http://teamcity.jetbrains.com/viewLog.html?buildId=lastSuccessful&#038;buildTypeId=bt343&#038;tab=artifacts&#038;guest=1##1htph"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/05/IDEA-CE-Artifacts3.png" alt="" title="IntelliJ IDEA Community Edition artifacts list" width="631" height="438" class="aligncenter size-full wp-image-5129"/></a></p>
<h2>HTTP</h2>
<p>Anonymous HTTP access is probably the easiest way to fetch TeamCity artifacts, the URL to do so is:</p>
<p><strong><code>http://server/guestAuth/repository/download/&lt;btN&gt;/&lt;buildNumber&gt;/&lt;artifactName&gt;</code></strong></p>
<p>Fot this request to work 3 parameters need to be specified:</p>
<table>
<tr>
<td align="center"><strong><code>btN</code></strong></td>
<td>Build configuration <strong><code>"id"</code></strong>, as mentioned above.</td>
</tr>
<tr>
<td align="center"><strong><code>buildNumber</code></strong></td>
<td>Build number or one of predefined constants: <code>"lastSuccessful"</code>, <code>"lastPinned"</code>, or <code>"lastFinished"</code>. For example, you can download periodic IDEA builds from <a href="http://teamcity.jetbrains.com/guestAuth/repository/download/bt343/lastSuccessful/ideaIC-118.SNAPSHOT.win.zip">last successful</a> TeamCity execution.
</td>
</tr>
<tr>
<td align="center"><strong><code>artifactName</code></strong></td>
<td>Name of artifact like <strong><code>"ideaIC-118.SNAPSHOT.win.zip"</code></strong>. Can also take a form of <strong><code>"artifactName!archivePath"</code></strong> for reading archive&#8217;s content, like IDEA&#8217;s <a href="http://teamcity.jetbrains.com/guestAuth/repository/download/bt343/lastSuccessful/sources.zip!build.xml">build file</a>. You can get a list of all artifacts produced in a certain build by requesting a special <a href="http://teamcity.jetbrains.com/guestAuth/repository/download/bt343/lastSuccessful/teamcity-ivy.xml"><code>"teamcity-ivy.xml"</code></a> artifact generated by TeamCity.
</td>
</tr>
</table>
<h2>Ant + Ivy</h2>
<p>All artifacts published to TeamCity are accompanied by <strong><code>"teamcity-ivy.xml"</code></strong> Ivy descriptor, effectively making TeamCity an Ivy repository. The code below downloads <strong><code>"core/annotations.jar"</code></strong> from IDEA distribution to <strong><code>"download/ivy"</code></strong> directory:</p>
<p><a href="https://github.com/evgeny-goldin/teamcity-download-examples/blob/master/ivyconf.xml"><strong><code>"ivyconf.xml"</code></strong></a></p>
<pre class="brush: xml; title: ; notranslate">
&lt;ivysettings&gt;
    &lt;settings defaultResolver='teamcity-repo'/&gt;
    &lt;resolvers&gt;
        &lt;url name='teamcity-repo' alwaysCheckExactRevision='yes' checkmodified='true'&gt;
            &lt;ivy      pattern='http://teamcity.jetbrains.com/guestAuth/repository/download/[module]/[revision]/teamcity-ivy.xml'/&gt;
            &lt;artifact pattern='http://teamcity.jetbrains.com/guestAuth/repository/download/[module]/[revision]/[artifact](.[ext])'/&gt;
        &lt;/url&gt;
    &lt;/resolvers&gt;
&lt;/ivysettings&gt;
</pre>
<p><a href="https://github.com/evgeny-goldin/teamcity-download-examples/blob/master/ivy.xml"><strong><code>"ivy.xml"</code></strong></a></p>
<pre class="brush: xml; title: ; notranslate">
&lt;ivy-module version=&quot;1.3&quot;&gt;
    &lt;info organisation=&quot;com.jetbrains&quot; module=&quot;idea&quot;/&gt;
    &lt;dependencies&gt;
        &lt;dependency org=&quot;org&quot; name=&quot;bt343&quot; rev=&quot;lastSuccessful&quot;&gt;
            &lt;include name=&quot;core/annotations&quot; ext=&quot;jar&quot;/&gt;
        &lt;/dependency&gt;
    &lt;/dependencies&gt;
&lt;/ivy-module&gt;
</pre>
<p><a href="https://github.com/evgeny-goldin/teamcity-download-examples/blob/master/build.xml"><strong><code>"build.xml"</code></strong></a></p>
<pre class="brush: xml; title: ; notranslate">
&lt;project name=&quot;teamcity-download&quot; default=&quot;download&quot; xmlns:ivy=&quot;antlib:org.apache.ivy.ant&quot;&gt;
    &lt;target name=&quot;download&quot; xmlns:ivy=&quot;antlib:org.apache.ivy.ant&quot;&gt;
        &lt;taskdef uri=&quot;antlib:org.apache.ivy.ant&quot; resource=&quot;org/apache/ivy/ant/antlib.xml&quot;/&gt;
        &lt;ivy:configure file    = &quot;${basedir}/ivyconf.xml&quot;/&gt;
        &lt;ivy:resolve   file    = &quot;${basedir}/ivy.xml&quot;/&gt;
        &lt;ivy:retrieve  pattern = &quot;${basedir}/download/ivy/[artifact].[ext]&quot;/&gt;
    &lt;/target&gt;
&lt;/project&gt;
</pre>
<h2>Gradle</h2>
<p>Identically to Ivy example above it is fairly easy to retrieve TeamCity artifacts with Gradle due to its built-in Ivy support. In addition to downloading the same jar file to <strong><code>"download/gradle"</code></strong> directory with a custom Gradle task let&#8217;s use it as <strong><code>"compile"</code></strong> dependency for our Java class, importing IDEA&#8217;s <a href="http://www.jetbrains.com/idea/documentation/howto.html"><strong><code>@NotNull</code></strong></a> annotation:</p>
<p><a href="https://github.com/evgeny-goldin/teamcity-download-examples/blob/master/src/main/java/com/test/Test.java"><strong><code>"Test.java"</code></strong></a></p>
<pre class="brush: java; title: ; notranslate">
import org.jetbrains.annotations.NotNull;

public class Test
{
    private final String data;
    public Test ( @NotNull String data ){ this.data = data; }
}
</pre>
<p><a href="https://github.com/evgeny-goldin/teamcity-download-examples/blob/master/build.gradle"><strong><code>"build.gradle"</code></strong></a></p>
<pre class="brush: groovy; title: ; notranslate">
apply plugin: 'java'

repositories {
    ivy {
        ivyPattern      'http://teamcity.jetbrains.com/guestAuth/repository/download/[module]/[revision]/teamcity-ivy.xml'
        artifactPattern 'http://teamcity.jetbrains.com/guestAuth/repository/download/[module]/[revision]/[artifact](.[ext])'
    }
}

dependencies {
    compile ( 'org:bt343:lastSuccessful' ){
        artifact {
            name = 'core/annotations'
            type = 'jar'
        }
    }
}

task copyJar( type: Copy ) {
    from configurations.compile
    into &quot;${ project.projectDir }/download/gradle&quot;
}
</pre>
<h2>Maven</h2>
<p>The best way to use Maven with TeamCity is by setting up an <a href="http://www.jfrog.com/">Artifactory repository manager</a> and its <a href="http://wiki.jfrog.org/confluence/display/RTF/TeamCity+Artifactory+Plug-in">TeamCity plugin</a>. This way artifacts produced by your builds are nicely deployed to Artifactory and can be served from there as from any other remote Maven repository.</p>
<p>However, you can still use TeamCity artifacts in Maven without any additional setups. <a href="http://evgeny-goldin.com/wiki/Ivy-maven-plugin"><strong><code>"ivy-maven-plugin"</code></strong></a> bridges two worlds allowing you to plug Ivy resolvers into Maven&#8217;s runtime environment, download dependencies required and add them to corresponding <strong><code>"compile"</code></strong> or <strong><code>"test"</code></strong> scopes.</p>
<p>Let&#8217;s compile the same Java source from the Gradle example but using Maven this time.</p>
<p><a href="https://github.com/evgeny-goldin/teamcity-download-examples/blob/master/pom.xml"><strong><code>"pom.xml"</code></strong></a></p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;project xmlns              = &quot;http://maven.apache.org/POM/4.0.0&quot;
         xmlns:xsi          = &quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation = &quot;http://maven.apache.org/POM/4.0.0

http://maven.apache.org/maven-v4_0_0.xsd&quot;&gt;

    &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
    &lt;groupId&gt;com.test&lt;/groupId&gt;
    &lt;artifactId&gt;maven&lt;/artifactId&gt;
    &lt;packaging&gt;jar&lt;/packaging&gt;
    &lt;version&gt;0.1-SNAPSHOT&lt;/version&gt;
    &lt;name&gt;[${project.groupId}:${project.artifactId}:${project.version}]&lt;/name&gt;
    &lt;description&gt;Ivy Maven plugin example&lt;/description&gt;

    &lt;build&gt;
        &lt;plugins&gt;
            &lt;plugin&gt;
                &lt;groupId&gt;com.github.goldin&lt;/groupId&gt;
                &lt;artifactId&gt;ivy-maven-plugin&lt;/artifactId&gt;
                &lt;version&gt;0.2.5&lt;/version&gt;
                &lt;executions&gt;
                    &lt;execution&gt;
                        &lt;id&gt;get-ivy-artifacts&lt;/id&gt;
                        &lt;goals&gt;
                            &lt;goal&gt;ivy&lt;/goal&gt;
                        &lt;/goals&gt;
                        &lt;phase&gt;initialize&lt;/phase&gt;
                        &lt;configuration&gt;
                            &lt;ivyconf&gt;${project.basedir}/ivyconf.xml&lt;/ivyconf&gt;
                            &lt;ivy&gt;${project.basedir}/ivy.xml&lt;/ivy&gt;
                            &lt;dir&gt;${project.basedir}/download/maven&lt;/dir&gt;
                            &lt;scope&gt;compile&lt;/scope&gt;
                        &lt;/configuration&gt;
                    &lt;/execution&gt;
                &lt;/executions&gt;
            &lt;/plugin&gt;
        &lt;/plugins&gt;
    &lt;/build&gt;
&lt;/project&gt;
</pre>
<p>When this plugin runs it resolves IDEA annotations artifact using the same <strong><code>"ivyconf.xml"</code></strong> and <strong><code>"ivy.xml"</code></strong> files we&#8217;ve seen previously, copies it to <strong><code>"download/maven"</code></strong> directory and adds to <strong><code>"compile"</code></strong> scope so our Java sources can compile.</p>
<h2>GitHub Project</h2>
<p>All examples demonstrated are available in my <a href="https://github.com/evgeny-goldin/teamcity-download-examples">GitHub project</a>. Feel free to clone and run it:</p>
<pre class="brush: bash; title: ; notranslate">
git clone git://github.com/evgeny-goldin/teamcity-download-examples.git
cd teamcity-download-examples
chmod +x run.sh dist/ant/bin/ant gradlew dist/maven/bin/mvn
./run.sh
</pre>
<h2>Resources</h2>
<p>The links below can provide you with more details:</p>
<ul>
<li>
<a href="http://confluence.jetbrains.net/display/TCD7/Patterns+For+Accessing+Build+Artifacts">TeamCity &#8211; Patterns For Accessing Build Artifacts</a>
</li>
<li>
<a href="http://confluence.jetbrains.net/display/TCD7/Accessing+Server+by+HTTP">TeamCity &#8211; Accessing Server by HTTP</a>
</li>
<li>
<a href="http://confluence.jetbrains.net/display/TCD7/Artifact+Dependencies#ArtifactDependencies-ConfiguringArtifactDependenciesUsingAntBuildScript">TeamCity &#8211; Configuring Artifact Dependencies Using Ant Build Script</a>
</li>
<li>
<a href="http://gradle.org/docs/current/userguide/dependency_management.html#sec:ivy_repositories">Gradle &#8211; Ivy repositories</a>
</li>
<li>
<a href="http://evgeny-goldin.com/wiki/Ivy-maven-plugin"><strong><code>"ivy-maven-plugin"</code></strong></a>
</li>
</ul>
<p>That&#8217;s it, you&#8217;ve seen it &#8211; TeamCity artifacts are perfectly accessible using either of 4 ways: direct HTTP access, Ant + Ivy, Gradle or Maven. Which one do you use? Let me know! </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=FqUqmBgU3GE:4kQkxO_NoAU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=FqUqmBgU3GE:4kQkxO_NoAU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=FqUqmBgU3GE:4kQkxO_NoAU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/FqUqmBgU3GE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/teamcity-ivy-gradle-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/teamcity-ivy-gradle-maven/</feedburner:origLink></item>
		<item>
		<title>Maven Plugins 0.2.5 – Artifactory Online, Maven Central!</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/Us2rON-f-nI/</link>
		<comments>http://evgeny-goldin.com/blog/maven-plugins-0-2-5/#comments</comments>
		<pubDate>Tue, 15 May 2012 15:51:21 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Artifactory]]></category>
		<category><![CDATA[Gradle]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Ivy]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=4978</guid>
		<description><![CDATA[Today I&#8217;m very excited to announce the availability of Maven Plugins v0.2.5! This version is not a regular update: it contains a great deal of infrastructural changes which I&#8217;ve been considering and working on for the past six months. Here it goes: My Artifactory repository has moved from evgeny-goldin.org/artifactory to Artifactory Online at evgenyg.artifactoryonline.com. What [...]]]></description>
				<content:encoded><![CDATA[<p><br/><br />
Today I&#8217;m very excited to announce the availability of <a href="http://evgeny-goldin.com/wiki/Maven-plugins">Maven Plugins</a> <strong>v0.2.5</strong>! This version is not a regular update: it contains a great deal of infrastructural changes which I&#8217;ve been considering and working on for the past six months.</p>
<p>Here it goes:</p>
<ul>
<li>My Artifactory repository has moved from <a href="http://evgeny-goldin.org/artifactory/">evgeny-goldin.org/artifactory</a> to Artifactory Online at <a href="http://evgenyg.artifactoryonline.com/">evgenyg.artifactoryonline.com</a>. What this means for you is that now the repository is not expected to ever go down, unlike the previous situation where I couldn&#8217;t provide any uptime guarantee due to upgrade downtimes.
</li>
<li>But it doesn&#8217;t end there! Starting from this version, all releases are now available at <a href="http://search.maven.org/#search|ga|1|com.github.goldin">Maven Central</a> as well. I&#8217;ve been approached by quite a few people asking for this and even though I still believe it&#8217;s perfectly Ok for each project to run its own repository, I also understand those who are unwilling or unable to connect to any repository except Maven Central. So we have both now. I&#8217;m not going to publish snapshot builds to Maven Central, neither am I going to publish my <a href="http://evgeny-goldin.com/wiki/Gradle-plugins">other</a> <a href="http://evgeny-goldin.com/wiki/Spock-extensions">projects</a> there yet, something that may change in the future.
</li>
<li>Starting from this version all plugins <strong>run only with Maven 3</strong>. Supporting Maven 2 has prevented me from using <a href="http://www.eclipse.org/aether/">Aether library</a> and has contributed to a messy code so I&#8217;ve decided to cut it this time. For those still running on Maven 2, you can use version <strong>&#8220;0.2.3.8&#8243;</strong> but I strongly suggest that you upgrade.
</li>
<li>Plugins coordinates have changed to provide a Maven Central compatibility. They are now <code><strong>"com.github.goldin:something-maven-plugin"</strong></code>.
</li>
<li>Java 7 is now fully supported. I run my tests with Sun&#8217;s Linux JDK but please, let me know if you experience any problems with OpenJDK.
</li>
</ul>
<p>As for the actual features implemented in this version, here&#8217;s a <a href="http://evgeny-goldin.com/wiki/Maven-plugins#v0.2.5.2C_May_15.2C_2012">complete list</a> of the issues addressed. Allow me to highlight just some of them:</p>
<ul>
<li>
<a href="http://evgeny-goldin.com/wiki/Ivy-maven-plugin"><code><strong>"ivy-maven-plugin"</strong></code></a> is a new plugin, allowing you to <strong>plug</strong> <a href="http://ant.apache.org/ivy/history/latest-milestone/settings/resolvers.html"><strong>Ivy resolvers</strong></a> <strong>into Maven</strong> and behave similarly to traditional Maven <code><strong>&lt;dependencies&gt;</strong></code> by adding artifacts resolved into Maven scopes such as <code><strong>"compile"</strong></code> or <code><strong>"test"</strong></code>. It expands the Maven boundaries and makes it possible to resolve artifacts from anywhere Ivy resolvers can get to: TeamCity build artifacts, local file system, remote URLs, etc. In short, any storage that is not compatible with Maven can be used with <a href="http://evgeny-goldin.com/wiki/Ivy-maven-plugin"><code><strong>"ivy-maven-plugin"</strong></code></a> as long as you can configure a corresponding Ivy resolver. Now, how cool is that?!
</li>
<li><a href="http://evgeny-goldin.com/wiki/Jenkins-maven-plugin"><code><strong>"jenkins-maven-plugin"</strong></code></a> now supports my favorite 3G technologies stack: <a href="http://evgeny-goldin.org/youtrack/issue/pl-359">Gradle</a>, <a href="http://evgeny-goldin.org/youtrack/issue/pl-560">Groovy</a> and <a href="http://evgeny-goldin.org/youtrack/issue/pl-357">GitHub</a> together with bringing in <a href="http://evgeny-goldin.org/youtrack/issue/pl-462">Mercurial</a> to the party. And there are many more &#8220;extension points&#8221; now, check this out: it is possible to <a href="http://evgeny-goldin.org/youtrack/issue/pl-474">&#8220;patch&#8221;</a> XML configs with Groovy snippets and provide your own <a href="http://evgeny-goldin.org/youtrack/issue/pl-558"><code><strong>&lt;task&gt;</strong></code></a>, <a href="http://evgeny-goldin.org/youtrack/issue/pl-613"><code><strong>&lt;prebuilders&gt;</strong></code></a> and <a href="http://evgeny-goldin.org/youtrack/issue/pl-613"><code><strong>&lt;postbuilders&gt;</strong></code></a>.
</li>
<li>
<a href="http://evgeny-goldin.com/wiki/Copy-maven-plugin"><code><strong>"copy-maven-plugin"</strong></code></a> has taken full advantage of the Aether library, as I&#8217;ve mentioned previously. Transitive dependencies resolution was re-implemented and, as a result, it has become significantly <a href="http://evgeny-goldin.org/youtrack/issue/pl-550">more</a> <a href="http://evgeny-goldin.org/youtrack/issue/pl-622">capable</a>. I&#8217;ll address this issue in a separate blog post. Build performance was one of the goals in this version and it brought a new option: <a href="http://evgeny-goldin.org/youtrack/issue/pl-562">skip copying and packing</a> operations whenever possible which usually results in noticeable speedups.
</li>
</ul>
<p>Now, I wouldn&#8217;t be able to make this update available without your help. </p>
<p>I&#8217;m very thankful to Liya Katz from <a href="http://www.tikalk.com/about">Tikal</a> for bringing up lot&#8217;s of cool ideas to make the <code><strong>"copy-maven-plugin"</strong></code> better and being patient enough to go through several beta versions :) I would also like to say &#8220;Thank you&#8221; to all those people who have suggested new features, submitted bug reports and tried out snapshot builds. Your feedback is essential so, please, keep it coming! </p>
<p>I would like to thank <a href="http://www.jfrog.com/">JFrog</a> for making the <a href="http://www.jfrog.com/art-online.php">Artifactory Online</a> service available and keeping it up 24&#215;7. Thank you, guys! I&#8217;m glad to see major open-source projects such as <a href="http://repo.springsource.org/">Spring</a>, <a href="http://repo.typesafe.com/">Scala</a>, <a href="http://repo.gradle.org/">Gradle</a>, <a href="http://repo.grails.org/">Grails</a> and <a href="http://repo.jenkins-ci.org/">Jenkins</a> switching over to Artifactory Online, and now with the JetBrains running its own <a href="http://repository.jetbrains.com">Artifactory</a> instance as well. </p>
<p>Speaking of JetBrains, I would like to thank the YouTrack team for granting me an open-source license to run <a href="http://evgeny-goldin.org/youtrack/issues">evgeny-goldin.org/youtrack</a> without having to worry about the number of registered users. And for making such a <a href="http://www.jetbrains.com/youtrack/features/issue_tracking.html">damn good product</a>, of course!</p>
<p>Stay tuned, more releases are coming.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=Us2rON-f-nI:TXj7p5SuDUE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=Us2rON-f-nI:TXj7p5SuDUE:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=Us2rON-f-nI:TXj7p5SuDUE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/Us2rON-f-nI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/maven-plugins-0-2-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/maven-plugins-0-2-5/</feedburner:origLink></item>
		<item>
		<title>Maven build progress with TeamCity Service Messages</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/B2O3XkTQ0wY/</link>
		<comments>http://evgeny-goldin.com/blog/teamcity-service-messages/#comments</comments>
		<pubDate>Fri, 11 May 2012 10:11:26 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Gradle]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[TeamCity]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[teamcity]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=4908</guid>
		<description><![CDATA[When you run a lengthy Maven build configuration in TeamCity it may be tricky to know what module is being built right now since all TeamCity displays is either &#8220;Running&#8221; or &#8220;Tests passed: X&#8221;. Luckily, TeamCity allows your build script to interact with the server using Service Messages. When you build script prints out the [...]]]></description>
				<content:encoded><![CDATA[<p><br/><br />
When you run a lengthy Maven build configuration in TeamCity it may be tricky to know what module is being built <em>right now</em> since all TeamCity displays is either <strong>&#8220;Running&#8221;</strong> or <strong>&#8220;Tests passed: X&#8221;</strong>.</p>
<p><a href="http://evgeny-goldin.com/blog/wp-content/uploads/2012/05/ScreenShot004.png"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/05/ScreenShot004.png" alt="" title="Maven Progress Report" class="aligncenter size-full wp-image-4909" /></a></p>
<p>Luckily, TeamCity allows your build script to interact with the server using <a href="http://confluence.jetbrains.net/display/TCD7/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-ServiceMessages"><strong>Service Messages</strong></a>. When you build script prints out the following command, TeamCity reads it and behaves accordingly. </p>
<p><a href="http://evgeny-goldin.com/blog/wp-content/uploads/2012/05/ScreenShot013.png"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/05/ScreenShot013.png" alt="" title="TeamCity Service Message" class="aligncenter size-full wp-image-4930" /></a></p>
<p>This way it is possible to report <a href="http://confluence.jetbrains.net/display/TCD7/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-ReportingCompilationMessages">a compilation</a> or <a href="http://confluence.jetbrains.net/display/TCD7/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-ReportingTests">testing</a> results, <a href="http://confluence.jetbrains.net/display/TCD7/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-PublishingArtifactswhiletheBuildisStillinProgress">publish artifacts</a> (you can find <strong><code>"##teamcity[publishArtifacts"</code></strong> messages in IntelliJ IDEA <a href="http://teamcity.jetbrains.com/downloadBuildLog.html?buildTypeId=bt343&#038;buildId=lastSuccessful&#038;guest=1">build log</a>), and even update <a href="http://confluence.jetbrains.net/display/TCD7/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-AddingorChangingaBuildParameterfromaBuildStep">build parameters</a> on the fly. However, what I was interested in is <a href="http://confluence.jetbrains.net/display/TCD7/Build+Script+Interaction+with+TeamCity#BuildScriptInteractionwithTeamCity-ReportingBuildProgress">build progress report</a>:</p>
<p><a href="http://evgeny-goldin.com/blog/wp-content/uploads/2012/05/ScreenShot015.png"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/05/ScreenShot015.png" alt="" title="Reporting Build Progress" class="aligncenter size-full wp-image-4934" /></a></p>
<p>Adding a single <strong><code>println</code></strong> to a Maven build can be done with a bit of Groovy scripting:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
  &lt;groupId&gt;org.codehaus.gmaven&lt;/groupId&gt;
  &lt;artifactId&gt;gmaven-plugin&lt;/artifactId&gt;
  &lt;version&gt;1.4&lt;/version&gt;
  &lt;executions&gt;
    &lt;execution&gt;
      &lt;id&gt;display-progress-report&lt;/id&gt;
      &lt;phase&gt;initialize&lt;/phase&gt;
      &lt;goals&gt;
        &lt;goal&gt;execute&lt;/goal&gt;
      &lt;/goals&gt;
      &lt;configuration&gt;
        &lt;providerSelection&gt;1.8&lt;/providerSelection&gt;
        &lt;source&gt;
        if ( System.getProperty( 'teamcity.version' ))
        {
          println &quot;##teamcity[progressMessage '${project.groupId}:${project.artifactId}']&quot;
        }
        &lt;/source&gt;
      &lt;/configuration&gt;
    &lt;/execution&gt;
  &lt;/executions&gt;
&lt;/plugin&gt;
</pre>
<p>After <a href="https://github.com/evgeny-goldin/maven-plugins/blob/eb8f3cd689921d25571d480be2fb065a4ef3fa79/pom.xml#L242">adding</a> this snippet to project's parent POM, the progress indicator becomes (see it <a href="http://vimeo.com/41978013">live!</a>)</p>
<p><a href="http://evgeny-goldin.com/blog/wp-content/uploads/2012/05/ScreenShot008.png"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/05/ScreenShot008.png" alt="" title="" class="aligncenter size-full wp-image-4944" /></a></p>
<p>And I'm now working on making this functionality <a href="http://youtrack.jetbrains.com/issue/TW-21380">built-in</a> for TeamCity 7.1.</p>
<p>Same trick can be used in Gradle, but it is less required since TeamCity already reports Gradle tasks progress. Anyway, if you're interested, grab this code:</p>
<pre class="brush: groovy; title: ; notranslate">
allprojects {
    ...
    if ( project.properties.teamcity )
    {
        tasks.all { it.doFirst { 
            logger.lifecycle( &quot;##teamcity[progressMessage ':${project.name}:${it.name}']&quot; )
        }}
    }
    ...
}
</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=B2O3XkTQ0wY:dxIgL5SG4gI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=B2O3XkTQ0wY:dxIgL5SG4gI:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=B2O3XkTQ0wY:dxIgL5SG4gI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/B2O3XkTQ0wY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/teamcity-service-messages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/teamcity-service-messages/</feedburner:origLink></item>
		<item>
		<title>TeamCity Build Dependencies</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/pMRjlempLaU/</link>
		<comments>http://evgeny-goldin.com/blog/teamcity-build-dependencies/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 14:01:34 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[TeamCity]]></category>
		<category><![CDATA[artifact]]></category>
		<category><![CDATA[dependencies]]></category>
		<category><![CDATA[snapshot]]></category>
		<category><![CDATA[teamcity]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=4400</guid>
		<description><![CDATA[This post is the second in a series of three blog posts dedicated to build dependencies. Part 1 &#8211; Maven Build Dependencies. Part 2 &#8211; TeamCity Build Dependencies. Part 3 &#8211; Artifactory Build Dependencies in TeamCity. Introduction The subject of build dependencies is neither a trivial nor a minor one. Various build tools approach this [...]]]></description>
				<content:encoded><![CDATA[<p><br/><br />
This post is the second in a series of three blog posts dedicated to <strong>build dependencies</strong>.</p>
<p><a href="http://evgeny-goldin.com/blog/maven-build-dependencies/">Part 1 &#8211; Maven Build Dependencies.</a><br />
<a href="http://evgeny-goldin.com/blog/teamcity-build-dependencies/">Part 2 &#8211; TeamCity Build Dependencies.</a><br />
Part 3 &#8211; Artifactory Build Dependencies in TeamCity.</p>
<hr/>
<h3>Introduction</h3>
<p>The subject of build dependencies is neither a trivial nor a minor one. Various build tools approach this subject from different perspectives contributing various solutions, each with its own strengths and weaknesses.</p>
<p>Maven and Gradle users who are familiar with release and snapshot dependencies may not know about TeamCity snapshot dependencies or assume they’re somehow related to Maven (which isn’t true). TeamCity users who are familiar with artifact and snapshot dependencies may not know that adding an Artifactory plugin allows them to use artifact and build dependencies as well, on top of those provided by TeamCity.</p>
<p>Some of the names mentioned above seem not to be established enough while others may require a discussion about their usage patterns. Having this in mind I’ve decided to explore each solution in its own blog post, setting a goal of providing enough information so that people can choose what works best.</p>
<p>The first post <a href="http://evgeny-goldin.com/blog/maven-build-dependencies/">explored</a> Maven snapshot and release dependencies. This is the second post, which covers artifact and snapshot dependencies provided by <a href="http://www.jetbrains.com/teamcity/">TeamCity</a> and the third and final part will cover the artifact and build dependencies provided by <a href="http://wiki.jfrog.org/confluence/display/RTF/TeamCity+Artifactory+Plug-in">TeamCity Artifactory plugin</a>.</p>
<h3>Non-Maven Dependencies</h3>
<p>While Maven-based dependencies management and artifact repositories are very common and widespread in Java, there are cases where you may still find them insufficient or inadequate for your needs. For starters, you may not be developing in Java or perhaps your build tool is not providing built-in integration with Maven repositories, as is the case with <a href="http://ant.apache.org/">Ant</a> (or its <a href="http://gant.codehaus.org/">Gant</a> and <a href="http://nant.sourceforge.net/">NAnt</a> spin-offs), <a href="http://www.scons.org/">SCons</a>, <a href="http://rake.rubyforge.org/">Rake</a> or <a href="http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx">MSBuild</a>. Secondly, snapshot Maven dependencies provide their own set of challenges covered in the <a href="http://evgeny-goldin.com/blog/maven-build-dependencies/">previous blog post</a>, making it harder to ensure correct snapshot dependency is used in a chain of builds.</p>
<p>In order to address these scenarios, TeamCity provides two ways to connect dependent build configurations and their outcomes: <a href="http://confluence.jetbrains.net/display/TCD7/Dependent+Build#DependentBuild-ArtifactDependency"><em>artifact</em></a> and <a href="http://confluence.jetbrains.net/display/TCD7/Dependent+Build#DependentBuild-SnapshotDependency"><em>snapshot</em></a> dependencies.</p>
<h3>TeamCity Artifact Dependencies</h3>
<p>The idea of artifact dependencies in TeamCity is very simple: download the artifacts produced by an other build before the current one begins. After the artifacts are downloaded to the folder specified (checkout directory by default), your build script can use them to achieve its goals. You can find configuration details in <a href="http://confluence.jetbrains.net/display/TCD7/Artifact+Dependencies#ArtifactDependencies-ConfiguringArtifactDependenciesUsingWebUI">TeamCity documentation</a>.</p>
<p><a href="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Artifact-Dependencies1.png"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Artifact-Dependencies-Small1.png" alt="" title="Adding &quot;Artifact Dependencies&quot;" width="630" height="335" class="aligncenter size-full wp-image-4575" /></a></p>
<p>Naturally, this scheme is not suitable for build tools with automatic dependencies management, but it works well with build or shell scripts accepting and expecting local paths, relative to the checkout directory. Note that the copying works not only for the produced build binaries, but for any kind of binary or text files, like the TeamCity coverage report as demonstrated on the screenshot above.</p>
<p><a href="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Build-from-the-same-chain1.png"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Build-from-the-same-chain-Small1.png" alt="" title="Adding &quot;Artifact Dependencies&quot; - &quot;Build from the same chain&quot; option" width="300" height="223" class="alignright size-full wp-image-4643" style="margin-top:25px"/></a></p>
<p>There is one important detail about specifying artifact dependencies and that is &#8220;Get artifacts from&#8221; configuration where you specify what type of build should files be taken from. Possible values of this field are &#8220;last successful&#8221;, &#8220;finished&#8221;, &#8220;pinned&#8221;, or &#8220;tagged build&#8221;, as well as the build number or &#8220;Build from the same chain&#8221;. While most values should be trivial to understand with &#8220;Last successful build&#8221; being the default and generally suitable option, the definition of &#8220;same chain&#8221; build is directly related to TeamCity <em>snapshot dependencies</em>.</p>
<h3>TeamCity Snapshot Dependencies</h3>
<p>Imagine a monolithic multi-step build process (build, test, package, deploy) which you decide to split into multiple smaller builds, invoked sequentially, forming a chain of executions. Doing so allows one to configure or trigger every chain step separately and run certain steps in parallel in order to speedup the process (like executing tests or building independent components). Most of all, it makes the overall maintenance significantly easier. However, while doing so you need to ensure every chain step uses the same consistent set of sources pulled from VCS even if newer commits are made all the while chain steps are running. That’s what TeamCity <a href="http://confluence.jetbrains.net/display/TCD7/Build+Dependencies#BuildDependencies-SnapshotDependencies"><strong>snapshot dependencies</strong></a> are for: they connect several build configurations into a single chain of execution, called <a href="http://confluence.jetbrains.net/display/TCD7/Build+Chain"><strong>build chain</strong></a>, with every step using <em>the same set of sources</em>, regardless of VCS updates. Note that the TeamCity use of the term <strong>&#8220;snapshot dependencies&#8221;</strong> may confuse people familiar with Maven snapshot dependencies which are two unrelated concepts.</p>
<p>Snapshot dependencies are configured similarly to artifact dependencies. You can find configuration details in <a href="http://confluence.jetbrains.net/display/TCD7/Snapshot+Dependencies">TeamCity documentation</a>.</p>
<p><a href="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Snapshot-Dependencies2.png"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Snapshot-Dependencies-Small2.png" alt="" title="Adding &quot;Snapshot Dependencies&quot;" width="630" height="391" class="aligncenter size-full wp-image-4592" /></a></p>
<h3>Using Artifact and Snapshot Dependencies Together</h3>
<p>When applicable, it is recommended to define both kinds of dependencies between build configurations, as this ensures not only a consistent set of sources used throughout a chain steps but also a consistent flow of artifacts produced. Now the definition of “Build from the same chain” in artifact dependency mentioned above becomes clear, as this is the only meaningful option in this scenario.</p>
<p>In a way, you can think of build chain steps running in isolation from VCS updates after the first sources’ &#8220;snapshot&#8221; is taken. Chain artifacts are either re-created from the same sources or passed through chain steps with artifact dependencies. This makes chain steps consistent, reproducible and always up-to-date (when applied to using chain artifacts), something that can’t be easily achieved with Maven snapshot dependencies.</p>
<h3>Build Chains Visibility in TeamCity 7.0</h3>
<p><a href="http://confluence.jetbrains.net/display/TCD7/What%27s+New+in+TeamCity+7.0"><strong>TeamCity 7.0</strong></a> took the notion of build chains to a whole new level by providing build chains a new UI, making chain steps visible and re-runnable. Once you have snapshot dependencies defined, a new <strong>&#8220;Build Chains&#8221;</strong> tab appears in project reports, providing a visual representation of all related build chains and a way to re-run any chain step manually, using the same set of sources pulled originally.</p>
<p><a href="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Build-Chains1.png"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Build-Chains-Small1.png" alt="" title="New &quot;Build Chains&quot; UI" width="630" height="195" class="aligncenter size-full wp-image-4719" /></a></p>
<h3>Build Chain Triggering</h3>
<p>Having build configurations connected with snapshot dependencies and, therefore, their builds grouped into build chains not only makes them more consistent regarding the sources used, it also impacts the way builds are added to the build queue: after a certain chain step is triggered, the default behavior is to add all <em>preceding</em> chain steps as well, keeping their respective order, in addition to the one that was triggered initially. Let me repeat it for more clarity: <em>triggering certain chain configuration adds preceding (those to the left of it) and not subsequent (to the right of it) configurations to the build queue</em>, although it may seem counterintuitive at first. The idea is to mark the location where chain execution stops, which is exactly the configuration that was triggered initially; it becomes the last execution step. </p>
<p>To trigger <em>subsequent</em> chain steps upon VCS changes found in a chain configuration, you can add a <a href="http://confluence.jetbrains.net/display/TCD7/Configuring+VCS+Triggers">VCS trigger</a> with the &#8220;Trigger on changes in snapshot dependencies&#8221; option to the configuration that would be the last execution step. This configuration is then triggered whenever any of the preceding chain steps is updated, which schedules the whole chain for execution.</p>
<p>Having this behavior in mind, you therefore need to decide which configurations are triggered automatically and which should be run manually. Usually, earlier chain steps having no impact on external environment can be triggered automatically by VCS trigger but final chain steps, potentially modifying external systems, are invoked manually after a human verification of the previous chain results. The process of running the final chain steps manually is usually referred to as &#8220;promoting&#8221; previously finished builds.</p>
<h3>Sample Build Chain: Compile, Test, Deploy</h3>
<p>Imagine three sample build configurations, <strong><code>"Compile"</code></strong>, <strong><code>"Test"</code></strong> and <strong><code>"Deploy"</code></strong> connected into a build chain: <strong><code>"Deploy"</code></strong> is snapshot dependent on <strong><code>"Test"</code></strong> which is snapshot dependent on <strong><code>"Compile"</code></strong>.</p>
<p><a href="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Build-Chains-Example-2.png"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Build-Chains-Example-2-Small.png" alt="" title="3-step &quot;Build Chain&quot; example" width="630" height="61" class="aligncenter size-full wp-image-4693" /></a></p>
<p>In this sample scenario the <strong><code>"Compile"</code></strong> and <strong><code>"Test"</code></strong> configurations are triggered automatically while <strong><code>"Deploy"</code></strong> is triggered manually, following the recommendations given above. VCS changes in <strong><code>"Compile"</code></strong> configuration only trigger an execution of this chain step, while VCS changes in <strong><code>"Test"</code></strong> configuration trigger <strong><code>"Compile"</code></strong> and <strong><code>"Test"</code></strong> execution (in that order).</p>
<p>Once a <strong><code>"Compile"</code></strong> configuration is added to the builds queue, its sources’ timestamp is recorded on the server to be used in all subsequent chain steps. If any of the chain steps is connected to a different VCS root, its sources are also pulled according to the same timestamp. </p>
<h3>Promoting Finished Builds</h3>
<p>As soon as the automatic chain execution stops (after running <strong><code>"Test"</code></strong>), you can continue it by clicking the corresponding &#8220;Run&#8221; button on the <strong><code>"Deploy"</code></strong> configuration that was not triggered (see the build chain screenshot above). Alternatively, it is possible to promote a finished <strong><code>"Test"</code></strong> build through its &#8220;Build Actions&#8221; and invoke configurations which are snapshot dependent on it &#8211; <strong><code>"Deploy"</code></strong> configuration in this case.</p>
<p><a href="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Promote-1.png"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Promote-1-Small.png" alt="" title="Promoting triggered build" width="630" height="107" class="aligncenter size-full wp-image-4701" /></a></p>
<p><a href="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Promote-2.png"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Promote-2-Small.png" alt="" title="Promoting triggered build" width="630" height="235" class="aligncenter size-full wp-image-4703" /></a></p>
<h3>Summary</h3>
<p>This article has provided an overview of TeamCity artifact and snapshot dependencies, build chains, how their steps are triggered and how finished builds are promoted. I hope you now have a good understanding of how it works and of when it is appropriate (or not) to use TeamCity build dependencies in addition to those provided by build tools such as Maven.</p>
<p>Please, refer to the TeamCity documentation for more information about this subject:</p>
<ul>
<li><a href="http://confluence.jetbrains.net/display/TCD7/Dependent+Build">Dependent Build</a></li>
<li><a href="http://confluence.jetbrains.net/display/TCD7/Build+Chain">Build Chain</a></li>
</ul>
<p>The final blog post in the series will uncover how you can use the <a href="http://wiki.jfrog.org/confluence/display/RTF/TeamCity+Artifactory+Plug-in">TeamCity Artifactory plugin</a> in order to achieve a behavior which is similar to build chains for projects with Maven-based dependency management. Stay tuned!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=pMRjlempLaU:pSjID6CwpeE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=pMRjlempLaU:pSjID6CwpeE:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=pMRjlempLaU:pSjID6CwpeE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/pMRjlempLaU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/teamcity-build-dependencies/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/teamcity-build-dependencies/</feedburner:origLink></item>
		<item>
		<title>Maven Build Dependencies</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/trOGmvWWBKk/</link>
		<comments>http://evgeny-goldin.com/blog/maven-build-dependencies/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 10:13:06 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Maven]]></category>
		<category><![CDATA[dependencies]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[snapshot]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=4267</guid>
		<description><![CDATA[This post is the first in a series of three blog posts dedicated to build dependencies. Part 1 &#8211; Maven Build Dependencies. Part 2 &#8211; TeamCity Build Dependencies. Part 3 &#8211; Artifactory Build Dependencies in TeamCity. Introduction The subject of build dependencies is neither a trivial nor a minor one. Various build tools approach this [...]]]></description>
				<content:encoded><![CDATA[<p><br/><br />
This post is the first in a series of three blog posts dedicated to <strong>build dependencies</strong>. </p>
<p><a href="http://evgeny-goldin.com/blog/maven-build-dependencies/">Part 1 &#8211; Maven Build Dependencies.</a><br />
<a href="http://evgeny-goldin.com/blog/teamcity-build-dependencies/">Part 2 &#8211; TeamCity Build Dependencies.</a><br />
Part 3 &#8211; Artifactory Build Dependencies in TeamCity.</p>
<hr/>
<h3>Introduction</h3>
<p>The subject of build dependencies is neither a trivial nor a minor one. Various build tools approach this subject from different perspectives contributing various solutions, each with its own strengths and weaknesses.</p>
<p>Maven and Gradle users who are familiar with release and snapshot dependencies may not know about TeamCity snapshot dependencies or assume they’re somehow related to Maven (which isn’t true). TeamCity users who are familiar with artifact and snapshot dependencies may not know that adding an Artifactory plugin allows them to use artifact and build dependencies as well, on top of those provided by TeamCity. </p>
<p>Some of the names mentioned above seem not to be established enough while others may require a discussion about their usage patterns. Having this in mind I’ve decided to explore each solution in its own blog post, setting a goal of providing enough information so that people can choose what works best.</p>
<p>This first post explores <a href="http://maven.apache.org/">Maven</a> snapshot and release dependencies. The second post <a href="http://evgeny-goldin.com/blog/teamcity-build-dependencies/">covers</a> artifact and snapshot dependencies provided by <a href="http://www.jetbrains.com/teamcity/">TeamCity</a>, and the third and final part will cover artifact and build dependencies provided by the <a href="http://wiki.jfrog.org/confluence/display/RTF/TeamCity+Artifactory+Plug-in">TeamCity Artifactory plugin</a>.</p>
<h3>Internal and External Dependencies</h3>
<p>Build processes may run in total isolation by checking out the entire code base and building an application from scratch. This is the case for projects where relevant binary dependencies (if there are any) are kept in VCS together with the project sources. However, in many other cases build scripts rely on <em>internal or external dependencies</em> of some sort.</p>
<p><strong>Internal dependencies</strong> are satisfied by our own code where we have full control over the project which can be split into multiple modules or sub-projects. <strong>External dependencies</strong> are satisfied by someone else’s code (on which we have no control) and we consume it or use it as clients. This can be a third-party library such as Spring or a component developed by another team.</p>
<p>This distinction is important since internal and external dependencies are usually accompanied by different release and upgrade cycles: internal dependencies may be modified, rebuilt and updated on an hourly basis while external dependencies’ release cycle is significantly slower with users applying the updates even less frequently, if at all. This is largely driven by the fact that internal dependencies are under our own control and have a narrow-scoped impact, limited by a specific project or module while external dependencies can only be used as-is, their impact is potentially company or world-wide, they are not scoped by any project and can be used anywhere. Naturally, this requires significantly higher standards of release stability, compatibility and maturity, hence slower release and update cycles.</p>
<p>Another aspect of “internal vs. external” dependency characteristics is expressed in how their versions are specified in a build script. Internal dependencies are usually defined using snapshot versions while external dependencies use release versions. The definition of <strong>“snapshot”</strong> and <strong>“release”</strong> versions was coined by Maven, which pioneered the idea of managing dependencies by a build tool. If you’re familiar with automatic dependencies management feel free to skip the following section which provides a quick overview of how it works.</p>
<h3>Automatic Dependencies Management</h3>
<p>In Maven dependencies are specified declaratively in a build script, an approach later followed by newer build tools such as <a href="http://gradle.org/">Gradle</a>, <a href="http://buildr.apache.org/">Buildr</a> and <a href="https://github.com/harrah/xsbt/wiki">sbt</a>.</p>
<p><a href="http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html"><strong>Maven:</strong></a></p>
<pre class="brush: xml; title: ; notranslate">
&lt;dependency&gt;
    &lt;groupId&gt;org.codehaus.groovy&lt;/groupId&gt;
    &lt;artifactId&gt;groovy-all&lt;/artifactId&gt;
    &lt;version&gt;1.8.6&lt;/version&gt;
    &lt;scope&gt;compile&lt;/scope&gt;
&lt;/dependency&gt;
</pre>
<p><a href="http://gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html"><strong>Gradle:</strong></a></p>
<pre class="brush: groovy; title: ; notranslate">
compile &quot;org.codehaus.groovy:groovy-all:1.8.6&quot;
</pre>
<p><a href="http://buildr.apache.org/artifacts.html"><strong>Buildr:</strong></a></p>
<pre class="brush: ruby; title: ; notranslate">
compile.with &quot;org.apache.axis2:axis2:jar:1.6.1&quot;
</pre>
<p><a href="https://github.com/harrah/xsbt/wiki/Getting-Started-Library-Dependencies"><strong>sbt:</strong></a></p>
<pre class="brush: scala; title: ; notranslate">
libraryDependencies += &quot;org.twitter4j&quot;  % &quot;twitter4j-core&quot;  % &quot;2.2.5&quot;
</pre>
<p>Every dependency is identified by its <em>coordinates</em> and <em>scope</em>. <strong>Coordinates</strong> unambiguously specify the library and version used, while <strong>scope</strong> defines its visibility and availability in build tasks such as compilation or tests invocation. </p>
<p>For instance, <strong><code>"compile org.codehaus.groovy:groovy-all:1.8.6"</code></strong> would designate a Groovy <a href="http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.codehaus.groovy%22%20AND%20a%3A%22groovy-all%22"><strong><code>"org.codehaus.groovy:groovy-all"</code></strong></a> distribution for version <a href="http://search.maven.org/#artifactdetails%7Corg.codehaus.groovy%7Cgroovy-all%7C1.8.6%7Cjar"><strong><code>"1.8.6"</code></strong></a>, used for source compilation and test invocation. Switching the scope to <strong>&#8220;test&#8221;</strong> or <strong>&#8220;runtime&#8221;</strong> would then narrow down the library visibility to tests-only or runtime-only, respectively.</p>
<p>When a build starts, dependencies are either located in a local artifacts repository managed by a build tool (similar to a browser cache) or downloaded from remote repositories, either public or private, such as <a href="http://search.maven.org/#browse%7C47">Maven Central</a>, <a href="http://repo.springsource.org/webapp/browserepo.html">Artifactory</a> or <a href="https://repository.jboss.org/nexus/index.html#view-repositories;developer~browsestorage">Nexus</a>. The build tool then adds the artifacts resolved to the corresponding classpaths according to their scopes. When assembling build artifacts, such as <strong><code>"*.war"</code></strong> or <strong><code>"*.ear"</code></strong> archives, all required dependencies are correctly handled and packaged as well.</p>
<p>Though dependencies management seems to be an essential part of almost any build, not all build tools provide a built-in support for it: <a href="http://ant.apache.org/">Ant</a> and <a href="http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx">MSBuild</a> lack this capability, a gap later addressed by <a href="http://ant.apache.org/ivy/">Ivy</a> and <a href="http://nuget.codeplex.com/">NuGet</a> to some extent. However, Ivy’s adoption was slower compared to Maven, while NuGet is a .NET-only tool. Over time, Maven artifact repositories and Maven Central have become a de facto mechanism for distributing and sharing Java artifacts. Being able to resolve and deploy these using Maven repositories has become a “must have” ability for all newer Java build tools.</p>
<h3>Release and Snapshot Dependencies</h3>
<p>As I mentioned previously, internal dependencies are normally defined using snapshot versions while external dependencies use release versions. Let’s look into release versions first as they are easier to reason about.</p>
<p><strong>Release dependencies</strong> are those which have a fixed version number, such as the <strong><code>"1.8.6"</code></strong> version of the Groovy distribution. Whatever artifact repository is used by the build and whenever it attempts to locate this dependency, it is always expected to resolve the exact same artifact. This is the main principle of release dependencies: <strong><em>“Same version = same artifact”</em></strong>. Due to this fact, build tools do not check for a release dependency update once it is found and will only re-download the artifact if the local cache was emptied. And this all makes sense, of course, since we never expect to find divergent artifacts of the same library carrying an identical version number!</p>
<p><strong>Snapshot dependencies</strong> are different and, as a result, way trickier to deal with. Snapshot dependency versions end with a special <strong><code>"-SNAPSHOT"</code></strong> keyword, like <strong><code>"3.2.0-SNAPSHOT"</code></strong>. This keyword signals the build tools to periodically check an artifact with a remote repository for updates; by default, Maven performs this check <a href="http://denis-zhdanov.blogspot.de/2010/01/maven-snapshot-dependencies-trick.html">on a daily basis</a>. The function of snapshot dependencies, then, is to depend on someone else’s work-in-progress (think “nightly builds”): when product development moves from version <strong><code>"X"</code></strong> to version <strong><code>"X+1"</code></strong> its modules are versioned <strong><code>"X+1-SNAPSHOT"</code></strong>.</p>
<h3>Snapshot Dependencies Uncertainty</h3>
<p>If the main principle of release dependencies was <em>“Same version = same artifact”</em> (after version ‘X’ of library is released, its artifacts are identical all around the world, forever), snapshot dependencies’ principle is <strong><em>“Same version = ever-updating artifact”</em></strong>. The benefit of this approach is that it enables retrieving frequent updates without the need to produce daily releases which would be highly impractical. The downside of it, however, is uncertainty – using snapshot dependencies in a build script makes it harder to know which version was used in a specific build execution. My <a href="http://evgeny-goldin.com/wiki/Maven-about-plugin"><strong><code>"maven-about-plugin"</code></strong></a> stores a textual “about” file in every snapshot artifact in order to better identify its origins such as VCS revision and build number; this can be helpful but it only solves half of the problem. </p>
<p>Being a moving target by their definition, snapshot dependencies do not allow us to pin down versions on which we depend and therefore build reproducibility becomes harder to achieve. Also, in a series or pipeline of builds (when a finished build triggers an invocation of subsequent ones), an artifact produced by initial pipeline steps is not necessarily consumed by the closing ones as it may be long overridden since then by other build processes running at the same time.</p>
<p>One possible approach in this situation is to <a href="http://mojo.codehaus.org/versions-maven-plugin/examples/lock-snapshots.html">lock-down</a> a dependency version in a build script using <a href="http://www.sonatype.com/people/2009/03/maven-virtual-versions-lets-fix-this-mess/">timestamp</a> so it becomes <strong><code>"3.2.0-20120119.134529-1"</code></strong> rather than <strong><code>"3.2.0-SNAPSHOT"</code></strong>. This effectively makes snapshot dependencies identical to release dependencies and disables an automatic update mechanism, making it impossible to use an up-to-date version even when one is available unless the timestamp is updated.</p>
<p>As you see, snapshot dependencies can be used where it makes sense but it should be done with caution and in small doses. If possible, it is best to manage a separate release lifecycle for every reusable component and let its clients use periodically updated release dependencies.</p>
<h3>Summary</h3>
<p>This article has provided an overview of automatic dependencies management by Java build tools together with an introduction to Maven release and snapshot dependencies. It also explained how snapshot dependencies’ advantages become debatable in the context of build reproducibility and build pipelines. </p>
<p>The following blog posts will explore the <a href="http://evgeny-goldin.com/blog/teamcity-build-dependencies/">TeamCity build chains</a> and Artifactory build isolation which allow to use consistent, reproducible and up-to-date snapshot versions throughout a chain of builds without locking down their timestamps in a build script. More to come!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=trOGmvWWBKk:JSygQdGf5JU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=trOGmvWWBKk:JSygQdGf5JU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=trOGmvWWBKk:JSygQdGf5JU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/trOGmvWWBKk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/maven-build-dependencies/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/maven-build-dependencies/</feedburner:origLink></item>
		<item>
		<title>Shawn Achor: “The Happiness Advantage”</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/35_9QxozEO4/</link>
		<comments>http://evgeny-goldin.com/blog/shawn-achor-happiness-advantage/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 08:48:22 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Ted]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[Happiness Advantage]]></category>
		<category><![CDATA[ted]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=4790</guid>
		<description><![CDATA[See the presentation and buy the book. One of the most influencing books I have read recently.]]></description>
				<content:encoded><![CDATA[<p><br/><br />
<object width="526" height="374"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent"></param><param name="bgColor" value="#ffffff"></param><param name="flashvars" value="vu=http://video.ted.com/talk/stream/2011X/Blank/ShawnAchor_2011X-320k.mp4&#038;su=http://images.ted.com/images/ted/tedindex/embed-posters/ShawnAchor_2011X-embed.jpg&#038;vw=512&#038;vh=288&#038;ap=0&#038;ti=1344&#038;lang=&#038;introDuration=15330&#038;adDuration=4000&#038;postAdDuration=830&#038;adKeys=talk=shawn_achor_the_happy_secret_to_better_work;year=2011;theme=not_business_as_usual;theme=what_makes_us_happy;event=TEDxBloomington;tag=business;tag=happiness;tag=psychology;tag=science;&#038;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="526" height="374" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talk/stream/2011X/Blank/ShawnAchor_2011X-320k.mp4&#038;su=http://images.ted.com/images/ted/tedindex/embed-posters/ShawnAchor_2011X-embed.jpg&#038;vw=512&#038;vh=288&#038;ap=0&#038;ti=1344&#038;lang=&#038;introDuration=15330&#038;adDuration=4000&#038;postAdDuration=830&#038;adKeys=talk=shawn_achor_the_happy_secret_to_better_work;year=2011;theme=not_business_as_usual;theme=what_makes_us_happy;event=TEDxBloomington;tag=business;tag=happiness;tag=psychology;tag=science;&#038;preAdTag=tconf.ted/embed;tile=1;sz=512x288;"></embed></object></p>
<p>See the presentation and <a href="http://www.amazon.com/The-Happiness-Advantage-Principles-Performance/dp/0307591549/"><strong>buy the book</strong></a>. One of the most influencing books I have read recently. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=35_9QxozEO4:kQ5eiZhRAKU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=35_9QxozEO4:kQ5eiZhRAKU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=35_9QxozEO4:kQ5eiZhRAKU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/35_9QxozEO4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/shawn-achor-happiness-advantage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/shawn-achor-happiness-advantage/</feedburner:origLink></item>
		<item>
		<title>WordPress Performance Optimization (from 6 seconds to 1)</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/NuMk59rCKPE/</link>
		<comments>http://evgeny-goldin.com/blog/wordpress-performance-optimization/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 11:28:57 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[speedup]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=4104</guid>
		<description><![CDATA[Since last week, this blog has a new name and a new look, but most importantly, it now loads faster. Over time I couldn&#8217;t but notice that the overall behavior was getting painfully slower. Surely, this blog uses &#8220;WordPress Super Cache&#8221; plugin but apparently caching wasn&#8217;t enough in order to improve performance so I decided [...]]]></description>
				<content:encoded><![CDATA[<p><br/><br />
Since last week, this blog has a new name and a new look, but most importantly, it now loads <strong><em>faster</em></strong>.</p>
<p>Over time I couldn&#8217;t but notice that the overall behavior was getting painfully slower. Surely, this blog uses <a href="http://wordpress.org/extend/plugins/wp-super-cache/">&#8220;WordPress Super Cache&#8221;</a> plugin but apparently caching wasn&#8217;t enough in order to improve performance so I decided it&#8217;s time for something better.</p>
<p>Let me start with the final results. Initially, the main page load time was more than <strong>5 terrible seconds</strong>. And now? We&#8217;re down to <strong>1 second</strong>! Here you have it, one evening spent wisely made this blog more pleasant to browse and read.</p>
<p><a href="http://gtmetrix.com/reports/evgeny-goldin.com/Os28sVcu#report-history" target="new1"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Page-Load-Times-small.png" alt="" title="GTmetrix &quot;History&quot; report (opens in new tab)"/></a></p>
<p>Anyone who has ever dealt with web performance analysis knows that today&#8217;s browsers and extensions provide you with enough tools to make a good analysis of web performance and page load times. Yes, I&#8217;m talking about <a href="http://getfirebug.com/network">Firebug Net monitor</a>, <a href="http://code.google.com/chrome/devtools/docs/network.html">&#8220;Chrome Developer Tools&#8221; Network Panel</a>, <a href="https://developers.google.com/speed/pagespeed/insights_extensions">PageSpeed</a>, <a href="http://developer.yahoo.com/yslow/">YSlow</a>, <a href="https://developers.google.com/web-toolkit/speedtracer/">Speed Tracer</a> and <a href="http://ajax.dynatrace.com/ajax/en/">dynaTrace AJAX</a>. Not only that, there are a number of online resources providing a similar kind of web profiling and monitoring, some of which I have listed below. In this specific case I have used <a href="http://gtmetrix.com">GTmetrix</a>, its &#8220;History&#8221; chart is shown above.</p>
<p>So what were those changes? Since I don&#8217;t develop WordPress plugins or themes I couldn&#8217;t do much about internal details, but there was still large enough room for improvements. </p>
<ul>
<li>First of all, I cleaned up WordPress from unused plugins and themes. That was an easy thing to do.</li>
<li>I checked that <a href="http://wordpress.org/extend/plugins/wp-super-cache/">&#8220;WordPress Super Cache&#8221;</a> and <a href="http://wordpress.org/extend/plugins/wp-smushit/">&#8220;WP Smush.it&#8221;</a> (which I had installed already in the past) are working properly and that the response is coming gzip-compressed.</li>
<li>&#8220;WordPress Super Cache&#8221; cache timeout was set to zero to disable its garbage collection &#8211; cache is now emptied when new pages are added, this is necessary for &#8220;Recent Posts&#8221; sidebar update. I also switched the plugin to &#8220;mod_rewrite&#8221; from PHP to serve cache files.
<p><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/WP-Cache-Settings2.png" alt="" title="WP Super Cache Settings" width="637" height="526" class="aligncenter size-full wp-image-4260" /></p>
</li>
<li>When Firebug Net monitor showed an extensive amount of external resources loaded, I aggressively cleaned up the sidebar from all additional widgets. Consequently, all my social, Twitter and Pinboard links are now gone (they can be found on <a href="http://evgeny-goldin.com">evgeny-goldin.com</a>, as before). Two &#8220;Twitter&#8221; buttons accompanying each post for easier retweeting were also removed for the same reason. The only external widgets I decided to keep were DZone buttons on some posts as they are an important part of the blog&#8217;s history.</li>
<li>The Gravatar plugin that used to display a picture of me on the right was replaced with a locally stored image and an HTML markup, see <a href="http://wordpress.org/extend/plugins/custom-admin-dashboard-widget/">&#8220;Custom Dashboard Widget&#8221;</a>.</li>
<li>I later attempted to combine, minify and compress the JS/CSS resources loaded. <a href="http://wordpress.org/extend/plugins/js-css-script-optimizer/">&#8220;JS &#038; CSS Script Optimizer&#8221;</a> plugin did just that. Two other plugins I have tried, <a href="http://wordpress.org/extend/plugins/bwp-minify/">&#8220;Better WordPress Minify&#8221;</a> and <a href="http://wordpress.org/extend/plugins/css-js-booster/">&#8220;CSS-JS-Booster&#8221;</a> didn&#8217;t perform equally well.</li>
<li>Trying to compress HTML by eliminating unnecessary white spaces and line breaks resulted in an negligible 5% improvement so I didn&#8217;t bother to keep this optimization. Anyway, <a href="http://wordpress.org/extend/plugins/wp-html-compression/">&#8220;WP-HTML-Compression&#8221;</a> and <a href="http://wordpress.org/extend/plugins/wp-compress-html/">&#8220;WP-Compress-HTML&#8221;</a> are at your service.</li>
<li>And then came the hardest part &#8211; theme update. I decided to switch to summary-only main page so that posts&#8217; bodies are kept hidden: some of them contain embedded Flash videos which hurts the loading time severely. The new <a href="http://wordpress.org/extend/themes/blue-modern">&#8220;Blue Modern&#8221;</a> theme is simple, lightweight and, most importantly, it keeps the main page free from any embedded content.</li>
<li>At some point the performance went up to 2 seconds, according to GTmetrix reports. It happened right after I added the Gr8Conf banner linked to &#8220;http://gr8conf.org/uploads/eu2012/Image/banners/gr8conf%20125&#215;125.png&#8221;. After uploading the image and serving the local copy of it the performance went back to normal.</li>
</ul>
<p>So that was the process. I believe that most of the time was spent on choosing the new WordPress theme (though there are so many of them, there are still not enough really good ones) but it was a very nice journey into some of the details of web performance. To reflect on it I&#8217;d suggest the following 4-step process to boost your WordPress blog&#8217;s performance:</p>
<p><strong>1. Cleanup caches.</strong></p>
<p>Assuming you&#8217;re using the <a href="http://wordpress.org/extend/plugins/wp-super-cache/">&#8220;WordPress Super Cache&#8221;</a> plugin, there are two caches you&#8217;re dealing with: the WordPress cache and the browser cache. The <strong>WordPress cache</strong> saves PHP and database processing results on the server side so when a cached page is requested it serves it immediately without involving the PHP preprocessor. The <strong>browser cache</strong> saves all the retrieved resources locally so when an image or a script are requested it serves a local copy after verifying with a server that it hasn&#8217;t been updated recently. Now, depending on what you&#8217;re going to measure, clean and repopulate the corresponding cache. Generally, I perform my measurements with WordPress&#8217; cache pre-populated and with an empty browser cache. Measuring performance when both caches are full also makes sense, as it allows you to see how quickly the page performs in an ideal situation and how long does it take for a browser to run an up-to-date check with a server.</p>
<p><strong>2. Analyze the timeline (waterfall) report.</strong></p>
<p>Load the page in a browser and analyze its &#8216;timeline&#8217; report, also referred to as &#8216;waterfall&#8217;, produced by either <a href="http://getfirebug.com/network">Firebug Net monitor</a>, <a href="http://code.google.com/chrome/devtools/docs/network.html">&#8220;Chrome Developer Tools&#8221; Network Panel</a> or GTmetrix whose &#8216;timeline&#8217; chart is shown below.</p>
<p><a href="http://gtmetrix.com/reports/evgeny-goldin.com/Os28sVcu#report-timeline" target="new2"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Waterfall-small1.png" alt="" title="GTmetrix &quot;Timeline&quot; report (opens in new tab)" width="630" height="386" class="aligncenter size-full wp-image-4199" /></a></p>
<p>Note that report numbers don&#8217;t carry much meaning as they will most definitely vary wildly depending on client-server geographic locations and connection speeds. What matters more is the overall loading behavior and the way your changes impact it: how many resources are loaded, what resources are loaded from external (potentially slower) domains, are they compressed, combined together or minified, which resources load most sluggishly and so on. In addition, note that while this report is useful for spotting the most obvious bottlenecks, it provides a network-only view of the page loading process. For detailed reports on page rendering and processing behavior consider using the <a href="https://developers.google.com/web-toolkit/speedtracer/">Speed Tracer</a> (Chrome) or <a href="http://ajax.dynatrace.com/ajax/en/">dynaTrace AJAX</a> (IE, Firefox) browser extensions.</p>
<p><strong>3. Analyze PageSpeed and YSlow reports.</strong></p>
<p>If the &#8216;timeline&#8217; report hasn&#8217;t provided you with enough data to work on, run <a href="https://developers.google.com/speed/pagespeed/insights_extensions">PageSpeed</a> or <a href="http://developer.yahoo.com/yslow/">YSlow</a> to get a detailed list of suggested optimizations. GTmetrix conveniently provides both reports online:</p>
<p><a href="http://gtmetrix.com/reports/evgeny-goldin.com/Os28sVcu#report-page-speed" target="new3"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/Screen-Shot-2012-04-10-at-5.48.10-PM-2.png" alt="" title="GTmetrix &quot;Page Speed&quot; report (opens in new tab)" width="630" height="426" class="aligncenter size-full wp-image-4188" /></a></p>
<p><strong>4. Implement the changes and repeat.</strong></p>
<p>Every time WordPress plugins are added or configured, clean up the caches and <strong>measure again</strong>. Do not take any optimization for granted. GTmetrix makes it easier with its &#8220;History&#8221; chart where you can easily spot performance anomalies as your blog evolves.</p>
<p><strong>Can it be better?</strong> Yes, absolutely. Looking on the main page source I still see references to external resources that simply shouldn&#8217;t be there, probably leftovers from plugins removed. So better results can be achieved. Naturally, not being able to control and fine-tune the WordPress application, HTTP headers and the content added by the plugins makes the task less trivial but as you&#8217;ve just witnessed, it is more or less doable nevertheless. </p>
<p><strong>What were the lessons learned?</strong> I think minimization of external content is the major takeout here. Taking out absolutely everything except the content proved to be the most high impact performance optimization. Content compression, resources unification and minification surely help but not as much as having all social buttons removed and external images served from the local domain. In addition, I figured out that adding more links not only makes the blog slower, it doesn&#8217;t make anyone&#8217;s life easier as I&#8217;m sure most of you have enough links to follow. </p>
<p><strong>What&#8217;s next?</strong> I believe that the next step can be more dramatic: stepping away from WordPress and switching to <a href="https://github.com/mojombo/jekyll">Jekyll</a>-generated static content. On top of being significantly faster, it brings control over everything back to your hands which is absolutely a must if you&#8217;re seeking decent Web performance. Two beautiful examples of static content blogs would be <a href="http://www.igvita.com/">igvita.com</a> by Ilya Grigorik and <a href="http://stevelosh.com/blog/">stevelosh.com</a> by Steve Losh. Try them out and see what fast really means!</p>
<p>To sum up this topic, I listed performance-related WordPress plugins and browser extensions mentioned in this post plus a number of on-line services you can use to analyze and monitor your blog performance:</p>
<p><strong>WordPress plugins</strong>:</p>
<ul>
<li><a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP Super Cache</a></li>
<li><a href="http://wordpress.org/extend/plugins/w3-total-cache/">W3 Total Cache</a></li>
<li><a href="http://wordpress.org/extend/plugins/wp-smushit/">WP Smush.it</a></li>
<li><a href="http://wordpress.org/extend/plugins/wp-optimize/">WP-Optimize</a></li>
<li><a href="http://wordpress.org/extend/plugins/custom-admin-dashboard-widget/">Custom Dashboard Widget</a></li>
<li><a href="http://wordpress.org/extend/plugins/js-css-script-optimizer/">JS &#038; CSS Script Optimizer</a></li>
<li><a href="http://wordpress.org/extend/plugins/bwp-minify/">Better WordPress Minify</a></li>
<li><a href="http://wordpress.org/extend/plugins/css-js-booster/">CSS-JS-Booster</a></li>
<li><a href="http://wordpress.org/extend/plugins/wp-html-compression/">WP-HTML-Compression</a></li>
<li><a href="http://wordpress.org/extend/plugins/wp-compress-html/">WP-Compress-HTML</a></li>
</ul>
<p><strong>Browser extensions</strong>:</p>
<ul>
<li><a href="http://getfirebug.com/">Firebug</a> (Firefox)</li>
<li><a href="https://developers.google.com/chrome-developer-tools/docs/overview">Chrome Developer Tools</a> (Chrome, built-in)</li>
<li><a href="https://developers.google.com/speed/pagespeed/">PageSpeed</a> (Firefox, Chrome)</li>
<li><a href="http://developer.yahoo.com/yslow/">YSlow</a> (Firefox, Chrome, Opera, Safari)</li>
<li><a href="https://developers.google.com/web-toolkit/speedtracer/">Speed Tracer</a> (Chrome)</li>
<li><a href="http://ajax.dynatrace.com/ajax/en/">dynaTrace AJAX</a> (IE, Firefox)</li>
</ul>
<p><strong>On-line services</strong>:</p>
<ul>
<li><a href="http://www.igvita.com/2012/04/04/measuring-site-speed-with-navigation-timing/">Google Analytics Site Speed reports</a></li>
<li><a href="http://gtmetrix.com/">GTmetrix</a> <em>(<a href="http://gtmetrix.com/wordpress-optimization-guide.html">&#8220;WordPress Optimization Guide&#8221;</a>)</em></li>
<li><a href="http://tools.pingdom.com/fpt/">Pingdom Tools</a></li>
<li><a href="http://www.showslow.com/">ShowSlow</a></li>
<li><a href="http://www.yottaa.com/">Yottaa</a></li>
<li><a href="https://developers.google.com/pagespeed/">Page Speed Online</a></li>
<li><a href="http://www.webpagetest.org/">WebPageTest</a></li>
<li><a href="https://www.speedoftheweb.org/">Speed of the Web</a></li>
</ul>
<p>You can also review my <a href="http://pinboard.in/u:evgenyg/t:wp%20perf/">WordPress</a> and <a href="http://pinboard.in/u:evgenyg/t:web%20perf/">web</a> performance links. In particular, I&#8217;ve found the <a href="http://www.youtube.com/watch?v=QGnG68gCRIw">&#8220;Making the Web Faster at LinkedIn&#8221;</a> video very useful.</p>
<p>What was your experience in optimizing WordPress? Which tools did you use? I&#8217;d love to hear!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=NuMk59rCKPE:sq5bhncsEKw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=NuMk59rCKPE:sq5bhncsEKw:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=NuMk59rCKPE:sq5bhncsEKw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/NuMk59rCKPE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/wordpress-performance-optimization/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/wordpress-performance-optimization/</feedburner:origLink></item>
		<item>
		<title>Gradle CodeNarc Plugin Update</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/RXAUelFC_c4/</link>
		<comments>http://evgeny-goldin.com/blog/gradle-codenarc-plugin-update/#comments</comments>
		<pubDate>Fri, 06 Apr 2012 19:57:07 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=4155</guid>
		<description><![CDATA[Gradle CodeNarc plugin was updated to match CodeNarc v0.17 released recently. Since Gradle now provides its own built-in plugin with flexible configuration you&#8217;d probably better switch to that one instead. I&#8217;m not going to kill my version of this plugin since I&#8217;m still using it in my Groovy projects. Note that starting from Gradle version [...]]]></description>
				<content:encoded><![CDATA[<p><br/><br />
<a href="http://evgeny-goldin.com/wiki/Gradle-CodeNarc-plugin">Gradle CodeNarc plugin</a> was updated to match <strong>CodeNarc v0.17</strong> released recently. Since Gradle now provides its own built-in <a href="http://gradle.org/docs/current/userguide/codenarc_plugin.html">plugin</a> with flexible <a href="http://gradle.org/docs/current/dsl/org.gradle.api.plugins.quality.CodeNarcExtension.html">configuration</a> you&#8217;d probably better switch to that one instead. I&#8217;m not going to kill my version of this plugin since I&#8217;m still using it in my Groovy projects. </p>
<p>Note that starting from Gradle version <strong><code>"1.0-milestone-9"</code></strong> you&#8217;re supposed to prepend dynamic properties with <a href="http://forums.gradle.org/gradle/topics/6caj90zrfqr0l"><strong><code>"ext."</code></strong></a>.</p>
<p><a href="https://github.com/evgeny-goldin/maven-plugins/blob/412e2fa00ae546ee3585d33e91717f5302b65aaa/build.gradle#L24"><strong><code>"build.gradle"</code></strong></a>:</p>
<pre class="brush: groovy; title: ; notranslate">
..
ext.codenarcRuleSetFiles = [ 'codenarc.groovy' ]
apply from: 'https://raw.github.com/evgeny-goldin/gradle-plugins/dev/src/main/groovy/CodeNarc.gradle'
..
</pre>
<p><a href="https://github.com/evgeny-goldin/maven-plugins/blob/412e2fa00ae546ee3585d33e91717f5302b65aaa/codenarc.groovy"><strong><code>"codenarc.groovy"</code></strong></a>:</p>
<pre class="brush: groovy; title: ; notranslate">
ruleset {

    description 'CodeNarc RuleSet'

    ruleset( &quot;http://codenarc.sourceforge.net/StarterRuleSet-AllRulesByCategory.groovy.txt&quot; ) {

        DuplicateNumberLiteral   ( enabled : false )
        DuplicateStringLiteral   ( enabled : false )
        BracesForClass           ( enabled : false )
        BracesForMethod          ( enabled : false )
        BracesForIfElse          ( enabled : false )
        BracesForForLoop         ( enabled : false )
        BracesForTryCatchFinally ( enabled : false )
        JavaIoPackageAccess      ( enabled : false )
        ConfusingMethodName      ( enabled : false )
        UnnecessarySubstring     ( enabled : false )
        FactoryMethodName        ( enabled : false )

        VariableName             ( finalRegex : /[a-zA-Z0-9_]+/ )
        LineLength               ( length     : 160   )
        MethodName               ( regex      : /[a-z][\w\s'\(\)]*/ ) // Spock method names
    }
}
</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=RXAUelFC_c4:loZdtjBL330:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=RXAUelFC_c4:loZdtjBL330:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=RXAUelFC_c4:loZdtjBL330:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/RXAUelFC_c4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/gradle-codenarc-plugin-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/gradle-codenarc-plugin-update/</feedburner:origLink></item>
		<item>
		<title>Twitter RSS Feeds – Yes, We Can</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/42NosL6Tgjw/</link>
		<comments>http://evgeny-goldin.com/blog/twitter-rss-feeds/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 16:05:41 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[atom]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=4030</guid>
		<description><![CDATA[Twitter never made it easy to follow people, lists or searches over RSS feed. In every case I had to search and try out various approaches to find those that work. Well, I&#8217;m finally able to follow all things Twitter in Google Reader and it just makes one less network to visit. It is sad [...]]]></description>
				<content:encoded><![CDATA[<p><br/><br />
<img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/rss2.png" alt="" title="RSS" width="100" height="142" class="alignleft size-full wp-image-4038" /></p>
<p>Twitter never made it easy to follow people, lists or searches over RSS feed. In every case I had to search and try out various approaches to find those that work. </p>
<p>Well, I&#8217;m finally able to follow all things Twitter in Google Reader and it just makes one less network to visit. It is sad to witness social networks obscuring their feeds in attempt to drag you in. I can only hope it doesn&#8217;t become too ridiculous &#8230;</p>
<p><a href="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/twitter.png"><img src="http://evgeny-goldin.com/blog/wp-content/uploads/2012/04/twitter.png" alt="" title="Twitter" width="100" height="98" class="alignright size-full wp-image-4039" /></a><br />
Anyway, Twitter feeds for users, lists and searches are shown below. Hope you find them useful.<br />
<br/><br />
<strong>User feed</strong></p>
<ul>
<li><code>http://twitter.com/statuses/user_timeline/<strong><span style="color:blue">[user-name]</span></strong>.rss</code></li>
<li><code>http://twitter.com/statuses/user_timeline/<strong><span style="color:blue">[user-id]</span></strong>.rss</code></li>
<li><a href="http://twitter.com/statuses/user_timeline/hackernewsbot.rss"><code>twitter.com/statuses/user_timeline/hackernewsbot.rss</code></a> <em>(<a href="http://www.google.com/reader/view/feed/http%3A//twitter.com/statuses/user_timeline/hackernewsbot.rss">preview</a>)</em></li>
<li><a href="https://dev.twitter.com/docs/api/1/get/statuses/user_timeline">API Reference</a></li>
</ul>
<p><br/><br />
<strong><code>"user-name"</code></strong> is how user normally appears on twitter and <strong><code>"user-id"</code></strong> is its numerical ID which can be found using <a href="http://www.idfromuser.com/">this application</a>. You can choose either of those.<br />
<br/><br />
<strong>List feed</strong></p>
<ul>
<li><code>http://api.twitter.com/1/<strong><span style="color:blue">[user-name]</span></strong>/lists/<strong><span style="color:blue">[list-name]</span></strong>/statuses.atom</code></li>
<li><a href="http://api.twitter.com/1/evgeny_goldin/lists/devops/statuses.atom"><code>api.twitter.com/1/evgeny_goldin/lists/devops/statuses.atom</code></a> <em>(<a href="http://www.google.com/reader/view/feed/http%3A//api.twitter.com/1/evgeny_goldin/lists/devops/statuses.atom">preview</a>)</em></li>
<li><a href="https://dev.twitter.com/docs/api/1/get/lists/statuses">API Reference</a></li>
</ul>
<p><br/><br />
<strong>Search feed</strong></p>
<ul>
<li><code>http://search.twitter.com/search.atom?q=<strong><span style="color:blue">[query]</span></strong></code></li>
<li><code>http://search.twitter.com/search.atom?q=%23<strong><span style="color:blue">[query]</span></strong></code> <em>(#query)</em></li>
<li><code>http://search.twitter.com/search.atom?q=%40<strong><span style="color:blue">[query]</span></strong></code> <em>(@query)</em></li>
<li><a href="http://search.twitter.com/search.atom?q=%40TeamCity"><code>search.twitter.com/search.atom?q=%40TeamCity</code></a> <em>(<a href="http://www.google.com/reader/view/feed/http%3A//search.twitter.com/search.atom%3Fq=%2540TeamCity">preview</a>)</em></li>
<li><a href="https://dev.twitter.com/docs/api/1/get/search">API Reference</a></li>
</ul>
<p><br/><br />
<strong>JetBrains feeds</strong></p>
<ul>
<li><a href="http://api.twitter.com/1/evgeny_goldin/lists/jetbrains/statuses.atom">Atom feed</a> of my &#8220;jetbrains&#8221; <a href="https://twitter.com/#!/evgeny_goldin/jetbrains">list</a> &#8211; all JetBrains tweets from projects and people <em>(<a href="http://www.google.com/reader/view/feed/http%3A//api.twitter.com/1/evgeny_goldin/lists/jetbrains/statuses.atom">preview</a>)</em></li>
<li>Projects blogs and updates <a href="http://www.google.com/reader/public/atom/user%2F12315629910073457959%2Fbundle%2FJetBrains%20Updates">feed</a> <em>(<a href="http://www.google.com/reader/view/feed/http%3A//www.google.com/reader/public/atom/user%252F12315629910073457959%252Fbundle%252FJetBrains%2520Updates#stream/user%2F12315629910073457959%2Fbundle%2FJetBrains%20Updates">preview</a>)</em></li>
<li>Employees personal blogs <a href="http://www.google.com/reader/public/atom/user%2F12315629910073457959%2Fbundle%2FJetBrains%20People">feed</a> <em>(<a href="http://www.google.com/reader/view/feed/http%3A//www.google.com/reader/public/atom/user%252F12315629910073457959%252Fbundle%252FJetBrains%2520People#stream/user%2F12315629910073457959%2Fbundle%2FJetBrains%20People">preview</a>)</em></li>
</ul>
<p><br/><br />
<strong>Chrome keyword searches</strong></p>
<table border="0" cellspacing="3">
<tr>
<td>
Twitter user:
</td>
<td>
<strong><code>"tw"</code></strong>
</td>
<td>
=
</td>
<td>
<code>"http://twitter.com/#!/<strong>%s</strong>"</code>
</td>
</tr>
<tr>
<td>
Twitter list:
</td>
<td>
<strong><code>"tl"</code></strong>
</td>
<td>
=
</td>
<td>
<code>"http://twitter.com/#!/evgeny_goldin/<strong>%s</strong>"</code>
</td>
</tr>
<tr>
<td>
Twitter search:
</td>
<td>
<strong><code>"ts"</code></strong>
</td>
<td>
=
</td>
<td>
<code>"http://twitter.com/#!/search/<strong>%s</strong>"</code>
</td>
</tr>
<tr>
<td>
Google Reader:
</td>
<td>
<strong><code>"gr"</code></strong>
</td>
<td>
=
</td>
<td>
<code>"http://www.google.com/reader/view/feed/<strong>%s</strong>"</code>
</td>
</tr>
</table>
<p><br/><br />
Twitter-related <a href="http://lifehacker.com/5476033/how-to-set-keyword-bookmarks-in-google-chrome">keyword searches</a> go a long way to make life easier! Using searches shown above I can type <a href="https://twitter.com/#!/youtrack"><strong><code>"tw youtrack"</code></strong></a>, <a href="https://twitter.com/#!/evgeny_goldin/devops"><strong><code>"tl devops"</code></strong></a>, and <a href="https://twitter.com/#!/search/anything"><strong><code>"ts anything"</code></strong></a> to read @YouTrack tweets, my &#8220;devops&#8221; list or search Twitter for &#8220;anything&#8221;. And <strong><code>"gr url"</code></strong> loads the feed  url into Google Reader.<br />
<br/><br />
<strong>References</strong><br />
<br/><br />
It wouldn&#8217;t be possible without the following posts whose authors made the effort of digging out this useful information. Thank you!</p>
<ul>
<li>Cynthia Ng &#8211; <a href="http://cynng.wordpress.com/2011/07/05/twitter-search-rss-feed/">&#8220;Creating a Twitter Search, Hashtag, User, Favorites or List RSS Feed&#8221;</a></li>
<li>Piers Dillon Scott &#8211; <a href="http://sociable.co/social-media/as-twitter-protects-its-ecosystem-heres-how-to-create-an-rss-feed-of-a-twitter-list/">&#8220;As Twitter protects its ecosystem, here’s how to create an RSS feed of a Twitter List&#8221;</a></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=42NosL6Tgjw:S4jluN9_aYk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=42NosL6Tgjw:S4jluN9_aYk:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=42NosL6Tgjw:S4jluN9_aYk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/42NosL6Tgjw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/twitter-rss-feeds/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/twitter-rss-feeds/</feedburner:origLink></item>
		<item>
		<title>Continuous Delivery and new makandracards</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/R2gY9-4Coos/</link>
		<comments>http://evgeny-goldin.com/blog/continuous-delivery-makandracards/#comments</comments>
		<pubDate>Fri, 10 Feb 2012 22:00:48 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[makandracards]]></category>
		<category><![CDATA[IDEA]]></category>
		<category><![CDATA[Ivy]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[Svn]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=4015</guid>
		<description><![CDATA[I have been working on a new Wiki page recently: Continuous Delivery. It summarizes major resources, ideas, techniques and tools around Continuous Delivery process. Also, I&#8217;ve started summarizing various steps to do something with makandracards. Try them out, they are really lovely. It is faster to work on a makandracard than to start a new [...]]]></description>
				<content:encoded><![CDATA[<p><br/><br />
I have been working on a new Wiki page recently: <a href="http://evgeny-goldin.com/wiki/Continuous_Delivery "><strong>Continuous Delivery</strong></a>. It summarizes major resources, ideas, techniques and tools around Continuous Delivery process.</p>
<p>Also, I&#8217;ve started summarizing various steps to do <em>something</em> with <a href="https://makandracards.com/"><strong>makandracards</strong></a>. Try them out, they are really lovely. It is faster to work on a makandracard than to start a new Wiki page (if you have Wiki).</p>
<p>Here are mine so far:</p>
<ul>
<li><a href="https://makandracards.com/evgeny-goldin/5477-getting-intellij-idea-jars-using-ivy-and-teamcity">Getting Intellij IDEA jars using Ivy and TeamCity.</a></li>
<li><a href="https://makandracards.com/evgeny-goldin/5817-calling-ivy-from-groovy-or-java">Calling Ivy from Groovy or Java.</a></li>
<li><a href="https://makandracards.com/evgeny-goldin/5877-converting-svn-to-mercurial-using-hgsubversion">Converting SVN to Mercurial using HgSubversion.</a></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=R2gY9-4Coos:EjHudGTcpCY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=R2gY9-4Coos:EjHudGTcpCY:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=R2gY9-4Coos:EjHudGTcpCY:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/R2gY9-4Coos" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/continuous-delivery-makandracards/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/continuous-delivery-makandracards/</feedburner:origLink></item>
		<item>
		<title>“UI/UX and Continuous Deployment” video</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/ziQX6b_Eo-M/</link>
		<comments>http://evgeny-goldin.com/blog/ui-continuous-deployment/#comments</comments>
		<pubDate>Sat, 03 Dec 2011 02:03:48 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Video]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=3997</guid>
		<description><![CDATA[ILTechTalks has met again and this time to discuss the issue of Continuous Deployment and UI development. First session was given by Ori Lahav (@orilahav) and Shaked Simchi from Outbrain and the seond one by Omri Nachman from Wix. Audio file (mp3) of the session. Audio file (mp3) of the session.]]></description>
				<content:encoded><![CDATA[<p><br/><br />
<a href="http://www.meetup.com/ILTechTalks/"><strong>ILTechTalks</strong></a> has met <a href="http://www.meetup.com/ILTechTalks/events/40140572/">again</a> and this time to discuss the issue of Continuous Deployment and UI development. First session was given by Ori Lahav (<a href="http://twitter.com/#!/orilahav">@orilahav</a>) and Shaked Simchi from <a href="http://www.outbrain.com/">Outbrain</a> and the seond one by Omri Nachman from <a href="http://www.wix.com/">Wix</a>. </p>
<p><iframe src="http://player.vimeo.com/video/32967933?title=0&amp;byline=0&amp;portrait=0" width="630" height="346" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<p><a href="http://goo.gl/hLUun">Audio file (mp3)</a> of the session.</p>
<p><iframe src="http://player.vimeo.com/video/32971396?title=0&amp;byline=0&amp;portrait=0" width="630" height="346" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<p><a href="http://goo.gl/0DmBK">Audio file (mp3)</a> of the session.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=ziQX6b_Eo-M:_bWzr4smY_M:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=ziQX6b_Eo-M:_bWzr4smY_M:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=ziQX6b_Eo-M:_bWzr4smY_M:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/ziQX6b_Eo-M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/ui-continuous-deployment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/ui-continuous-deployment/</feedburner:origLink></item>
		<item>
		<title>Lion Video Conversion Tools</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/YzWixnRVRkk/</link>
		<comments>http://evgeny-goldin.com/blog/lion-video-conversion-tools/#comments</comments>
		<pubDate>Sat, 03 Dec 2011 01:13:06 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Video]]></category>
		<category><![CDATA[Lion]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=3979</guid>
		<description><![CDATA[After recording technical sessions I visit on my camera, there was a clear need to share them on a reliable and controllable platform. Without thinking too much I started with Vimeo Plus as it provides a reasonable compromise between the price, storage space and overall control. In a way, I much prefer to pay and [...]]]></description>
				<content:encoded><![CDATA[<p><br/><br />
After recording technical sessions I visit on my camera, there was a clear need to share them on a reliable and controllable platform. Without thinking too much I started with <a href="http://vimeo.com/plus">Vimeo Plus</a> as it provides a reasonable compromise between the price, storage space and overall control. In a way, I much prefer to pay and then have something to say (and demand!) rather than rely on free services, behaving on their own will.</p>
<p>My second issue was converting <strong><code>MOD</code></strong> files recorded by the camera before uploading them to Vimeo. Initially, <a href="http://handbrake.fr/">HandBrake</a> looked like an excellent solution as it compresses <code>mod</code>s to <strong><code>mkv</code></strong>, my preferable format. On top of that it was free, which doesn&#8217;t happen a lot in the Mac world. However, I found out my camera starts recording new <code>mod</code> file every 60 minutes. To verify that and see if any recording is lost in the middle I recorded my digital clock for about 3 hours and found out no time above one second is lost. To merge the files I switched to <a href="http://www.wondershare.com/mac-video-converter-ultimate/">Video Converter Ultimate for Mac</a> which is more capable than HandBrake although it is not free. This application also allows conversion of <code>mkv</code> files resulting from the merge to <code>mp3</code> audio so that people would be able to download the smaller audio files to their players. As a long-time iPod listener, I believe having a downloadable <code>mp3</code> file is definitely a must for any technical session being recorded. </p>
<p>Another application I found for conversion of video files (to audio and video formats, including <code>mp4</code> and <code>mp3</code>) was <a href="http://www.mirovideoconverter.com/">Miro Video Converter</a>, also a free one but with a limited functionality. For instance, it doesn&#8217;t allow to control the compression quality.</p>
<p>At the end of the day, video converter from Wondershare is the one I use the most although I have all 3 of them installed.</p>
<p><a href="http://www.alfredapp.com/"><img border="0" src="http://evgeny-goldin.com/blog/wp-content/uploads/2011/12/Mac-Video-Tools1.png" alt="" title="Mac Video Tools shown by Alfred" width="615" height="257" class="aligncenter size-full wp-image-3988" /></a></p>
<p>One thing I wouldn&#8217;t suggest, though, is clicking the &#8220;Remember it as my default option&#8221; checkbox in the converter welcome screen as I found no way to switch the conversion mode later and had to reinstall the application to undo the default &#8220;Video&#8221; mode.</p>
<p><a href="http://www.wondershare.com/mac-video-converter-ultimate/"><img border="0" src="http://evgeny-goldin.com/blog/wp-content/uploads/2011/12/Video-Converter1.png" alt="" title="Video Converter Ultimate for Mac" width="549" height="314" class="aligncenter size-full wp-image-3987" /></a></p>
<p>Well, now I have created my own <a href="http://vimeo.com/channels/263367">&#8220;Technical Sessions&#8221;</a> Vimeo channel (reposted here in <a href="http://evgeny-goldin.com/blog/category/video/">&#8220;Video&#8221;</a> category) where all sessions I ever visit will be uploaded to. The link to corresponding <code>mp3</code> files is available in every video &#8220;Description&#8221;. Right now most sessions are in Hebrew but this will change next year.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=YzWixnRVRkk:JLEZC--ONO8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=YzWixnRVRkk:JLEZC--ONO8:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=YzWixnRVRkk:JLEZC--ONO8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/YzWixnRVRkk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/lion-video-conversion-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/lion-video-conversion-tools/</feedburner:origLink></item>
		<item>
		<title>Big Data &amp; LivePerson: Hadoop and MapReduce</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/E7tccXMsKao/</link>
		<comments>http://evgeny-goldin.com/blog/big-data-liveperson/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 13:55:41 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=3962</guid>
		<description><![CDATA[ILTechTalks organized another event yesterday &#8211; &#8220;Big Data &#038; LivePerson&#8221; where Ophir Cohen (@ophchu) from LivePerson presented company experience with Hadoop and MapReduce.]]></description>
				<content:encoded><![CDATA[<p><br/><br />
<a href="http://www.meetup.com/ILTechTalks/"><strong>ILTechTalks</strong></a> organized another event yesterday &#8211; <a href="http://www.meetup.com/ILTechTalks/events/39864572/">&#8220;Big Data &#038; LivePerson&#8221;</a> where Ophir Cohen (<a href="http://twitter.com/#!/ophchu"><strong>@ophchu</strong></a>) from LivePerson presented company experience with Hadoop and MapReduce.</p>
<p><iframe src="http://player.vimeo.com/video/32504726?title=0&amp;byline=0&amp;portrait=0" width="630" height="346" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe><br />
<br/><br />
<iframe src="http://player.vimeo.com/video/32505056?title=0&amp;byline=0&amp;portrait=0" width="630" height="346" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=E7tccXMsKao:lShnHhhp3ZU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=E7tccXMsKao:lShnHhhp3ZU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=E7tccXMsKao:lShnHhhp3ZU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/E7tccXMsKao" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/big-data-liveperson/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/big-data-liveperson/</feedburner:origLink></item>
		<item>
		<title>10 Cool Facts about Gradle</title>
		<link>http://feedproxy.google.com/~r/GoldinTheJunior/~3/uwiZdVMYL14/</link>
		<comments>http://evgeny-goldin.com/blog/10-cool-facts-gradle/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 15:24:43 +0000</pubDate>
		<dc:creator>Evgeny Goldin</dc:creator>
				<category><![CDATA[Gradle]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[builds]]></category>

		<guid isPermaLink="false">http://evgeny-goldin.com/blog/?p=3933</guid>
		<description><![CDATA[About a month ago @saylambda user group (lambda.org.il) had a &#8220;JavaScript as a Functional Language&#8221; meeting, very nicely presented by Zachary Kessin (@zkessin). You can see a summary, HTML slides and video recording of the session. This time the subject was Groovy and Ronen Narkis (@narkisr) presented Groovy as a language, its powerful GDK, AST [...]]]></description>
				<content:encoded><![CDATA[<p><br/><br />
About a month ago <a href="http://twitter.com/#!/saylambda"><strong>@saylambda</strong></a> user group (<a href="http://www.lambda.org.il/">lambda.org.il</a>) had a &#8220;JavaScript as a Functional Language&#8221; meeting, very nicely presented by Zachary Kessin (<a href="http://twitter.com/#!/zkessin">@zkessin</a>). You can see a <a href="http://www.evernote.com/shard/s63/sh/015c6fcf-bb47-4fa9-8cd0-518809d8e75e/2be707e66f87818ced94b24902876665">summary</a>, <a href="http://www.lambda.org.il/meetings/past/javascript/slides">HTML slides</a> and <a href="http://vimeo.com/27759669">video recording</a> of the session. </p>
<p>This time the subject was Groovy and Ronen Narkis (<a href="http://twitter.com/#!/narkisr">@narkisr</a>) presented Groovy as a language, its powerful GDK, AST and MOP capabilities together with GPars examples. Ronen presentation is available in his <a href="https://github.com/narkisr/lambda-groovy">GitHub repository</a>.</p>
<p>I was invited to speak about Gradle and since my session was targeted to the audience where not everyone was familiar with either Groovy or Gradle I decided not to cover it feature-by-feature or go into any technical details (and we were short on time, as always). Instead, I picked 10 facts about Gradle which, coming from the Maven background, made me say &#8220;Hmm, that&#8217;s cool!&#8221; in the past. Hope you&#8217;ll share my experience so here it is.</p>
<p><object type='application/x-shockwave-flash' wmode='opaque' data='http://static.slideshare.net/swf/ssplayer2.swf?id=9082958&doc=10coolfactsaboutgradle-110831074317-phpapp01' width='630' height='516'><param name='movie' value='http://static.slideshare.net/swf/ssplayer2.swf?id=9082958&doc=10coolfactsaboutgradle-110831074317-phpapp01' /><param name='allowFullScreen' value='true' /></object><br />
<br/></p>
<p>
My other presentations are now available <a href="https://github.com/evgeny-goldin/presentations">in GitHub</a> as well.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=uwiZdVMYL14:02TG9PEsoEE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=uwiZdVMYL14:02TG9PEsoEE:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/GoldinTheJunior?a=uwiZdVMYL14:02TG9PEsoEE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/GoldinTheJunior?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/GoldinTheJunior/~4/uwiZdVMYL14" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://evgeny-goldin.com/blog/10-cool-facts-gradle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://evgeny-goldin.com/blog/10-cool-facts-gradle/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 3.063 seconds. --><!-- Cached page generated by WP-Super-Cache on 2013-06-18 16:18:20 -->
