<?xml version="1.0"?>
<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom">
   <channel>
      <title>Jenkins blogs</title>
      <description>Pipes Output</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=jLGuq2bi2xGE_YKmjUnRlg</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=jLGuq2bi2xGE_YKmjUnRlg&amp;_render=rss&amp;page=2"/>
      <pubDate>Thu, 01 Oct 2015 23:09:10 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <item>
         <title>Upcoming in office horus: Jenkins 2.0</title>
         <link>http://feedproxy.google.com/~r/ContinuousBlog/~3/MD1mOs-K7yU/upcoming-office-horus-jenkins-20</link>
         <description>&lt;p&gt;
I hope many of you have had a chance to see &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/vbXK7JJekFw&quot;&gt;the Jenkins 2.0 thread&lt;/a&gt;.
I'm going to use &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://wiki.jenkins-ci.org/display/JENKINS/Office+Hours&quot;&gt;the office hours next Wednesday&lt;/a&gt; to go through this proposal.

&lt;/p&gt;&lt;p&gt;
This is still primarily for developers in the project, as it's &quot;just&quot; a proposal with lots of details unspecified. It's more meant to help people understand where I'm coming from and what goals I have in mind for this effort.

&lt;/p&gt;&lt;p&gt;
As always, this will be on Hangout on air. The event page is &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://plus.google.com/events/co46heshe6i4io1dsaaj1h3th2c&quot;&gt;here&lt;/a&gt;, and if you want to participate in the discussion, join &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://plus.google.com/hangouts/_/hoaevent/AP36tYfvk_ZBO4dCmxysNPfi-R5_xlkgscU-r9WDq_8zXDv6VnN3kg&quot;&gt;here&lt;/a&gt;. Read-only viewers should use &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.youtube.com/watch?v=fl5xfqtiNko&quot;&gt;YouTube&lt;/a&gt; to watch, and you can still send questions in real time to IRC and I'll make sure to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jenkins-ci.org/content/chat&quot;&gt;go through them&lt;/a&gt;.

 
&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ContinuousBlog/~4/MD1mOs-K7yU&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">632 at http://jenkins-ci.org</guid>
         <pubDate>Thu, 01 Oct 2015 20:51:25 +0000</pubDate>
      </item>
      <item>
         <title>Bay Area JAM</title>
         <link>http://feedproxy.google.com/~r/ContinuousBlog/~3/UvJq8Ywyc3Q/bay-area-jam</link>
         <description>&lt;div style=&quot;float:right;margin:1em;&quot;&gt;
&lt;img src=&quot;http://jenkins-ci.org/sites/default/files/images/Screen%20Shot%202015-09-30%20at%202.15.54%20PM_0.png&quot; width=&quot;320&quot;&gt;
&lt;/div&gt;

&lt;p&gt;Last week, the first &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.meetup.com/jenkinsmeetup/events/225059665/&quot;&gt;Jenkins Area Meetup (JAM)&lt;/a&gt; took place in San Jose, CA on Wednesday, Sept 23.  What a way to kick off the first JAM other than to have Docker, John Willis as our guest speaker. John talked about &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.slideshare.net/botchagalupe/devops-and-immutable-infrastructure-cloud-expo-2015-nyc&quot;&gt;immutable infrastructure&lt;/a&gt; and its benefits and role of containers.&lt;/p&gt;

&lt;p&gt;Kohsuke discussed &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://wiki.jenkins-ci.org/display/JENKINS/Workflow+Plugin&quot;&gt;Jenkins Workflow&lt;/a&gt;, the motivation behind the same and latest features of Jenkins Workflow like &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://developer-blog.cloudbees.com/2015/08/workflow-19-and-multibranch-beta.html&quot;&gt;multi branch support&lt;/a&gt; followed by &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.cloudbees.com/2015/06/building-modern-real-world-software.html&quot;&gt;docker use cases&lt;/a&gt;. The highlight of the meetup was definitely Kohsuke breaking the news about Jenkins 2.0 and his vision and motivation behind it.&lt;/p&gt;

&lt;p&gt;The next Bay Area JAM is slated for Oct 21. Be sure to check &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.meetup.com/jenkinsmeetup/&quot;&gt;HERE&lt;/a&gt; for the agenda. We’d love to have you join us if you’re in the area.  If you’re interested in speaking, or become a food &amp; bev, venue, or recording sponsor please send email to the organizer or &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;mailto:events@lists.jenkins-ci.org&quot;&gt;events@lists.jenkins-ci.org&lt;/a&gt;.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ContinuousBlog/~4/UvJq8Ywyc3Q&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">629 at http://jenkins-ci.org</guid>
         <pubDate>Wed, 30 Sep 2015 18:18:27 +0000</pubDate>
      </item>
      <item>
         <title>GUI improvements on the horizon</title>
         <link>http://feedproxy.google.com/~r/ContinuousBlog/~3/1bEYowQlZ3w/gui-improvements-horizon</link>
         <description>&lt;p&gt;This past Thursday, September 24th, 2015, I presented a couple of prototypes of what I hope will be the future of the Jenkins GUI. Or perhaps more correctly, close enough to the future to start generating positive feedback from you the community that improving the Jenkins GUI is important and some pieces that I am showing are going in the right direction. If you have ~45 minutes to spare, I recommend the video (the narrator's voice is very soothing). If not, I offer the following as a reasonable summary.&lt;/p&gt;

&lt;p&gt;Jenkins has a lot of strengths as tool. Its robust user community along with its thoughtful and extensible design are two of the most immediate. They are the two pillars that have made Jenkins the leader in the CD/CI space and the de facto choice for most of us looking to automate our build and test processes. But let's face it, by today's standards, the GUI doesn't really sing. I will even go so far as to say, I believe it is a platform liability at the moment, and even among we the Jenkins faithful, few of us look forward to using it.&lt;/p&gt;

&lt;p&gt;In an effort to turn that tide, I traveled to this year's 3 main JUC events, in DC, London, and Santa Clara, pushing the idea that enhancement is possible and providing an evolving sketch of what that might look like. The three main areas of enhancement I have targeted for a first round of improvement are these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://youtu.be/A_lu-P0OhNQ&quot;&gt;Item creation and configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.youtube.com/watch?v=9vPUMe3lzfo&quot;&gt;Plugin selection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://youtu.be/fja9nxXcykg&quot;&gt;Workflow construction&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Soon to follow, but not yet prototyped by me would be pieces dedicated to monitoring jobs in Jenkins as well as node and resource utilization and efficiency. Rightly or wrongly, I have started with the create and configure side of the GUI, as I see it as somewhat primary in a typical job creation scenario (you have to create a job before you can monitor it), but this second piece is no less important. Sadly, lips service is all I can offer you today, but more prototypes and video demonstrations are on the way.&lt;/p&gt;

&lt;h3&gt;Item Creation and Configuration in Jenkins&lt;/h3&gt;

 

&lt;p&gt;In most use cases, item creation means creating a freestyle job, so that is what I use as my base use case example. It is important to note, however, that most configuration in Jenkins happens through a shared set of GUI components. These components are a blend of Jelly files and Javascript and can be found in the .../main/resources/lib/form directory in the Jenkins source code. In operating on these pieces, I have the opportunity to effectively enhance broad areas of the Jenkins experience, including aspects of plugin use that share these components. This greatly increases the upside of the effort as well as the possible drama and side effects, which I will go into more detail on later.&lt;/p&gt;

&lt;p&gt;As for the upside piece, the first bit of improvement I am looking to attain is breaking up the many 'toilet paper' style unbroken configuration lists sprinkled throughout Jenkins. The first example of this appears in item creation. On first installation, this issue is not immediately obvious, but if you have installed a variety of plugins or chosen to purchase CloudBee's Jenkins Enterprise product, you will find that Jenkins can have quite a few types of items to create. While they do have descriptive text, I still find them difficult to differentiate and almost impossible to casually scan. Thus, my first suggestion is to add some form of categorization to the item types. For this to function correctly, the GUI will need to be smart enough to apply the categories only when item counts are sufficient to justify them (if you only have 4 item creation types, it doesn't make sense to have 8 categories with which to sort them). But if you are a long time Jenkins user with many plugins you may also know it is possible to have more than a dozen item types. So if nothing else, an extension point that allowed for the categorization of item types seems helpful.&lt;/p&gt;

&lt;p&gt;The configuration form itself, it also can become incredibly long with few landmarks or visual differentiation points. As a remedy, I propose calling out and clearly boxing each of the existing configuration sections and making sure that their names are as meaningful as possible. As an added step, I make the sections collapsible. This allows the user to jump to specific points in the form and tuck other areas out of the way. In some cases, we can make specific sections open by link context or even by user context.&lt;/p&gt;

&lt;h3&gt;Plugin Selection&lt;/h3&gt;

 

&lt;p&gt;Another essential piece of the Jenkins experience is plugin configuration. Today, if you are looking to add plugins to your Jenkins environment, you are almost certainly using Google to find a 3rd party review site, collecting the name of the plugin you want and then either linking to it on this website, or filtering for it in the Plugin Manager GUI.&lt;/p&gt;

&lt;p&gt;Neither in the product nor on this website is there a particularly good resource for comparing plugins and evaluating which you might add.&lt;/p&gt;

&lt;p&gt;Instead, I am looking to add something akin to an application store experience to both this website and the product UI. You should be able to group sort and compare plugins by a variety of criteria, including author, installation base, and user review. You should also have a set of general use categories that fits user needs and expectations, rather than the free ranging labels that plugin authors have arbitrarily applied today.&lt;/p&gt;

&lt;h3&gt;Workflow Script Builder&lt;/h3&gt;

 

&lt;p&gt;Finally, I have a GUI that allows for a sort of Drag-n-drop assembly of Workflows. A major tenant of the utility of Workflows as opposed to Freestyle jobs is that they can be completely separated from the Jenkins GUI and stored in a source repository. None-the-less, with absolutely no GUI, there is little to guide the user who is looking to get started without a upfront learning investment. As it turns out, a Workflow/Groovy script is pretty straight forward, but you don't really know that until you have made one. Also, Workflow allows for the orchestration of jobs across multiple nodes of hardware resources, making it a potentially involved little bit of configuration. Thus, my goal here is two fold. Allow the user to model a workflow quickly and easily and showcase a few of the more advanced features workflow enables. The result is this script builder. My hope is to host the prototype somewhere you all might be able to use it directly, but in the meantime, my hope is that my video pretty well explains how it works. Please take a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://youtu.be/fja9nxXcykg&quot;&gt;look&lt;/a&gt; and post whatever comments you see fit.&lt;/p&gt;

&lt;h3&gt;...and really send along feedback...&lt;/h3&gt;

&lt;p&gt;So with all things community related, please, please, send back whatever feedback makes sense. I can be reached via Twitter &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://twitter.com/gusreiber&quot;&gt;@gusreiber&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Other places you can find me include, IRC (freenode/#jenkins) and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://plus.google.com/+GusReiberUI&quot;&gt;Google+ (https://plus.google.com/+GusReiberUI)&lt;/a&gt;. I would love to hear from you.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;Questions and Answers from the talk:&lt;/h3&gt;

&lt;ol&gt;&lt;li&gt;
&lt;b&gt;How likely is it that any of these UI changes will make it into the core open source Jenkins? When would we start seeing them there?&lt;/b&gt;&lt;br/&gt;
Most will be OSS. An exact schedule has not been determined, but most of it is still about a year away. Likely we will have an experimental wars for download along the way. 
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Is there anyway to determine which GUI attributes are contributed by which plugin?&lt;/b&gt;&lt;br/&gt;
I take it that is a bit of a feature request? 
It came up at JUC West as well. Should be something that can be surfaced in the GUI. I agree, it would be helpful.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
What is the difference between ANT and Jenkins?&lt;/b&gt;&lt;br/&gt;
Ant is a good bit more bare-bones than Jenkins. In fact, you can add an Ant plugin to your Jenkins environment. You would typically use Ant to compile java source files. Jenkins orchestrates the fetching of the source files from some particular repository, the building of those files (often Jenkins uses Ant via its plugin to do this), running and reporting some suite of tests against that build, and then archiving or deploying the artifacts to wherever. Often times this requires navigating several computers with their own security constraints, so Jenkins helps you manage that as well.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
What version of the Jenkins it is?&lt;/b&gt;&lt;br/&gt;
This isn’t available today, but I am building against 1.621-SNAPSHOT currently, but will upgrade with Jenkins to the coming December LTS.

I'm interested in seeing the list of 100 plugins that you mentioned (by Daniel?)
Me too. :^)  He and the community (which can be you if want to join IRC freenode.net/#jenkins and attend the hangouts and governance meetings: http://jenkins.ci.org )
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
For IRC, I assume the server is freenode.net?&lt;/b&gt;&lt;br/&gt;
Yes.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Will there be any dashboard kind of feature for the build history in the new GUI?&lt;/b&gt;&lt;br/&gt;
So far, I have been focusing on the create and configuration portion of the Jenkins UX as I see it as a barrier to entry for new users. The read/report/analyze half of the Jenkins UX I actually see as the portion with more long term value, as you tend to read more often than you write, so I am eager to jump in here as well.
....however, in its core today, Jenkins the tool seems to me to really want to see the world in the same context of flat XML files in folders as it actually persists its configuration data. To really make meaningful dashboards, it needs to be possible to query job configurations and build artifacts by a wide set of criteria that is not at all related to the folder in which the xml file happens to be stored. Also, some of the things you care about in the Jenkins universe are compute resources (masters/slaves/exactures). These are also not the same as config files in folders and need to be queryable as their own first class type of entity.

...so what I am saying with a lot of words is that I see the config piece as a somewhat more immediate and urgent fix. The broccoli of the meal, if you will. I will want to get that out as fast as possible to get it out of the way.  The reporting piece is actually the wine. At the moment, we are giving you Bartles and Jaymes in paper cups.

...so a lot of work is still needed there.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Have you investigated Google Polymer as UI components for jenkins UI?&lt;/b&gt;&lt;br/&gt;
I have not, but will now. I am actually quite a google fan-boy in much the way a lot of kids love Apple. (I also love Apple… being from Seattle, I even love MS). But, for the super near term, we are most focused on getting JQuery cleanly into core and Prototype.JS deprecated. Walk first, is my feeling.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Are there any tutorials on Jenkins workflow?&lt;/b&gt;&lt;br/&gt;
Jesse Glick or KK are better people to ask about that, really. They are also on IRC: freenode.net/#jenkins. Daniel Beck as well, might be a good person to ask. My little workflow demo is still really just fiction.

Will there be a 'Expand All' and 'Collapse All' buttons for the accordions in new configure GUI?  (I would probably inject one if not by default)
Yes. Also, they should be URL controllable so that they can be set by link or user context easily. Maybe they should also remember what you had open last? ...stuff to tinker with that really needs to be right.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
 What impact does the UI changes have on job configuration behind the scenes? Is configuration still stored in XML format?&lt;/b&gt;&lt;br/&gt;
None. The post string stays the same and from then on, Jenkins is Jenkins.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Can the create item screen be configurable?
At the moment, no, but ideally yes. It is still a big hand wave at the moment about how those categories are created, managed, and updated. The same categories ought to bubble back up when searching for the plugins to help relate what plugins generate what UI. I am hoping for guidance from the community.

How will workflow fit in with new UI?&lt;/b&gt;&lt;br/&gt;
In some respects, the new configuration page is about enhancing the more traditional freestyle job and not workflow. However, the last bit of my presentation with the script builder is exclusively about workflow. The plugin manager is about plugins, so it would apply to both.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
How is a human notified for the wait for approval step in this workflow?&lt;/b&gt;&lt;br/&gt;
So workflow approval can be done via the web GUI. But to get real notification, you would program that into your workflow Jenkins has a fairly large set of notification plugins. So you can use Jenkins to trigger email, or SMS, or HipChat, or Slack, or pretty much whatever. As these plugins are increasingly customized for workflow, you will get nice and nice workflow syntax for instantiating those actions. When my script builder is adopted, you would have a friendly button you could drag into the stage and it would notify you prior to the manual checkpoint.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Custom plugins still supported?&lt;/b&gt;&lt;br/&gt;
Yes. Though there is supported and supported. The highest level of support for a plugin would be a custom DSL for workflow that would make for streamlined syntax in workflow for interacting with that plugin via Groovy. But existing plugins do not need that level of support to be used within a Jenkins file / Groovy script. Instead, the syntax for accessing the plugin is likely to be more complicated.
….some plugins are freestyle specific, in which case, they no longer make sense in workflow.
….Daniel Beck or Jesse Glick are probably better suited to answering this question, however...
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Will there be an improvement in performance with docker builds, sonar scanning? From my experience sonar takes 20+ mins with jenkins plugin where as it takes 3 mins with maven plugin&lt;/b&gt;&lt;br/&gt;
Is this times it is taking the GUI to render, or the actual build to run? I am not sure I am following the question exactly, but regardless, I am not well equipped to answer many questions about performance issues in Jenkins. I know of a fairly major performance issue specifically in the configuration form that I believe will be fixed in the new GUI, but that isn’t build performance, it is just form rendering performance.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
I like the graphical configuration. Thanks.  The scripting of a complex workflow looked a bit daunting.&lt;/b&gt;&lt;br/&gt;
Cool. Yeah, my main and first goal is to get something out there that would allow folks to quickly sketch and deploy an actual working workflow that reasonably reflects an 80%ish use case. No GUI can ever be as fully flexible as a script, but I don’t think most people need the 95% case to get started and see the benefit of a versionable and robust config file format.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Will there be any effort to make the UI mobile friendly for the admin on the go?&lt;/b&gt;&lt;br/&gt;
Absolutely. Especially on the TBD read/reporting end of the UI, but everything new needs to meet a reasonably high bar of device responsiveness. Today, the Jenkins GUI is just not responsive. Which is terrible.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
 As a plugin developer do I need to change implementing the ui source from jelly or groovy to some other language/technique or will it be compatible?&lt;/b&gt;&lt;br/&gt;
So you will not NEED to change from whatever you are doing, except if you have built a plugin GUI that has custom script that either relies directly on behavior.js, hudson-behavior.js, or the particulars of the existing DOM structure (you do something in the client that requires your or some other input to be in a particular TABLE TR TD DOM traversal path). 
...I believe 2 things are going to continue to happen at a faster and faster rate. New plugin authors are not going to want to write GUIs in Jelly and Prototype.js, but instead use some more modern client side MVC approaches like Angular, where the GUI interacts with a REST api instead of being a dom directly rendered from the server. It is a bit of a different mode of working than Jelly, and maybe slightly less direct, but it is a lot easier to find doc on how to do things with JQuery, Agile, Handlebars and the like, than it is to find doc on Jelly. And the responsiveness and breadth of gestures and controls in Jelly are already terribly behind what is now the main stream of web UI development. So I think plugin builders are, if they aren’t already, going to want better tools available to them.
      I also think that people are going to gravitate towards workflow or something similar. Since the UI for workflow is foremost a script, making a GUI for a plugin that works with it might be a fundamentally different beast.  ...depending on what the plugin is trying to do… So again, new plugins or even upgrading existing plugins to work with workflow are likely want a new technology set, not just because the existing Jenkins GUI is changing, but because new plugins will want to do different and better stuff.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Are there connectors for other source control tools like CVS and Dimensions?&lt;/b&gt;&lt;br/&gt;
I am not sure exactly which connector plugins are already supporting Workflow or how deeply that support goes. Because Jenkins has plugins that provide access to these SCMs, you can use workflow to go and fetch those source trees. A greater level of support for workflow from these plugins would mean a more elegant workflow syntax for that interaction. At the moment, my GUI script builder is still fiction. My plan would be to add GUI buttons for whatever are the most popular SCMs and I will attempt to mask the syntax regardless of its clumsiness.
….the way I am constructing my initial prototype, there is already a reasonably clear extension point for adding buttons that generate some chunk of Groovy syntax when it is dragged into a stage. So I will add the initial set based on community feedback and then the community can continue to add their own.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
 What are the compatibility issues existing plugin developers needs to be aware of?&lt;/b&gt;&lt;br/&gt;
For plugins that interact with freestyle jobs, or really most job types that aren’t workflow, plugin developers should expect the page DOM structure to change. If for whatever reason, they find they are busting into some custom script to traverse the DOM to compare 1 setting to another, that will break.
    Also, hudson-behaviors.js itself has a number of functions in it that do DOM traversing, like “findFollowingTR”. In some cases the signatures of those functions might need to change and the DOM structure that they return might also change. If a plugin uses what were meant to have been internal functions, they are likely to break.
    Finally, the page geometry is going to change. This may seem so superficial and obvious that, who cares, but sometimes changing a column width translates into an important part of a GUI being hidden or otherwise inaccessible. That ends up being as critical a break as any other.

...so to combat these points of possible breakage, we are going to be looking for a handful somewhere between 20 and 100 plugins that we will want to test against. We haven’t made that list yet, let alone run any tests, so that is really a critical next step.

For the plugin manager changes, I don’t see much if any of a braking issue, although I would like to add additional sorting and display power to the GUI, which means the GUI will need more metadata than currently exists, if the plugins want to take advantage of that new power in the GUI. This won’t break things, but plugin authors might want to go back to their plugins and fill in whatever the new bits of metadata end up being…. most likely they would be things like, richer descriptions, better category selections, and possibly icons.

&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
I've not seen a lot of Jenkins but what I had I didn't really get, was awkward for all the reasons Gus mentioned.  This looks brilliant.  When can we have it?&lt;/b&gt;&lt;br/&gt;
Tom and I, and now our junior pledge, Keith (not actually junior at all, just more fit than me), are busily typing as fast as we can as well as lobbying the community that our vision is more or less a correct one. We have a very interesting initial plugin selection GUI that might make this years final LTS (which I did not demo), which is none-the-less a nice step forward for Jenkins. In it will be a lot of the JS library bundling that will enable most of what I have shown in this demo. Our hope is that with each LTS we will be able to push out an additional piece of the GUI puzzle. Likely starting with the job create and configure GUI, which would be the mid year LTS. I am hoping that a year from now this will be how Jenkins looks and acts.
….in the meantime, we are grappling with how best to push preview releases so people can play with it and send me hate mail.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
Is there any way to test front end of Jenkins plugins? And will that improve too?&lt;/b&gt;&lt;br/&gt;
A major and almost blocking portion of this work used to be the custom and somewhat broken version of HTMLUnit that was in core, which greatly hampered including libraries other than Prototype in Jenkins and writing code using those libraries in some sort of testable way. Our new approach to rebuilding the Jelly controls which are the foundation of the Jenkins config page and in general are shared by all plugins that need to post data back to Jenkins, already have a testing strategy backed into our design. Those Jelly form controls are extensible in Jenkins today and would remain so. Our hope would be that any plugin adding custom controls would follow our same design and test pattern we are building in core.
….so that was a long answer, but the short answer YES! Today, building GUI parts into your Jenkins plugin is a bit of a mystery, where most people copy something they saw someone else did, hack it, and the only test is, well…. it worked for me. That is no good and a fundamental piece we are looking to change.
….still a long answer… 
Node.js and Jasmine are the specific tools we using.

&lt;/li&gt;
&lt;li&gt;&lt;b&gt;
What's the estimated rollout date for this workflow feature?&lt;/b&gt;&lt;br/&gt;
The workflow feature is the newest concept I demonstrated, but in a lot of ways may also be the easiest to ship. As a script generator, exclusively, it could be hosted anywhere, and then you just paste your generated workflow script into the whatever existing Jenkins GUI better, submit into your source code.

….but at the moment, it isn’t actually on an official roadmap yet.
Assuming the response to it remain positive, I would expect that to change fairly quickly.
&lt;/li&gt;&lt;/ol&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ContinuousBlog/~4/1bEYowQlZ3w&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">627 at http://jenkins-ci.org</guid>
         <pubDate>Wed, 30 Sep 2015 03:12:30 +0000</pubDate>
      </item>
      <item>
         <title>Office hour on form handling in Jenkins</title>
         <link>http://feedproxy.google.com/~r/ContinuousBlog/~3/sA3lHpq334Q/office-hour-form-handling-jenkins</link>
         <description>&lt;p&gt;&lt;strong&gt;Update: This week's office hour has been canceled.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.timeanddate.com/worldclock/fixedtime.html?msg=Jenkins+Office+Hours&amp;amp;iso=20150923T11&amp;amp;p1=283&amp;amp;ah=1&quot;&gt;This Wednesday, Sep 23, at 11 am PDT&lt;/a&gt; I will host another office hour on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://stapler.kohsuke.org/&quot;&gt;Stapler&lt;/a&gt;, the web framework used in Jenkins. This time, I'll show you how structured form submission in Jenkins works, and how Stapler can help you with it.&lt;/p&gt;

&lt;p&gt;As usual, the office hour will use Hangout on Air, and a limited number of people will be able to join and participate. The others will be able to watch the office hour live on YouTube. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://wiki.jenkins-ci.org/display/JENKINS/Office+Hours&quot;&gt;Links to participate and watch will be posted before the event on the Office Hours wiki page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update: This week's office hour has been canceled.&lt;/strong&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ContinuousBlog/~4/sA3lHpq334Q&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">626 at http://jenkins-ci.org</guid>
         <pubDate>Sun, 20 Sep 2015 02:36:29 +0000</pubDate>
      </item>
      <item>
         <title>Office hour on proposed UI/UX changes</title>
         <link>http://feedproxy.google.com/~r/ContinuousBlog/~3/9EJkp50tNLY/office-hour-proposed-uiux-changes</link>
         <description>&lt;p&gt;Gus Reiber will host this week's office hour on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.timeanddate.com/worldclock/fixedtime.html?msg=Jenkins+Office+Hours&amp;amp;iso=20150909T11&amp;amp;p1=283&amp;amp;ah=1&quot;&gt;Wednesday, 11 AM PDT&lt;/a&gt;. He'll talk about some of the UI/UX improvements in Jenkins that he's working on, and will answer your questions about it.&lt;/p&gt;

&lt;p&gt;He's already given several talks about this, so you can check these out to learn more before the office hour:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/02-03-1400-reiber-fennelly&quot;&gt;JUC US East&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/europe/01-02-1400-fennelly-reiber&quot;&gt;JUC Europe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-02-1500&quot;&gt;JUC US West&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are also some mailing list threads where he's discussing his designs with the community:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/6BdWZt35dTQ&quot;&gt;February to April discussion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://groups.google.com/forum/#!msg/jenkinsci-dev/Tiz-LSqCJmg/3CuYzuBXJpsJ&quot;&gt;July discussion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The links to the Google Hangout (participate) and Youtube (watch live) &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://wiki.jenkins-ci.org/display/JENKINS/Office+Hours&quot;&gt;will be posted to the wiki before the event&lt;/a&gt;. If you don't get into the Hangout (limited number of participants), don't worry: You'll be able to send questions and suggestions to his &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://twitter.com/gusreiber&quot;&gt;Twitter account @gusreiber&lt;/a&gt;.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ContinuousBlog/~4/9EJkp50tNLY&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">625 at http://jenkins-ci.org</guid>
         <pubDate>Mon, 07 Sep 2015 15:53:01 +0000</pubDate>
      </item>
      <item>
         <title>Jenkins User Conference West Day 1</title>
         <link>http://feedproxy.google.com/~r/ContinuousBlog/~3/pzqmRbNMYfw/jenkins-user-conference-west-day-1</link>
         <description>&lt;div style=&quot;float:right;margin:1em;&quot;&gt;
&lt;img src=&quot;https://pbs.twimg.com/media/CN6MLZnUsAAj0RD.jpg&quot; width=&quot;300&quot;/&gt;
&lt;/div&gt;

&lt;p&gt;
Boy, what a day! This is the 5th annual JUC in San Francisco bay area, and the crowd is getting bigger.

&lt;/p&gt;&lt;p&gt;
I brought the LEGO Jenkins + CloudBees logo mosaic that we built at the CloudBees San Jose office:

&lt;div align=&quot;center&quot;&gt;
&lt;img src=&quot;https://pbs.twimg.com/media/CN6Cid3UEAEx5xK.jpg&quot; width=&quot;500&quot;/&gt;
&lt;/div&gt; 

&lt;p&gt;
The community booth was very busy. We have people like Dean Yu (board), Andrew Bayer (board), Mark Waite (git), Jesse Glick (workflow and core), Daniel Beck (core), Vincent Latombe (literate), Steven Christou (subversion) and Owen Mehegan (community outreach) talking to people all day long.

&lt;/p&gt;&lt;p&gt;
If you are here, make sure to stop by, and if you are not, follow news with &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://twitter.com/search?q=%23jenkinsconf&quot;&gt;#jenkinsconf&lt;/a&gt;.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ContinuousBlog/~4/pzqmRbNMYfw&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">623 at http://jenkins-ci.org</guid>
         <pubDate>Thu, 03 Sep 2015 15:55:58 +0000</pubDate>
      </item>
      <item>
         <title>Take the 2015 Jenkins Survey!</title>
         <link>http://feedproxy.google.com/~r/ContinuousBlog/~3/gXe8ZYO2zok/take-2015-jenkins-survey</link>
         <description>&lt;p&gt;Just as in past years, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.surveymonkey.com/s/Jenkins2015&quot;&gt;we are running a survey&lt;/a&gt; this year, to get some objective insights into what our users would like to see in the Jenkins project. Obviously, the developers in the project deal with individual bug reports and feature requests all the time, but sometimes those day-to-day issues distract you from a bigger picture.&lt;/p&gt;

&lt;p&gt;This year, we kept some of the questions the same, so that we can see the trend over time. But we also wanted to bring in some questions around how you are using Jenkins and what other technologies you leverage such as Linux containers and cloud services.&lt;/p&gt;

&lt;p&gt;The survey will close at the end of September and, if you participate, you'll get to see the results first. CloudBees is sponsoring the survey and as an added incentive for us to fill it out, CloudBees has pitched in a $100 Amazon gift card (thanks CloudBees!). Information you submit is only going to be used by the community and not by CloudBees. So please take the survey and let your voice be heard.&lt;/p&gt;

&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blog.cloudbees.com/2015/09/jenkins-community-survey-your-chance-to.html&quot;&gt;Finally, there are laws that govern prize giveaways like this and Cloudbees has put up terms and conditions for this.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;h2&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.surveymonkey.com/s/Jenkins2015&quot;&gt;Take the survey here&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ContinuousBlog/~4/gXe8ZYO2zok&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">622 at http://jenkins-ci.org</guid>
         <pubDate>Tue, 01 Sep 2015 23:34:36 +0000</pubDate>
      </item>
      <item>
         <title>Jenkins CIA Program and Meetup Updates</title>
         <link>http://feedproxy.google.com/~r/ContinuousBlog/~3/NKucsG6HiDU/jenkins-cia-program-and-meetup-updates</link>
         <description>&lt;p&gt;A few years ago, the Jenkins community announced the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jenkins-ci.org/content/announcing-jenkins-cia&quot;&gt;Jenkins CIA program&lt;/a&gt; - the Continuous Integration Ambassador initiative to spread the word of Jenkins. As of recently, there hasn't been as much activity, so this program needs to be revived!&lt;/p&gt;

&lt;p&gt;There are over 120,000 active Jenkins installations now and that number just keeps climbing and climbing. It's important to bring all of us together through big events like the Jenkins User Conference, but not everyone can get there. That is why Meetups and smaller Jenkins events are crucial.&lt;/p&gt;

&lt;p&gt;To support this effort, CloudBees has announced that they will be sponsoring the kickoff of the CIA revival/&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jenkins-ci.org/content/bay-area-jenkins-area-meet-looking-you&quot;&gt;JAM&lt;/a&gt; to help the Jenkins community host these Meetups!&lt;/p&gt;

&lt;p&gt;To kick this off, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.meetup.com/jenkinsmeetup/events/225059665/&quot;&gt;the first Jenkins Area Meetup (JAM)&lt;/a&gt; is in the San Jose CloudBees office on &lt;strong&gt;Sept 23&lt;/strong&gt;. We are shooting to have a JAM everything 3rd Wednesday of every month to consistently bring the community together.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ContinuousBlog/~4/NKucsG6HiDU&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">621 at http://jenkins-ci.org</guid>
         <pubDate>Tue, 01 Sep 2015 01:21:32 +0000</pubDate>
      </item>
      <item>
         <title>Plugin Spotlight: Version Column Plugin</title>
         <link>http://feedproxy.google.com/~r/ContinuousBlog/~3/XdXpcfUlb1E/plugin-spotlight-version-column-plugin</link>
         <description>&lt;p&gt;Most Jenkins masters with a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://wiki.jenkins-ci.org/display/JENKINS/Distributed+builds&quot;&gt;distributed build&lt;/a&gt; configuration will leverage nodes that run a &lt;code&gt;slave.jar&lt;/code&gt; to start a slave agent. Regardless of whether the &lt;code&gt;slave.jar&lt;/code&gt; is launched through a Java Web Start or SSH launcher, the jar will be copied from &lt;code&gt;http://yourserver:port/jnlpJars/slave.jar&lt;/code&gt; to the build node. Keeping this jar up to date ensures that it picks up the newest features in a more recent release, such as the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jenkins-ci.org/content/your-java-web-start-slaves-will-be-always-clean&quot;&gt;self-restart feature&lt;/a&gt; to keep slave JVMs “clean” and to automatically reconnect to their master. Additionally, newer versions of this component may fix bugs or implement newer protocol versions with various improvements.&lt;/p&gt;

&lt;h2&gt;What is the Version Column Plugin?&lt;/h2&gt;

&lt;p&gt;Launch methods designed to pull the latest &lt;code&gt;slave.jar&lt;/code&gt; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://issues.jenkins-ci.org/browse/JENKINS-16490&quot;&gt;are not always reliable&lt;/a&gt; and some launch methods don’t even try to update the &lt;code&gt;slave.jar&lt;/code&gt;. Therefore it can be useful to see what &lt;code&gt;slave.jar&lt;/code&gt; version is running on a given build node and take offline any nodes which fails to update to the latest version of the jar.&lt;/p&gt;

&lt;p&gt;The Version Column Plugin allows Jenkins masters to do just this, adding a new column to the “Manage Nodes” view and a new option for version enforcement on the node configuration screen.&lt;/p&gt;

&lt;h2&gt;Getting started&lt;/h2&gt;

&lt;p&gt;After installing the Version Column Plugin, navigate to the list of nodes in your Jenkins instance by clicking &lt;em&gt;Build Executor Status&lt;/em&gt; in the executors widget below the side panel on the Jenkins home page.&lt;/p&gt;

&lt;p&gt;If the plugin installed successfully, you will see a new column simply called “Version”. This column displays the version of the &lt;code&gt;slave.jar&lt;/code&gt; that each build node is using.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot;/&gt;&lt;/p&gt;

&lt;p&gt;This column is simply displaying the versions, so enforcement of &lt;code&gt;slave.jar&lt;/code&gt; versions will need to be configured elsewhere. To activate this, click on the “Configure” link in the node manager’s left-hand menu.&lt;/p&gt;

&lt;p&gt;You will then see a set of options for slaves. To activate version enforcement, check the “Version” box and apply your changes.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot;/&gt;&lt;/p&gt;

&lt;p&gt;When you update Jenkins, there’s a chance it’ll come with a new version of &lt;code&gt;slave.jar&lt;/code&gt;. Now if the &lt;code&gt;slave.jar&lt;/code&gt; on a particular slave doesn’t get updated automatically, the master will take it offline and show a warning next to the out-of-date slave’s version number:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;&quot;/&gt;&lt;/p&gt;

&lt;p&gt;The Version Column Plugin is available for download in the Jenkins plugin manager or from &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://wiki.jenkins-ci.org/display/JENKINS/VersionColumn+Plugin&quot;&gt;its wiki page&lt;/a&gt;.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ContinuousBlog/~4/XdXpcfUlb1E&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">620 at http://jenkins-ci.org</guid>
         <pubDate>Tue, 01 Sep 2015 00:58:28 +0000</pubDate>
      </item>
      <item>
         <title>JUC Speaker Blog Series: Laurette Cisneros, JUC U.S. West</title>
         <link>http://feedproxy.google.com/~r/ContinuousBlog/~3/tECdm4qGn_M/juc-speaker-blog-series-laurette-cisneros-juc-us-west</link>
         <description>&lt;div style=&quot;float:right;margin:1em;&quot;&gt;
&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; width=&quot;114&quot; height=&quot;128&quot;&gt;
&lt;/div&gt;

&lt;p&gt;Last year's &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.cloudbees.com/event/juc/2014/san-francisco&quot;&gt;JUC West 2014&lt;/a&gt; was packed with good gems of information – such as &quot;how we did it&quot; talks where the speakers shared their points of view on the tools they use for automating their pipeline. At JUC and other conferences I especially seek out talks about how others implement their Continuous Delivery processes.   At the upcoming &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;JUC West 2015&lt;/a&gt;, it is my turn to share “how we did it” at Perforce. I will present my talk &quot;Continuous Delivery: Driving Lessons” and describe our journey, the rewards we reaped, and the challenges we faced along the way.&lt;/p&gt;

&lt;p&gt;At &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.perforce.com/&quot;&gt;Perforce&lt;/a&gt;, we see Continuous Delivery as taking the proven technique of automation and expanding it to a solid set of practices that make the pipeline even more efficient. This includes empowering the product teams to own production and quality all the way from requirements to delivery, and moving from a central build and release team to a self-serve infrastructure to remove the &quot;friction&quot; in the workflow. These changes have allowed us to quickly, efficiently and reliably adapt our software in line with user feedback, shifts in the market, and changes to the business strategy. &lt;/p&gt;

&lt;p&gt;I look forward to seeing you there!&lt;/p&gt;

&lt;div style=&quot;float:left;margin:1em;&quot;&gt;
&lt;img src=&quot;http://jenkins-ci.org/sites/default/files/images/cisneros_0.preview.jpg&quot; width=&quot;150&quot; height=&quot;224&quot;&gt;
&lt;/div&gt;

&lt;p&gt;This post is by Laurette Cisneros, Engineering Tools Manager at Perforce Software. If you have your ticket to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;JUC U.S. West&lt;/a&gt;, you can attend her talk &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-03-1500&quot;&gt;&quot;The Road to Continuous Delivery: Driving Lessons&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Still need your ticket to JUC? If you register with a friend you can get 2 tickets for the price of 1! &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;Register here for a JUC U.S. West, the last JUC of the year!&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Thank you to our &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&lt;/p&gt;

&lt;p&gt;&lt;/b&gt;&lt;/p&gt;

&lt;div style=&quot;float:left;margin:0em;&quot;&gt;
&lt;img src=&quot;http://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; width=&quot;598&quot; height=&quot;579&quot;&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/ContinuousBlog/~4/tECdm4qGn_M&quot; height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot;/&gt;</description>
         <guid isPermaLink="false">615 at http://jenkins-ci.org</guid>
         <pubDate>Mon, 31 Aug 2015 20:00:53 +0000</pubDate>
      </item>
      <item>
         <title>Jenkins' Maven job type considered evil</title>
         <link>http://javaadventure.blogspot.com/2013/11/jenkins-maven-job-type-considered-evil.html</link>
         <description>&lt;p&gt;There are two ways to build a Maven project with Jenkins*&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Use a free-style project with a Maven build step&lt;/li&gt;&lt;li&gt;Use a Maven-style project&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The first way runs the build as Maven intended. The second way adds a whole lot of hooks and can even modify the build in ways that Maven did not intend.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;The first way requires that you configure stuff yourself. The second way tries to “guess” what you want and auto-configure it.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;The first way is initially less user friendly, i.e. you have more UI to click through to get the full set of reports. The second way is initially more user friendly… but when things go wrong… well sorry out of luck.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;If something goes wrong with the first way, worst case you add a shell build step above the Maven build step that just runs SET, trigger a build, login to the build slave, switch to the user the build is running as, apply the environment your SET build step output and then run the Maven command that the build’s console log captured. That will give you an &lt;strong&gt;exact&lt;/strong&gt; reproduction of the Maven build and you can debug why your build is not working.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;When something goes wrong with the second way, well good luck. By all means try to do the same as you would for a free-style project, but at the end of the day, there is no way you can replicate the injected hooks that Jenkins puts into your Maven build. You can get an &lt;strong&gt;approximate&lt;/strong&gt; reproduction, and hey, that may just be enough to let you figure out what is wrong and fix your build… but there are cases where you cannot.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Hence why, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jenkins-ci.361315.n4.nabble.com/plugins-disabled-when-using-m2-build-td367093.html&quot;&gt;since 2007&lt;/a&gt;, I have been saying that the Maven job type is considered evil…&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;It has very attractive because is easy to configure (so users use it) and gives nice per-module reports&lt;/li&gt;&lt;li&gt;When it blows up, and it will blow up, it blows up big&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;-Stephen&lt;/p&gt;&lt;p&gt;* well actually three ways if you include the literate job type&lt;/p&gt;</description>
         <author>Stephen Connolly</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21580788.post-6112643894611190754</guid>
         <pubDate>Wed, 06 Nov 2013 10:44:00 +0000</pubDate>
      </item>
      <item>
         <title>Setting Gradle home directory and proxy in Jenkins</title>
         <link>http://jlorenzen.blogspot.com/2013/06/setting-gradle-home-directory-and-proxy.html</link>
         <description>Real quick. Spent the past few hours working around some nasty issues with &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.gradle.org/&quot;&gt;gradle&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jenkins-ci.org/&quot;&gt;jenkins&lt;/a&gt;. It seems due to a bug, the jenkins gradle plugin puts the dependency/artifact cache under the jobs workspace. This really isn't a good idea as every job would then download all of the projects artifacts taking up large amounts of space. At the same time, I also needed to setup the proxy information for gradle, which sadly doesn't reuse the jenkins proxy information.&lt;br /&gt;&lt;br /&gt;I was able to finally figure out a good place to define the gradle user home and proxy information in a single place to prevent each job from having to define it.&lt;br /&gt;&lt;br /&gt;Go into &lt;b&gt;Manage Jenkins&lt;/b&gt; &amp;gt; &lt;b&gt;Configure System&lt;/b&gt;. Under Global properties check Environment variables and fill in the following for name and value:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;name&lt;/b&gt;: GRADLE_OPTS&lt;br /&gt;&lt;b&gt;value&lt;/b&gt;: -Dgradle.user.home=/home/tomcat/.gradle -Dhttp.proxyHost=101.10.10.10 -Dhttp.proxyPort=3128&lt;br /&gt;&lt;br /&gt;For the gradle.user.home property, I tried using ~/.gradle, but that didn't work which means most likely my $HOME environment variable was not set for whatever reason. My guess is it has something to do with all the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://answers.bitnami.com/questions/12799/setting-up-jenkins-on-ec2-with-github-private-repository&quot;&gt;troubles&lt;/a&gt; I've had lately using the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bitnami.com/stack/jenkins/cloud/amazon&quot;&gt;bitnami jenkins amazon ami&lt;/a&gt;. I also tried setting the environment variable GRADLE_USER_HOME, but that didn't seem to work. Either way, hopefully this will help others.</description>
         <author>jlorenzen</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-1280619439915049383.post-6256123403234004856</guid>
         <pubDate>Fri, 28 Jun 2013 01:34:00 +0000</pubDate>
      </item>
      <item>
         <title>JenkinsMobi V4 Beta brings APK history on your Mobile</title>
         <link>http://jenkinsmobi.me/2013/04/24/jenkinsmobi-v4-beta-brings-apk-history-on-your-mobile/</link>
         <description>You can see your Jenkins build history and re-deploy the older APKs from your Mobile Phone ! This is particularly useful when you want to have multiple of version of your Mobile App to your QA or Beta Testers (just like you !) without having to redeploy or notify anyone: you can go back and [&amp;#8230;]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://pixel.wp.com/b.gif?host=jenkinsmobi.me&amp;#038;blog=12790565&amp;#038;post=281&amp;#038;subd=hudsonmobi&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jenkinsmobi.me/?p=281</guid>
         <pubDate>Wed, 24 Apr 2013 12:21:22 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://hudsonmobi.files.wordpress.com/2013/04/jenkinsmobi-v4-build-history.png"><img class=" wp-image-282 alignnone" style="border:0;" alt="jenkinsmobi-v4-build-history" src="http://hudsonmobi.files.wordpress.com/2013/04/jenkinsmobi-v4-build-history.png?w=600&#038;h=315" width="600" height="315"/></a></p>
<p>You can <strong>see your Jenkins build history</strong> and <span style="color:#0000ff;"><strong>re-deploy the older APKs from your Mobile Phone</strong></span> !</p>
<p>This is particularly useful when you want to have multiple of version of your Mobile App to your QA or Beta Testers (just like you !) without having to redeploy or notify anyone: you can go back and forth in a time-machine as many times you want !</p>
<p>Jenkins acts like a APK binary repository with full access to:</p>
<ul>
<li>Code changes</li>
<li>Unit-test executions</li>
<li>Console output</li>
</ul>
<p><a rel="nofollow" title="JenkinsMobi V4 Beta" target="_blank" href="http://jenkins-ci.mobi/#v4beta">Join JenkinsMobi V4 Beta now</a> and give your feedback today.</p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/hudsonmobi.wordpress.com/281/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hudsonmobi.wordpress.com/281/"/></a> <img alt="" border="0" src="http://pixel.wp.com/b.gif?host=jenkinsmobi.me&#038;blog=12790565&#038;post=281&#038;subd=hudsonmobi&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/7beef3a3c76d83b955c22d1aadd99aa9?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">hudsonmobi</media:title>
         </media:content>
         <media:content medium="image" url="http://hudsonmobi.files.wordpress.com/2013/04/jenkinsmobi-v4-build-history.png">
            <media:title type="html">jenkinsmobi-v4-build-history</media:title>
         </media:content>
      </item>
      <item>
         <title>JenkinsMobi V4 Beta and Assembla login</title>
         <link>http://jenkinsmobi.me/2013/04/18/jenkinsmobi-v4-beta-and-assembla-login/</link>
         <description>JenkinsMobi V4 Beta program continues with the support of Assembla SSO Login. Assembla.com is Cloud ALM that provides Project Workspaces, featuring project management software elements such as task management, issue tracking, cardwall (Kanban), agile project management, Git/Svn  repositories and scrum meetings. When you configure Jenkins with Assembla Auth Plugin the Jenkins Login process goes through the Assembla SSO Form-based login: this is now automatically [&amp;#8230;]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://pixel.wp.com/b.gif?host=jenkinsmobi.me&amp;#038;blog=12790565&amp;#038;post=277&amp;#038;subd=hudsonmobi&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jenkinsmobi.me/?p=277</guid>
         <pubDate>Thu, 18 Apr 2013 10:52:10 +0000</pubDate>
         <content:encoded><![CDATA[<p><strong><a rel="nofollow" target="_blank" href="http://hudsonmobi.files.wordpress.com/2013/04/assembla-logo.png"><img class="size-full wp-image-278 alignleft" style="padding:5px;" alt="assembla-logo" src="http://hudsonmobi.files.wordpress.com/2013/04/assembla-logo.png?w=595"/></a>JenkinsMobi V4 Beta program continues with the <span style="color:#ff0000;">support of Assembla SSO Login</span>.</strong></p>
<p><a rel="nofollow" title="Assembla ALM" target="_blank" href="http://assembla.com">Assembla.com</a> is Cloud ALM that provides Project Workspaces, featuring project management software elements such as task management, issue tracking, cardwall (Kanban), agile project management, Git/Svn  repositories and scrum meetings.</p>
<p>When you configure Jenkins with <a rel="nofollow" title="Assembla Auth Plugin" target="_blank" href="https://wiki.jenkins-ci.org/display/JENKINS/Assembla+Auth+Plugin">Assembla Auth Plugin</a> the Jenkins Login process goes through the Assembla SSO Form-based login: this is now automatically managed by JenkinsMobi V4 Beta.</p>
<p>As usual, everything is plug&amp;play: just enter your Assembla Credentials in the JenkinsMobi settings &#8230; and then play with JenkinsMobi V4 Beta !</p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/hudsonmobi.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hudsonmobi.wordpress.com/277/"/></a> <img alt="" border="0" src="http://pixel.wp.com/b.gif?host=jenkinsmobi.me&#038;blog=12790565&#038;post=277&#038;subd=hudsonmobi&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/7beef3a3c76d83b955c22d1aadd99aa9?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">hudsonmobi</media:title>
         </media:content>
         <media:content medium="image" url="http://hudsonmobi.files.wordpress.com/2013/04/assembla-logo.png">
            <media:title type="html">assembla-logo</media:title>
         </media:content>
      </item>
      <item>
         <title>Gerrit Code Review Hackathon in London – 7-9th of May 2013</title>
         <link>http://jenkinsmobi.me/2013/04/17/gerrit-code-review-hackathon-in-london-7-9th-of-may-2013/</link>
         <description>Originally posted on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://gitenterprise.me/2013/04/17/gerrit-code-review-hackathon-in-london-7-9th-of-may-2013/&quot;&gt;GitEnterprise&lt;/a&gt;:&lt;br /&gt;GerritForge is proud to organise the first European Gerrit Code Review Hackathon in London (UK) for three days: 7th, 8th and 9th of May 2013. The Hackathon is a great way to have the core Gerrit developer Team working side-by-side on some new exciting new features for the OpenSource community. Some of the major improvements in Gerrit&amp;#8230;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://pixel.wp.com/b.gif?host=jenkinsmobi.me&amp;#038;blog=12790565&amp;#038;post=275&amp;#038;subd=hudsonmobi&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jenkinsmobi.me/2013/04/17/gerrit-code-review-hackathon-in-london-7-9th-of-may-2013/</guid>
         <pubDate>Wed, 17 Apr 2013 17:52:57 +0000</pubDate>
         <content:encoded><![CDATA[<div class="wpcom-reblog-snapshot"><div class="reblogger-note"><p class="reblogger-headline"><img alt='' src='http://1.gravatar.com/avatar/7beef3a3c76d83b955c22d1aadd99aa9?s=32&#038;d=identicon&#038;r=G' class='avatar avatar-32' height='32' width='32'/><a rel="nofollow" target="_blank" href="http://jenkinsmobi.me/author/hudsonmobi/">hudsonmobi</a>:</p><div class='reblogger-note-content'><blockquote><p>Keep calm and Gerrit Code Review Hackathon</p>
</blockquote></div></div><div class="reblog-post"><p class="reblog-from"><img alt='' src='http://0.gravatar.com/avatar/c75db57f068c19901339c3a2dfc650e8?s=48&#038;d=identicon&#038;r=G' class='avatar avatar-48' height='48' width='48'/>Originally posted on <a rel="nofollow" target="_blank" href="http://gitenterprise.me/2013/04/17/gerrit-code-review-hackathon-in-london-7-9th-of-may-2013/">GitEnterprise</a>:</p><div class="reblogged-content">
<p><a rel="nofollow" target="_blank" href="http://gitenterprise.files.wordpress.com/2013/04/gerrit-hackathon.png"><img class="size-full wp-image-106 alignleft" style="border:0;" src="http://gitenterprise.files.wordpress.com/2013/04/gerrit-hackathon.png?w=595" alt="gerrit-hackathon"></a><strong><span style="color:#808080;">Ge<span style="color:#ff0000;">rri</span><span style="color:#008000;">t</span></span>Forge</strong> is proud to organise the first European <a rel="nofollow" target="_blank" href="http://gerritforge.com/gerrit-london-hackathon.html" title="Gerrit London Hackathon">Gerrit Code Review Hackathon in London (UK)</a> for three days:<span style="color:#ff0000;"><strong> 7th, 8th and 9th of May 2013</strong></span>.<br>
The Hackathon is a great way to have the <b>core Gerrit developer Team</b> working side-by-side on some new <b>exciting new features</b> for the OpenSource community. Some of the major improvements in Gerrit architecture and functionality came out from past Hackathons.</p>

<p>New exciting features are going to be proposed and implemented: see the Gerrit Hackathon topics and comments at <a rel="nofollow" target="_blank" href="http://gerritforge.com/gerrit-london-hackathon.html">http://gerritforge.com/gerrit-london-hackathon.html</a></p>
</div><p class="reblog-source"><a rel="nofollow" target="_blank" href="http://gitenterprise.me/2013/04/17/gerrit-code-review-hackathon-in-london-7-9th-of-may-2013/">View original</a></p></div></div><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/hudsonmobi.wordpress.com/275/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hudsonmobi.wordpress.com/275/"/></a> <img alt="" border="0" src="http://pixel.wp.com/b.gif?host=jenkinsmobi.me&#038;blog=12790565&#038;post=275&#038;subd=hudsonmobi&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/7beef3a3c76d83b955c22d1aadd99aa9?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">hudsonmobi</media:title>
         </media:content>
         <category>Uncategorized</category>
      </item>
      <item>
         <title>JenkinsMobi V4 and Google Authenticator support</title>
         <link>http://jenkinsmobi.me/2013/04/15/jenkinsmobi-v4-and-google-authenticator-support/</link>
         <description>When you configure Jenkins with OpenID SSO, the authentication phase goes through an external web-site (GitHub, Google or others) for authenticating your credentials: when authentication succeded, Jenkins gives you a Session-ID to continue using the API until the session expires. From JenkinsMobi V4.6.1 (see how to upgrade from JenkinsMobi home screen) you can even automatically [&amp;#8230;]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://pixel.wp.com/b.gif?host=jenkinsmobi.me&amp;#038;blog=12790565&amp;#038;post=263&amp;#038;subd=hudsonmobi&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jenkinsmobi.me/?p=263</guid>
         <pubDate>Mon, 15 Apr 2013 14:13:11 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://hudsonmobi.files.wordpress.com/2013/04/google-authenticator.png"><img class="size-full wp-image-264 alignleft" alt="" src="http://hudsonmobi.files.wordpress.com/2013/04/google-authenticator.png?w=595"/></a><br />
When you configure <strong>Jenkins with OpenID SSO</strong>, the authentication phase goes through an external web-site (GitHub, Google or others) for authenticating your credentials: when authentication succeded, Jenkins gives you a Session-ID to continue using the API until the session expires.</p>
<p>From <strong>JenkinsMobi V4.6.1</strong> (<a rel="nofollow" title="JenkinsMobi V4 auto-upgrade" target="_blank" href="https://www.facebook.com/media/set/?set=a.560011137363334.1073741826.142802995750819&amp;type=1&amp;l=5ad62c5ce4">see how to upgrade from JenkinsMobi home screen</a>) you can even automatically manage a <a rel="nofollow" title="Google 2-step authentication" target="_blank" href="http://support.google.com/accounts/bin/answer.py?hl=en&amp;answer=180744&amp;topic=1099588&amp;ctx=topic">2-step SSO Authentication with your Google Account</a> and <a rel="nofollow" title="Google Authenticator" target="_blank" href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Google Authenticator</a>.</p>
<p><a rel="nofollow" target="_blank" href="http://hudsonmobi.files.wordpress.com/2013/04/jenkinsmobi-google-authenticator.png"><img class="alignnone  wp-image-267" alt="jenkinsmobi-google-authenticator" src="http://hudsonmobi.files.wordpress.com/2013/04/jenkinsmobi-google-authenticator.png?w=600&#038;h=237" width="600" height="237"/></a></p>
<ol>
<li>Edit your JenkinsMobi settings and put your Jenkins URL and SSO username and password.</li>
<li>Whenever your Google SSO request a 2-step authentication, you will see a pop-up asking to enter your one-time verification code</li>
<li>Tap on &#8220;Auth App&#8221; to jump directly to Google Authenticator</li>
<li>Read the verification code and tap on the &#8220;back&#8221; button of your Android phone</li>
<li>Enter the verification code and tap Verify</li>
<li>JenkinsMobi contacts Google SSO and enters again your SSO credentials and one-time verfication code</li>
</ol>
<p>Your authenticated session will last for the time-to-live of Jenkins Session: should the session be disconnected, you would need to go through the Google SSO and 2-step verification again.</p>
<p>Enjoy <span style="color:#ff0000;"><strong>JenkinsMobi with Google Authenticator</strong> </span>securely over the Internet <span class='wp-smiley wp-emoji wp-emoji-smile' title=':-)'>:-)</span></p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/hudsonmobi.wordpress.com/263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hudsonmobi.wordpress.com/263/"/></a> <img alt="" border="0" src="http://pixel.wp.com/b.gif?host=jenkinsmobi.me&#038;blog=12790565&#038;post=263&#038;subd=hudsonmobi&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/7beef3a3c76d83b955c22d1aadd99aa9?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">hudsonmobi</media:title>
         </media:content>
         <media:content medium="image" url="http://hudsonmobi.files.wordpress.com/2013/04/google-authenticator.png"/>
         <media:content medium="image" url="http://hudsonmobi.files.wordpress.com/2013/04/jenkinsmobi-google-authenticator.png">
            <media:title type="html">jenkinsmobi-google-authenticator</media:title>
         </media:content>
      </item>
      <item>
         <title>JenkinsMobi V4 Beta: OpenID certified</title>
         <link>http://jenkinsmobi.me/2013/04/10/jenkinsmobi-v4-beta-openid-certified/</link>
         <description>&amp;#160; &amp;#160; Thanks to the first feedback of the JenkinsMobi V4 Beta, today we have certified JenkinsMobi with OpenID: you don&amp;#8217;t have to do anything, just insert your OpenID credentials in the JenkinsMobi V4 settings and, if you have Jenkins-OpenID SSO, everything will magically works :-) &amp;#160;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://pixel.wp.com/b.gif?host=jenkinsmobi.me&amp;#038;blog=12790565&amp;#038;post=259&amp;#038;subd=hudsonmobi&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jenkinsmobi.me/?p=259</guid>
         <pubDate>Wed, 10 Apr 2013 19:18:59 +0000</pubDate>
         <content:encoded><![CDATA[<p><img class="alignleft" alt="" src="http://openid.net/wordpress-content/themes/openid/images/logo_openid.png" width="120" height="41"/></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Thanks to the first feedback of the JenkinsMobi V4 Beta, today we have certified JenkinsMobi with OpenID: you don&#8217;t have to do anything, just insert your OpenID credentials in the JenkinsMobi V4 settings and, if you have Jenkins-OpenID SSO, everything will magically works <span class='wp-smiley wp-emoji wp-emoji-smile' title=':-)'>:-)</span></p>
<p>&nbsp;</p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/hudsonmobi.wordpress.com/259/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hudsonmobi.wordpress.com/259/"/></a> <img alt="" border="0" src="http://pixel.wp.com/b.gif?host=jenkinsmobi.me&#038;blog=12790565&#038;post=259&#038;subd=hudsonmobi&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/7beef3a3c76d83b955c22d1aadd99aa9?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">hudsonmobi</media:title>
         </media:content>
         <media:content medium="image" url="http://openid.net/wordpress-content/themes/openid/images/logo_openid.png"/>
      </item>
      <item>
         <title>JenkinsMobi V4 Beta program: Open for feedback</title>
         <link>http://jenkinsmobi.me/2013/04/09/jenkinsmobi-v4-beta-program-open-for-feedback/</link>
         <description>JenkinsMobi V4 Beta program is officially started !  Follow the the four simple steps described at http://jenkins-ci.mobi/#v4beta and starting exploring the new possibility and provide your feedback on the new JenkinsMobi V4 Architecture.&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://pixel.wp.com/b.gif?host=jenkinsmobi.me&amp;#038;blog=12790565&amp;#038;post=256&amp;#038;subd=hudsonmobi&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jenkinsmobi.me/?p=256</guid>
         <pubDate>Tue, 09 Apr 2013 18:22:48 +0000</pubDate>
         <content:encoded><![CDATA[<p><span style="color:#ff0000;"><strong>JenkinsMobi V4 Beta program is officially started ! </strong></span></p>
<p>Follow the the four simple steps described at <a rel="nofollow" title="JenkinsMobi V4 Beta" target="_blank" href="http://jenkins-ci.mobi/#v4beta">http://jenkins-ci.mobi/#v4beta</a> and starting exploring the new possibility and <a rel="nofollow" target="_blank" href="http://jenkins-ci.mobi/#support">provide your feedback</a> on the new JenkinsMobi V4 Architecture.</p>
<p><img class="alignleft" alt="" src="http://jenkins-ci.mobi/images/v4_screenshot_1.png" width="192" height="288"/><img class="alignleft" alt="" src="http://jenkins-ci.mobi/images/v4_screenshot_2.png" width="192" height="288"/><img class="alignleft" alt="" src="http://jenkins-ci.mobi/images/v4_screenshot_3.png" width="192" height="288"/><img class="alignleft" alt="" src="http://jenkins-ci.mobi/images/v4_screenshot_4.png" width="192" height="288"/></p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/hudsonmobi.wordpress.com/256/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hudsonmobi.wordpress.com/256/"/></a> <img alt="" border="0" src="http://pixel.wp.com/b.gif?host=jenkinsmobi.me&#038;blog=12790565&#038;post=256&#038;subd=hudsonmobi&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/7beef3a3c76d83b955c22d1aadd99aa9?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">hudsonmobi</media:title>
         </media:content>
         <media:content medium="image" url="http://jenkins-ci.mobi/images/v4_screenshot_1.png"/>
         <media:content medium="image" url="http://jenkins-ci.mobi/images/v4_screenshot_2.png"/>
         <media:content medium="image" url="http://jenkins-ci.mobi/images/v4_screenshot_3.png"/>
         <media:content medium="image" url="http://jenkins-ci.mobi/images/v4_screenshot_4.png"/>
      </item>
      <item>
         <title>JenkinsMobi v4 showcase @33rdDegreeConf in Warsaw</title>
         <link>http://jenkinsmobi.me/2013/03/14/jenkinsmobi-v4-showcase-33rddegreeconf-in-warsaw/</link>
         <description>JenkinsMobi v4 has been showcased in Wasaw yesterday, during the 33rd Degree Conference for Java Developers. SmartPhones and Tablets have revolutionised the way we think, write and use software: software development on Mobile has and need to be agile &amp;#8230; but how can you make one step further and have actually your SmartPhone to drive [&amp;#8230;]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://pixel.wp.com/b.gif?host=jenkinsmobi.me&amp;#038;blog=12790565&amp;#038;post=251&amp;#038;subd=hudsonmobi&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jenkinsmobi.me/?p=251</guid>
         <pubDate>Thu, 14 Mar 2013 14:42:55 +0000</pubDate>
         <content:encoded><![CDATA[<p style="text-align:center;"></p>
<p><span style="color:#ff0000;"><strong>JenkinsMobi v4 has been showcased in Wasaw yesterday</strong></span>, during the <a rel="nofollow" title="33rd Degree Conference for Java Developers" target="_blank" href="http://2013.33degree.org">33rd Degree Conference for Java Developers</a>.</p>
<p>SmartPhones and Tablets have <strong>revolutionised the way we think, write and use software</strong>: software development on Mobile has and need to be agile &#8230; but how can you make one step further and have actually your SmartPhone to drive your development ?</p>
<p>Thanks to Jenkins, can Mobile App development and Continuous Delivery be pushed to the edges?</p>
<p>See how you can follow every step of your development with your SmartPhone end-to-end:</p>
<ul>
<li>Continuous Integration and Delivery with Jenkins</li>
<li>Beta notification and distribution to all Mobile stakeholders</li>
<li>Test execution</li>
<li>Issue tracking</li>
<li>Production monitoring</li>
</ul>
<p>This is a new dimension for the Jenkins eco-system: you will be able to write your plugins to do even more to shorted your continuous application development, testing and deployment.</p>
<p><span style="color:#0000ff;"><strong>Beta testing will start shortly &#8230; stay tuned <span class='wp-smiley wp-emoji wp-emoji-smile' title=':-)'>:-)</span></strong></span></p>
<div style="margin-bottom:5px;"><b> </b></div><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/hudsonmobi.wordpress.com/251/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hudsonmobi.wordpress.com/251/"/></a> <img alt="" border="0" src="http://pixel.wp.com/b.gif?host=jenkinsmobi.me&#038;blog=12790565&#038;post=251&#038;subd=hudsonmobi&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/7beef3a3c76d83b955c22d1aadd99aa9?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">hudsonmobi</media:title>
         </media:content>
      </item>
      <item>
         <title>JenkinsMobi v4 is coming at 33rd Degree Conference in Warsaw</title>
         <link>http://jenkinsmobi.me/2013/03/05/jenkinsmobi-v4-is-coming-at-33rd-degree-conference-in-warsaw/</link>
         <description>JenkinsMobi v4 is the Mobile Engine that powers the 33rd Degree Conference ! The long wait is over &amp;#8230; JenkinsMobi has been completely rewritten and will be officially launched next week, 13-15 March  during the 33rd Degree Conference for Java Developers in Warsaw PL. We will show the new architecture of JenkinsMobi, designed to completely revolutionize the way [&amp;#8230;]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://pixel.wp.com/b.gif?host=jenkinsmobi.me&amp;#038;blog=12790565&amp;#038;post=232&amp;#038;subd=hudsonmobi&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://hudsonmobi.wordpress.com/?p=232</guid>
         <pubDate>Tue, 05 Mar 2013 23:33:26 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://hudsonmobi.files.wordpress.com/2013/03/diuk.png"><img class="wp-image-233 alignleft" alt="diuk" src="http://hudsonmobi.files.wordpress.com/2013/03/diuk.png?w=307&#038;h=307" width="307" height="307"/></a><span style="color:#ff0000;"><strong>JenkinsMobi v4 is the Mobile Engine that powers the 33rd Degree Conference !</strong></span></p>
<p>The long wait is over &#8230; <strong><span style="color:#333399;">JenkinsMobi has been completely rewritten</span></strong> and will be officially launched next week, 13-15 March  during the <a rel="nofollow" title="33rd Degree Conference" target="_blank" href="http://2013.33degree.org">33rd Degree Conference for Java Developers in Warsaw PL</a>.</p>
<p>We will show the new architecture of JenkinsMobi, designed to completely revolutionize the way to organise your <a rel="nofollow" title="Mobile Application Lifecycle" target="_blank" href="http://2013.33degree.org/talk/show/84">Mobile Application Development lifecycle</a>, from the Continuous Integration to Deployment, QA and management of your Production instances in the Cloud.</p>
<p>Follow the <a rel="nofollow" title="Mobile Application Development Lifecycle" target="_blank" href="http://2013.33degree.org/talk/show/84">JenkinsMobi v4 talk</a> and change the way you manage your Mobile Apps from TODAY !</p>
<p>JenkinsMobi v4 is available for preview as the official App of the 33rd Degree Conference: <a rel="nofollow" title="33rd Degree Conference" target="_blank" href="https://play.google.com/store/apps/details?id=com.lmitsoftware.app33degree"><strong>DOWNLOAD NOW</strong></a> at  or <span style="color:#333399;"><strong>scan the following QR Code</strong></span>.</p>
<h2 style="text-align:center;"><span style="color:#ff0000;">JenkinsMobi is back ! <span class='wp-smiley wp-emoji wp-emoji-smile' title=':-)'>:-)</span></span></h2>
<p><a rel="nofollow" target="_blank" href="http://hudsonmobi.files.wordpress.com/2013/03/jenkinsmobi-qr.png"><img class="size-full wp-image-240 aligncenter" alt="jenkinsmobi-qr" src="http://hudsonmobi.files.wordpress.com/2013/03/jenkinsmobi-qr.png?w=595"/></a></p>
<h2 style="text-align:right;"></h2><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/hudsonmobi.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hudsonmobi.wordpress.com/232/"/></a> <img alt="" border="0" src="http://pixel.wp.com/b.gif?host=jenkinsmobi.me&#038;blog=12790565&#038;post=232&#038;subd=hudsonmobi&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/7beef3a3c76d83b955c22d1aadd99aa9?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">hudsonmobi</media:title>
         </media:content>
         <media:content medium="image" url="http://hudsonmobi.files.wordpress.com/2013/03/diuk.png">
            <media:title type="html">diuk</media:title>
         </media:content>
         <media:content medium="image" url="http://hudsonmobi.files.wordpress.com/2013/03/jenkinsmobi-qr.png">
            <media:title type="html">jenkinsmobi-qr</media:title>
         </media:content>
      </item>
      <item>
         <title>The Cross-Build Injection Attack Fallacy</title>
         <link>http://javaadventure.blogspot.com/2012/10/the-cross-build-injection-attack-fallacy.html</link>
         <description>&lt;p style=&quot;text-align:center;&quot;&gt;This is a repost of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://developer-blog.cloudbees.com/2012/10/the-cross-build-injection-attack-fallacy.html&quot;&gt;my post on the CloudBees Developers blog&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;TL;DR Source control injection attacks are a bigger worry than build tool injection attacks, and if you cannot trust your local filesystem, then you cannot trust anything.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;A few exchanges on twitter have prompted me to write a fuller blog post on the subject of Cross-Build Injection (XBI) Attacks.&lt;/p&gt;&lt;p&gt;The idea of XBI is that you trick the developer and replace parts of their code with your code, thereby getting your code to be trusted by the developer.&lt;/p&gt;&lt;p&gt;I do not object to the theory of XBI. But let's get real for a minute. Ultimately &lt;strong&gt;all&lt;/strong&gt; the XBI attacks rely on a compromised local file system.&lt;/p&gt;&lt;p&gt;I am not saying that you cannot apply these attacks to remote systems and then have those affect developers with un-compromised local file systems.&lt;/p&gt;&lt;p&gt;I am saying that when you fix any remote vectors, you still end up victim of the local file system integrity.&lt;/p&gt;&lt;p&gt;Take for example &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://branchandbound.net/blog/security/2012/10/cross-build-injection-in-action/&quot;&gt;this attack vector using Maven as an example victim build tool&lt;/a&gt;. How does the attack work? Well it replaces a good artifact in the Maven local repository with a bad version… and bad things happen.&lt;/p&gt;&lt;p&gt;For this attack to work &lt;em&gt;for real&lt;/em&gt; you need to have your local file system compromised. Is that attack specific to Maven? Nope. You can get your &lt;span style=&quot;font-family:Courier;font-size:12px;&quot;&gt;$ANT_HOME/lib&lt;/span&gt; folder contents compromised just as easily (i.e. if your local file system cannot be trusted to hold your local repository, it cannot be trusted to hold your build tool) Same too applies to Gradle, Make, MSBuild, etc.&lt;/p&gt;&lt;p&gt;How do we prevent the attack? Well for quite some time the central repository has only been publishing artifacts with GPG signatures. So we could verify the GPG signature before each and every build… &lt;strong&gt;but&lt;/strong&gt; those signatures are stored on the file system too, so we cannot trust them… &lt;strong&gt;and&lt;/strong&gt; our GPG checking code is stored on the filesystem also… so we cannot trust that! Never mind that such checks would slow every build down - increasing the risk of the developer being knocked out of “the zone”.&lt;/p&gt;&lt;p&gt;The reality of “the zone” is often lost on people. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://books.google.ie/books/about/Cognitive_aspects_of_computer_supported.html?id=aOdQAAAAMAAJ&amp;amp;redir_esc=y&quot;&gt;Working memory is only able to retain information for a couple of seconds at a time&lt;/a&gt; and therefore any interruptions can be fatal to problem solving processes. Software development is one continuous problem solving process after another. If you add 5 seconds to every build, then that is 5 seconds of temptation for the developer to check their email / reddit / stackoverflow / etc. And then they will have to rebuild the context of the problem they were solving. In some cases, this can correspond to up to 45-50 minutes of zero productivity for the developer (I cannot find the link, but I have personal experiences that confirm this).&lt;/p&gt;&lt;p&gt;Good developers that recognise this problem will therefore seek to reduce build time to the minimum… therefore turning off any GPG or other integrity checks, etc. If you ask them why, they will probably respond with something like:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Well if I cannot trust the local filesystem, sure I cannot trust the SCM or the signature checks to even run in the first place. I'm reclaiming those 5 seconds on every build and being more productive.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;What is the solution? Simple. Don't do the checks until you are making the release build! Better yet do the release builds from a continuous integration server such as &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.jenkins-ci.org&quot;&gt;Jenkins&lt;/a&gt;. You can lock that down, have it do the checks for you, and have it sign the resultant artifacts… but just be sure that you trust its filesystem and your source control system too!&lt;/p&gt;</description>
         <author>Stephen Connolly</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21580788.post-6998166078422917682</guid>
         <pubDate>Tue, 09 Oct 2012 10:18:00 +0000</pubDate>
      </item>
      <item>
         <title>Do you want to become a Maven Committer?</title>
         <link>http://javaadventure.blogspot.com/2012/07/do-you-want-to-become-maven-committer.html</link>
         <description>&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif;font-size:14px;line-height:21px;&quot;&gt;&lt;i&gt;Hamlet:&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;background-color:white;font-family:'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif;font-size:14px;line-height:21px;&quot;&gt;... for there is nothing either good or&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color:white;font-family:'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif;font-size:14px;line-height:21px;&quot;&gt;bad, but thinking makes it so.&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style=&quot;text-align:right;&quot;&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif;&quot;&gt;&lt;span style=&quot;background-color:white;font-size:14px;line-height:21px;&quot;&gt;&lt;i&gt;Hamlet Act 2, scene 2, 239–251&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif;&quot;&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style=&quot;text-align:right;&quot;&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif;&quot;&gt;&lt;span style=&quot;background-color:white;font-size:14px;line-height:21px;&quot;&gt;William Shakespeare&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-family:'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;The &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.apache.org/&quot;&gt;Apache Software Foundation&lt;/a&gt; is a&amp;nbsp;meritocracy. By this we mean that you gain status based on the merit of your work and actions. In fact the status that you gain is a recognition of the merit of your work and actions.&lt;br /&gt;&lt;br /&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maven.apache.org/&quot;&gt;Maven&lt;/a&gt; is an Apache project, that means that we have to follow the Apache rules and way. One of those rules is that we cannot hand out commit access to anyone who asks for it.&lt;br /&gt;&lt;br /&gt;To gain commit access you must establish your merit by submitting patches that get picked up by existing committers.&lt;br /&gt;&lt;br /&gt;After you have contributed enough patches to establish merit, the project management committee decides whether you can be trusted with commit access.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;background:rgb(220,220,220);border:1px solid black;float:right;margin:2px;padding:2px;width:50%;&quot;&gt;&lt;h4&gt;      Is this a good way to manage commit access?&lt;/h4&gt;There was a reason for the Hamlet quote that I opened this post with.&lt;br /&gt;&lt;br /&gt;Other communities can do things differently, for example the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jenkins-ci.org/&quot;&gt;Jenkins&lt;/a&gt; project which I am also involved with gives out commit access to anyone who cares to ask for it... but commit access to core requires completing some paperwork, and access to infrastructure requires that you establish your merit.&lt;br /&gt;&lt;br /&gt;Which is better? It all depends on who is asking and what they mean by better.&lt;br /&gt;&lt;br /&gt;The reality is that &quot;It is what it is&quot;&lt;/div&gt;&lt;i&gt;TL;DR To become a Maven committer write good patches and get them applied.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;      What makes a good patch?&lt;/h3&gt;A good patch is a patch that applies cleanly and includes tests that cover both the positive and negative case and has documentation where relevant.&lt;br /&gt;&lt;br /&gt;For example, if you were implementing a patch to fix &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jira.codehaus.org/browse/MNG-4612&quot;&gt;MNG-4612&lt;/a&gt;&amp;nbsp;you would first need to write a test case that is failing when trying to encrypt&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;{DESede}y+qq...==&lt;/span&gt;&lt;/blockquote&gt;and a second test case that is passing when trying to encrypt&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;password&lt;/span&gt;&lt;/blockquote&gt;This is in order to be sure that you have written an effective test case that can pass for good data. Then you implement the fix and all the tests should pass. You then take a Subversion compatible&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=21580788#svn&quot;&gt;&lt;sup&gt;†&lt;/sup&gt;&lt;/a&gt; diff of the source code and attach that to the issue in question.&lt;br /&gt;&lt;br /&gt;To understand how your patch gets evaluated, here is how I apply patches:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style=&quot;background-color:white;&quot;&gt;I look at the actual diff, if there is a whole lot of formatting changes irrelevant to the issue being fixed =&amp;gt; &lt;/span&gt;&lt;b style=&quot;background-color:white;&quot;&gt;Patch is no good, ask on JIRA for a clean patch&lt;/b&gt;&lt;/li&gt;&lt;li&gt;I look at the list of files in the diff, if there are no tests =&amp;gt; &lt;b&gt;Patch is no good, ask on JIRA for test cases&lt;/b&gt;&lt;/li&gt;&lt;li&gt;I look at the issue and if the issue requires documentation be updated and there is no documentation changes in the patch =&amp;gt; &lt;b&gt;Patch is no good, ask on JIRA for documentation changes in the patch&lt;/b&gt;&lt;/li&gt;&lt;li&gt;I take a clean checkout of the source that the patch applies to and try to apply the patch... if it does not apply clean =&amp;gt; &lt;b&gt;Patch is no good, ask on JIRA for an updated patch&lt;/b&gt;&lt;/li&gt;&lt;li&gt;I revert the src/main and run the tests. If the tests all pass, then there are no test cases to catch the bug =&amp;gt; &lt;b&gt;Patch is no good, ask on JIRA for proper tests&lt;/b&gt;&lt;/li&gt;&lt;li&gt;I revert src and run the tests. If any tests fail, then there is something wrong with the existing code =&amp;gt; &lt;b&gt;If I have time I might try and fix the issue, otherwise I just move on&lt;/b&gt;&lt;/li&gt;&lt;li&gt;I apply the patch a second time and run the tests. If the tests all pass =&amp;gt; &lt;b&gt;Patch is good, I commit the patch and mark the JIRA as resolved.&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;So there you have it, my guide to writing good patches... now the next step is getting your patches noticed...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;      How to get your patches noticed&lt;/h3&gt;&lt;div&gt;The simplest way to get your patches noticed is to submit them to the JIRA issue that they fix.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Remember that the Maven project is run by volunteers in their spare time, so very often we may not notice your patch for a few days.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you are certain that your patch is a good patch, and a week has passed with no comments on JIRA, then you should send &lt;i&gt;one and only one&lt;/i&gt; email to the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;mailto:dev@maven.apache.org&quot;&gt;dev@maven.apache.org&lt;/a&gt; mailing list to see if your patch can get noticed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Note:&lt;/b&gt;&amp;nbsp;you need to be fairly confident that your patch is a good patch, because if you keep on pestering the Maven developers looking to have non-good patches applied, your merit will become negative and people will be less&amp;nbsp;inclined to help you get your patches applied... also this is why you should send one and &lt;i&gt;only one&lt;/i&gt; email&amp;nbsp;about your patch on any specific JIRA issue.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;      Stephen, Arnaud &amp;amp; Barrie's school for potential Maven committers&lt;/h3&gt;&lt;div&gt;To help people who are interested in becoming Maven committers&amp;nbsp;fulfill their goals, myself, Arnaud Heritier and Barrie Treloar (along with any other current Maven committers who decide to help) will be running an assignment based class to help people become committers.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To register for the class you need to complete the following steps:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;span style=&quot;background-color:white;&quot;&gt;Read the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.apache.org/licenses/icla.txt&quot;&gt;Apache Individual Contributor License Agreement&lt;/a&gt;. When you graduate from the class you will be required to sign this in order to become a committer. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color:white;&quot;&gt;Subscribe to the&amp;nbsp;&lt;/span&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;mailto:dev@maven.apache.org&quot;&gt;dev@maven.apache.org&lt;/a&gt;&amp;nbsp;mailing list.&lt;/li&gt;&lt;li&gt;Send an email to the list with the Subject line: &lt;br /&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;[Committer School] I would like to become a committer&lt;/span&gt;&lt;br /&gt;and the Message body:&lt;br /&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;I am interested in the following areas:&lt;br /&gt;&amp;nbsp; &lt;i&gt;_______,&lt;/i&gt;&amp;nbsp;_______ and ______&lt;br /&gt;&lt;br /&gt;If anyone knows any issues that I could take a look at I would be very much appreciated&lt;br /&gt;&lt;br /&gt;Thanks&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Once you have registered your class assignments are basically to find JIRA issues that you want to fix. The issues can be in any part of Maven, but it is best to start with the areas you have the most interest in. Once you have found a JIRA issue that you are interested in fixing, the process will work a little something like this:&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Make sure that nobody else is working on the issue and that the issue is one that should be fixed by sending an email to the list with a Subject line something like:&lt;br /&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;[Committer School] Should I fix MNG-4612?&lt;/span&gt;&lt;br /&gt;The Message body should be something like:&lt;br /&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;I have had a look at MNG-4612 and I think this is a real issue because...&lt;br /&gt;&lt;br /&gt;I think I can fix it like so....&lt;br /&gt;&lt;br /&gt;Is that the correct way to go about fixing it and is it a real issue at all&lt;br /&gt;&lt;br /&gt;Thanks&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Wait a couple of days. Arnaud, Barrie and I will do our best to respond quickly to all such emails, but please keep in mind that we are doing this in our spare time.&amp;nbsp;&lt;/li&gt;&lt;li&gt;If you get the all clear, develop your patch and upload it to the JIRA, after it is uploaded, send an email to the list with a subject line something like:&lt;br /&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;[Committer School] Patch for review: MNG-4612&lt;/span&gt;&lt;br /&gt;The Message body should be something like:&lt;br /&gt;&lt;span style=&quot;font-family:'Courier New', Courier, monospace;&quot;&gt;I have tested that this is a good patch and I would appreciate if a committer could review and apply&lt;br /&gt;&lt;br /&gt;Thanks&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span style=&quot;font-family:inherit;&quot;&gt;Keep in mind that the Committer School is just a way for us to identify people who are committed to developing patches with a view to eventually becoming committers.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family:inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family:inherit;&quot;&gt;When we have enough evidence that we think we can get you accepted as a committer we will nominate you and hopefully your nomination will be accepted.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Personally, if I see somebody averaging a good patch a week for 2-3 months&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://draft.blogger.com/blogger.g?blogID=21580788#rate&quot;&gt;&lt;sup&gt;‡&lt;/sup&gt;&lt;/a&gt; and being active helping out on the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;mailto:users@maven.apache.org&quot;&gt;users@maven.apache.org&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;mailto:dev@maven.apache.org&quot;&gt;dev@maven.apache.org&lt;/a&gt;&amp;nbsp;mailing lists then I think I could make a strong case for such a person being given commit access.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So if you think you have the right stuff and want to become a Maven committer... class&amp;nbsp;enrollment&amp;nbsp;is open!&lt;/div&gt;&lt;div id=&quot;svn&quot;&gt;&lt;sup id=&quot;rate&quot;&gt;†&lt;/sup&gt;&lt;small&gt;the Maven project may well move to GIT at some point in the future but for now we are using Subversion&lt;/small&gt;&lt;/div&gt;&lt;div id=&quot;rate&quot;&gt;&lt;sup&gt;‡&lt;/sup&gt;&lt;small&gt;or a good patch a month for a year&lt;/small&gt;&lt;/div&gt;</description>
         <author>Stephen Connolly</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21580788.post-5850874870135471947</guid>
         <pubDate>Wed, 11 Jul 2012 09:03:00 +0000</pubDate>
      </item>
      <item>
         <title>JenkinsMobi 3.0.3 for iOS available for download</title>
         <link>http://jenkinsmobi.me/2012/05/12/jenkinsmobi-3-0-3-for-ios-available-for-download/</link>
         <description>We are proud to announce that a new major release of JenkinsMobi is now available for download from iTunes AppStore. New version 3.0.3 solves many of the problems notified through crash reports by the users and most notably: &amp;#8211; iOS 5.1 multi-tasking &amp;#8211; HomeViewController is now fixed and more stable &amp;#8211; IndexOutOfBound when reloading views [&amp;#8230;]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://pixel.wp.com/b.gif?host=jenkinsmobi.me&amp;#038;blog=12790565&amp;#038;post=220&amp;#038;subd=hudsonmobi&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://hudsonmobi.wordpress.com/?p=220</guid>
         <pubDate>Sat, 12 May 2012 14:30:13 +0000</pubDate>
         <content:encoded><![CDATA[<p><img class="size-full wp-image alignleft" title="JenkinsMobi 3.0.3" src="http://hudsonmobi.files.wordpress.com/2012/05/jenkins-mobi-3-0.png?w=188" alt="Image" width="188" height="183"/>We are proud to announce that a new major release of JenkinsMobi is now available for download from iTunes AppStore.</p>
<p><strong>New version 3.0.3 solves many of the problems</strong> notified through crash reports by the users and most notably:</p>
<p>&#8211; iOS 5.1 multi-tasking<br />
&#8211; HomeViewController is now fixed and more stable<br />
&#8211; IndexOutOfBound when reloading views<br />
&#8211; Significantly improved user list load time</p>
<p>Moreover <span style="text-decoration:underline;">one major issue was found on cookie management</span> while logging out from a Jenkins instance (see <a rel="nofollow" title="JenkinsMobi Support: Cookie issue" target="_blank" href="http://hudson-mobi.479254.n3.nabble.com/JenkinsMobi-on-iphone-and-security-td3906562.html;cid=1336832712034-235">JenkinsMobi Support Forum</a>) and <span style="text-decoration:underline;"><strong>now is completely resolved</strong></span>.</p>
<p>Now before each login all cookies are removed from app shared storage, more secure and reliable.</p>
<p>You can install or upgrade JenkinsMobi on your phone by searching &#8220;JenkinsMobi&#8221; or visiting the following URL: <a rel="nofollow" target="_blank" href="http://itunes.apple.com/gb/app/jenkinsmobi/id467020180?mt=8">http://itunes.apple.com/gb/app/jenkinsmobi/id467020180?mt=8</a></p>
<p>Stay with us &#8230; new features are coming out !</p>
<p><a rel="nofollow" title="LMIT Software Ltd" target="_blank" href="http://www.lmitsoftware.com/">LMIT</a> and <a rel="nofollow" title="JenkinsMobi Team" target="_blank" href="http://www.jenkins-ci.mobi/#about">JenkinsMobi Development Team</a>.</p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/hudsonmobi.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hudsonmobi.wordpress.com/220/"/></a> <img alt="" border="0" src="http://pixel.wp.com/b.gif?host=jenkinsmobi.me&#038;blog=12790565&#038;post=220&#038;subd=hudsonmobi&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/7beef3a3c76d83b955c22d1aadd99aa9?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">hudsonmobi</media:title>
         </media:content>
         <media:content medium="image" url="http://hudsonmobi.files.wordpress.com/2012/05/jenkins-mobi-3-0.png?w=188">
            <media:title type="html">JenkinsMobi 3.0.3</media:title>
         </media:content>
      </item>
      <item>
         <title>JenkinsMobi @Jenkins User Conference in San Francisco</title>
         <link>http://jenkinsmobi.me/2012/04/07/jenkinsmobi-jenkins-user-conference-in-san-francisco/</link>
         <description>For those who did not attend the first Jenkins User Conference 2011 @San Francisco, you can watch the JenkinsMobi presentation on this video, starring Luca Milanesio and Simone Ardissone (see: http://www.jenkins-ci.mobi/#about) We revealed who we are and how we developed HudsonMobi and then JenkinsMobi using the XML API and all our expertise and experience on Mobile [&amp;#8230;]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://pixel.wp.com/b.gif?host=jenkinsmobi.me&amp;#038;blog=12790565&amp;#038;post=214&amp;#038;subd=hudsonmobi&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://hudsonmobi.wordpress.com/?p=214</guid>
         <pubDate>Fri, 06 Apr 2012 23:36:28 +0000</pubDate>
         <content:encoded><![CDATA[<span class='embed-youtube' style='text-align:center;display:block;'></span>
<p>For those who did not attend the first <a rel="nofollow" title="Jenkins User Conference - San Francisco" target="_blank" href="https://www.cloudbees.com/jenkins-user-conference-2011-session-abstracts.cb">Jenkins User Conference 2011 @San Francisco</a>, you can watch the JenkinsMobi presentation on this video, starring <em>Luca Milanesio</em> and <em>Simone Ardissone</em> (see: http://www.jenkins-ci.mobi/#about)</p>
<p>We revealed who we are and <strong>how we developed HudsonMobi and then JenkinsMobi using the XML API</strong> and all our expertise and experience on Mobile Development.</p>
<p><span style="color:#0000ff;"><strong>Enjoy the video <span class='wp-smiley wp-emoji wp-emoji-smile' title=':-)'>:-)</span></strong></span></p>
<p>JenkinsMobi Development Team &#8211; LMIT Software Ltd.</p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/hudsonmobi.wordpress.com/214/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/hudsonmobi.wordpress.com/214/"/></a> <img alt="" border="0" src="http://pixel.wp.com/b.gif?host=jenkinsmobi.me&#038;blog=12790565&#038;post=214&#038;subd=hudsonmobi&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/7beef3a3c76d83b955c22d1aadd99aa9?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">hudsonmobi</media:title>
         </media:content>
      </item>
      <item>
         <title>Open Source: the Meritocracy vs the Circle of Trust</title>
         <link>http://javaadventure.blogspot.com/2011/08/open-source-meritocracy-vs-circle-of.html</link>
         <description>There has been this idea running around the back of my head for a while, and it's only now that it is starting to crystalize into something that I can express.&lt;br /&gt;When we look at Open Source projects, we see that there is a hierarchy of involvement. There are different levels at which you can be involved, and at each higher level, there will be less and less individuals. For now I am going to divide involvement up like this:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Interested: this group of individuals know that the project exists, and might even be following what it is doing, but have not been able to actually use the project at all yet (for whatever reason)&lt;/li&gt;&lt;li&gt;Consumers: these are the people who actually use the project. They may not even be following the project, e.g. a lot of people consume log4j or ANT without following the mailing lists, seeing what features are on the roadmap, or even filing issues.&lt;/li&gt;&lt;li&gt;Contributors: if you are filing issues, submitting patches, etc, but you do not have commit access to the project, then you are a Contributor.&lt;/li&gt;&lt;li&gt;Committers: you have commit access to the project&lt;/li&gt;&lt;li&gt;Management: you get to have a say in some of the following: whether the new release of a project can be released; the architecture/direction of the project going forward; who has commit access; etc.&lt;/li&gt;&lt;/ul&gt;Different Open Source projects but different barriers at different points. For example:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Contributor road-blocks:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;You may have to create an account to file issues. [Technical]&lt;/li&gt;&lt;li&gt;You may have to sign a CLA and fax it off before you can commit any patches. [Legal]&lt;/li&gt;&lt;li&gt;You may have to get a&amp;nbsp;notarized signed CLA sent via snail-mail before you can commit any patches. [Legal]&lt;/li&gt;&lt;li&gt;You may have to get your employer to sign-off on you contributing patches. [Legal]&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Committer road-blocks:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;You may have to be invited to become a committer.&lt;/li&gt;&lt;li&gt;You may have to establish merit before you can be invited to become a committer.&lt;/li&gt;&lt;li&gt;You may have&amp;nbsp;to sign a CLA and fax it off before you can get commit access. [Legal]&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;You may have to get a&amp;nbsp;notarized signed CLA sent via snail-mail before you can get commit access. [Legal]&lt;/li&gt;&lt;li&gt;You may have to get your employer to sign-off on you committing code to the project. [Legal]&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Management road-blocks:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;You may have to be invited to become management.&lt;/li&gt;&lt;li&gt;You may have to establish merit before you can be invited to become management.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;(Note: I'm not going to even try and pretend that the above is a complete list of road-blocks)&lt;br /&gt;&lt;div&gt;Different people view success of Open Source projects differently. Some measures of success include: the number of consumers; &amp;nbsp;the number of active contributors; the number of committers; the number of releases; the number of downloads; the number of issues raised and closed; the activity of mailing lists.&lt;/div&gt;&lt;div&gt;None of these are correct, and much like psychologists&amp;nbsp;hypothesize a (in reality) unmeasurable&amp;nbsp;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/G_factor_(psychometrics)&quot;&gt;“g factor”&lt;/a&gt; as a true measure of intelligence against which all real measures (such as IQ) are only partial measures. We could hypothesize an unmeasurable “s factor” which is the true measure of the success of an Open Source project.&lt;/div&gt;&lt;div&gt;But I don't want to go down such an academic road today. Instead lets look at the dependency tree in the measures of success that we know of...&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Number of downloads depends on number of consumers: as a consumer has to download your project at least once... it is not a perfect dependency, because you could download each release of the project once and every time decide it is a load of rubbish and never actually consume it... and a consumer may have just downloaded version 1.0 once and stayed on that version for ever more, but in general, if you have a large number of consumers, you will have a large number of downloads and the opposite does not necessarily follow.&lt;/li&gt;&lt;li&gt;Activity of mailing lists depends on the number of active contributors: when you have a lot of active contributors, the mailing lists will be active... however the mailing lists can be active without any active contributors.&lt;/li&gt;&lt;li&gt;Number of issues raised depends on the number of active contributors: for similar reasons to the previous.&lt;/li&gt;&lt;li&gt;Number of issues closed depends on the number of committers: because you need commit access to close most issues (appart from the &quot;not a bug&quot; type of issues)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;So a lot of the measures of success can be raised by increasing the number of consumers, active contributors, and committers. However, just because we have a large number of consumers/active contributors/committers does not imply that we have a successful project, it just says that projects that&amp;nbsp;have a large number of consumers/active contributors/committers have a greater&amp;nbsp;likelihood of being successful projects.&lt;/div&gt;&lt;div&gt;So how do we increase that number, and thereby increase the probability that our Open Source project is a “success”?&lt;/div&gt;&lt;div&gt;Well, if you are picking an project to use, i.e. deciding to become a consumer, one of the things you will look at is how active the community is (i.e. number of active&amp;nbsp;contributors&amp;nbsp;and number of committers). It's not the only thing you will look at, but assuming you have two projects which have the feature-set you need, and they are comparable in usability, etc. When you come to make the decision, the social beast in you will pick the larger active community (who wants to pick the dead project).&amp;nbsp;The active community also act as evangelists out selling the project to potential consumers. So one way to grow the number of consumers is to grow the active community.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Number of consumers (partially) depends on the number of active contributors&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;If we have lots of active contributors and very few committers, very soon there will be a glut of patches that don't get applied, and the active contributors will wonder off to another project where there contributions can be consumed. So for each project, there is probably some upper limit to the number of active contributors that depends on the number of committers. That limit depends on things like the complexity of the project, the code base, the toolchain used by the project, the project management processes, etc. So I don't think there is any hard and fast rule like you can have X active contributors for every Y committers on any open source project.&lt;/div&gt;&lt;div&gt;But what I do think we can say is:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Number of active contributors is limited by the number of committers.&lt;/li&gt;&lt;/ul&gt;So at this point you might feel that my chain of logic looks a little like this:&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-H10LaHHYGuI/Tjp4aG25B-I/AAAAAAAAAFQ/uSx2SyoC91M/s1600/2260187416_be564a30a4.jpg&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://1.bp.blogspot.com/-H10LaHHYGuI/Tjp4aG25B-I/AAAAAAAAAFQ/uSx2SyoC91M/s320/2260187416_be564a30a4.jpg&quot; width=&quot;212&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;But I should point out that what I am trying to say is really that:&lt;/div&gt;&lt;div style=&quot;text-align:center;&quot;&gt;&lt;i&gt;Having a lot of committers&lt;br /&gt;&amp;nbsp;indicates that a project is more likely to be successful, &lt;br /&gt;but it cannot guarantee that success.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Hopefully your back thinking I have a solid argument again.&lt;/div&gt;&lt;div&gt;So how do we get a lot of committers? Well the answer is easy, remove as many road-blocks to becoming a committer.&lt;/div&gt;&lt;div&gt;Some of the road-blocks are technical. So you have to create an account to file issues... well we can switch to a issue tracking tool that uses OpenID or oAuth and now you can use an account you already have to file those issues... or perhaps you can just provide your email address and fill in a captcha... etc. None of these completely remove the technical road-block, but they can make it easier for the consumer to graduate to active contributor.&lt;/div&gt;&lt;div&gt;Some of the road-blocks are legal. So you need a CLA signed with the blood of an Armur leopard before you can submit a patch. These are harder to work around, but not always impossible e.g. perhaps small patches (less than some size metric) don't need the CLA.&lt;/div&gt;&lt;div&gt;After all these road-blocks, we start to hit what I like to call the “merit wall”. And this is the problem that I see. In essence you need to establish that you have the merit to work on the project. You need to establish a chain of consistent patches (which get picked up by the existing committers) of good quality before you are invited to become a committer.&amp;nbsp;&lt;/div&gt;&lt;div&gt;That to me is a crazy way to gate commit access.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Just because your submitted patches were all stellar quality, that could just be the result of the areas being patched having good test coverage, so you were forced to get the code right. It could be that the nature of bundling up your changes as a patch forced you to think more about the changes. You could become sloppy as a coder, etc.&lt;/div&gt;&lt;div&gt;There are many reasons why “past performance is not a guarantee of future returns”. Some people think the solution to this is to have merit expire, e.g. if you have not worked on the project recently, then you loose the right to work on the project. All that happens then is that people start doing busy work on the project just before their merit is due to expire, and such busy work is, by its very nature, not the work that drives a project forward.&lt;/div&gt;&lt;div&gt;In my view, the only merit to contribute to a project is the code you are contributing right now. Not the code you contributed yesterday, last month, or last year. Not the code you might contribute tomorrow, next month, or next year. But the code you are contributing right now. You don't have merit, but your code might.&lt;/div&gt;&lt;div&gt;Merit is the wrong thing to use as a gate for commit access.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Because what is giving commit access really about? It is about saying that we trust you to commit changes to the project. If you commit code which has no merit, we (or you) can use the SCM to back out those changes. The merit of your previous submissions is a very poor measure of our trust in you using the SCM. In fact because for a lot of projects, generating patches actually is about not using the SCM at all (Git pull requests changes that) it is exactly the wrong thing to use to establish trust.&lt;/div&gt;&lt;div&gt;Once we realize that commit access is about trust and not merit, then we can really start to build a community, and increase the likelihood of our project being a success:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;You don't start with zero trust.&lt;/li&gt;&lt;li&gt;One big abuse of trust, and you have lost all your trust and you have to work a lot harder to earn what you had back again.&lt;/li&gt;&lt;li&gt;You have to be given scope in order to earn more trust.&lt;/li&gt;&lt;li&gt;Trust does not expire easily.&lt;/li&gt;&lt;/ul&gt;So what I am arguing is that if somebody shows up knocking at the door of your project looking to contribute, at some point you have to trust them enough to open the door and let them in. It's fine if you have a few hurdles that they have to jump, but remember that at the end of the day you are trying to decided if you trust them enough to let them make changes to the code, or to put it another way, if you trust them to make good judgements on the merit of any changes they want to commit.&lt;/div&gt;&lt;div style=&quot;text-align:center;&quot;&gt;&lt;i&gt;Your merit as a committer is not the &lt;br /&gt;merit of the code changes you have committed, &lt;br /&gt;but all the code changes you did not commit&amp;nbsp;&lt;/i&gt;&lt;i&gt;because those changes had no merit.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;A good committer is somebody who does not make changes that are bad. The ideal committer only makes commits that improve the project. Joe might be the ideal committer for your project even though he has never submitted a patch because Joe knows when a patch is improving the project and when it is not, but because Joe has never submitted a patch, he has earned no merit in your projects eyes, so he will never become a committer.&lt;/div&gt;&lt;div&gt;Commit access is about letting somebody inside the circle of trust. The easier you make that process, the more vibrant your community, and the more successful your project. Put a merit wall in place and you are alienating your potential community (never mind that it is the wrong barrier in the first place)&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;/div&gt;&lt;div&gt;Look at the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jenkins-ci.org/&quot;&gt;Jenkins&lt;/a&gt; project. If you want commit access, you just ask for it. How is that for initial trust. The result is a very successful project, oh and the sky has not fallen. Everyone that has been trusted so far has respected the trust they have been shown.&lt;/div&gt;&lt;div&gt;Look at most projects hosted on github. Pull requests have effectively removed a large chunk of the need for commit access, and because you can see the person's skills with the SCM, they can earn trust to be let loose on the canonical source directly.&lt;/div&gt;&lt;div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left:auto;margin-right:auto;text-align:center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-QHIt80xqV0k/Tjp449CedNI/AAAAAAAAAFU/Hi0lynTYXpw/s1600/Circle-of-Trust1.jpg&quot; style=&quot;margin-left:auto;margin-right:auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;193&quot; src=&quot;http://2.bp.blogspot.com/-QHIt80xqV0k/Tjp449CedNI/AAAAAAAAAFU/Hi0lynTYXpw/s320/Circle-of-Trust1.jpg&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align:center;&quot;&gt;A merit wall can leave you feeling like this&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;So my message to all open source projects that use merit based on previous patches as a measure of the worth of a potential committer, please look again at your policy. Are you sure you are looking for the right qualities to drive your project to bigger successes?&amp;nbsp;&lt;/div&gt;&lt;/div&gt;</description>
         <author>Stephen Connolly</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21580788.post-1619472904270827101</guid>
         <pubDate>Thu, 04 Aug 2011 11:38:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://1.bp.blogspot.com/-H10LaHHYGuI/Tjp4aG25B-I/AAAAAAAAAFQ/uSx2SyoC91M/s72-c/2260187416_be564a30a4.jpg" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Backwards compatibility</title>
         <link>http://javaadventure.blogspot.com/2011/05/backwards-compatibility.html</link>
         <description>This is a tail about Jenkins (née Hudson) and Kohsuke's policy of maintaining backwards compatibility...&lt;br /&gt;&lt;br /&gt;Back in 2006 I started working for my previous employer, just a month or two after Peter Reilly started. Initially we were working on the same team. This was a team who's CI system was a nightly cron job that emailed off a list of failing tests to everyone... obviously Peter and I had many a WTF over that old system... so I convinced our boss that we should put some effort into setting up a proper CI system... Initially this was CruiseControl (as he thought Hudson at version 1.64 was too new and unheard of... go with the old reliable)... but after a couple of pains with the CruiseControl system (monolithic xml config file), we convinced him to switch to Hudson... (I don't think we ever looked back!)&lt;br /&gt;&lt;br /&gt;What we really liked was that Kohsuke had put in place a plugin framework, so I started writing plugins, and shortly afterwards convinced Peter that it was &quot;cool&quot; (even if he did have to use Maven to build the plugins - Peter is on the Apache ANT PMC).&lt;br /&gt;&lt;br /&gt;One of the earlier plugins that Peter wrote during his spare time was his &quot;Simple Cobertura plugin&quot; which allowed you to get the Cobertura coverage results on the build page&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;i&gt;[1]&lt;/i&gt;&lt;/span&gt;.&amp;nbsp;Peter created his plugin against Hudson 1.129.&amp;nbsp;By this stage Peter and I had moved onto separate projects, eventually Peter left the company, but the team he was working on still had the .hpi for his &quot;Simple Cobertura plugin&quot;. As they moved to newer and newer Hudson builds, the plugin kept on working (no recompile needed). I had my own plugins which were built for an earlier version of Hudson (my closed source SilkTest plugin, my original closed source AccuRev plugin [not to be confused with the open source one I subsequently developed and handed on to others to maintain]) which also were still working (with no recompile) in newer versions of Hudson&lt;br /&gt;&lt;br /&gt;Recently, I met up with Peter, and he told me the sad news.... his plugin is now broken... it no longer works in the latest version of Jenkins... this was strange news to me, as before I left my previous employer to join &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt; I'd upgraded our CI servers to the latest and one of those was using Peter's&amp;nbsp;&quot;Simple Cobertura plugin&quot; which did not seem broken...&lt;br /&gt;&lt;br /&gt;After looking at Peter's code I finally found the problem... he was using the old javadoc annotation to mark the constructor as one for data binding, with one simple change:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;6,7d5&lt;br /&gt;&amp;lt; import org.kohsuke.stapler.DataBoundConstructor;&lt;br /&gt;&amp;lt; &lt;br /&gt;22a21&lt;br /&gt;&amp;gt;      * @stapler-constructor&lt;br /&gt;24d22&lt;br /&gt;&amp;lt;     @DataBoundConstructor&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;His plugin was back in action... Now I was puzzled, as I couldn't understand how I'd upgraded this old old plugin from Hudson 1.129 and got it running on Jenkins 1.397 without recompiling...&lt;br /&gt;&lt;br /&gt;Well I found out the answer, the version Peter had left in behind, didn't use the data bound constructor at all... it was doing&lt;br /&gt;&lt;pre&gt;    public Publisher newInstance(StaplerRequest req) throws FormException {&lt;br /&gt;        return new C2Publisher(req.getParameter(&quot;c2_coverReportDir&quot;));&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;While the code Peter had was doing&amp;nbsp;&lt;/div&gt;&lt;pre&gt;    public C2Publisher newInstance(StaplerRequest req, JSONObject obj) &lt;br /&gt;            throws FormException {&lt;br /&gt;        return req.bindParameters(C2Publisher.class, &quot;c2_&quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;If you change it back to the old way, and you have enough Maven-foo to build against that old a version of Jenkins (née Hudson) you can end up with a plugin that works on both Hudson 1.129 and Jenkins 1.413...&lt;br /&gt;&lt;br /&gt;I am fairly sure that if I had a SilkTest license and a copy of the SilkTest plugin that I wrote against Hudson 1.96, it would also still run unmodified on Jenkins 1.413.&lt;br /&gt;&lt;br /&gt;How many projects can maintain &lt;b&gt;&lt;u&gt;that&lt;/u&gt;&lt;/b&gt; level of backwards compatibility.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;i&gt;[1]&lt;/i&gt; Peter wanted to have the coverage results on the main page, and at the time Kohsuke did not want to allow plugins to add columns to the main page... I came up with the compromise of adding a column which would be just one icon wide and have a tooltip to which plugins could contribute information... and that was the birth of the weather (health) icons&lt;i&gt;[2]&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:x-small;&quot;&gt;&lt;i&gt;[2]&lt;/i&gt; at the time Peter thought it would be cool if he could generate his own weather icon on the fly so that if you had high code coverage that would be a full&amp;nbsp;umbrella&amp;nbsp;while poor code coverage would be a tattered umbrella with no fabric and only the frame remaining... this is actually part of the API, so the technology to implement this has been there since 1.115... just nobody has done it... yet!&lt;/span&gt;</description>
         <author>Stephen Connolly</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21580788.post-4113129733343964320</guid>
         <pubDate>Fri, 27 May 2011 14:55:00 +0000</pubDate>
      </item>
      <item>
         <title>Continuously deploy your java apps to the cloud</title>
         <link>http://javaadventure.blogspot.com/2011/05/continuously-deploy-your-java-apps-to.html</link>
         <description>&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:left;&quot;&gt;In my &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://javaadventure.blogspot.com/2011/05/deploy-your-java-apps-to-cloud.html&quot;&gt;previous post&lt;/a&gt;&amp;nbsp;showed how easy it is to run your java application on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt;' RUN@cloud service. Today I'm going to use the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://wiki.jenkins-ci.org/display/JENKINS/Cloudbees+Deployer+Plugin&quot;&gt;CloudBees Deployer plugin for Jenkins&lt;/a&gt; that allows you to deploy your app to the cloud from your CI server. I am using the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cloudbees.com/dev.cb&quot;&gt;DEV@cloud&lt;/a&gt; Jenkins service for my CI infrastructure, but you can use this plugin from your own &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jenkins-ci.org/&quot;&gt;Jenkins&lt;/a&gt; (or &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://nectar.cloudbees.com/&quot;&gt;Nectar&lt;/a&gt;) server.&lt;/div&gt;&lt;br /&gt;So first step is to install the CloudBees Deployer plugin...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. Goto Manage Jenkins&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-3KYlccVpLcs/TdOMFgqS-7I/AAAAAAAAABw/ap-fQVzcVqI/s1600/Screen+shot+2011-05-18+at+09.43.35.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;424&quot; src=&quot;http://4.bp.blogspot.com/-3KYlccVpLcs/TdOMFgqS-7I/AAAAAAAAABw/ap-fQVzcVqI/s640/Screen+shot+2011-05-18+at+09.43.35.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;2. Goto Manage Plugins&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-EcHJmUwcbWk/TdOMF0JGRSI/AAAAAAAAAB0/bvmEn6krkz4/s1600/Screen+shot+2011-05-18+at+09.43.40.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;424&quot; src=&quot;http://4.bp.blogspot.com/-EcHJmUwcbWk/TdOMF0JGRSI/AAAAAAAAAB0/bvmEn6krkz4/s640/Screen+shot+2011-05-18+at+09.43.40.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;3. Goto the Available tab&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-3byLi7A49QI/TdOMG77BJfI/AAAAAAAAAB4/nmj7te6mIA0/s1600/Screen+shot+2011-05-18+at+09.43.46.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;424&quot; src=&quot;http://2.bp.blogspot.com/-3byLi7A49QI/TdOMG77BJfI/AAAAAAAAAB4/nmj7te6mIA0/s640/Screen+shot+2011-05-18+at+09.43.46.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;4. Scroll down until you find the cloudbees-deployer-plugin. Check the box.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-74aFOsDEhoU/TdOMHNELSrI/AAAAAAAAAB8/ctFi1xo4a_8/s1600/Screen+shot+2011-05-18+at+09.43.55.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;424&quot; src=&quot;http://1.bp.blogspot.com/-74aFOsDEhoU/TdOMHNELSrI/AAAAAAAAAB8/ctFi1xo4a_8/s640/Screen+shot+2011-05-18+at+09.43.55.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;5. Scroll down and click the Install button&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/-ibEv8NMGnho/TdOMHYNJyBI/AAAAAAAAACA/x4kyR53m6Gk/s1600/Screen+shot+2011-05-18+at+09.44.03.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;424&quot; src=&quot;http://3.bp.blogspot.com/-ibEv8NMGnho/TdOMHYNJyBI/AAAAAAAAACA/x4kyR53m6Gk/s640/Screen+shot+2011-05-18+at+09.44.03.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;6. Restart Jenkins after it's installed.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-Yb2_nP0qrzo/TdOMHlzLUaI/AAAAAAAAACE/xTth0p5F2CQ/s1600/Screen+shot+2011-05-18+at+09.44.22.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;424&quot; src=&quot;http://4.bp.blogspot.com/-Yb2_nP0qrzo/TdOMHlzLUaI/AAAAAAAAACE/xTth0p5F2CQ/s640/Screen+shot+2011-05-18+at+09.44.22.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;/div&gt;&lt;div&gt;7. Goto Manage Jenkins, select Configure and&amp;nbsp;scroll down to the bottom&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://3.bp.blogspot.com/--NTXGgwXdWc/TdONL4nVnJI/AAAAAAAAACI/mf7Z7NNyPI8/s1600/Screen+shot+2011-05-18+at+09.45.55.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;424&quot; src=&quot;http://3.bp.blogspot.com/--NTXGgwXdWc/TdONL4nVnJI/AAAAAAAAACI/mf7Z7NNyPI8/s640/Screen+shot+2011-05-18+at+09.45.55.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;8. Click the Add button beside the CloudBees accounts&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-qW9UJEoxp7o/TdONMCTiszI/AAAAAAAAACM/B-Qt1QKF4YE/s1600/Screen+shot+2011-05-18+at+09.46.02.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;424&quot; src=&quot;http://2.bp.blogspot.com/-qW9UJEoxp7o/TdONMCTiszI/AAAAAAAAACM/B-Qt1QKF4YE/s640/Screen+shot+2011-05-18+at+09.46.02.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;9. Add in your CloudBees account details (which you can find on your&amp;nbsp;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://grandcentral.cloudbees.com/user/keys&quot;&gt;user keys screen on grandcentral&lt;/a&gt;)&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-HsiABb95L2g/TdOOLf40YpI/AAAAAAAAACQ/LGpw2kPjCcU/s1600/Screen+shot+2011-05-18+at+09.51.19.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;424&quot; src=&quot;http://4.bp.blogspot.com/-HsiABb95L2g/TdOOLf40YpI/AAAAAAAAACQ/LGpw2kPjCcU/s640/Screen+shot+2011-05-18+at+09.51.19.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;10. Click on Save and then goto the Configure page for your project. Enable CloudBees Deployment and fill in the details:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-dw_E0_47oDk/TdOOL50qoeI/AAAAAAAAACU/Ql_I0ZYvNPk/s1600/Screen+shot+2011-05-18+at+09.52.08.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;424&quot; src=&quot;http://4.bp.blogspot.com/-dw_E0_47oDk/TdOOL50qoeI/AAAAAAAAACU/Ql_I0ZYvNPk/s640/Screen+shot+2011-05-18+at+09.52.08.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;11. Save and then kick off a build&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-hjYfaX7DT6w/TdOOMpYEKCI/AAAAAAAAACc/3lUwEZsFJGM/s1600/Screen+shot+2011-05-18+at+09.53.06.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;424&quot; src=&quot;http://4.bp.blogspot.com/-hjYfaX7DT6w/TdOOMpYEKCI/AAAAAAAAACc/3lUwEZsFJGM/s640/Screen+shot+2011-05-18+at+09.53.06.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;12. When the build is finished, your application has been deployed:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://2.bp.blogspot.com/-9lXahzAh9Ac/TdOONLIAnyI/AAAAAAAAACg/abImJ0JZ1PQ/s1600/Screen+shot+2011-05-18+at+09.54.36.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;424&quot; src=&quot;http://2.bp.blogspot.com/-9lXahzAh9Ac/TdOONLIAnyI/AAAAAAAAACg/abImJ0JZ1PQ/s640/Screen+shot+2011-05-18+at+09.54.36.png&quot; width=&quot;640&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;There you go. Continuous Deployment on RUN@cloud.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is a whole host of things you can do with this. &amp;nbsp;You can use build promotion to trigger the deployment, you can set up a staging deployment followed by the real thing if a test staging project builds successfully... I could go on... but there is always another day! Speaking of which, my next step will probably be enabling deployment straight from the project build (for those unfortunate enough to not have a CI server) probably using the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojo.codehaus.org/ship-maven-plugin&quot;&gt;ship-maven-plugin&lt;/a&gt;&amp;nbsp;&lt;/div&gt;</description>
         <author>Stephen Connolly</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21580788.post-828264878015915640</guid>
         <pubDate>Wed, 18 May 2011 10:29:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://4.bp.blogspot.com/-3KYlccVpLcs/TdOMFgqS-7I/AAAAAAAAABw/ap-fQVzcVqI/s72-c/Screen+shot+2011-05-18+at+09.43.35.png" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Deploy your java apps to the cloud</title>
         <link>http://javaadventure.blogspot.com/2011/05/deploy-your-java-apps-to-cloud.html</link>
         <description>I work for &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cloudbees.com/&quot;&gt;CloudBees Inc.&lt;/a&gt;, they are a great company with great products. I have mostly been working on the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cloudbees.com/dev.cb&quot;&gt;DEV@&lt;/a&gt; side of the fence which is focused on continuous integration and basically the development side of your application, but we also have the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.cloudbees.com/run.cb&quot;&gt;RUN@&lt;/a&gt; side of the fence where we provide a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/Platform_as_a_service&quot;&gt;platform as a service (PaaS)&lt;/a&gt; for running your java web applications on the cloud. I could give you the sales pitch, but I'll leave it at: the technologies and people behind RUN@ were one of the key reasons why I decided to join CloudBees.&lt;br /&gt;&lt;br /&gt;Well I've been busy on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://nectar.cloudbees.com/products-features-scale.cb#rbac&quot;&gt;some stuff&lt;/a&gt; since joining, so I decided it was time to actually try out the RUN@ stuff for my self. &amp;nbsp;So here is my experience:&lt;br /&gt;&lt;br /&gt;My test application:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I'm on the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maven.apache.org/&quot;&gt;Apache Maven&lt;/a&gt; PMC, so I'm going to build it with... shock... horror... Maven.&lt;/li&gt;&lt;li&gt;I am partial to the odd bit of JSF, so it will be a JSF 2.0 application based off of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://myfaces.apache.org/&quot;&gt;Apache MyFaces&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;I love &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://eclipse.org/jetty/&quot;&gt;Jetty&lt;/a&gt; as a servlet container for local testing, so we'll use that hammer too.&lt;/li&gt;&lt;/ul&gt;Let's get started...&lt;br /&gt;&lt;br /&gt;First the pom.xml&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;         xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&amp;gt;&lt;br /&gt;  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!-- basic information --&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;com.blogspot.javaadventure.cloudbees.run&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;jsf2-hello-world&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;0.1-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!-- Project information --&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;name&amp;gt;JSF 2.0 Hello World&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;description&amp;gt;&lt;br /&gt;    A JSF 2.0 web application that says hello world.&lt;br /&gt;  &amp;lt;/description&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;properties&amp;gt;&lt;br /&gt;    &amp;lt;project.reporting.outputEncoding&amp;gt;UTF-8&amp;lt;/project.reporting.outputEncoding&amp;gt;&lt;br /&gt;    &amp;lt;project.build.outputEncoding&amp;gt;UTF-8&amp;lt;/project.build.outputEncoding&amp;gt;&lt;br /&gt;    &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;&lt;br /&gt;  &amp;lt;/properties&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!-- Dependency details --&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;dependencies&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;org.apache.myfaces.core&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;myfaces-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;2.0.5&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;org.apache.myfaces.core&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;myfaces-impl&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;2.0.5&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;4.8.2&amp;lt;/version&amp;gt;&lt;br /&gt;      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;  &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!-- Build settings --&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;build&amp;gt;&lt;br /&gt;    &amp;lt;pluginManagement&amp;gt;&lt;br /&gt;      &amp;lt;plugins&amp;gt;&lt;br /&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;maven-clean-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;version&amp;gt;2.4.1&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;version&amp;gt;2.3.2&amp;lt;/version&amp;gt;&lt;br /&gt;          &amp;lt;configuration&amp;gt;&lt;br /&gt;            &amp;lt;source&amp;gt;1.6&amp;lt;/source&amp;gt;&lt;br /&gt;            &amp;lt;target&amp;gt;1.6&amp;lt;/target&amp;gt;&lt;br /&gt;          &amp;lt;/configuration&amp;gt;&lt;br /&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;maven-deploy-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;version&amp;gt;2.6&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;maven-failsafe-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;version&amp;gt;2.8.1&amp;lt;/version&amp;gt;&lt;br /&gt;          &amp;lt;executions&amp;gt;&lt;br /&gt;            &amp;lt;execution&amp;gt;&lt;br /&gt;              &amp;lt;goals&amp;gt;&lt;br /&gt;                &amp;lt;goal&amp;gt;integration-test&amp;lt;/goal&amp;gt;&lt;br /&gt;                &amp;lt;goal&amp;gt;verify&amp;lt;/goal&amp;gt;&lt;br /&gt;              &amp;lt;/goals&amp;gt;&lt;br /&gt;            &amp;lt;/execution&amp;gt;&lt;br /&gt;          &amp;lt;/executions&amp;gt;&lt;br /&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;maven-install-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;version&amp;gt;2.3.1&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;maven-jar-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;version&amp;gt;2.3.1&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;version&amp;gt;2.8.1&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;maven-release-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;version&amp;gt;2.1&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;maven-resources-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;version&amp;gt;2.5&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;        &amp;lt;plugin&amp;gt;&lt;br /&gt;          &amp;lt;groupId&amp;gt;org.mortbay.jetty&amp;lt;/groupId&amp;gt;&lt;br /&gt;          &amp;lt;artifactId&amp;gt;jetty-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;          &amp;lt;version&amp;gt;8.0.0.M2&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;/plugin&amp;gt;&lt;br /&gt;      &amp;lt;/plugins&amp;gt;&lt;br /&gt;    &amp;lt;/pluginManagement&amp;gt;&lt;br /&gt;    &amp;lt;plugins&amp;gt;&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;maven-release-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;configuration&amp;gt;&lt;br /&gt;          &amp;lt;autoVersionSubmodules&amp;gt;true&amp;lt;/autoVersionSubmodules&amp;gt;&lt;br /&gt;          &amp;lt;goals&amp;gt;install&amp;lt;/goals&amp;gt;&lt;br /&gt;        &amp;lt;/configuration&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;    &amp;lt;/plugins&amp;gt;&lt;br /&gt;  &amp;lt;/build&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Then the src/main/webapp/WEB-INF/web.xml&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;web-app version=&quot;2.5&quot; xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;&lt;br /&gt;         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;         xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;&amp;gt;&lt;br /&gt;  &amp;lt;display-name&amp;gt;JSF 2.0 Hello World&amp;lt;/display-name&amp;gt;&lt;br /&gt;  &amp;lt;description&amp;gt;&lt;br /&gt;    A JSF 2.0 web application that says hello world.&lt;br /&gt;  &amp;lt;/description&amp;gt;&lt;br /&gt;  &amp;lt;context-param&amp;gt;&lt;br /&gt;    &amp;lt;param-name&amp;gt;javax.faces.STATE_SAVING_METHOD&amp;lt;/param-name&amp;gt;&lt;br /&gt;    &amp;lt;param-value&amp;gt;server&amp;lt;/param-value&amp;gt;&lt;br /&gt;  &amp;lt;/context-param&amp;gt;&lt;br /&gt;  &amp;lt;context-param&amp;gt;&lt;br /&gt;    &amp;lt;param-name&amp;gt;javax.faces.DEFAULT_SUFFIX&amp;lt;/param-name&amp;gt;&lt;br /&gt;    &amp;lt;param-value&amp;gt;.xhtml&amp;lt;/param-value&amp;gt;&lt;br /&gt;  &amp;lt;/context-param&amp;gt;&lt;br /&gt;  &amp;lt;context-param&amp;gt;&lt;br /&gt;    &amp;lt;param-name&amp;gt;javax.faces.FACELETS_SKIP_COMMENTS&amp;lt;/param-name&amp;gt;&lt;br /&gt;    &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;  &amp;lt;/context-param&amp;gt;&lt;br /&gt;  &amp;lt;context-param&amp;gt;&lt;br /&gt;    &amp;lt;param-name&amp;gt;javax.faces.PROJECT_STAGE&amp;lt;/param-name&amp;gt;&lt;br /&gt;    &amp;lt;param-value&amp;gt;Production&amp;lt;/param-value&amp;gt;&lt;br /&gt;    &amp;lt;!--param-value&amp;gt;Development&amp;lt;/param-value--&amp;gt;&lt;br /&gt;  &amp;lt;/context-param&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!-- [jetty] does not initialize myfaces correctly for some reason --&amp;gt;&lt;br /&gt;  &amp;lt;listener&amp;gt;&lt;br /&gt;    &amp;lt;listener-class&amp;gt;org.apache.myfaces.webapp.StartupServletContextListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;  &amp;lt;/listener&amp;gt;&lt;br /&gt;  &amp;lt;!-- [/jetty] --&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;servlet&amp;gt;&lt;br /&gt;    &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;    &amp;lt;servlet-class&amp;gt;javax.faces.webapp.FacesServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;    &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;  &amp;lt;/servlet&amp;gt;&lt;br /&gt;  &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;    &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;    &amp;lt;url-pattern&amp;gt;*.xhtml&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;  &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;session-config&amp;gt;&lt;br /&gt;    &amp;lt;session-timeout&amp;gt;60&amp;lt;/session-timeout&amp;gt;&lt;br /&gt;  &amp;lt;/session-config&amp;gt;&lt;br /&gt;  &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;    &amp;lt;welcome-file&amp;gt;index.xhtml&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;  &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Then the backing bean (src/main/java/com/blogspot/javaadventure/cloudbees/run/GreeterBean.java)&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package com.blogspot.javaadventure.cloudbees.run;&lt;br /&gt;&lt;br /&gt;import javax.faces.bean.ManagedBean;&lt;br /&gt;import javax.faces.bean.ViewScoped;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;&lt;br /&gt;@ManagedBean(name=&quot;greeter&quot;)&lt;br /&gt;@ViewScoped&lt;br /&gt;public class GreeterBean implements Serializable {&lt;br /&gt;    private String name;&lt;br /&gt;&lt;br /&gt;    public String getName() {&lt;br /&gt;        return name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setName(String name) {&lt;br /&gt;        this.name = name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getResponse() {&lt;br /&gt;        if (name != null &amp;amp;&amp;amp; !name.isEmpty()) {&lt;br /&gt;            return &quot;Hello &quot; + name;&lt;br /&gt;        } else {&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Should always have some tests (src/test/java/com/blogspot/javaadventure/cloudbees/run/GreeterBeanTest.java)&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package com.blogspot.javaadventure.cloudbees.run;&lt;br /&gt;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;&lt;br /&gt;import static org.hamcrest.CoreMatchers.*;&lt;br /&gt;import static org.junit.Assert.*;&lt;br /&gt;&lt;br /&gt;public class GreeterBeanTest {&lt;br /&gt;    @Test&lt;br /&gt;    public void nullNameMeansNoGreeting() throws Exception {&lt;br /&gt;        GreeterBean instance = new GreeterBean();&lt;br /&gt;        instance.setName(null);&lt;br /&gt;        assertThat(instance.getResponse(), nullValue());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Test&lt;br /&gt;    public void noNameMeansNoGreeting() throws Exception {&lt;br /&gt;        GreeterBean instance = new GreeterBean();&lt;br /&gt;        instance.setName(&quot;&quot;);&lt;br /&gt;        assertThat(instance.getResponse(), nullValue());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Test&lt;br /&gt;    public void aNameMeansGreeting() throws Exception {&lt;br /&gt;        GreeterBean instance = new GreeterBean();&lt;br /&gt;        instance.setName(&quot;Fred&quot;);&lt;br /&gt;        assertThat(instance.getResponse(), notNullValue());&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;Next the page of our web application (src/main/webapp/index.xhtml), i'm going to use the JSF 2.0 ajax support (because it's there)&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;&lt;br /&gt;        &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&amp;gt;&lt;br /&gt;&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&lt;br /&gt;      xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot;&lt;br /&gt;      xmlns:h=&quot;http://java.sun.com/jsf/html&quot;&lt;br /&gt;      xmlns:f=&quot;http://java.sun.com/jsf/core&quot;&amp;gt;&lt;br /&gt;&amp;lt;ui:insert name=&quot;metadata&quot;/&amp;gt;&lt;br /&gt;&amp;lt;h:head&amp;gt;&lt;br /&gt;    &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;/&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;&lt;br /&gt;        JSF 2.0 Hello World&lt;br /&gt;    &amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/h:head&amp;gt;&lt;br /&gt;&amp;lt;h:body&amp;gt;&lt;br /&gt;    &amp;lt;f:view&amp;gt;&lt;br /&gt;        &amp;lt;h:form&amp;gt;&lt;br /&gt;            &amp;lt;h:outputLabel for=&quot;greeter&quot; value=&quot;Please tell me your name:&quot;/&amp;gt;&lt;br /&gt;            &amp;lt;h:inputText id=&quot;greeter&quot; value=&quot;#{greeter.name}&quot;&amp;gt;&lt;br /&gt;                &amp;lt;f:ajax event=&quot;keyup&quot; render=&quot;text&quot;/&amp;gt;&lt;br /&gt;            &amp;lt;/h:inputText&amp;gt;&lt;br /&gt;        &amp;lt;/h:form&amp;gt;&lt;br /&gt;        &amp;lt;h:outputText id=&quot;text&quot; value=&quot;${greeter.response}&quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/f:view&amp;gt;&lt;br /&gt;&amp;lt;/h:body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;Let's test it locally&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ mvn jetty:run&lt;/pre&gt;&lt;pre&gt;[INFO] Scanning for projects...&lt;br /&gt;[INFO]                                                                         &lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] Building JSF 2.0 Hello World 0.1-SNAPSHOT&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] &lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;...&lt;/pre&gt;&lt;pre&gt;WARNING: &lt;br /&gt;&lt;br /&gt;*******************************************************************&lt;br /&gt;*** WARNING: Apache MyFaces-2 is running in DEVELOPMENT mode.   ***&lt;br /&gt;***                                         ^^^^^^^^^^^         ***&lt;br /&gt;*** Do NOT deploy to your live server(s) without changing this. ***&lt;br /&gt;*** See Application#getProjectStage() for more information.     ***&lt;br /&gt;*******************************************************************&lt;br /&gt;&lt;br /&gt;2011-05-17 10:22:10.982:INFO::Started SelectChannelConnector@0.0.0.0:8080&lt;br /&gt;[INFO] Started Jetty Server&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fire up a browser to http://localhost:8080/ and here's what we get:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://1.bp.blogspot.com/-uT5H_QxEFJ4/TdI-3s8A-VI/AAAAAAAAABo/vDQmZXZf_Vk/s1600/Screen+shot+2011-05-17+at+10.24.27.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;257&quot; src=&quot;http://1.bp.blogspot.com/-uT5H_QxEFJ4/TdI-3s8A-VI/AAAAAAAAABo/vDQmZXZf_Vk/s320/Screen+shot+2011-05-17+at+10.24.27.png&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;OK, so now I turn off DEVELOPMENT mode in the web.xml, build my app and deploy it to RUN@cloud... and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jsf2-hello-world.stephenc.cloudbees.net/&quot;&gt;here&lt;/a&gt;'s what we get:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear:both;text-align:center;&quot;&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://4.bp.blogspot.com/-uqTMwA58wW4/TdI_3ZaTi1I/AAAAAAAAABs/M_kvGO67ll0/s1600/Screen+shot+2011-05-17+at+10.28.45.png&quot; style=&quot;margin-left:1em;margin-right:1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;257&quot; src=&quot;http://4.bp.blogspot.com/-uqTMwA58wW4/TdI_3ZaTi1I/AAAAAAAAABs/M_kvGO67ll0/s320/Screen+shot+2011-05-17+at+10.28.45.png&quot; width=&quot;320&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;That was cool. Didn't have to change anything (other than switch to production mode for safety as it's being deployed in the wild) and I did all this in under 20 minutes (including signing up for RUN@cloud)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My next steps will be to integrate this web application with DEV@cloud and our Jenkins plugin for deployment to RUN@cloud so that I can show off continuous deployment! But that will be a different day!&lt;/div&gt;</description>
         <author>Stephen Connolly</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-21580788.post-1753910047661907517</guid>
         <pubDate>Tue, 17 May 2011 10:40:00 +0000</pubDate>
         <media:thumbnail height="72" url="http://1.bp.blogspot.com/-uT5H_QxEFJ4/TdI-3s8A-VI/AAAAAAAAABo/vDQmZXZf_Vk/s72-c/Screen+shot+2011-05-17+at+10.24.27.png" width="72" xmlns:media="http://search.yahoo.com/mrss/"/>
      </item>
      <item>
         <title>Update to the Hudson book</title>
         <link>https://janmaterne.wordpress.com/2010/11/22/update-to-the-hudson-book/</link>
         <description>News from the Hudson by Simon Wiest book I reviewed: it is now in the press and if you order it (e.g. at Amazon), you should be able to read it by Xmas ;-) (if you can read German :-O )&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&amp;#038;blog=544265&amp;#038;post=304&amp;#038;subd=janmaterne&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://janmaterne.wordpress.com/?p=304</guid>
         <pubDate>Mon, 22 Nov 2010 20:58:23 +0000</pubDate>
         <content:encoded><![CDATA[<p>News from the <a rel="nofollow" title="Hudsons homepage" target="_blank" href="http://hudson-ci.org/">Hudson</a> by <a rel="nofollow" title="Homepage Simon Wiest" target="_blank" href="http://www.simonwiest.de/">Simon Wiest</a> <a rel="nofollow" title="Book at the publisher" target="_blank" href="http://www.dpunkt.de/buecher/3293.html">book</a> I <a rel="nofollow" title="My blog about it" target="_blank" href="https://janmaterne.wordpress.com/2010/11/08/hudson-review-and-ideas/">reviewed</a>: it is now in the press and if you order it (e.g. at <a rel="nofollow" title="Order at Amazon" target="_blank" href="http://www.amazon.de/gp/product/3898646904/">Amazon</a>), you should be able to read it by Xmas <span class='wp-smiley wp-emoji wp-emoji-wink' title=';-)'>;-)</span> (if you can read German :-O )</p>
<p><a rel="nofollow" target="_blank" href="https://janmaterne.files.wordpress.com/2010/11/32931.jpg"><img class="aligncenter size-full wp-image-297" title="Cover &quot;Continuous Integration mit Hudson&quot; by Simon Wiest" src="https://janmaterne.files.wordpress.com/2010/11/32931.jpg?w=450" alt=""/></a></p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/janmaterne.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/janmaterne.wordpress.com/304/"/></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&#038;blog=544265&#038;post=304&#038;subd=janmaterne&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="https://2.gravatar.com/avatar/e965379db91e0faa68ee5c211e49118c?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">janmaterne</media:title>
         </media:content>
         <media:content medium="image" url="https://janmaterne.files.wordpress.com/2010/11/32931.jpg">
            <media:title type="html">Cover &quot;Continuous Integration mit Hudson&quot; by Simon Wiest</media:title>
         </media:content>
      </item>
      <item>
         <title>Hudson: Review and ideas</title>
         <link>https://janmaterne.wordpress.com/2010/11/08/hudson-review-and-ideas/</link>
         <description>In June I had the pleasure to do a review of the first German book about CI with Hudson by Simon Wiest. The book is announced for December 2010 and it will cover topics from basic (setup, first jobs) up to deep knowledge like writing plugins for Hudson. As with earlier reviews I had printed [&amp;#8230;]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&amp;#038;blog=544265&amp;#038;post=295&amp;#038;subd=janmaterne&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://janmaterne.wordpress.com/?p=295</guid>
         <pubDate>Sun, 07 Nov 2010 22:01:29 +0000</pubDate>
         <content:encoded><![CDATA[<p>In June I had the pleasure to do a review of the first German book about <a rel="nofollow" target="_blank" href="http://www.dpunkt.de/buecher/3293.html">CI with Hudson</a> by <a rel="nofollow" target="_blank" href="http://www.simonwiest.de/">Simon Wiest</a>. The book is announced for December 2010 and it will cover topics from basic (setup, first jobs) up to deep knowledge like writing plugins for Hudson.<a rel="nofollow" target="_blank" href="https://janmaterne.files.wordpress.com/2010/11/32931.jpg"><img class="aligncenter size-full wp-image-297" title="Cover &quot;Continuous Integration mit Hudson&quot; by Simon Wiest" src="https://janmaterne.files.wordpress.com/2010/11/32931.jpg?w=450" alt=""/></a></p>
<p>As with earlier reviews I had printed the book (draft), read it and made comments on the side (and Simon had to listen to them for hours <span class='wp-smiley wp-emoji wp-emoji-wink' title=';-)'>;-)</span></p>
<p>But some comments weren&#8217;t for the author &#8211; they &#8220;just&#8221; ideas which came into my mind. But because I won&#8217;t have the time for implementing them, I&#8217;ll write about them &#8230;</p>
<h1>Capability Plugin</h1>
<p>The main idea is automatic dispatching of jobs to slaves according to their needs. If I remember right, TeamCity has this feature too &#8230;</p>
<h2>The Slaves</h2>
<p>The slaves have some capabilities. There are two kinds of them:</p>
<ol>
<li>automatic capabilities: result from tool configuration, operating system, jdk versions, build tool name+version, &#8230;</li>
<li>manual capabilities: the admin of the slave can define key-value pairs</li>
</ol>
<h2>The Jobs</h2>
<p>For jobs you define requirements according to the provided capabilities. And like them there are two requirements:</p>
<ol>
<li>automatic requirements: selected jdk, build tool, operating system (if you use e.g. a Windows Batch &#8230;)</li>
<li>manual requirement: define additional requirements (or overwrite the complete formula). Use key=value (aspectj.available=true) or comparisons (ant.version &gt;= 1.8) and combine them (and, or, xor, &#8230;)</li>
</ol>
<h2>Dispatcher strategy</h2>
<p>The dispatcher must select all slaves which fit the defined requirements. From this list it selects the one by looking at the build queue of the slave (does it have time for building?) and net-response-time (don&#8217;t forget that much data has to be transfered &#8230;)</p>
<p>&nbsp;</p>
<p>Not sure if there is something like this now &#8230;. <span class='wp-smiley wp-emoji wp-emoji-wink' title=';-)'>;-)</span></p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/janmaterne.wordpress.com/295/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/janmaterne.wordpress.com/295/"/></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&#038;blog=544265&#038;post=295&#038;subd=janmaterne&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="https://2.gravatar.com/avatar/e965379db91e0faa68ee5c211e49118c?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">janmaterne</media:title>
         </media:content>
         <media:content medium="image" url="https://janmaterne.files.wordpress.com/2010/11/32931.jpg">
            <media:title type="html">Cover &quot;Continuous Integration mit Hudson&quot; by Simon Wiest</media:title>
         </media:content>
      </item>
      <item>
         <title>Hash tags in Commit Comments</title>
         <link>http://jlorenzen.blogspot.com/2010/08/hash-tags-in-commit-comments.html</link>
         <description>I've been using Yammer, Twitter, and Facebook consistently for awhile now. One of the things I really like are hash tags, where yams or tweets include additional meta information in the comment such as #groovy, #hudson, or #maven. One of the main purposes of hash tags, is it allows others to subscribe to an area of interest verses subscribing to hundreds of individual people. Another purpose it serves, is determining interest value; sort of like a subject heading. Since hash tags are typically at the end of a tweet or yam, I usually read the end first before I commit to reading the whole yam or tweet. I don't follow a ton of people yet, but I do consume a lot of information in a day and in order to find the good I have to wade through the bad. Using hash tags aides in this process.&lt;br /&gt;&lt;br /&gt;I also think hash tags could help in another area: commit comments. It's something important I've &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jlorenzen.blogspot.com/2010/02/commit-comments-conversation-with-your.html&quot;&gt;mentioned&lt;/a&gt; before, and I think hash tags can be useful in commit comments even if there aren't any tools yet to mash it up. A few days ago, our of habit I accidentally started including some high level hash tags in an svn commit comment and it occurred to me that it might be useful to others, if not myself in 6 months. If we find hash tags useful in yams and tweets, why not commit comments?&lt;br /&gt;&lt;br /&gt;Including tokens in commit comments isn't new. In fact, we already include a Jira number in most of our commit comments and this allows us to view all the commits for a Jira issue. There is even a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://blogs.atlassian.com/developer/2009/10/dragon_slayer_supplement_action_issues_with_commit_commands.html&quot;&gt;Jira plugin&lt;/a&gt; that allows you to perform actions by specifying hashes in commit comments. For example, if I want to resolve a Jira I can include #resolve in my commit comment, and Jira will automatically Resolve that Jira. And don't feel like you can't include the #resolve tag only if your using that jira plugin. I could see value in seeing a #resolve tag in the final commit of a Jira.&lt;br /&gt;&lt;br /&gt;As an example, here is the exact commit comment I used that includes some hash tags for geoserver and installer.&lt;br /&gt;&lt;br /&gt;&quot;&lt;i&gt;Jira: AC-4207. Got the filtered geowebcache.xml file correctly moved to the production and staging data directories. These files point to localhost with the correct geo port and stage geo port. Also commented out some fixpath.cmd lines to get the installer to work. Finally, I also change the ProcessPanel to not have a condition:  changed to . This should allow us to be really selective in what we install and still allow the process panel to run, whereas before it wasn't running. #geoserver #installer&lt;/i&gt; &quot;&lt;br /&gt;&lt;br /&gt;Now the really cool part is if someone else in the near future notices an issue with geoserver in our installer, this comment will stick out more than a comment without those hashes.&lt;br /&gt;&lt;br /&gt;Another cool thing that could be done is a team subscribing to certain hash tags in the svn commit emails. For example, someone responsible for peer reviewing all DAO changes could subscribe to a hash like #dao. Then when developers are modifying DAO's all they need to do is include the #dao tag.&lt;br /&gt;&lt;br /&gt;I guess what I am saying is perhaps we could also benefit from putting extra hash tags in our commit comments. My brain has already been trained to read them so personally I think it's useful.</description>
         <author>jlorenzen</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-1280619439915049383.post-8937840818543986</guid>
         <pubDate>Sat, 14 Aug 2010 23:20:00 +0000</pubDate>
      </item>
      <item>
         <title>Another Admin job Hudson: ensure that there are not too many old builds …</title>
         <link>https://janmaterne.wordpress.com/2010/08/14/another-admin-job-hudson-ensure-that-there-are-not-too-many-old-builds/</link>
         <description>Especially if you have a large number of jobs and they are running more often, you&amp;#8217;ll come to a point, where your disk is full of old builds. Hudson provides a configuration parameter for that: &amp;#8220;discard old builds&amp;#8221;. This will delete old builds according to the specified number of days or number of builds. For [&amp;#8230;]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&amp;#038;blog=544265&amp;#038;post=288&amp;#038;subd=janmaterne&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://janmaterne.wordpress.com/?p=288</guid>
         <pubDate>Sat, 14 Aug 2010 12:56:13 +0000</pubDate>
         <content:encoded><![CDATA[<p>Especially if you have a large number of jobs and they are running more often, you&#8217;ll come to a point, where your disk is full of old builds.</p>
<p>Hudson provides a configuration parameter for that: &#8220;discard old builds&#8221;. This will delete old builds according to the specified number of days or number of builds.</p>
<p style="text-align:center;"><a rel="nofollow" target="_blank" href="https://janmaterne.files.wordpress.com/2010/08/hudson1.jpg"><img class="aligncenter size-full wp-image-289" title="hudson1" src="https://janmaterne.files.wordpress.com/2010/08/hudson1.jpg?w=450" alt=""/></a></p>
<p>For Apache I wrote a script which ensures, that all jobs have &#8220;discard&#8221; setting and that existing values are not higher than a defined maximum value.</p>
<p><a rel="nofollow" target="_blank" href="https://janmaterne.files.wordpress.com/2010/08/hudson2.jpg"><img class="aligncenter size-full wp-image-290" title="hudson2" src="https://janmaterne.files.wordpress.com/2010/08/hudson2.jpg?w=450&#038;h=146" alt="" width="450" height="146"/></a></p>
<pre>

/** Default-Setting for the &quot;number of old builds&quot; */
numberOfOldBuilds  = 10

/** Maximum of &quot;number of days&quot; */
maxDaysOfOldBuilds = 14

/** Should we override existing values? */
overrideExistingValues = true

/** Closures for setting default 'max number' */
setMaxNum = { job -&gt;
   job.logRotator = new hudson.tasks.LogRotator(-1, numberOfOldBuilds)
}

/** Closures for setting default 'max number' */
setMaxDays = { job -&gt;
 job.logRotator = new hudson.tasks.LogRotator(maxDaysOfOldBuilds, -1)
}

// ----- Do the work. -----

// Access to the Hudson Singleton
hudsonInstance = hudson.model.Hudson.instance

// Retrieve all active Jobs
allItems = hudsonInstance.items
activeJobs = allItems.findAll{job -&gt; job.isBuildable()}

// Table header
col1 = &quot;Old&quot;.center(10)
col2 = &quot;New&quot;.center(10)
col3 = &quot;Job&quot;.center(50)
col4 = &quot;Action&quot;.center(14)
header = &quot;$col1 | $col2 | $col3 | $col4&quot;
line = header.replaceAll(&quot;[^|]&quot;, &quot;-&quot;).replaceAll(&quot;&#92;&#92;|&quot;, &quot;+&quot;)
title = &quot;Set 'Discard old builds'&quot;.center(line.size())

println title
println line
println header
println line

// Do work and create the result table
activeJobs.each { job -&gt;

 // Does the job have a discard setting?
 discardActive = job.logRotator != null

 // Enforce the settings
 action   = &quot;&quot;
 newValue = &quot;&quot;
 oldValue = &quot;&quot;
 if (!discardActive) {
 // No discard settings, so set the default
 setMaxNum.call(job)
 action   = &quot;established&quot;
 newValue = &quot;$numberOfOldBuilds jobs&quot;
 } else {
 // What are the current settings?
 oldDays = job.logRotator.daysToKeep
 oldNums    = job.logRotator.numToKeep

 if (oldNums &gt; 0) {
 // We have a set value for 'numbers'
 if (oldNums &gt; numberOfOldBuilds &amp;&amp; overrideExistingValues) {
 // value is too large so set a new one
 setMaxNum.call(job)
 action   = &quot;updated&quot;
 newValue = &quot;$numberOfOldBuilds jobs&quot;
 oldValue = &quot;$oldNums jobs&quot;
 } else {
 // Correct value or we arent allowed to override.
 oldValue = &quot;$oldNums jobs&quot;
 }
 } else {
 // we have a value for 'days'
 if (oldDays &gt; maxDaysOfOldBuilds &amp;&amp; overrideExistingValues) {
 // value is too large so set a new one
 setMaxDays.call(job)
 action   = &quot;updated&quot;
 newValue = &quot;$maxDaysOfOldBuilds days&quot;
 oldValue = &quot;$oldDays days&quot;
 } else {
 // Correct value or we aren't allowed to override.
 oldValue = &quot;$oldDays days&quot;
 }
 }
 }

 // String preparation for table output
 oldValue = oldValue.padLeft(10)
 newValue = newValue.padLeft(10)
 jobname  = job.name.padRight(50)

 // Table output
 println &quot;$oldValue | $newValue | $jobname | $action&quot;
}
println line

// Meaningful output on the Groovy console
// (the console will output the result of the last statement)
printout = &quot;Number of Jobs: $activeJobs.size&quot;

</pre>
<p>In the first section I define the &#8220;constants&#8221; (line 001-008). After that I define two closures which update a given Hudson job (line 010-018).<br />
The basic structure is the one I used in<a rel="nofollow" target="_blank" href="https://janmaterne.wordpress.com/2010/07/11/how-to-check-if-all-hudson-jobs-have-a-timeout/"> earlier scripts</a> &#8230;<br />
The work here is in lines 053-088. But that&#8217;s pretty easy: check the given values and eventually set new values using the pre defined closures.<br />
New is the last line: I dont use a &gt;x = &#8220;&#8221;&lt; instruction for suppressing the output. I use a more meaningful message: the number of jobs.</p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/janmaterne.wordpress.com/288/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/janmaterne.wordpress.com/288/"/></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&#038;blog=544265&#038;post=288&#038;subd=janmaterne&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="https://2.gravatar.com/avatar/e965379db91e0faa68ee5c211e49118c?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">janmaterne</media:title>
         </media:content>
         <media:content medium="image" url="https://janmaterne.files.wordpress.com/2010/08/hudson1.jpg">
            <media:title type="html">hudson1</media:title>
         </media:content>
         <media:content medium="image" url="https://janmaterne.files.wordpress.com/2010/08/hudson2.jpg">
            <media:title type="html">hudson2</media:title>
         </media:content>
      </item>
      <item>
         <title>POTD: bridge method injector</title>
         <link>http://www.java.net/blog/kohsuke/archive/2010/08/07/potd-bridge-method-injector</link>
         <description>&lt;p style=&quot;color:gray;&quot;&gt;(I started cross-posting blogs to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://kohsuke.org/2010/08/07/potd-bridge-method-injector/&quot;&gt;my own website&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;
I was working on Hudson yesterday which led me to develop this little tool called &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bridge-method-injector.infradna.com/&quot;&gt;Bridge method injector&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
When you are writing a library, there are various restrictions about the kind of changes you can make, in order to maintain binary compatibility.&lt;/p&gt;
&lt;p&gt;
One such restriction is an inability to restrict the return type. Say in v1 of your library you had the following code:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;public Foo getFoo() {&lt;br /&gt;    return new Foo();&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
In v2, say if you introduce a subtype of  called &lt;tt&gt;FooSubType&lt;/tt&gt;, and you want to change the &lt;tt&gt;getFoo&lt;/tt&gt; method to return &lt;tt&gt;FooSubType&lt;/tt&gt;.&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;public FooSubType getFoo() {&lt;br /&gt;    return new FooSubType();&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
But if you do this, you break the binary compatibility. The clients need to be recompiled to be able to work with the new signature. This is where this bridge method injector can help. By adding an annotation like the following:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;@WithBridgeMethods(Foo.class)&lt;br /&gt;public FooSubType getFoo() {&lt;br /&gt;    return new FooSubType();&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
... and running the bytecode post processor, your class file will get the additional &quot;bridge methods.&quot; In pseudo-code, it'll look like this:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;// your original definition&lt;br /&gt;@WithBridgeMethods(Foo.class)&lt;br /&gt;public FooSubType getFoo() {&lt;br /&gt;    return new FooSubType();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// added bridge method&lt;br /&gt;public Foo getFoo() {&lt;br /&gt;    invokevirtual this.getFoo()LFooSubType;&lt;br /&gt;    areturn&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Such code isn't allowed in Java source files, but class files allow that. With this addition, existing clients will continue to function.&lt;/p&gt;
&lt;p&gt;
In this way, you can evolve your classes more easily without breaking backward compatibility.&lt;/p&gt;
&lt;p&gt;
For more about how to use it in your Maven project, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://bridge-method-injector.infradna.com/&quot;&gt;the project website&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">461096 at http://www.java.net</guid>
         <pubDate>Sat, 07 Aug 2010 18:10:23 +0000</pubDate>
      </item>
      <item>
         <title>Links for 2010-07-20</title>
         <link>https://janmaterne.wordpress.com/2010/07/20/links-for-2010-07-20/</link>
         <description>According to Entwickler.COM Microsoft has published a free ebook about &amp;#8220;Cloud Computing&amp;#8221; by Bob Muglia. On Wakaleo the development of an open source book about Hudson: &amp;#8220;Continuous Integration with Hudson&amp;#8220;. First chapters are online &amp;#8230; Golem.DE has found a free German video workshop about Gimp 2.6. On DZone Hudson creator Kohsuke Kawaguchi introduced his new [&amp;#8230;]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&amp;#038;blog=544265&amp;#038;post=266&amp;#038;subd=janmaterne&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://janmaterne.wordpress.com/?p=266</guid>
         <pubDate>Tue, 20 Jul 2010 06:45:01 +0000</pubDate>
         <content:encoded><![CDATA[<p>According to <a rel="nofollow" target="_blank" href="http://entwickler.com/itr/news/psecom,id,51490,nodeid,82.html">Entwickler.COM</a> Microsoft has published a free <a rel="nofollow" target="_blank" href="https://www.microsoft.com/business/mycenter/library/cloud-computing.aspx">ebook</a> about &#8220;Cloud Computing&#8221; by Bob Muglia.</p>
<p>On Wakaleo the development of an open source book about <a rel="nofollow" target="_blank" href="http://hudson-ci.org/">Hudson</a>: &#8220;<a rel="nofollow" target="_blank" href="http://www.wakaleo.com/books/continuous-integration-with-hudson-the-book">Continuous Integration with Hudson</a>&#8220;. First chapters are online &#8230;</p>
<p><a rel="nofollow" target="_blank" href="http://www.golem.de/1004/74825.html">Golem.DE</a> has found a free German <a rel="nofollow" target="_blank" href="http://download.galileo-press.de/trailer/97/system/lesson.htm">video workshop</a> about <a rel="nofollow" target="_blank" href="http://www.gimp.org/">Gimp</a> 2.6.</p>
<p>On <a rel="nofollow" target="_blank" href="http://java.dzone.com/articles/kohsuke-kawaguchi-talks-hudson">DZone</a> Hudson creator Kohsuke Kawaguchi introduced his new startup, <a rel="nofollow" target="_blank" href="http://infradna.com/">InfraDNA</a>, which provides support and consulting for the <a rel="nofollow" target="_blank" href="http://hudson-ci.org/">Hudson</a> <a rel="nofollow" target="_blank" href="http://martinfowler.com/articles/continuousIntegration.html">Continuous Integration</a> system.</p>
<p>Again on <a rel="nofollow" target="_blank" href="http://java.dzone.com/articles/htmlunit-%E2%80%93-quick-introduction?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+javalobby%2Ffrontpage+(Javalobby+%2F+Java+Zone">DZone</a> there is a nice introduction into <a rel="nofollow" target="_blank" href="http://htmlunit.sourceforge.net/">HtmlUnit</a>. It provides a Java based WebClient which you can control via its API. With this you could write <a rel="nofollow" target="_blank" href="http://www.junit.org/">JUnit</a> tests. But more easily you could write them with the additional assert-Methods:</p>
<pre>
@Test
public void testGoogle(){
 WebClient webClient = new WebClient();
 HtmlPage currentPage = webClient.getPage(&quot;http://www.google.com/&quot;);
 assertEquals(&quot;Google&quot;, currentPage.getTitleText());
}
@Test public void htmlunitAsserts() {
 // Load a page
 webClient.getPage(&quot;http://www.google.com/search?q=htmlunit&quot;);

 // JUnit asserts and WebClient API
 assertEquals(200,currentPage.getWebResponse().getStatusCode());
 assertEquals(&quot;OK&quot;,currentPage.getWebResponse().getStatusMessage());

 // HtmlUnit asserts
 WebAssert.assertTextPresent(currentPage, &quot;htmlunit&quot;);
 WebAssert.assertTitleContains(currentPage, &quot;htmlunit&quot;);
 WebAssert.assertLinkPresentWithText(currentPage, &quot;Advanced search&quot;);

 // XPath Query
 assertTrue(currentPage.getByXPath(&quot;//h3&quot;).size()&gt;0); //result number

 // Cookies
 assertNotNull(webClient.getCookieManager().getCookie(&quot;NID&quot;));
}
</pre>
<p>According to <a rel="nofollow" target="_blank" href="http://entwickler.com/itr/news/psecom,id,54228,nodeid,82.html">Entwickler.COM</a> <a rel="nofollow" target="_blank" href="http://www.microsoft.com">Microsoft</a> has published a bunch of <a rel="nofollow" target="_blank" href="http://office.microsoft.com/en-us/powerpoint-help/free-professionally-designed-templates-for-powerpoint-2010-HA010359443.aspx">Powerpoint-Templates</a> for demonstrating the new features of PPT 2010.</p>
<p>If you ask yourself what Darth Vader and Yoda are doing after making the movies with George Lucas, <a rel="nofollow" target="_blank" href="http://www.golem.de/1007/76388.html">GolemDE</a> has found the answer: they are creating TomToms next voices &#8230; <span class='wp-smiley wp-emoji wp-emoji-wink' title=';-)'>;-)</span></p>
<p>If you are updating to <a rel="nofollow" target="_blank" href="http://java.sun.com/javase/6/webnotes/6u21.html">Java 1.6_21</a> and having problems with Eclipse, have a look at this <a rel="nofollow" target="_blank" href="http://aniefer.blogspot.com/2010/07/permgen-problems-and-running-eclipse-on.html">blog</a> entry: it show how to tune the JVM settings &#8230;</p>
<p>Also if you write JPA applications you should have a good test suite. So looking at the blog &#8220;<a rel="nofollow" target="_blank" href="http://greensopinion.blogspot.com/2010/07/patterns-for-better-unit-testing-with.html">Patterns for Better Unit Testing with JPA</a>&#8221; is not waste of time <span class='wp-smiley wp-emoji wp-emoji-wink' title=';)'>;)</span></p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/janmaterne.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/janmaterne.wordpress.com/266/"/></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&#038;blog=544265&#038;post=266&#038;subd=janmaterne&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="https://2.gravatar.com/avatar/e965379db91e0faa68ee5c211e49118c?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">janmaterne</media:title>
         </media:content>
      </item>
      <item>
         <title>Hudson: Overview of the suggestd timeout settings</title>
         <link>https://janmaterne.wordpress.com/2010/07/13/hudson-overview-of-the-suggestd-timeout-settings/</link>
         <description>In my last post I explained why and how to check the timeout settings for Hudson jobs. On our mailinglist for Hudson users at Apache there was a suggestion to get an overview of (computed) suggested timeout settings. So here is the follow up to my earlier code &amp;#8230; The new stuff is only the [&amp;#8230;]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&amp;#038;blog=544265&amp;#038;post=255&amp;#038;subd=janmaterne&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://janmaterne.wordpress.com/?p=255</guid>
         <pubDate>Tue, 13 Jul 2010 14:58:59 +0000</pubDate>
         <content:encoded><![CDATA[<p>In my<a rel="nofollow" target="_blank" href="https://janmaterne.wordpress.com/2010/07/11/how-to-check-if-all-hudson-jobs-have-a-timeout"> last post</a> I explained why and how to check the timeout settings for Hudson jobs.</p>
<p>On our mailinglist for Hudson users at Apache there was a suggestion to get an overview of (computed) suggested timeout settings.</p>
<p>So here is the follow up to my earlier code &#8230;</p>
<pre>
hudsonInstance = hudson.model.Hudson.instance&lt;/pre&gt;
allItems = hudsonInstance.items
activeJobs = allItems.findAll{job -&gt; job.isBuildable()}
wrappableJobs = activeJobs.findAll{job -&gt; job instanceof hudson.model.BuildableItemWithBuildWrappers}

jobsWithoutTimeout = wrappableJobs.findAll { job -&gt;
 job.getBuildWrappersList().findAll{it instanceof hudson.plugins.build_timeout.BuildTimeoutWrapper }[0] == null
}

println &quot;Suggested timeout values for jobs without any ($jobsWithoutTimeout.size in total):&quot;
jobsWithoutTimeout.each { job -&gt;
 defaultTimeout = Math.round(job.estimatedDuration * 2 / 1000 / 60)
 if (defaultTimeout &lt; 10) defaultTimeout = 10
 String s = defaultTimeout
 s = s.padLeft(4)
 println &quot;$s | $job.name&quot;
}

x = &quot;&quot;

</pre>
<p>The new stuff is only the creation in the last few lines. Nothing special &#8211; apart from the conversion from Long to String for getting padLeft() work <span class='wp-smiley wp-emoji wp-emoji-wink' title=';-)'>;-)</span></p>
<p>The result is a &#8220;table&#8221; like this:</p>
<p><a rel="nofollow" target="_blank" href="https://janmaterne.files.wordpress.com/2010/07/timout.jpg"><img class="aligncenter size-medium wp-image-257" title="Suggestion of Timeout values per Job" src="https://janmaterne.files.wordpress.com/2010/07/timout.jpg?w=300&#038;h=283" alt="Suggestion of Timeout values per Job"/></a></p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/janmaterne.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/janmaterne.wordpress.com/255/"/></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&#038;blog=544265&#038;post=255&#038;subd=janmaterne&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="https://2.gravatar.com/avatar/e965379db91e0faa68ee5c211e49118c?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">janmaterne</media:title>
         </media:content>
         <media:content medium="image" url="https://janmaterne.files.wordpress.com/2010/07/timout.jpg?w=300">
            <media:title type="html">Suggestion of Timeout values per Job</media:title>
         </media:content>
      </item>
      <item>
         <title>How to check if all Hudson jobs have a timeout?</title>
         <link>https://janmaterne.wordpress.com/2010/07/11/how-to-check-if-all-hudson-jobs-have-a-timeout/</link>
         <description>At Apaches Hudson installation I have sometimes seen the situation where too many builds are stuck and therefore blocking the executors. And sadly for me &amp;#8211; the executors my own jobs require &amp;#8230; Having a policy to use the &amp;#8220;build timeout plugin&amp;#8221; and kill jobs which are running too long (thinking more of &amp;#8220;not running [&amp;#8230;]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&amp;#038;blog=544265&amp;#038;post=247&amp;#038;subd=janmaterne&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://janmaterne.wordpress.com/?p=247</guid>
         <pubDate>Sun, 11 Jul 2010 13:18:18 +0000</pubDate>
         <content:encoded><![CDATA[<p>At Apaches <a rel="nofollow" target="_blank" href="http://hudson-ci.org/">Hudson</a> <a rel="nofollow" target="_blank" href="http://hudson.zones.apache.org">installation</a> I have sometimes seen the situation where too many builds are stuck and therefore blocking the executors. And sadly for me &#8211; the executors my own jobs require &#8230;</p>
<p>Having a policy to use the &#8220;<a rel="nofollow" target="_blank" href="http://wiki.hudson-ci.org/display/HUDSON/Build-timeout+Plugin">build timeout plugin</a>&#8221; and kill jobs which are running too long (thinking more of &#8220;not running any more&#8221; <span class='wp-smiley wp-emoji wp-emoji-wink' title=';)'>;)</span> is good. But having a program which checks this is better &#8230;</p>
<p>So I tried a little bit Groovy&#8217;in for the Groovy console:</p>
<pre>
hudsonInstance = hudson.model.Hudson.instance
allItems = hudsonInstance.items
activeJobs = allItems.findAll{job -&gt; job.isBuildable()}
wrappableJobs = activeJobs.findAll{job -&gt; job instanceof hudson.model.BuildableItemWithBuildWrappers}

jobsWithoutTimeout = wrappableJobs.findAll { job -&gt;
 job.getBuildWrappersList().findAll{it instanceof hudson.plugins.build_timeout.BuildTimeoutWrapper }[0] == null
}

println &quot;There are $jobsWithoutTimeout.size jobs without timeout:&quot;
jobsWithoutTimeout.each { println &quot;- $it.name&quot; }

x = &quot;&quot;
</pre>
<p>In line 1 we get the reference to the Hudson singleton. Then we get the list of all item in line 2 which we filter in line 3 to get only buildable items, like our jobs. The line 4 contains the first thing special to this requirement: the item must be able to have a BuildWrapper.</p>
<p>But the most thing is done in line 5 which filters again with a closure: get all BuildWrappers for the job, but only if it is our TimeOut-Plugin. Because it can be registered only once, I check the first element of that list. It must be null for being a problem. Otherwise the job has a timeout setting.</p>
<p>After that, the last two lines are simply out &#8230; and the last line supresses the result output in the console.</p>
<p><span style="text-decoration:underline;"><strong>Update:</strong></span></p>
<p><a rel="nofollow" target="_blank" href="http://www.lunar-ocean.com/">Antoine Tulme</a> had consulted <a rel="nofollow" target="_blank" href="http://www.kohsuke.org/">Kohsuke Kawaguchi</a> and he sees three possibilities of forcing the timeout setting:</p>
<ol>
<li>We cannot make the timeout field mandatory.</li>
<li>We can create a plugin that presets the timeout field.</li>
<li>We can iterate over the projects and set a value for the timeouts en masse.</li>
</ol>
<p>Good, so I evaluate my &#8220;iteration solution&#8221; a little more.</p>
<p>We have a list of all jobs without settings and so we only have to iterate over this list, instantiate and initialize the BuildTimeoutWrapper and add it to the jobs wrapper-list:</p>
<pre>
jobsWithoutTimeout.each { job -&gt;
 defaultTimeout = 180
 defaultFailBuild = false
 plugin = new hudson.plugins.build_timeout.BuildTimeoutWrapper(defaultTimeout, defaultFailBuild)
 job.getBuildWrappersList().add(plugin)
}

</pre>
<p>BTW &#8211; If you want to work with a plugin, you could start with the <a rel="nofollow" target="_blank" href="http://wiki.hudson-ci.org/display/HUDSON/Create+Job+Advanced+Plugin">Create Job Advances Plugin</a> &#8211; maybe this requires code enhancement &#8230; and it will only for future jobs, not for existing one.</p>
<p><span style="text-decoration:underline;"><strong>Update:</strong></span></p>
<p>The last update of the script for setting the timeout value is this:</p>
<pre>

hudsonInstance = hudson.model.Hudson.instance
allItems = hudsonInstance.items
activeJobs = allItems.findAll{job -&gt; job.isBuildable()}
defaultFailBuild = true

println &quot;Cur   |  Est  | Name&quot;
activeJobs.each { job -&gt;
 // Get the Timeout-PlugIn
 wrapper = job.getBuildWrappersList().findAll{it instanceof hudson.plugins.build_timeout.BuildTimeoutWrapper }[0]

 // Get the current Timeout, if any
 currentTimeout = (wrapper != null) ? wrapper.timeoutMinutes : &quot;&quot;

 // Calculate a new timeout with a min-value
 defaultTimeout = Math.round(job.estimatedDuration * 2 / 1000 / 60)
 if (defaultTimeout &lt; 10) defaultTimeout = 10

 // Update the timeout, maybe requires instantiation
 action = (wrapper != null) ? &quot;updated&quot; : &quot;established&quot;
 if (wrapper == null) {
 plugin = new hudson.plugins.build_timeout.BuildTimeoutWrapper(defaultTimeout, defaultFailBuild)
 job.getBuildWrappersList().add(plugin)
 } else {
 wrapper.timeoutMinutes = defaultTimeout
 }

 // String preparation for table output
 String defaultTimeoutStr = defaultTimeout
 defaultTimeoutStr = defaultTimeoutStr.padLeft(5)
 String currentTimeoutStr = currentTimeout
 currentTimeoutStr = currentTimeoutStr.padLeft(5)
 String jobname = job.name.padRight(40)

 // Table output
 println &quot;$currentTimeoutStr | $defaultTimeoutStr | $jobname | $action &quot;
}

x = &quot;&quot;

</pre>
<p>This updates all timeout settings and reports this like here:</p>
<p><a rel="nofollow" target="_blank" href="https://janmaterne.files.wordpress.com/2010/07/timout21.jpg"><img class="aligncenter size-full wp-image-264" title="Report of Timout-Setter" src="https://janmaterne.files.wordpress.com/2010/07/timout21.jpg?w=450&#038;h=137" alt="Report of Timout-Setter" width="450" height="137"/></a></p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/janmaterne.wordpress.com/247/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/janmaterne.wordpress.com/247/"/></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&#038;blog=544265&#038;post=247&#038;subd=janmaterne&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="https://2.gravatar.com/avatar/e965379db91e0faa68ee5c211e49118c?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">janmaterne</media:title>
         </media:content>
         <media:content medium="image" url="https://janmaterne.files.wordpress.com/2010/07/timout21.jpg">
            <media:title type="html">Report of Timout-Setter</media:title>
         </media:content>
      </item>
      <item>
         <title>My Upcoming Presentations</title>
         <link>http://www.java.net/blog/kohsuke/archive/2010/06/03/my-upcoming-presentations</link>
         <description>&lt;p style=&quot;color:gray;&quot;&gt;(I started cross-posting blogs to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://kohsuke.org/2010/06/03/my-upcoming-presentations/&quot;&gt;my own website&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;I will be presenting Hudson (with a focus on its Selenium support/integration) at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.meetup.com/seleniumsanfrancisco/calendar/13674328/&quot;&gt;the upcoming San Francisco Selenium Meetup event on Jun 22nd in San Francisco&lt;/a&gt;. There are several Selenium-related plugins in Hudson, but running Selenium tests on Hudson involves some initial setup cost. I'd discuss those, plus general-purpose features in Hudson that really work well with Selenium.&lt;/p&gt;
&lt;p&gt;In the week after that, from 30th to July 3rd, I'll be in Israel, thanks to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jfrog.org/&quot;&gt;JFrog&lt;/a&gt;. This is my first visit to Israel, so I'm really excited. If there are any Hudson users there who'd like to meet up, please let me know, as I'm always interested in seeing different deployments of Hudson and learn from those. Or if you are interested in having me do a short on-site work, there won't be any travel cost, so this would be a good opportunity ;-)&lt;/p&gt;
&lt;p&gt;Further down the road, I'll be speaking in JavaOne 2010. Historically we have a good number of Hudson committers/users in JavaOne, so we've been doing some get-together. I hope we can do it again, so please stay tuned as the details of the conference develops over the summer.&lt;/p&gt;</description>
         <guid isPermaLink="false">424644 at http://www.java.net</guid>
         <pubDate>Thu, 03 Jun 2010 17:05:08 +0000</pubDate>
      </item>
      <item>
         <title>How to create a release without the maven2 release plugin</title>
         <link>http://jlorenzen.blogspot.com/2010/05/how-to-create-release-without-maven2.html</link>
         <description>One of the most referenced articles I have written is &quot;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jlorenzen.blogspot.com/2007/09/how-to-create-release-using-maven2.html&quot;&gt;How to create a release using the maven release plugin&lt;/a&gt;&quot;. But what if you can't get the maven release plugin to work with your project? Perhaps like our team, you've got a legacy maven2 multi-module project that's been nigh impossible to use with the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://maven.apache.org/plugins/maven-release-plugin/&quot;&gt;release plugin&lt;/a&gt;. Our project has a mix of WAR modules combined with some Flex modules. I believe our last issue was some googlecode flex mojo wasn't working with the release plugin. Consequently, for the past year or so, we've been manually creating our releases. This actually hasn't been that much of a pain since we really only do it once a sprint at the end. Combined with my favorite &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.debianadmin.com/howto-replace-multiple-file-text-string-in-linux.html&quot;&gt;perl script&lt;/a&gt; it doesn't really take that long. However, it does have the disadvantage of requiring some knowledge of what and now to do it. Ideally, it would be a job in &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://hudson-ci.org/&quot;&gt;Hudson&lt;/a&gt;, anyone on the team could run as many times as they like.&lt;br /&gt;&lt;br /&gt;In an effort to try and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jlorenzen.blogspot.com/2010/04/thoughts-on-fowlers-continuous.html&quot;&gt;automate as much as possible&lt;/a&gt;, I decided to try and automate releasing our legacy multi-module project using bash. This has several benefits: create a release faster, done consistently each time, turn-key solution anyone on the team can run that doesn't require stale documentation on how to do it.&lt;br /&gt;&lt;br /&gt;It took my several hours to essentially duplicate the maven release plugin process. Thanks to our new intern Scott Rogers and linux master Ron Alleva, I was eventually able to get it finished. It's my first &quot;official&quot; bash script so pardon the mess. If you've never attempted to automate your release project, first consider reading my article on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jlorenzen.blogspot.com/2007/09/how-to-effectively-use-snapshot.html&quot;&gt;How to effectively use SNAPSHOT&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here is the script available as a gist on github: &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://gist.github.com/401974&quot;&gt;project-release.sh&lt;/a&gt;. Here is what it does:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Copies the current working branch (i.e. trunk) into another branch. It uses the pom.xml  value to get the current working branch.&lt;/li&gt;&lt;li&gt;Updates all the pom.xml version sections of the current working branch&lt;/li&gt;&lt;li&gt;Commits the pom.xml changes&lt;/li&gt;&lt;li&gt;Checks out the release branch&lt;/li&gt;&lt;li&gt;Updates all the pom.xml version sections of the release branch (basically stripping off -SNAPSHOT)&lt;/li&gt;&lt;li&gt;Commits the pom.xml changes&lt;/li&gt;&lt;/ol&gt;To run this script all you have to do is run: &lt;i&gt;project-release.sh 2 false&lt;/i&gt;. The first parameter (2) is the increment position that the current working branch needs to be next. For example, if trunk was on 1.2.0-SNAPSHOT and the position passed in was 2, then trunk gets updated to 1.3.0-SNAPSHOT. If the position was 3 then trunk would be updated to 1.2.1-SNAPSHOT. The second parameter is used when testing. It's like the dryRun option in the maven release plugin. When set to true, nothing gets copied or committed.&lt;br /&gt;&lt;br /&gt;A few notes about the script:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The base branch URL is hardcoded but could easily be passed in as another parameter or placed and read from some external file.&lt;/li&gt;&lt;li&gt;It uses the cmd &lt;i&gt;xpath&lt;/i&gt; to extract out the pom version, project name, and scm url. I'm on ubuntu 9.10 and according to synaptic I have libxml-xpath-perl version 1.13-6 installed.&lt;/li&gt;&lt;li&gt;It doesn't run any maven commands like mvn deploy. Other jobs in CI can accomplish that or you can easily add them into the script.&lt;/li&gt;&lt;li&gt;To run from Hudson:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Create a New Job&lt;/li&gt;&lt;li&gt;In the Build section Add a Execute Shell Step&lt;/li&gt;&lt;li&gt;Update the Command text with: $WORKSPACE/trunk/project-release.sh 2 false&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;Overall, I'm pretty happy with the outcome. And as we start to perform more releases among multiple projects I think it's going to really come in handy. I think ideally you should try and release your project using the maven release plugin, but if that isn't possible then don't give up. Just clone.</description>
         <author>jlorenzen</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-1280619439915049383.post-2038567867122876467</guid>
         <pubDate>Fri, 14 May 2010 22:40:00 +0000</pubDate>
      </item>
      <item>
         <title>Interview with DZone</title>
         <link>http://www.java.net/blog/kohsuke/archive/2010/04/29/interview-dzone</link>
         <description>&lt;p style=&quot;color:gray;&quot;&gt;(I started cross-posting blogs to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://kohsuke.org/2010/04/29/interview-with-dzone/&quot;&gt;my own website&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;I did a quick interview with DZone about my new company, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.infradna.com/&quot;&gt;InfraDNA&lt;/a&gt;, which they &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://java.dzone.com/articles/kohsuke-kawaguchi-talks-hudson&quot;&gt;published on their website&lt;/a&gt;. Thank you DZone for the opportunity!&lt;/p&gt;</description>
         <guid isPermaLink="false">404144 at http://www.java.net</guid>
         <pubDate>Fri, 30 Apr 2010 04:45:48 +0000</pubDate>
      </item>
      <item>
         <title>Introducing InfraDNA, the Hudson company</title>
         <link>http://www.java.net/blog/kohsuke/archive/2010/04/26/introducing-infradna-hudson-company</link>
         <description>&lt;p style=&quot;color:gray;&quot;&gt;(I started cross-posting blogs to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.kohsuke.org/&quot;&gt;my own website&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;As I wrote in my farewell note, I was working on starting a new company around Hudson. It took longer than I initially anticipated, but it's finally &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://infradna.com/&quot;&gt;open for business&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;The company will provide two things; one is support, so that I can answer your questions and problem reports in a timely fashion, and the other is consulting, so that I can help you develop custom plugins, or provide on-site support to work on some tricky problems.&lt;/p&gt;
&lt;p&gt;The name of the company is InfraDNA because I think of Hudson more as an infrastructure on which all kinds of server-side automation/tools can be built/deployed, and because I think this stuff is built into me (as in DNA) &amp;mdash; when I look back my career as a software engineer, I always somehow seem to come back to tooling. (Plus, the domain name was available!)&lt;/p&gt;
&lt;p&gt;Looking forward to hearing from you.&lt;/p&gt;</description>
         <guid isPermaLink="false">401531 at http://www.java.net</guid>
         <pubDate>Mon, 26 Apr 2010 23:09:17 +0000</pubDate>
      </item>
      <item>
         <title>POTD: GitHub API for Java</title>
         <link>http://www.java.net/blog/kohsuke/archive/2010/04/18/potd-github-api-java</link>
         <description>&lt;p style=&quot;color:gray;&quot;&gt;(I started cross-posting blogs to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.kohsuke.org/&quot;&gt;my own website&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;My project of the day (or &amp;quot;POTD&amp;quot;) is &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://kohsuke.org/github-api/&quot;&gt;GitHub API for Java&lt;/a&gt; &amp;mdash; a library for accessing GitHub programmatically.&lt;/p&gt;
&lt;p&gt;As the Hudson community is embracing plugins developed in Git more and more, I needed to interact with GitHub as a part of the community infrastructure automation. I did a quick Google search to locate existing implementations, but unfortunately I couldn't find anything good. So I decided to just write my own. Thanks to a reasonable API design of GitHub and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://develop.github.com/&quot;&gt;a good documentation&lt;/a&gt;, it was very easy to do so. The trick is to use &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jackson.codehaus.org/&quot;&gt;the right library&lt;/a&gt;, which handles most of the JSON/Java databinding.&lt;/p&gt;
&lt;p&gt;The library so far only covers the part of the GitHub API that I care about, which is a small subset of the entire GitHub API. But hopefully this library is easy enough to extend so that other people can add the remaining APIs. The source code is available in &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://github.com/kohsuke/github-api&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">396720 at http://www.java.net</guid>
         <pubDate>Mon, 19 Apr 2010 05:38:28 +0000</pubDate>
      </item>
      <item>
         <title>Hudson console markups</title>
         <link>http://www.java.net/blog/kohsuke/archive/2010/04/14/hudson-console-markups</link>
         <description>&lt;p style=&quot;color:gray;&quot;&gt;(I started cross-posting blogs to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.kohsuke.org/&quot;&gt;my own website&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Despite all the report comprehension in Hudson, such as JUnit, PMD, FindBugs, etc., log files still hold a special place in terms of capturing what has really happened. Hudson does a bit of AJAX in this space to let you follow output as it comes, but the log is basically just a plain text that doesn't really have structures.&lt;/p&gt;
&lt;p&gt;But that is changing. One of the recent improvements in Hudson is &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://hudson-ci.org/javadoc/index.html?hudson/console/package-summary.html&quot;&gt;the infrastructure and extension points for Hudson&lt;/a&gt; (and its plugins) to mark up the console output to improve interactivity and do some cool stuff.&lt;/p&gt;
&lt;p&gt;I prepared two kinds of extension points for this. One is the ability to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://hudson-ci.org/javadoc/index.html?hudson/console/ConsoleAnnotator.html&quot;&gt;scan the console output line by line and add arbitrary markup to it&lt;/a&gt;. This can be used for context-independent markup, for example to turn URLs into hyperlinks, look for keywords like &amp;quot;ERROR&amp;quot;, that sort of things.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://hudson-ci.org/javadoc/index.html?hudson/console/ConsoleNote.html&quot;&gt;The other kind&lt;/a&gt; is more interesting, where we can place anchors (I call them 'notes') at arbitrary points during the output, and those notes can then in turn generate markups. This enables highly context sensitive markups, which I think has a lot of potential.&lt;/p&gt;
&lt;p&gt;For example, I started putting a note for every Ant target that gets executed during the Ant execution. I can use this to generate outline for the console output, so that you can jump to the interesting targets, or move up/down to next target very quickly. For simple build scripts, I can let users click the target name and jump to its definition in the build script.&lt;/p&gt;
&lt;p&gt;Another place I do this today is when Hudson reports an exception. I can make a stack trace foldable so as not to overwhelm users, and I can also hyperlink each stack trace element to its source file, as a way to encourage people to start hacking Hudson. Or if a build fails, I can present an UI that gives you actions that you might want to take --- 1. edit config, 2. rebuild, 3. report to the admin, etc.&lt;/p&gt;
&lt;p&gt;With Maven, where Hudson puts a little spying agent inside the Maven process, I can do even better. For example, wouldn't it be nice if you can hide all the &amp;quot;[INFO]&amp;quot; message with one mouse click? How about a navigation from compilation failure reports to source files? Or if you have an outline of modules that were built and jump to them quickly?&lt;/p&gt;
&lt;p&gt;If you are an user, this is just a sneak preview into what will come. If you are a plugin developer, think about all the things you might want to do with this mechanism!&lt;/p&gt;</description>
         <guid isPermaLink="false">394855 at http://www.java.net</guid>
         <pubDate>Thu, 15 Apr 2010 01:15:14 +0000</pubDate>
      </item>
      <item>
         <title>Thoughts on Fowler's Continuous Integration</title>
         <link>http://jlorenzen.blogspot.com/2010/04/thoughts-on-fowlers-continuous.html</link>
         <description>It's always kind of nice to go back to the basics. I've always enjoyed re-reading basic programming practices and patterns. I tend to forget the things I don't use on a daily basis. That's why I enjoyed reading Martin Fowler's article on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://martinfowler.com/articles/continuousIntegration.html&quot;&gt;Continuous Integration&lt;/a&gt;. The article says the last significant update occurred May 2006, but it's withstood the test of time; much like &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://en.wikipedia.org/wiki/The_Cathedral_and_the_Bazaar&quot;&gt;The Cathedral and the Bazaar&lt;/a&gt;. But if you don't have the time to read this rather long article, here are a few of the favorites I pulled out as I read it over the course of a few days. Before that, let me explain a little bit of my experience.&lt;br /&gt;&lt;br /&gt;At my first programming job we didn't really have a VCS (Version Control System) like CVS or SVN nor did we have a CI (Continuous Integration) server; we really didn't know any better. We essentially did all of our work straight off a shared drive (I know). But that was before I came to Gestalt, now Accenture, 5 years ago. Since then I've been exposed to CVS--&amp;gt;SVN--&amp;gt;Git, Ant--&amp;gt;Maven 1--&amp;gt;Maven 2,&amp;nbsp; CruiseControl--&amp;gt;Hudson, and finally TDD (Test Driven Development). Being exposed to all of this has been a huge improvement to my career. More importantly it's been a huge benefit to how I write software and the tools our teams use such as VCS and CI. I can't image developing software without them.&lt;br /&gt;&lt;br /&gt;Here are some points out of &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://martinfowler.com/articles/continuousIntegration.html&quot;&gt;Continuous Integration&lt;/a&gt; that I would think applies to any project java or not:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Work does not stop on your commit&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&quot;However my commit doesn't finish my work. At this point we build again, but this time on an integration machine based on the mainline code. Only when this build succeeds can we say that my changes are done.&quot;&lt;/blockquote&gt;So true. Just because you ran some tests locally or manually tested it, doesn't mean your done just because you checked in your changes. You've got to monitor CI to ensure it passes. This has been a topic of discussion on my team lately as we've come in in the morning with a few broken builds. Solution: check in often during the day, but don't checkin and leave and not verify CI passed. Either stay late, sign in at home, come in early, or checkin first thing the next day.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Simple checkout build rule&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&quot;The basic rule of thumb is that you should be able to walk up to the project with a virgin machine, do a checkout, and be able to fully build the system.&quot;&lt;/blockquote&gt;This is a very important point. Not only will this improve the productivity of new team members but also reduce the amount of time it takes to create new CI jobs. This rule is even more important for open source projects. I've had several issues in the past trying to patch open source projects and wasted several hours just trying to build their code. If you want people do contribute to your project, make it easy for them to build your software. For example, I've been wanting to write a simple &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://do.davebsd.com/wiki/Docky&quot;&gt;Docky plugin&lt;/a&gt; for &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://hudson-ci.org/&quot;&gt;Hudson&lt;/a&gt;, but have ran into several issues (&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://answers.launchpad.net/docky/+question/99325&quot;&gt;New Plugin&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://answers.launchpad.net/docky/+question/99967&quot;&gt;Missing Package&lt;/a&gt;) trying to build the Do project. Have those questions really been Answered? NO! What have I done about it? I haven't retried it since. To restate Mr. Fowler, I should be able to easily checkout your code and at a minimum build it. As an added bonus it'd be nice to run unit tests as well.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Automate everything&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&quot;However like most tasks in this part of software development it can be automated - and as a result should be automated. Asking people to type in strange commands or clicking through dialog boxes is a waste of time and a breeding ground for mistakes.&quot;&lt;/blockquote&gt;If your just getting started with CI this can often be difficult. But your long term goal should be to automate everything. This includes creating/destroying your database, deploying/undeploying your application, automating your tests, copying configuration files around. I'd even go as far as to say automate the creation of the development environment: installing maven and java for example. Again this not only speeds up new team members productivity but also those virgin CI servers.&lt;br /&gt;&lt;br /&gt;Two great examples of this. Before we had a internal CI team, our team was manually setting up multiple CI servers with maven, java, jboss, and a database. These new servers couldn't be used until all of this stuff was manually configured. Then our internal CI team helped automate some of this stuff and we can very easily use hudson to point jobs at different servers within minutes. Something that wasn't really possible before without manually intervention. And all they really did was call a few simple ant copy commands from maven.&lt;br /&gt;&lt;br /&gt;Another good example of this comes back from our old CruiseControl and Ant days. At one point in our project we were constantly breaking a major piece of functionality and one of the main reasons was it was very difficult to test. It was a distributed test with multiple servers communicating with multiple clients via SIP. The build process called for building the latest code, stopping 2 instances of weblogic (1 local, 1 remote), starting weblogic, deploying the latest code, waiting for weblogic to finish starting (not easy mind you), and then running our automated test. This was rather huge undertaking, but given a few weeks we had the core of it automated. It was amazing. I never thought it would have been possible, but it was and anytime that test failed we knew immediately we broke something. We were able to accomplish the difficult parts by calling remote bash scripts via ssh from ant.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Imperfect Tests&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&quot;Imperfect tests, run frequently, are much better than perfect tests that are never written at all. &quot;&lt;/blockquote&gt;Not exactly sure what he means by imperfect tests, but this is one place I currently disagree. It takes practice to write good tests. Once you refactor and maintain tests over a long period of time you start getting pretty good at writing tests that require less refactoring. One of the things that is killing the productivity of our team right now is what I call &quot;cronically failing tests&quot; or tests that randomly fail for no reason. You check the change log and nothing changed in the build which means it shouldn't have failed. You rebuild the job and it passes. Here lately this can be attributed to date comparison asserts and issues with timing. For example, the test passes when the database is local, but fails when the database is remote. Or you get different results when the time on the database server is not sync'd. The end result is this produces false negatives that really hurt the validity of CI; developers just start ignoring all failures. Once you've identified one of these cronically failing tests, it's important the author of that test, or the person who last modified it, refactor the test to be flexible. If the author doesn't do it, they will continue producing these types of imperfect tests.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Good Build Characteristics&lt;/b&gt;&lt;br /&gt;He had several comments I would wrap into good general build characteristics. Two of which are fast builds and accessible artifacts. As a general rule he suggests keeping build times to around 10 minutes. Which is usually achievable for compile/unit test jobs, but database related and above can usually take longer. My general guideline is try to keep those longer running builds to around 30 minutes, but definitely no longer than an hour. Unfortunately right now, we have several of those 40-55 minute builds I'd like to trim down some. It'd be great to see a hudson plugin that could show me how long each part of my build took.&lt;br /&gt;&lt;br /&gt;With a combination of our company maven repository and hudson, it's pretty easy to make our artifacts accessible. This is really huge as sometimes I don't waste time building certain things that take forever to build; I'll just download them from hudson. I know a lot of times our DBA will just download the zip he wants to test and prevents him from updating his source and building, etc. Another related topic is we have several nightly jobs that deploy the latest code to jboss/websphere that can be used the next day by everyone to see/test/verify the latest code.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Rollback Deployment&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&quot;If you deploy into production one extra automated     capability you should consider is automated rollback.&quot;&lt;/blockquote&gt;This was a pretty new concept for me and one we don't necessarily follow. I've heard of Continuous Deployment, but never really heard about a rollback feature. I know we've accidentally benefited from a build failing and not deploying the latest nightly code thus allowing us to perform diff-debugging to track down a bug. We had 2 servers that built the night before, 1 passed and the other failed so it contained the previous days build. A bug was detected on the passing server and we were unable to reproduce on the outdated server. This told us it had been introduced in the past 24 hours. This isn't exactly rolling back but maybe the morale of the story is keeping a server around that is behind a day.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;br /&gt;There is a lot of good general information in this article and I would encourage anyone to take the time to read it. I only highlighted the things that really stuck out at me; there were a lot more useful things I passed mentioning.</description>
         <author>jlorenzen</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-1280619439915049383.post-5058753529986294660</guid>
         <pubDate>Wed, 14 Apr 2010 22:43:00 +0000</pubDate>
      </item>
      <item>
         <title>POTD: Custom Access Modifier</title>
         <link>http://www.java.net/blog/kohsuke/archive/2010/04/09/potd-custom-access-modifier</link>
         <description>&lt;p&gt;My project of the day (or &quot;POTD&quot;) is &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://kohsuke.org/access-modifier/&quot;&gt;Custom Access Modifier&lt;/a&gt; — an annotation and an enforcer that lets you define application-defined custom access modifiers,&lt;/p&gt;
&lt;p&gt;So let me explain this a bit more. Say you have a library that people use, and say you are thinking about deprecating one of the methods. Yes, you can just put &lt;code class=&quot;prettyprint&quot;&gt;@Deprecated&lt;/code&gt;, but that doesn't actually prevent people from continuing to use them. This is where you can put the custom access modifier, like this:&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;public class Library {&lt;br /&gt;    @Deprecated @Restricted(DoNotUse.class)&lt;br /&gt;    public void foo() {&lt;br /&gt;        ...&lt;br /&gt;    }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This causes compilation to fail for new source files that try to call the &lt;tt&gt;foo&lt;/tt&gt; method. But at the resulting class file still contains the method, so existing applications continue to work. As per the JVM spec, this contraint enforcement is strictly in the user land and thus voluntary, and at the runtime there's no check nor overhead.&lt;/p&gt;
&lt;p&gt;Or say you have a &quot;public&quot; class that's never intended to be used outside your library? Not a problem.&lt;/p&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;code&gt;@Restricted(NoExternalUse.class)&lt;br /&gt;public class FooBarImpl {&lt;br /&gt;    ...&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the first version, I packaged the enforcer as a Maven mojo, but it should be trivial to write an Ant task or CLI. A real usability improvement is if this can be done as JSR-269 compatible annotation processor, but unfortunately the enforcer needs bytecode level access to the source files being compiled, and I don't think JSR-269 gives me that, which is a pity.&lt;/p&gt;
&lt;p&gt;The real flexibility here is that you can define your own access restrictions, not just using those that I provided out of the box.&lt;/p&gt;
&lt;p&gt;The reason I came up with this is to better assist the feature deprecation in Hudson. With 6+ years of the code history, there are a fair amount of deprecated code in the foundation. We'd eventually like to remove them, but we can't just delete them all the sudden — there might be plugins using them out there. But with this plugin, I can actually make sure that plugins are not using those deprecated features that are candidates for removal.&lt;/p&gt;
&lt;p&gt;I hope you'll find &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://kohsuke.org/access-modifier/&quot;&gt;this tool&lt;/a&gt; useful. The source is on GitHub.&lt;/p&gt;</description>
         <guid isPermaLink="false">391855 at http://www.java.net</guid>
         <pubDate>Fri, 09 Apr 2010 23:08:57 +0000</pubDate>
      </item>
      <item>
         <title>Good bye, Sun/Oracle</title>
         <link>http://www.java.net/blog/kohsuke/archive/2010/04/05/good-bye-sunoracle</link>
         <description>&lt;p&gt;I started working for Sun Microsystems since Janurary 2001, when I first came to the US. During these years I was able to work on many different projects, such as MSV, JAXB, JAX-WS, Metro, GlassFish v3, and Hudson, to name a few, with many great people. It was all quite an enjoyable journey. I won't list all those names one by one here, for it will be too long, but if you are one of them, I think you know that I'm talking about you. As my colleague Abhijit said once, a large part of enjoying your work is the people you work with.&lt;/p&gt;
&lt;p&gt;So with a bit of sadness and a lot of excitements, I announce that today is my last day at Oracle.&lt;/p&gt;
&lt;p&gt;Where am I heading next? I'm actually starting my own company to take Hudson to the next stage. This has always been in the back of my mind, and I'm very excited that I'm finally doing it. Stay tuned for more details, in a week or so. But in the mean time, if you'd like get any custom development/support done on Hudson, please let me know at &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;mailto:kk@kohsuke.org&quot;&gt;kk@kohsuke.org&lt;/a&gt; so that we can start having a conversation.&lt;/p&gt;
&lt;p&gt;Even though I leave Oracle, I'll continue to lead the Hudson project. I'll be working with Oracle to transfer the infrastructure services to their IT operations team. There might be some out-of-schedule releases, service disruptions, and other inconveniences during this period, but hopefully things will be back in order relatively quickly.&lt;/p&gt;
&lt;p&gt;And finally, big thank you to everyone in the Hudson community, and in a broader java.net community. I wouldn't be here without you guys, and I feel very proud that I'm a part of it. Thanks for your patronage to my projects, and I hope our relationship will continue.&lt;/p&gt;</description>
         <guid isPermaLink="false">388683 at http://www.java.net</guid>
         <pubDate>Mon, 05 Apr 2010 21:59:13 +0000</pubDate>
      </item>
      <item>
         <title>Hudson Hackathon Day 1</title>
         <link>http://www.java.net/blog/kohsuke/archive/2010/03/19/hudson-hackathon-day-1</link>
         <description>&lt;img border=&quot;0&quot; align=&quot;left&quot;/&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wiki.hudson-ci.org/display/HUDSON/Hudson+Bay+Area+Hackathon+2.0&quot;&gt;Hudson Hackathon Day 1&lt;/a&gt; is over, and I'm just back to the office.&lt;/p&gt;
&lt;p&gt;Total of 9 people came and we had a great time talking about infrastructure issues, possible enhancements, design dicussions, exchanging tips and plugins that they've developed, and otherwise building personal relationships. It was a beautiful day outside, and fortunately the meeting room had a lot of Sun lights to create a warm atmosphere.&lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.java.net/sites/default/files/HackathonDay1.jpeg&quot;/&gt;&lt;/div&gt;
&lt;p&gt;As for me, I didn't get much hacking done, but that's OK because my job there was to help others more than to get hacking done myself.&lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.java.net/sites/default/files/HackathonDay1.2.JPG&quot;/&gt;&lt;/div&gt;
&lt;table id=&quot;attachments&quot; class=&quot;sticky-enabled&quot;&gt;
 &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Attachment&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt; &lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
 &lt;tr class=&quot;odd&quot;&gt;&lt;td&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.java.net/sites/default/files/HackathonDay1.jpeg&quot;&gt;HackathonDay1.jpeg&lt;/a&gt;&lt;/td&gt;&lt;td&gt;84.27 KB&lt;/td&gt; &lt;/tr&gt;
 &lt;tr class=&quot;even&quot;&gt;&lt;td&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.java.net/sites/default/files/HackathonDay1.2.JPG&quot;&gt;HackathonDay1.2.JPG&lt;/a&gt;&lt;/td&gt;&lt;td&gt;68.94 KB&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
         <guid isPermaLink="false">379113 at http://www.java.net</guid>
         <pubDate>Sat, 20 Mar 2010 01:37:23 +0000</pubDate>
         <enclosure length="86288" type="image/jpeg" url="http://www.java.net/sites/default/files/HackathonDay1.jpeg"/>
      </item>
      <item>
         <title>Hudson Hackathon this weekend</title>
         <link>http://www.java.net/blog/kohsuke/archive/2010/03/16/hudson-hackathon-weekend</link>
         <description>&lt;p&gt;If you are living in San Francisco bay area, or if you are visiting the area for EclipseCon next week, make sure to come to Hudson Hackathon this Friday 3/19 and/or Saturday 3/20. The plan is to meet up, hang out, chat, hack code, and have fun. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wiki.hudson-ci.org/display/HUDSON/Hudson+Bay+Area+Hackathon+2.0&quot;&gt;If you are planning to attend, please RSVP by leaving your name on Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We planned this for two days, so that people doing Hudson for work can come Friday during their business hours, and people doing Hudson outside work can come Saturday without conflicting with day job commitments. Friday it'll be hosted at Oracle Santa Clara campus (and I booked a nice conference room that we only use for special occasions), and Saturday it'll be hosted at Hacker Dojo in Mountain View. &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wiki.hudson-ci.org/display/HUDSON/Hudson+Bay+Area+Hackathon+2.0&quot;&gt;See the Wiki page for more details&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It should be a lot of fun &amp;mdash; please come join us.&lt;/p&gt;</description>
         <guid isPermaLink="false">376332 at http://www.java.net</guid>
         <pubDate>Tue, 16 Mar 2010 18:36:43 +0000</pubDate>
      </item>
      <item>
         <title>Free Maven Repository Hosting for Open Source projects by Sonatype</title>
         <link>http://jlorenzen.blogspot.com/2010/03/free-maven-repository-hosting-for-open.html</link>
         <description>I'm very excited to &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://java.dzone.com/news/sonatype-free-maven-repo&quot;&gt;see&lt;/a&gt; Sonatype support maven repositories for Open Source projects that use maven. In all honesty, they didn't have to do this. Unfortunately, the java.net repo was &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://java.dzone.com/articles/dont-publish-nexus-oss-here&quot;&gt;harming&lt;/a&gt; the maven reputation. I've had direct experience using the java.net maven repo and can say it was an unpleasant experience. When we open sourced our 4 JBI (Java Business Integration) &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://wiki.open-esb.java.net/Wiki.jsp?page=GestaltUserCenter&quot;&gt;Components&lt;/a&gt; their home existed on java.net and we used the their maven repo. It was difficult to upload anything and it seemed to be constantly down.&lt;br /&gt;&lt;br /&gt;Before this announcement, open source java projects using maven didn't really have an option as to where they could publish their artifacts. To my knowledge neither Google Code or Sourceforge offered this capability. Apache and Codehaus did and obviously you still have the Maven Central (http://repo1.maven.org/maven2/), but I never went through the process of what it took to use them. Now it doesn't matter where your project is hosted. Hopefully the next thing to come is free Continuous Integration services in the cloud using &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://hudson-ci.org/&quot;&gt;Hudson&lt;/a&gt;. I think this is the next step for project hosting sites like Google Code and github.&lt;br /&gt;&lt;br /&gt;Providing free maven repos I think has a lot of benefits and not just for maven users. For example, this should benefit all dependency management tools that are built on top of maven repos. I'm not 100% sure tools like &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://ant.apache.org/ivy/&quot;&gt;Ivy&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://groovy.codehaus.org/Grape&quot;&gt;Grape&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.gradle.org/&quot;&gt;Gradle&lt;/a&gt;, and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://buildr.apache.org/&quot;&gt;Buildr&lt;/a&gt; use maven repo's, but my guess is they do and this will benefit those users. Another benefit is being able to standardize on maven repositories, hopefully preventing users from searching where they can find your artifacts. I've wasted a lot of time in the past trying to find valid repositories where I could find artifacts for a project I was wanting to use.&lt;br /&gt;&lt;br /&gt;I'm also very impressed with the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://docs.sonatype.com/display/NX/OSS+Repository+Hosting&quot;&gt;features&lt;/a&gt; Sonatype is providing. Not only will they support release artifacts but &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.blogger.com/goog_1267710764129&quot;&gt;SNAPSHOT's&lt;/a&gt; as well which could consume a lot of space. You'll also be able to easily sync with Central. Finally, they will support a staging repo in order to test things out before officially releasing.&lt;br /&gt;&lt;br /&gt;So go &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;https://docs.sonatype.com/display/NX/OSS+Repository+Hosting&quot;&gt;sign up&lt;/a&gt; and thanks &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.sonatype.com/&quot;&gt;Sonatype&lt;/a&gt;. Also, read this &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://jlorenzen.blogspot.com/2007/09/how-to-create-release-using-maven2.html&quot;&gt;post&lt;/a&gt; to learn how to release your project using the maven release plugin.</description>
         <author>jlorenzen</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-1280619439915049383.post-1244212587354725326</guid>
         <pubDate>Mon, 01 Mar 2010 15:48:00 +0000</pubDate>
      </item>
      <item>
         <title>Links for 2009-11-13</title>
         <link>https://janmaterne.wordpress.com/2009/11/13/links-for-2009-11-13/</link>
         <description>Today I found two tools for testing: Byteman and YouDebug. While I haven’t have a deeper look at Byteman I realized that YouDebug is writte by Kohsuke Kawaguchi. And it is very funny to recognizing him after Args4J and Hudson with another project. The world is small and you’ll see another every twice … or [&amp;#8230;]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&amp;#038;blog=544265&amp;#038;post=228&amp;#038;subd=janmaterne&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://janmaterne.wordpress.com/2009/11/13/links-for-2009-11-13/</guid>
         <pubDate>Fri, 13 Nov 2009 15:40:50 +0000</pubDate>
         <content:encoded><![CDATA[<p>Today I found two tools for testing: <a rel="nofollow" target="_blank" href="http://www.jboss.org/byteman.html">Byteman</a> and <a rel="nofollow" target="_blank" href="http://youdebug.kenai.com/">YouDebug</a>.</p>
<p>While I haven’t have a deeper look at Byteman I realized that YouDebug is writte by Kohsuke Kawaguchi. And it is very funny to recognizing him after <a rel="nofollow" target="_blank" href="http://args4j.dev.java.net">Args4J</a> and <a rel="nofollow" target="_blank" href="http://hudson-ci.org">Hudson</a> with another project. <em>The world is small and you’ll see another every twice … or more</em> <span class='wp-smiley wp-emoji wp-emoji-wink' title=';-)'>;-)</span></p><br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/janmaterne.wordpress.com/228/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/janmaterne.wordpress.com/228/"/></a> <img alt="" border="0" src="https://pixel.wp.com/b.gif?host=janmaterne.wordpress.com&#038;blog=544265&#038;post=228&#038;subd=janmaterne&#038;ref=&#038;feed=1" width="1" height="1"/>]]></content:encoded>
         <media:content medium="image" url="https://2.gravatar.com/avatar/e965379db91e0faa68ee5c211e49118c?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">janmaterne</media:title>
         </media:content>
      </item>
      <item>
         <title>Hudson Plugin for Eclipse 1.0.8</title>
         <link>http://braindump.dk/tech/2009/10/01/hudson-plugin-for-eclipse-1-0-8/</link>
         <description>&lt;p&gt;It&amp;#8217;s been a while, but thanks to a couple of contributions, I finally managed to release the next version of the Hudson plugin for Eclipse, this time version 1.0.8. There are a couple of new features: Non-blocking refreshes, Date and time-information for the builds, support for HTTP Basic Auth, and a couple of bugfixes. Check out the changelog and download at http://code.google.com/p/hudson-eclipse/.&lt;/p&gt;</description>
         <author>recht</author>
         <guid isPermaLink="false">http://braindump.dk/tech/?p=186</guid>
         <pubDate>Thu, 01 Oct 2009 21:50:27 +0000</pubDate>
      </item>
   </channel>
</rss>
<!-- fe8.yql.bf1.yahoo.com compressed/chunked Thu Oct  1 23:09:07 UTC 2015 -->
