<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title>The Travis CI Blog</title>
  <link href="http://about.travis-ci.org/blog.xml" rel="self"/>
  <link href="http://about.travis-ci.org/" rel="alternate"/>
  <updated>2012-05-12T01:52:55-07:00</updated>
  <id>http://about.travis-ci.org/</id>
  <author>
    <name>Team Travis CI</name>
    <uri>https://github.com/travis-ci</uri>
  </author>

  
  <entry>
    <title>Announcing Pull Request Support</title>
    <link href="http://about.travis-ci.org/blog/announcing-pull-request-support"/>
    <published>2012-05-02T00:00:00-07:00</published>
    <updated>2012-05-02T00:00:00-07:00</updated>
    <id>http://about.travis-ci.org/blog/announcing-pull-request-support</id>
    <content type="html">&lt;p&gt;&lt;figure class=&quot;small right&quot;&gt;
  &lt;a href=&quot;http://www.flickr.com/photos/39342275@N02/7096070433/in/photostream&quot;&gt; &lt;img src=&quot;http://farm8.staticflickr.com/7091/7096070433_afc7cb5f43_m.jpg&quot; alt=&quot;Josh and José at Railsberry&quot; /&gt; &lt;/a&gt;
  &lt;figcaption&gt;&lt;a href=&quot;https://twitter.com/#!/joshkalderimis&quot;&gt;Josh&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/#!/josevalim&quot;&gt;José&lt;/a&gt; at Railsberry&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;Some of our team just got back from two pretty intense weeks of conferencing. We had an amazing time speaking at the &lt;a href=&quot;http://jax.de/2012/&quot;&gt;JAX&lt;/a&gt;, &lt;a href=&quot;http://railsberry.com/&quot;&gt;Railsberry&lt;/a&gt; and &lt;a href=&quot;http://railsconf2012.com/&quot;&gt;RailsConf&lt;/a&gt; and getting our hands on two of the &lt;a href=&quot;http://www.confreaks.com/videos/881-railsconf2012-ruby-hero-awards&quot;&gt;Ruby Hero Awards&lt;/a&gt;. A couple of announcements were made live on stage and you might have heard a few rumors coming out of the conferences. So let me wrap up one of them for you.&lt;/p&gt;

&lt;p&gt;I'm pretty excited about this one, as I've been working on it over the last weeks. This is the first feature to be sponsored by our impressing &lt;a href=&quot;https://love.travis-ci.org/&quot;&gt;Love Campaign&lt;/a&gt;. While the &lt;a href=&quot;https://love.travis-ci.org/#languages&quot;&gt;promise&lt;/a&gt; of adding &lt;a href=&quot;http://about.travis-ci.org/blog/first_class_nodejs_support_on_travis_ci/&quot;&gt;more&lt;/a&gt; &lt;a href=&quot;http://about.travis-ci.org/blog/first_class_php_support_on_travis_ci/&quot;&gt;languages&lt;/a&gt; &lt;a href=&quot;http://about.travis-ci.org/blog/announcing_support_for_java_scala_and_groovy_on_travis_ci/&quot;&gt;actually&lt;/a&gt; &lt;a href=&quot;http://about.travis-ci.org/blog/announcing_python_and_perl_support_on_travis_ci/&quot;&gt;came&lt;/a&gt; &lt;a href=&quot;http://about.travis-ci.org/blog/announcing_support_for_haskell_on_travis_ci/&quot;&gt;true&lt;/a&gt;, this was mainly done by excellent community contributions and the hard working &lt;a href=&quot;http://twitter.com/michaelklishin&quot;&gt;Michael Klishin&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;How We Use Pull Requests&lt;/h2&gt;

&lt;p&gt;&lt;figure&gt;
  &lt;a href=&quot;http://travis-pr.herokuapp.com/image/slides/pull-request.png&quot;&gt; &lt;img src=&quot;http://travis-pr.herokuapp.com/image/slides/pull-request.png&quot; alt=&quot;A typical Pull Request&quot; /&gt; &lt;/a&gt;
  &lt;figcaption&gt;A typical Pull Request&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;When Github first announced &lt;a href=&quot;https://github.com/blog/712-pull-requests-2-0&quot;&gt;Pull Requests 2.0&lt;/a&gt;, it wasn't obvious right away how truly amazing this feature is for us developers.&lt;/p&gt;

&lt;p&gt;&lt;figure class=&quot;small right&quot;&gt;
  &lt;a href=&quot;http://travis-pr.herokuapp.com/image/slides/pre-merge-button.png&quot;&gt; &lt;img src=&quot;http://travis-pr.herokuapp.com/image/slides/pre-merge-button.png&quot; alt=&quot;Pull Request 2.0 Workflow&quot; /&gt; &lt;/a&gt;
  &lt;figcaption&gt;Pull Request 2.0 Workflow&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;It revolutionized the workflow by making the patches part of the discussion. This actually led to code reviews from other contributors while working on a feature, rather than once you think you're done working on it.&lt;/p&gt;

&lt;p&gt;Think of it as bringing &lt;a href=&quot;http://agilemanifesto.org/&quot;&gt;agile development&lt;/a&gt; to Open Source contributions. Wikipedia even calls this new and social approach &lt;a href=&quot;http://en.wikipedia.org/wiki/History_of_free_and_open-source_software#The_GitHub_revolution&quot;&gt;The GitHub revolution&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It really only had one downside: Merging still was as complicated as before. You have all the fancy review tools and still have to go into the terminal and type a couple of commands. This quickly became rather tedious.&lt;/p&gt;

&lt;h2&gt;The Merge Button&lt;/h2&gt;

&lt;p&gt;&lt;figure&gt;
  &lt;a href=&quot;http://travis-pr.herokuapp.com/image/slides/merge_button.png&quot;&gt; &lt;img src=&quot;http://travis-pr.herokuapp.com/image/slides/merge_button.png&quot; alt=&quot;GitHub's Merge Button allows merging Pull Request form the Web Interface&quot; /&gt; &lt;/a&gt;
  &lt;figcaption&gt;GitHub's Merge Button allows merging Pull Request form the Web Interface&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;GitHub, once more, came to our rescue by adding the &lt;a href=&quot;https://github.com/blog/843-the-merge-button&quot;&gt;Merge Button&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;figure class=&quot;small right&quot;&gt;
  &lt;a href=&quot;http://travis-pr.herokuapp.com/image/slides/pre-travis.png&quot;&gt; &lt;img src=&quot;http://travis-pr.herokuapp.com/image/slides/pre-travis.png&quot; alt=&quot;The Merge Button Workflow&quot; /&gt; &lt;/a&gt;
  &lt;figcaption&gt;The Merge Button Workflow&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;By pressing a button on the website, one could easily merge Pull Requests without having to drop to the console.&lt;/p&gt;

&lt;p&gt;This feature, combined with the &lt;a href=&quot;https://github.com/blog/844-forking-with-the-edit-button&quot;&gt;Fork and Edit&lt;/a&gt; button, made contributing a no brainer.&lt;/p&gt;

&lt;p&gt;Especially the roundtrip time for documentation fixes, like typos, broken examples, etc. went down to sometimes just a few seconds.&lt;/p&gt;

&lt;p&gt;Contributing a fix became as simple as two clicks on GitHub. Making contributions that easy lowers the barrier and thereby strengthens the Open Source ecosystem.&lt;/p&gt;

&lt;p&gt;You probably can tell by now how much we love this feature.&lt;/p&gt;

&lt;p&gt;&lt;figure class=&quot;small left&quot;&gt;
  &lt;a href=&quot;http://travis-pr.herokuapp.com/image/slides/one-does-not-pull-request.jpg&quot;&gt; &lt;img src=&quot;http://travis-pr.herokuapp.com/image/slides/one-does-not-pull-request.jpg&quot; alt=&quot;The Merge Button is a dangerous tool, trust Boromir.&quot; /&gt; &lt;/a&gt;
  &lt;figcaption&gt;The Merge Button is a dangerous tool, trust Boromir.&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;There is a downside, though. The Merge Button is not really usable for anything but documentation.&lt;/p&gt;

&lt;p&gt;If you click the Merge Button for anything touching code, you risk breaking upstream. Maybe this seem acceptable at first, after all your CI will tell you if you broke anything. You are using CI, right?&lt;/p&gt;

&lt;p&gt;However, it not only renders your mainline pretty unstable, it also changes responsibility. All of a sudden you as a maintainer are responsible for fixing the issue, if only by reverting the commits.&lt;/p&gt;

&lt;p&gt;So you're back at merging locally and checking out if everything works. Maybe you even push on a feature branch first, just to trigger a CI run before merging.&lt;/p&gt;

&lt;h2&gt;Enter Travisbot&lt;/h2&gt;

&lt;p&gt;&lt;figure class=&quot;small right&quot;&gt;
  &lt;a href=&quot;http://travis-pr.herokuapp.com/image/slides/with-travis.png&quot;&gt; &lt;img src=&quot;http://travis-pr.herokuapp.com/image/slides/with-travis.png&quot; alt=&quot;The Perfect&amp;trade; Workflow&quot; /&gt; &lt;/a&gt;
  &lt;figcaption&gt;The Perfect&amp;trade; Workflow&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;It would be really cool to just know if the Pull Request breaks anything, without all the hassle.&lt;/p&gt;

&lt;p&gt;This is basically what we've implemented. We test every mergeable Pull Request and have our friendly &lt;a href=&quot;https://github.com/travisbot&quot;&gt;Travisbot&lt;/a&gt; leave a comment in the Pull Request discussion.&lt;/p&gt;

&lt;p&gt;That way you can now safely press the Merge Button. That is, if it doesn't break anything, of course. And if it breaks, it's not necessarily the maintainers (or worse, the users) responsibility to deal with the issue.&lt;/p&gt;

&lt;p&gt;Or imagine having a broken upstream and someone submits a Pull Request fixing it.&lt;/p&gt;

&lt;p&gt;&lt;figure&gt;
  &lt;a href=&quot;http://travis-pr.herokuapp.com/image/slides/travisbot.png&quot;&gt; &lt;img src=&quot;http://travis-pr.herokuapp.com/image/slides/travisbot.png&quot; alt=&quot;Post-Merge Button Workflow&quot; /&gt; &lt;/a&gt;
  &lt;figcaption&gt;Pre-Merge Button Workflow&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;In contrast to most &lt;a href=&quot;https://github.com/cramerdev/jenkins-comments&quot;&gt;self-made solutions&lt;/a&gt; out there, we actually test the &lt;em&gt;merged&lt;/em&gt; version, rather than just the fork or feature branch. Thus, we also take into account changes made upstream &lt;em&gt;after&lt;/em&gt; the repository has been forked.&lt;/p&gt;

&lt;p&gt;We will also re-run the tests whenever new commits are added to a Pull Requests (yes, this works fine with force pushes and rebases). Also, it pretty much works with anything that is mergeable, might it be a branch, tag, fork, etc. As long as you see the green Merge Button, we can test it.&lt;/p&gt;

&lt;h2&gt;Are we there yet?&lt;/h2&gt;

&lt;p&gt;This feature is still under development. The described functionality works just fine, but we have plans for future extensions.&lt;/p&gt;

&lt;p&gt;For instance, we would like to leave a comment whenever master is updated and give you the option to automatically rerun the tests with the new merge commit.&lt;/p&gt;

&lt;h2&gt;I WANT THIS NOW!!&lt;/h2&gt;

&lt;p&gt;If you made it this far in the blog post, you probably want it for your repository, and you want it &lt;em&gt;now&lt;/em&gt;. Good news! We started unrolling this feature.&lt;/p&gt;

&lt;p&gt;&lt;figure class=&quot;small right&quot;&gt;
  &lt;a href=&quot;https://img.skitch.com/20120502-xmjnfsk2bfjkwabk5y2ra6dtfi.jpg&quot;&gt; &lt;img src=&quot;https://img.skitch.com/20120502-xmjnfsk2bfjkwabk5y2ra6dtfi.jpg&quot; alt=&quot;Let us know if you want this feature&quot; /&gt; &lt;/a&gt;
  &lt;figcaption&gt;Let us know if you want this feature&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;

&lt;p&gt;As we are still improving it, and are not sure if we can stand the load of activating it for everyone right away, we are turning it on on a repo per repo basis.&lt;/p&gt;

&lt;p&gt;Please note that we start unrolling for those people, that donated, so I was actually able to work on this. So, if you donated and want this, just &lt;a href=&quot;mailto:contact+pr@travis-ci.org?subject=Pull%20Request%20Support&amp;amp;body=Could%20you%20please%20activate%20PR%20testing%20for%20USER/REPO?%20I%20donated%20-%20Order%20#XYZ%20-%20and%20would%20love%20to%20use%20this%20feature.%20XOXO%20-%20NAME&quot;&gt;let us know&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you didn't donate, but still want to use this feature right away, our &lt;a href=&quot;https://love.travis-ci.org/&quot;&gt;Love Campaign&lt;/a&gt; is still running.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Metrics, Monitoring, Infrastructure, Oh my!</title>
    <link href="http://about.travis-ci.org/blog/2012-04-02-metrics-monitoring-infrastructure-oh-my"/>
    <published>2012-04-02T00:00:00-07:00</published>
    <updated>2012-04-02T00:00:00-07:00</updated>
    <id>http://about.travis-ci.org/blog/monitoring-metrics-infratructure-oh-my</id>
    <content type="html">&lt;p&gt;Making sure Travis always runs smoothly all the time has become one of our most
important tasks over the recent weeks and months. As a distributed system, there
are a lot of moving parts, and we're putting more and more eyes on every single
piece to make sure they do their job. Obviously there's no need to keep this a
secret, so let's talk about some recent changes to Travis' infrastructure.&lt;/p&gt;

&lt;p&gt;Case in point. A recent deployment broke updating profiles temporarily. Here's a
pretty graph showing the pretty much exact point in time when we deployed and
the spike in the number of errors.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://s3itch.paperplanes.de/Librato_Metrics-20120402-114010.png&quot; alt=&quot;Pretty graph showing deployments&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can see the initial spike, which represents a sudden increase in application
errors. We rolled out a fix shortly after, so things quieted down somewhat.
There's still some noise though, still several 500 errors popping up in our
logs. It took a while to fix those, but you can see it eventually ebbed off
after another deployment.&lt;/p&gt;

&lt;p&gt;This is a pretty powerful tool. We added putting more and more metrics on the
moving parts in Travis. If you want to know why, you should read this &lt;a href=&quot;http://code.flickr.com/blog/2008/10/27/counting-timing/&quot;&gt;blog
post&lt;/a&gt; from the Flickr
engineering team, and you should definitely watch &lt;a href=&quot;http://pivotallabs.com/talks/139-metrics-metrics-everywhere&quot;&gt;Coda Hale's talk Metrics,
Metrics Everywhere!&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All these metrics tell us what's going on inside Travis in real time, and they
show us historical growth so we can spot patterns, capacity issues and
unexpected spikes. Here's a another pretty graph of all our internal
notifications. These metrics are pretty new and were put in production last
Friday, but it's still something to enjoy (click to enlarge).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://s3itch.paperplanes.de/Librato_Metrics-20120402-114119.png&quot;&gt;&lt;img src=&quot;http://s3itch.paperplanes.de/Librato_Metrics-20120402-175556.png&quot; alt=&quot;Notifications graphed&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All these pretty graphs are courtesy of &lt;a href=&quot;https://metrics.librato.com/&quot;&gt;Librato
Metrics&lt;/a&gt;, who were kind enough to offer sponsoring
their service for Travis CI. As we add more and more metrics to Travis they'll
automatically show up in Librato and will be graphed in real time.&lt;/p&gt;

&lt;p&gt;The fun doesn't stop there. To make it possible that we can properly graph 404
and 500 errors, we added custom logging. Rails' default logging is not very
helpful for production systems, as it produces a lot of noise. Thanks to Rails 3
and the new notifications introduced with it, it's now possible to override what
Rails does by default and hook in your own logging. That's exactly what we did,
and the result is &lt;a href=&quot;https://github.com/mattmatt/lograge&quot;&gt;lograge&lt;/a&gt;, a little
library that turns Rails' logging events into a neat, single line per request.
You can read all about it in &lt;a href=&quot;http://www.paperplanes.de/2012/3/14/on-notifications-logsubscribers-and-bringing-sanity-to-rails-logging.html&quot;&gt;Mathias' blog
post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This helped streamlining our logging, making it more and more useful along the
way. All our logs are aggregated in &lt;a href=&quot;https://papertrailapp.com/&quot;&gt;Papertrail&lt;/a&gt;,
who were also kind enough to offer sponsoring their services for Travis.&lt;/p&gt;

&lt;p&gt;This allowed us to do something pretty nifty.
&lt;a href=&quot;https://twitter.com/lindvall&quot;&gt;Eric&lt;/a&gt; of Papertrail wrote a neat little metrics
library for Ruby called &lt;a href=&quot;https://github.com/eric/metriks&quot;&gt;Metriks&lt;/a&gt;, which we
started using in Travis. It collects metrics and can dump them to either a log
file or directly export to &lt;a href=&quot;https://metrics.librato.com/&quot;&gt;Librato Metrics&lt;/a&gt; or
&lt;a href=&quot;http://graphite.wikidot.com/&quot;&gt;Graphite&lt;/a&gt;. It can also show selected metrics in
the process status, so whenever you run &lt;code&gt;ps ax&lt;/code&gt;, you can see the current number
of requests per second, or pretty much whatever you fancy. You should go and
read &lt;a href=&quot;http://bitmonkey.net/post/18854033582/introducing-metriks&quot;&gt;Eric's blog post on the
library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The really neat bit is that Metriks can log the collected metrics to the log
file. Papertrail can then look for patterns in the aggregated logs and react
accordingly, in this case triggering a webhook  where the metrics are aggregated
and eventually stored in Librato Metrics. Did that just blow your mind?&lt;/p&gt;

&lt;p&gt;Here's how that looks coming into Papertrail (click to enlarge).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://s3itch.paperplanes.de/Skitch-20120402-204154.png&quot;&gt;&lt;img src=&quot;http://s3itch.paperplanes.de/Skitch-20120402-204339.png&quot; alt=&quot;Papertrail Metrics&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This little trick utilizes Papertrail's filters and webhooks alerts, and a nifty
&lt;a href=&quot;https://github.com/eric/metriks_log_webhook&quot;&gt;little app that Eric built&lt;/a&gt; to
accept the filtered output when a metric is found in the logs.&lt;/p&gt;

&lt;p&gt;Why would we want to do that? Simply because it decouples the fact that we're
collecting from where the metrics need to be stored. It's a fully asynchronous
process, and they'll simply show up in Librato eventually. We can also put a
filter on anything in Papertrail and have occurrences in the log be directly
graphed in Librato's Metrics. It's pretty awesome. Every bug fixed is a new
opportunity to add more graphs and add more logging.&lt;/p&gt;

&lt;p&gt;For good measure, here's another graph showing the requests we're receiving from
Github. It includes the received, accepted and rejected pushes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://s3itch.paperplanes.de/Skitch-20120402-202853.png&quot; alt=&quot;Github Requests&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The beautiful bit is that we can take any metric and correlate it with others.
That's a pretty powerful tool to find problems in infrastructure.&lt;/p&gt;

&lt;p&gt;This is far from all of it, but it's a start. If you want to know more about why
Mathias is so obsessed with metrics and monitoring, you should &lt;a href=&quot;http://www.paperplanes.de/2011/1/5/the_virtues_of_monitoring.html&quot;&gt;read his blog
post about
it&lt;/a&gt;. See you
in the next installment about how we're adding more mustache to Travis'
infrastructure.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Migrating CI Environment to Ubuntu 11.10</title>
    <link href="http://about.travis-ci.org/blog/upcoming_ubuntu_11_10_migration"/>
    <published>2012-03-27T00:00:00-07:00</published>
    <updated>2012-03-27T00:00:00-07:00</updated>
    <id>http://about.travis-ci.org/blog/upcoming_ubuntu_11_10_migration</id>
    <content type="html">&lt;h2&gt;Keeping Up With the Times&lt;/h2&gt;

&lt;p&gt;When we first started using virtual machines for Travis CI (around June 2011) we decided to use Ubuntu 10.04. This worked perfectly, but by the fall of 2011 10.04 started showing its age. Our users kept asking for more recent versions of certain tools and libraries which were challenging to provide without building and maintaining a myriad of Debian packages. So in November 2011 we migrated all VMs to Ubuntu 11.04 which solved the problem.&lt;/p&gt;

&lt;p&gt;Now it is Spring 2012 and the time to move on to 11.10 is drawing close. We want to explain briefly how Travis CI will migrate to it, why we are doing it and what may change for your project.&lt;/p&gt;

&lt;h2&gt;Why Migrate?&lt;/h2&gt;

&lt;p&gt;With Ubuntu 11.10, we will be able to provide more up-to-date versions of tools and services in our CI environment, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenJDK 7 alongside OpenJDK 6 (this is still a work in progress)&lt;/li&gt;
&lt;li&gt;PostgreSQL 9.1 + updated extensions&lt;/li&gt;
&lt;li&gt;CouchDB 1.1&lt;/li&gt;
&lt;li&gt;Firefox 11&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;In addition, we won't have to use 3rd party apt repositories or compile certain tools from source, which greatly reduces our maintenance burden, for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Haskell Platform&lt;/li&gt;
&lt;li&gt;Maven 3&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Staying One Step Behind, Intentionally&lt;/h2&gt;

&lt;p&gt;Our users are mostly software developers and they tend to like to staying up-to-date with tools, services, libraries and so on. However, production environments are rarely on the bleeding edge. So for CI in general, and Travis CI in particular, it is important to maintain a balance: not too old, but not too new either. This is why Travis CI is intentionally about 6 months behind Ubuntu releases. It gives developers several months to catch up with recent changes, fix issues and push out new releases.&lt;/p&gt;

&lt;h2&gt;Important Changes in 11.10&lt;/h2&gt;

&lt;h3&gt;GCC&lt;/h3&gt;

&lt;p&gt;One of the biggest changes with every distro release is GCC version changes. 11.10 ships with GCC 4.6. This version is known to be more strict than previous releases and some tools and libraries may need minor changes when compiled with -Wall. Judging from the experience from one of our team members, most popular tools were updated in the beginning of this year.&lt;/p&gt;

&lt;h3&gt;OpenSSL&lt;/h3&gt;

&lt;p&gt;Another important change OpenSSL version. 11.10 ships with OpenSSL 1.0 by default, but even more importantly,
disables SSLv2 support. SSLv2 is very old (released in &lt;a href=&quot;http://youtu.be/N6voHeEa3ig&quot;&gt;1995&lt;/a&gt;), there were 4 updates to the spec after it: SSL 3.0, TLS 1.0, TLS 1.1 and TLS 1.2. In addition to that, SSLv2 contains several known &lt;a href=&quot;http://en.wikipedia.org/wiki/Secure_Socket_Layer#cite_note-5&quot;&gt;security flaws&lt;/a&gt;
and all new distributions either already dropped support for it or will be dropping it very soon.&lt;/p&gt;

&lt;h3&gt;PHP 5.2&lt;/h3&gt;

&lt;p&gt;Because of the SSLv2 change explained above, we had to disable SSL support for PHP 5.2 and 5.3.2. PHP 5.2 is no longer maintained by the PHP Core Team and we were faced with a decision: either drop it completely or patch and maintain it to work with OpenSSL 1.0, or disable SSL support for it.&lt;/p&gt;

&lt;p&gt;PHP 5.3.10 and 5.4.0 are maintained and work with OpenSSL 1.0 without modifications, and have OpenSSL support enabled, just like they have today.&lt;/p&gt;

&lt;h2&gt;The Road to 11.10&lt;/h2&gt;

&lt;p&gt;On April 6th, 2012 we plan to update all our VMs to use Ubuntu 11.10. We will provide the same set of tools, services, and libraries, but some of them will be newer than what we have today. Most maintained software should work without any changes on your part. If you experience any issues please drop by #travis on irc.freenode.net and we will do our best to help you.&lt;/p&gt;

&lt;p&gt;You can also try a minimalistic 11.10 image using Virtual Box and &lt;a href=&quot;https://github.com/michaelklishin/sous-chef&quot;&gt;sous chef&lt;/a&gt; or &lt;a href=&quot;http://vagrantup.com&quot;&gt;Vagrant&lt;/a&gt;
with our &lt;a href=&quot;http://files.travis-ci.org/boxes/bases/oneiric32_base.box&quot;&gt;11.10 base box&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy testing!&lt;/p&gt;

&lt;p&gt;The Travis CI Team&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Announcing Haskell project support</title>
    <link href="http://about.travis-ci.org/blog/announcing_support_for_haskell_on_travis_ci"/>
    <published>2012-03-11T00:00:00-08:00</published>
    <updated>2012-03-11T00:00:00-08:00</updated>
    <id>http://about.travis-ci.org/blog/announcing_haskell_support_on_travis_ci</id>
    <content type="html">&lt;h2&gt;Travis' Eleven&lt;/h2&gt;

&lt;p&gt;Today we are happy to announce support for an 11th language on Travis CI: Haskell. Known for its concision and very advanced type system, Haskell
has been attracting some of the brightest minds in the programming languages research community for a couple of decades.&lt;/p&gt;

&lt;p&gt;Haskell can be found in &lt;a href=&quot;http://vimeo.com/6699769&quot;&gt;code analysis tools&lt;/a&gt;, &lt;a href=&quot;http://corp.galois.com/cryptol/&quot;&gt;DSLs for cryptographic algorithms&lt;/a&gt;,
&lt;a href=&quot;http://corp.galois.com/hans&quot;&gt;secure networking stack implementations&lt;/a&gt;, &lt;a href=&quot;http://www.janrain.com/blogs/haskell-janrain&quot;&gt;network applications&lt;/a&gt;, plenty of financial software
and even &lt;a href=&quot;http://k1024.org/~iusty/papers/icfp10-haskell-reagent.pdf&quot;&gt;system administration&lt;/a&gt;. So Haskell sounds like the right candidate to complete
Travis' Eleven.&lt;/p&gt;

&lt;h2&gt;Wait, What Is Travis CI Anyway?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://travis-ci.org&quot;&gt;Travis CI&lt;/a&gt; is a distributed continuous integration for the open source community. It is integrated with GitHub and offers first class support for multiple technologies. Our CI environment provides many tools, libraries, and services (MySQL, PostgreSQL, Redis, RabbitMQ, MongoDB and so on), and you don't have to bother setting up your own CI server.&lt;/p&gt;

&lt;p&gt;You can watch build logs in near-real time in your browser, access logs later, and even link to log line numbers (for example, when reporting an issue).&lt;/p&gt;

&lt;p&gt;Thanks to Github integration, Travis CI lets your contributors effortlessly add their development forks to test work-in-progress branches and makes your CI status very visible to the community thanks to our &lt;a href=&quot;http://about.travis-ci.org/docs/user/status-images/&quot;&gt;CI badges&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Started in early 2011, Travis CI has since run half a million builds for over 7,000 open source projects, including Ruby, Ruby on Rails, RubyGems, Node.js, Leiningen, Symfony and many more.&lt;/p&gt;

&lt;h2&gt;Getting Your Project on Travis CI&lt;/h2&gt;

&lt;p&gt;Travis CI currently provides &lt;a href=&quot;http://hackage.haskell.org/platform/contents.html&quot;&gt;Haskell Platform&lt;/a&gt; 2011.04 (with GHC 7, Cabal, Happy, Alex and so on). To get started, you need to add one file
(.travis.yml) and the Github hook as described in the &lt;a href=&quot;http://about.travis-ci.org/docs/user/getting-started/&quot;&gt;Getting Started guide&lt;/a&gt;. If your
project uses Cabal, a minimal .travis.yml would look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language: haskell
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Travis CI will run the dependency installation command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cabal install 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and then the testing commands:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cabal configure --enable-tests &amp;amp;&amp;amp; cabal build &amp;amp;&amp;amp; cabal test
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It is possible to override these commands and add new ones to the build lifecycle, please refer to &lt;a href=&quot;http://about.travis-ci.org/&quot;&gt;our documentation&lt;/a&gt;, which now includes
a guide dedicated to &lt;a href=&quot;http://about.travis-ci.org/docs/user/languages/haskell/&quot;&gt;Haskell&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Build workflow&lt;/h3&gt;

&lt;p&gt;By default Travis' build workflow is&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clone your repository from GitHub&lt;/li&gt;
&lt;li&gt;(If applicable) pick language/runtime version to use&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;before_install&lt;/code&gt; commands (can be more than one)&lt;/li&gt;
&lt;li&gt;Install dependencies. Travis will use &lt;code&gt;cabal install&lt;/code&gt; by default. You can override the command using the &lt;code&gt;install&lt;/code&gt; key in your .travis.yml.&lt;/li&gt;
&lt;li&gt;Run one or more &lt;code&gt;before_script&lt;/code&gt; commands.&lt;/li&gt;
&lt;li&gt;Run the &lt;code&gt;script&lt;/code&gt; command, e.g. &lt;code&gt;cabal build &amp;amp;&amp;amp; cabal test&lt;/code&gt;. This too can be overridden in .travis.yml.&lt;/li&gt;
&lt;li&gt;Report the build has finished running.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Learn more&lt;/h3&gt;

&lt;p&gt;To learn what tools and services (mysql, postgres, riak, etc.) are available in the CI environment, refer to the &lt;a href=&quot;http://about.travis-ci.org/docs/user/ci-environment/&quot;&gt;CI environment&lt;/a&gt; guide.&lt;/p&gt;

&lt;p&gt;If you need help, feel free to join #travis on irc.freenode.net, ping us on Twitter (&lt;a href=&quot;http://twitter.com/travisci&quot;&gt;@travisci&lt;/a&gt;) and ask questions on &lt;a href=&quot;https://groups.google.com/group/travis-ci&quot;&gt;our mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Thank You Contributors&lt;/h2&gt;

&lt;p&gt;We would like to thank &lt;a href=&quot;http://alessandrovermeulen.me&quot;&gt;Alessandro Vermeulen&lt;/a&gt; for his help with making Haskell support on Travis CI a reality.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>The Great Bundler 1.1 Upgrade</title>
    <link href="http://about.travis-ci.org/blog/the-great-bundler-1-1-upgrade"/>
    <published>2012-03-09T00:00:00-08:00</published>
    <updated>2012-03-09T00:00:00-08:00</updated>
    <id>http://about.travis-ci.org/blog/the_great_bundler_update</id>
    <content type="html">&lt;h1&gt;The Great Bundler 1.1 Upgrade&lt;/h1&gt;

&lt;p&gt;As you possibly have heard, Bundler 1.1 was released a few days ago and is no longer vaporware, huzzah!  We want to explain briefly how Travis CI will migrate to it, and how you can upgrade early if you want to.&lt;/p&gt;

&lt;h2&gt;Key Improvements in Bundler 1.1&lt;/h2&gt;

&lt;p&gt;Bundler 1.0 is often criticized for being a tad slow. One of the reasons was due to the large number of requests Bundler 1.0 issues to rubygems.org to resolve the dependency graph. Bundler 1.1 uses a new and improved rubygems.org API to significantly reduce the number of network requests, and in some cases it can even avoid hitting the network altogether.&lt;/p&gt;

&lt;h2&gt;Where We Are Today&lt;/h2&gt;

&lt;p&gt;Travis CI Ruby VMs have Bundler 1.0 preinstalled. If you have a small Gemfile then this should be perfectly fine for you, but if you have a larger more complicated Gemfile then your build might benefit from Bundler 1.1.&lt;/p&gt;

&lt;p&gt;To update Bundler before dependencies are installed you can do:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;before_install:
  - gem install bundler
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And thanks to virtual machine snapshotting these changes won't affect subsequent builds.&lt;/p&gt;

&lt;h2&gt;Migrating to 1.1&lt;/h2&gt;

&lt;p&gt;On March 14th, 2012 we plan to update the Ruby VMs to use Bundler 1.1. If you experience any issues with Bundler 1.1 please report these to the Bundler team.&lt;/p&gt;

&lt;p&gt;If for some reason you want to continue using a previous Bundler version you can downgrade using the following technique:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;before_install:
  - rvm @default,@global do gem uninstall bundler -v 1.1.0 -x
  - gem install bundle --version '~&amp;gt; 1.0.0'
  - bundle --version
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Happy Friday!&lt;/p&gt;

&lt;p&gt;The Travis CI Team&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Announcing Python and Perl support on Travis CI</title>
    <link href="http://about.travis-ci.org/blog/announcing_python_and_perl_support_on_travis_ci"/>
    <published>2012-02-27T00:00:00-08:00</published>
    <updated>2012-02-27T00:00:00-08:00</updated>
    <id>http://about.travis-ci.org/blog/announcing_python_and_perl_support_on_travis_ci</id>
    <content type="html">&lt;p&gt;Just shy of a week ago we announced support for Java, Scala, and Groovy. Well, we thought to ourselves 'we already support 8 languages, why not more?', and MOAR you shall have!&lt;/p&gt;

&lt;p&gt;Today we are happy to announce first class support for Python and Perl projects!&lt;/p&gt;

&lt;p&gt;Adding support for Perl and Python was a no brainer for us, not that it was easy, because it wasn't, but that both languages were sought after by their respective communities and complete the quest for the three P's (PHP, Perl, and Python).&lt;/p&gt;

&lt;p&gt;Perl, which has been around since 1987 (Genesis &lt;a href=&quot;http://www.youtube.com/watch?v=1pkVLqSaahk&quot;&gt;&quot;Land Of Confusion&quot;&lt;/a&gt;)and has a toolset just as strong and mature as its community. For example, the Perl community has had a variation of Travis for the last 10 years called CPANTesters, with the difference being that CPANTesters tests releases while we test active development.&lt;/p&gt;

&lt;p&gt;Python, around since the early 90's (think MC Hammer &lt;a href=&quot;http://youtu.be/_UJaLq4YOo0&quot;&gt;&quot;Too Legit to Quit&quot;&lt;/a&gt;, 1991), and in fact it's OLDER than Java! It is used for pretty much EVERYTHING you can think of, from research at CERN, to build website (YouTube and DISQUS), scripting for Games (Battlefield 2), and scripting for Graphics programs (Autodesk Maya, GIMP, Panda3D and Blender to name a few). Pretty much, you have used Python and you didn't even know it!&lt;/p&gt;

&lt;h2&gt;Wait, What Is Travis CI Anyway?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://travis-ci.org&quot;&gt;Travis CI&lt;/a&gt; is a distributed continuous integration for the open source community. It is integrated with GitHub and offers first class support for multiple technologies. Our CI environment provides many tools, libraries, and services (MySQL, PostgreSQL, Redis, RabbitMQ, MongoDB and so on), and you don't have to bother setting up your own CI server.&lt;/p&gt;

&lt;p&gt;You can watch build logs in near-real time in your browser, access logs later, and even link to log line numbers (for example, when reporting an issue).&lt;/p&gt;

&lt;p&gt;Thanks to Github integration, Travis CI lets your contributors effortlessly add their development forks to test work-in-progress branches and makes your CI status very visible to the community thanks to our &lt;a href=&quot;http://about.travis-ci.org/docs/user/status-images/&quot;&gt;CI badges&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Started in early 2011, Travis CI has since run half a million builds for over 6,000 open source projects, including Ruby, Ruby on Rails, RubyGems, Node.js, Leiningen, Symfony and many more.&lt;/p&gt;

&lt;h2&gt;Getting Your Python Project on Travis CI&lt;/h2&gt;

&lt;p&gt;Travis CI provides multiple Python and Perl versions to test against. To get started, you need to add one file
(.travis.yml) and the Github hook as described in the &lt;a href=&quot;http://about.travis-ci.org/docs/user/getting-started/&quot;&gt;Getting Started guide&lt;/a&gt;. A minimal .travis.yml
would look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language: python
python:
  - &quot;2.6&quot;
  - &quot;2.7&quot;
  - &quot;3.2&quot;
# command to install dependencies
install: pip install -r requirements.txt --use-mirrors
# command to run tests
script: nosetests
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It is possible to add new commands to the build lifecycle, please refer to &lt;a href=&quot;http://about.travis-ci.org/&quot;&gt;our documentation&lt;/a&gt;, which now includes a guide dedicated to &lt;a href=&quot;http://about.travis-ci.org/docs/user/languages/python/&quot;&gt;Python&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Getting Your Perl Project on Travis CI&lt;/h2&gt;

&lt;p&gt;Travis CI provides three Perl versions to test against. To get started, you need to add one file
(.travis.yml) and the Github hook as described in the &lt;a href=&quot;http://about.travis-ci.org/docs/user/getting-started/&quot;&gt;Getting Started guide&lt;/a&gt;. A minimal .travis.yml
would look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language: perl
perl:
  - &quot;5.14&quot;
  - &quot;5.12&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Travis CI will will run widely used&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cpanm --installdeps --notest .
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;command to install your project's dependencies. For running tests, Travis CI will try to detect &lt;code&gt;Build.PL&lt;/code&gt; or &lt;code&gt;Makefile.PL&lt;/code&gt; file in your repository root
and will run either&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;perl Build.PL &amp;amp;&amp;amp; ./Build test
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;perl Makefile.PL &amp;amp;&amp;amp; make test
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It is possible to override these commands and add new ones to the build lifecycle, please refer to &lt;a href=&quot;http://about.travis-ci.org/&quot;&gt;our documentation&lt;/a&gt;, which now includes a guide dedicated to &lt;a href=&quot;http://about.travis-ci.org/docs/user/languages/perl/&quot;&gt;Perl&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Build workflow&lt;/h3&gt;

&lt;p&gt;Travis' build workflow usually is&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clone your repository from GitHub&lt;/li&gt;
&lt;li&gt;Pick language/runtime version to use&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;before_install&lt;/code&gt; commands (can be more than one)&lt;/li&gt;
&lt;li&gt;Install dependencies. This will use cpanm for Perl and pip for Python. You can override the command using the &lt;code&gt;install&lt;/code&gt; key in your .travis.yml.&lt;/li&gt;
&lt;li&gt;Run one or more &lt;code&gt;before_script&lt;/code&gt; commands.&lt;/li&gt;
&lt;li&gt;Run the &lt;code&gt;script&lt;/code&gt; command, e.g. &lt;code&gt;perl Makefile.PL &amp;amp;&amp;amp; make test&lt;/code&gt;. This too can be overriden in .travis.yml. Python projects are required to provide &lt;code&gt;script:&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;Report the build has finished running.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Learn more&lt;/h3&gt;

&lt;p&gt;To learn what tools and services (mysql, postgres, riak, etc.) are available in the CI environment, refer to the &lt;a href=&quot;http://about.travis-ci.org/docs/user/ci-environment/&quot;&gt;CI environment&lt;/a&gt; guide.&lt;/p&gt;

&lt;p&gt;If you need help, feel free to join #travis on irc.freenode.net, ping us on Twitter (&lt;a href=&quot;http://twitter.com/travisci&quot;&gt;@travisci&lt;/a&gt;) and ask questions on &lt;a href=&quot;https://groups.google.com/group/travis-ci&quot;&gt;our mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Thank You Contributors&lt;/h2&gt;

&lt;p&gt;We would like to thank &lt;a href=&quot;http://twitter.com/dstufft&quot;&gt;Donald Stufft&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/kennethreitz&quot;&gt;Kenneth Reitz&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/jezdez&quot;&gt;Jannis Leidel&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/dreid&quot;&gt;David Reid&lt;/a&gt; for helping us making Python support happen and initial field testing.&lt;/p&gt;

&lt;p&gt;Perl support wouldn't be possible without amazing work and advice by &lt;a href=&quot;http://twitter.com/judofyr&quot;&gt;Magnus Holm&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/dukeleto&quot;&gt;Jonathan &quot;Duke&quot; Leto&lt;/a&gt; (also a big YAY for adding Parrot to Travis CI!), and &lt;a href=&quot;http://twitter.com/fxn&quot;&gt;Xavier Noria&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also, if you have a spare minute, send a &lt;em&gt;HUGE&lt;/em&gt; thanks to &lt;a href=&quot;http://twitter.com/michaelklishin&quot;&gt;Michael Klishin&lt;/a&gt; who works day and night (seriously, we can not figure out when he sleeps, or if he sleeps!) maintaining the VMs and making sure they are up to date. He was the driving force behind adding support for JVM languages (first Clojure, later Java, Scala, Groovy), and was instrumental in adding Python and Perl support. So please send him a tweet to say thanks, because without Michael we would still be at just Ruby support!&lt;/p&gt;

&lt;h2&gt;Next steps&lt;/h2&gt;

&lt;p&gt;Python and Perl support brings the total number of languages supported by Travis CI to 10. We love adding support to even more languages, but we think for now we need to focus on features like pre-tested pull requests that will benefit all projects, regardless of the language.&lt;/p&gt;

&lt;p&gt;If you want to help us make Travis CI even better, consider &lt;a href=&quot;https://love.travis-ci.org&quot;&gt;making a donation&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Announcing Java, Scala and Groovy project support on travis-ci.org</title>
    <link href="http://about.travis-ci.org/blog/announcing_support_for_java_scala_and_groovy_on_travis_ci"/>
    <published>2012-02-21T00:00:00-08:00</published>
    <updated>2012-02-21T00:00:00-08:00</updated>
    <id>http://about.travis-ci.org/blog/announcing_support_for_java_scala_and_groovy_on_travis_ci</id>
    <content type="html">&lt;p&gt;Travis CI started in early 2011 as a service for the Ruby community with the simple vision to make CI easy for OSS libraries and services. It wasn't long until we added support for Erlang, Clojure, Node.js and PHP. And, in fact, it is easy to build many other projects by supplying your own commands.&lt;/p&gt;

&lt;p&gt;Today we are excited to announce support for Java, Scala, and Groovy!&lt;/p&gt;

&lt;p&gt;The JVM ecosystem is very vibrant with multiple exciting languages maturing and being adopted by companies far and wide. In fact, since November 2011 Travis started using the JVM (JRuby) for several of our applications. The JVM and JRuby gave us access to a very solid runtime, as well as a vast selection of stable libraries, helping us to keep up with the growth over the last year.&lt;/p&gt;

&lt;h2&gt;Wait, What Is Travis CI Anyway?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://travis-ci.org&quot;&gt;Travis CI&lt;/a&gt; is a distributed continuous integration for the open source community. It is integrated with GitHub and offers first class support for multiple technologies. Our CI environment provides many tools, libraries, and services (MySQL, PostgreSQL, Redis, RabbitMQ, MongoDB and so on), and you don't have to bother setting up your own CI server.&lt;/p&gt;

&lt;p&gt;You can watch build logs in near-real time in your browser, access logs later, and even link to log line numbers (for example, when reporting an issue).&lt;/p&gt;

&lt;p&gt;Thanks to Github integration, Travis CI lets your contributors effortlessly add their development forks to test work-in-progress branches and makes your CI status very visible to the community thanks to our &lt;a href=&quot;http://about.travis-ci.org/docs/user/status-images/&quot;&gt;CI badges&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Started in early 2011, Travis CI has since run half a million builds for over 6,000 open source projects, including Ruby, Ruby on Rails, RubyGems, Node.js, Leiningen, Symfony and many more.&lt;/p&gt;

&lt;h2&gt;Getting Your Project on travis-ci.org&lt;/h2&gt;

&lt;p&gt;Travis CI currently provides OpenJDK 6, Maven 3, SBT 0.11.x and Gradle (currently 1.0 Milestone 8). To get started, you need to add one file
(.travis.yml) and the Github hook as described in the &lt;a href=&quot;http://about.travis-ci.org/docs/user/getting-started/&quot;&gt;Getting Started guide&lt;/a&gt;. If your
project uses Maven or Gradle, a minimal .travis.yml would look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language: java
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;for Java, or&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language: groovy
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;for Groovy and so on. Then Travis will see if you have a &lt;code&gt;build.gradle&lt;/code&gt; or &lt;code&gt;pom.xml&lt;/code&gt; file in your repository root and will run the standard dependency installation and testing commands, like&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mvn test
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gradle check
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It is possible to override these commands and add new ones to the build lifecycle, please refer to &lt;a href=&quot;http://about.travis-ci.org/&quot;&gt;our documentation&lt;/a&gt;, which now includes guides dedicated to &lt;a href=&quot;http://about.travis-ci.org/docs/user/languages/java/&quot;&gt;Java&lt;/a&gt;, &lt;a href=&quot;http://about.travis-ci.org/docs/user/languages/scala/&quot;&gt;Scala&lt;/a&gt; and &lt;a href=&quot;http://about.travis-ci.org/docs/user/languages/groovy/&quot;&gt;Groovy&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Build workflow&lt;/h3&gt;

&lt;p&gt;Travis' build workflow usually is&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clone your repository from GitHub&lt;/li&gt;
&lt;li&gt;(If applicable) pick language/runtime version to use&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;before_install&lt;/code&gt; commands (can be more than one)&lt;/li&gt;
&lt;li&gt;Install dependencies. Travis will try to detect whether project uses Gradle and SBT and run their respective commands, falling back to &lt;code&gt;mvn install&lt;/code&gt;. You can override the command using the &lt;code&gt;install&lt;/code&gt; key in your .travis.yml.&lt;/li&gt;
&lt;li&gt;Run one or more &lt;code&gt;before_script&lt;/code&gt; commands.&lt;/li&gt;
&lt;li&gt;Run the &lt;code&gt;script&lt;/code&gt; command, e.g. &lt;code&gt;gradle check&lt;/code&gt; or &lt;code&gt;mvn test&lt;/code&gt;, falling back to &lt;code&gt;ant test&lt;/code&gt;. This too can be overriden in .travis.yml.&lt;/li&gt;
&lt;li&gt;Report the build has finished running.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Support for multiple JDKs in the Travis CI Environment&lt;/h3&gt;

&lt;p&gt;travis-ci.org currently provides only one JDK. This is not on par with our support for Ruby (a dozen of versions/implementations), Erlang (several OTP releases)
and so on. We will add support for testing against multiple JDKs near in the future.&lt;/p&gt;

&lt;p&gt;Note that Clojure and Scala build tools allow testing against multiple versions and it is just as valid for Travis CI. This is documented in our guides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://about.travis-ci.org/docs/user/languages/scala/&quot;&gt;Clojure guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://about.travis-ci.org/docs/user/languages/scala/&quot;&gt;Scala guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Learn more&lt;/h3&gt;

&lt;p&gt;To learn what tools and services (mysql, postgres, riak, etc.) are available in the CI environment, refer to the &lt;a href=&quot;http://about.travis-ci.org/docs/user/ci-environment/&quot;&gt;CI environment&lt;/a&gt; guide.&lt;/p&gt;

&lt;p&gt;If you need help, feel free to join #travis on irc.freenode.net, ping us on Twitter (&lt;a href=&quot;http://twitter.com/travisci&quot;&gt;@travisci&lt;/a&gt;) and ask questions on &lt;a href=&quot;https://groups.google.com/group/travis-ci&quot;&gt;our mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Thank You Contributors&lt;/h2&gt;

&lt;p&gt;We would like to thank Gilles Cornu for doing most of the work on the Scala builder and updating our SBT Chef cookbook to 0.11.x.&lt;/p&gt;

&lt;h2&gt;Next steps&lt;/h2&gt;

&lt;p&gt;We don't want to stop here! There are so many other fantastic languages to add, and if all goes well we should have Perl and Python support around the corner. And if you want to help out, &lt;a href=&quot;https://love.travis-ci.org&quot;&gt;donating to Travis CI&lt;/a&gt; will make it happen sooner.&lt;/p&gt;

&lt;h2&gt;Discuss on Hacker News&lt;/h2&gt;

&lt;p&gt;You can discuss Java, Scala and Groovy support on travis-ci.org &lt;a href=&quot;http://news.ycombinator.com/item?id=3616923&quot;&gt;on Hacker News&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Announcing "first class" PHP project support!</title>
    <link href="http://about.travis-ci.org/blog/first_class_php_support_on_travis_ci"/>
    <published>2011-11-13T00:00:00-08:00</published>
    <updated>2011-11-13T00:00:00-08:00</updated>
    <id>http://about.travis-ci.org/blog/first_class_php_support_on_travis_ci</id>
    <content type="html">&lt;p&gt;Today we are happy to announce first class PHP support with Travis CI.&lt;/p&gt;

&lt;p&gt;It includes all the same features Ruby, Erlang and Node.js projects enjoy today, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to get started and integrates with GitHub.&lt;/li&gt;
&lt;li&gt;Test against multiple databases and services, including Mysql, Postgres, Redis, RabbitMQ and many more.&lt;/li&gt;
&lt;li&gt;Test your projects against multiple PHP versions.&lt;/li&gt;
&lt;li&gt;Build results are publicly available online so you can link to them in your bug reports, including line numbers.&lt;/li&gt;
&lt;li&gt;Notifications the way you want them! (email, IRC, and webhooks)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Over the last several weeks many nice folks from the PHP community have been working with the Travis team
and it would not be possible without all the help from &lt;a href=&quot;https://twitter.com/loicfrering&quot;&gt;Loïc Frering&lt;/a&gt; and &lt;a href=&quot;https://github.com/pborreli&quot;&gt;Pascal Borreli&lt;/a&gt;. &lt;a href=&quot;https://github.com/till&quot;&gt;Till Klampaeckel&lt;/a&gt; has helped us set up &lt;a href=&quot;http://sourceforge.net/p/phpfarm/wiki/Home/&quot;&gt;phpfarm&lt;/a&gt; and &lt;a href=&quot;http://pear2.php.net/&quot;&gt;pyrus&lt;/a&gt; and test drive the whole thing. &lt;a href=&quot;https://twitter.com/old_sound&quot;&gt;Álvaro Videla&lt;/a&gt; and
&lt;a href=&quot;https://github.com/lsmith77&quot;&gt;Lukas Kahwe Smith&lt;/a&gt; also helped us a lot by running some of the &lt;a href=&quot;https://github.com/friendsofsymfony&quot;&gt;Friends of Symfony&lt;/a&gt; projects on Travis early on.
Pascal also got Symfony, Twig, Silex, Doctrine and Monolog test suites up and running on travis-ci.org (we hope his patches will be accepted
upstream).&lt;/p&gt;

&lt;p&gt;Having all those projects building fine for several days makes us confident that we are ready to ship this feature.&lt;/p&gt;

&lt;p&gt;Please see our &lt;a href=&quot;http://about.travis-ci.org/docs/user/languages/php&quot;&gt;initial documentation for PHP projects&lt;/a&gt; and &lt;a href=&quot;http://about.travis-ci.org/docs/&quot;&gt;the rest of the guides&lt;/a&gt;. We tried to link to as many real world .travis.yml examples to demonstrate all the features in action.&lt;/p&gt;

&lt;p&gt;In addition, we have a couple of machines lined up that we will be running PHP builds on. One of them is &lt;a href=&quot;http://shopify.com&quot;&gt;Shopify&lt;/a&gt;: they donated us a worker we have been using for Node.js projects. Another one is &lt;a href=&quot;http://servergrove.com&quot;&gt;ServerGrove&lt;/a&gt;, experts in PHP hosting and specifically frameworks like Symfony and Zend Framework: they donated us one more machine to run PHP builds
on.&lt;/p&gt;

&lt;p&gt;If you have questions, find us in #travis on irc.freenode.net, we will be happy to answer them. To stay up to date with new announcements, CI environment software updates and more, &lt;a href=&quot;https://twitter.com/travisci&quot;&gt;follow us on Twitter&lt;/a&gt; and &lt;a href=&quot;https://groups.google.com/forum/#!forum/travis-ci&quot;&gt;join our mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We hope you enjoy using Travis for your open source projects as much as we do. Go add your PHP projects to Travis CI and recommend your fellow PHP developers to do the same!&lt;/p&gt;

&lt;p&gt;The Travis Team.&lt;/p&gt;

&lt;h2&gt;Spread the word!&lt;/h2&gt;

&lt;p&gt;Feel free to &lt;a href=&quot;http://news.ycombinator.com/item?id=3231030&quot;&gt;discuss and upvote on Hacker News&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Updates&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Doctrine is now on Travis: &lt;a href=&quot;http://travis-ci.org/#!/doctrine/doctrine2&quot;&gt;doctrine2&lt;/a&gt;, &lt;a href=&quot;http://travis-ci.org/#!/doctrine/common&quot;&gt;common&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Monolog is now on Travis &lt;a href=&quot;http://travis-ci.org/#!/Seldaek/monolog&quot;&gt;Monolog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  
  <entry>
    <title>VM environment upgrade, Nov 11th, 2011</title>
    <link href="http://about.travis-ci.org/blog/vm_upgrade_nov_11_2011"/>
    <published>2011-11-11T00:00:00-08:00</published>
    <updated>2011-11-11T00:00:00-08:00</updated>
    <id>http://about.travis-ci.org/blog/vm_upgrade</id>
    <content type="html">&lt;p&gt;travis-ci.org Ruby workers were upgraded, here is what's new:&lt;/p&gt;

&lt;h2&gt;Ruby Workers Changes&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Updated Rubinius 2.0 from 2.0.testing branch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bit.ly/rabbitmq-2-7-0&quot;&gt;RabbitMQ 2.7.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Rubinius team was busy making GC and full CPU concurrency improvements as well as upgrading Ruby standard library
for their 1.9 mode. Give it a try by testing your Ruby projects against Rubinius!&lt;/p&gt;

&lt;h2&gt;Node.js Workers Changes&lt;/h2&gt;

&lt;p&gt;Node.js workers were upgraded, too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://bit.ly/rabbitmq-2-7-0&quot;&gt;RabbitMQ 2.7.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Follow Us on Twitter&lt;/h2&gt;

&lt;p&gt;To get regular updates about travis-ci.org environment upgrades and other developments, &lt;a href=&quot;https://twitter.com/travisci&quot;&gt;follow Travis CI on Twitter&lt;/a&gt;
and watch our &lt;a href=&quot;https://github.com/travis-ci/travis-cookbooks/tree/master/vagrant_base&quot;&gt;Chef cookbooks repository on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/michaelklishin&quot;&gt;MK&lt;/a&gt; on behalf of the Travis CI Team.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Announcing "first class" Node.js project support!</title>
    <link href="http://about.travis-ci.org/blog/first_class_nodejs_support_on_travis_ci"/>
    <published>2011-11-09T00:00:00-08:00</published>
    <updated>2011-11-09T00:00:00-08:00</updated>
    <id>http://about.travis-ci.org/blog/first_class_nodejs_support_on_travis_ci</id>
    <content type="html">&lt;p&gt;One of the things people keep asking us is when language X will be a first class citizen on Travis-CI.
While it has been possible to build Node.js and C++ projects on Ruby workers for a while, it is not very convenient or intuitive, and such projects will not get the killer feature of travis-ci.org: testing against multiple versions/implementations. So we have good news for the Node.js community: Node.js is gaining first class support on Travis-CI, joining Ruby and Erlang.&lt;/p&gt;

&lt;p&gt;Thanks to the hard work by &lt;a href=&quot;https://twitter.com/harrybrundage&quot;&gt;Harry Brundage&lt;/a&gt; and the Travis core team, it is now possible to test your Node.js projects against multiple Node versions (currently 0.4.12, 0.5.8 and 0.6.0). We use &lt;a href=&quot;https://github.com/travis-ci/travis-cookbooks/blob/master/vagrant_base/nodejs/files/default/nvm.sh&quot;&gt;NVM (&quot;RVM for Node.js&quot;) project&lt;/a&gt; and &lt;a href=&quot;https://github.com/travis-ci/travis-cookbooks/tree/master/vagrant_base/nodejs&quot;&gt;Chef cookbooks&lt;/a&gt; to enable to easy switching of Node.js versions.&lt;/p&gt;

&lt;p&gt;In addition, Shopify now sponsors a machine that we will be running five Node.js workers on. Please thank them by sending a loving tweet or two to &lt;a href=&quot;https://twitter.com/shopify&quot;&gt;@Shopify&lt;/a&gt; :)&lt;/p&gt;

&lt;h3&gt;How do I test my project against multiple Node.js versions?&lt;/h3&gt;

&lt;p&gt;To test your Node.js project against multiple Node versions, add a '.travis.yml' file to your GitHub repository and add the following to it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language: &quot;node_js&quot;
node_js:
  - 0.4
  - 0.5
  - 0.6
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When you define &quot;node_js&quot; as the language it tells Travis to switch the Node.js version (nvm use 0.4), install the dependencies of the project (npm install), and run the tests (npm test). If you define multiple Node.js versions to test against, like the above example, Travis will create a matrix of test configurations, in this case three builds will be queued. Or you can leave out the node_js versions to test against and Travis will use 0.4 by default. If your project is not yet Node 0.5 or 0.6 compatible,
you can exclude those versions. The same goes for project that want to only support 0.6, for example.&lt;/p&gt;

&lt;p&gt;See Shopify's &lt;a href=&quot;https://github.com/shopify/batman/blob/master/.travis.yml&quot;&gt;Batman&lt;/a&gt; as well as &lt;a href=&quot;https://twitter.com/#!/martin_sunset&quot;&gt;Martin Wawrusch&lt;/a&gt;'s &lt;a href=&quot;https://github.com/scottyapp/hook.io-blueprint-coffeescript/blob/master/.travis.yml&quot;&gt;hook.io-blueprint-in-coffescript&lt;/a&gt; and &lt;a href=&quot;https://github.com/scottyapp/hook.io-amqp-listener/blob/master/.travis.yml&quot;&gt;hook.io-amqp-listener&lt;/a&gt; projects as examples.&lt;/p&gt;

&lt;h2&gt;The Workflow&lt;/h2&gt;

&lt;p&gt;Travis' Node.js builder will do the following as part of the build process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clone your repository from GitHub&lt;/li&gt;
&lt;li&gt;Pick Node.js version to use&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;before_install&lt;/code&gt; commands (can be more than one)&lt;/li&gt;
&lt;li&gt;Install dependencies using &lt;code&gt;npm install [npm_args]&lt;/code&gt; or whatever you provide in the &lt;code&gt;install&lt;/code&gt; key in your .travis.yml file&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;before_script&lt;/code&gt; (can be more than one script)&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;install&lt;/code&gt; command if you provided it in your .travis.yml. By default it is &lt;code&gt;npm test&lt;/code&gt; if it finds package.json in the repository root or  &lt;code&gt;make test&lt;/code&gt; otherwise.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;after_script&lt;/code&gt; (can be more than one command)&lt;/li&gt;
&lt;li&gt;Report the build has finished running&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Most of steps in the workflow can be overriden by projects that need it. We recommend you to use defaults when possible, though.&lt;/p&gt;

&lt;p&gt;For more information on what is &lt;a href=&quot;http://about.travis-ci.org/docs/user/ci-environment/&quot;&gt;available in terms of services&lt;/a&gt; (mysql, postgres, riak, etc.), or how to configure your builds or matrix, visit the &lt;a href=&quot;http://about.travis-ci.org/docs/&quot;&gt;docs site&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Next steps&lt;/h3&gt;

&lt;p&gt;We have support for more languages in the works, one of which we hope to ship really soon, so stay tuned!&lt;/p&gt;

&lt;h3&gt;In conclusion (a.k.a lots of &amp;lt;3 &amp;lt;3 &amp;lt;3)&lt;/h3&gt;

&lt;p&gt;Once again we would like to thank Harry for doing most of the work on first class Node.js support and Shopify for sponsoring a machine that we will host the workers on.&lt;/p&gt;

&lt;p&gt;Now go add your Node.js projects to travis-ci.org and tell your friends and colleagues about it!&lt;/p&gt;

&lt;p&gt;&amp;lt;3 &amp;lt;3 &amp;lt;3, the &lt;a href=&quot;https://twitter.com/travisci&quot;&gt;Travis CI core team&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Discuss on Hacker News&lt;/h3&gt;

&lt;p&gt;You can discuss Node.js support on travis-ci.org &lt;a href=&quot;http://news.ycombinator.com/item?id=3216403&quot;&gt;on Hacker News&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>VM environment upgrade, Oct 31st, 2011</title>
    <link href="http://about.travis-ci.org/blog/vm_upgrade_oct_31_2011"/>
    <published>2011-10-31T00:00:00-07:00</published>
    <updated>2011-10-31T00:00:00-07:00</updated>
    <id>http://about.travis-ci.org/blog/vm_upgrade</id>
    <content type="html">&lt;p&gt;travis-ci.org Ruby workers were upgraded to provide the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ruby 1.9.3-p0 (final release)&lt;/li&gt;
&lt;li&gt;JRuby 1.6.5&lt;/li&gt;
&lt;li&gt;Updated Rubinius 2.0 from 2.0.testing branch&lt;/li&gt;
&lt;li&gt;Node.js 0.4.12, npm 1.0.18&lt;/li&gt;
&lt;li&gt;MongoDB 2.0.1&lt;/li&gt;
&lt;li&gt;Riak 1.0.1&lt;/li&gt;
&lt;li&gt;ragel&lt;/li&gt;
&lt;li&gt;RVM 1.9.2&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;There is also one more change we want to highlight: we now provide two installations of Rubinius, one in Ruby 1.8 mode
and another one in Ruby 1.9 mode. Their RVM aliases are &lt;em&gt;rbx-18mode&lt;/em&gt; and &lt;em&gt;rbx-19mode&lt;/em&gt;, respectively. For example, to test your gem
against Rubinius in both modes, you can use the following list of Rubies in your .travis.yml file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rvm:
  - 1.8.7
  - 1.9.3
  - jruby
  - rbx-18mode
  - rbx-19mode
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Existing aliases for 1.8 mode (&lt;em&gt;rbx&lt;/em&gt; and &lt;em&gt;rbx-2.0&lt;/em&gt;) are still around and will work.&lt;/p&gt;

&lt;p&gt;Rubinius' Ruby 1.9 features support is still a work in progress (it does not support encodings yet, for example) but
we encourage Ruby developers to try testing their libraries against Rubinius, in both 1.8 and 1.9 modes. Now it is even
easier to do on travis-ci.org.&lt;/p&gt;

&lt;p&gt;To get regular updates about travis-ci.org environment upgrades and other developments, &lt;a href=&quot;https://twitter.com/travisci&quot;&gt;follow Travis CI on Twitter&lt;/a&gt;
and watch our &lt;a href=&quot;https://github.com/travis-ci/travis-cookbooks/tree/master/vagrant_base&quot;&gt;Chef cookbooks repository on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/michaelklishin&quot;&gt;MK&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>A Big Refactoring!</title>
    <link href="http://about.travis-ci.org/blog/big_refactoring"/>
    <published>2011-08-29T00:00:00-07:00</published>
    <updated>2011-08-29T00:00:00-07:00</updated>
    <id>http://about.travis-ci.org/blog/big_refactoring</id>
    <content type="html">&lt;p&gt;We've just rolled out a big refactoring to the Travis CI &lt;a href=&quot;https://github.com/travis-ci/travis-ci&quot;&gt;application&lt;/a&gt;
(i.e. the server app which runs on Heroku) that we've been working on over the
last four weeks.&lt;/p&gt;

&lt;p&gt;This refactoring was quite far-reaching and even though we've tried hard to
make sure everything works fine there may be glitches and bugs that we've
overlooked.&lt;/p&gt;

&lt;h2&gt;Why?&lt;/h2&gt;

&lt;p&gt;The motivation behind all of this work was quite manifold. Maybe the best
summary is that our previous domain model still had the very basic design from
its original spike. But here are some more details. We wanted to achieve the
following things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Split up the monster Build model into more finegrained classes for more
clarity&lt;/li&gt;
&lt;li&gt;Move to a statemachine-like pattern for more explicitely reflecting
various state changes that happen across various models&lt;/li&gt;
&lt;li&gt;Lay better grounds for the long planned move to &lt;a href=&quot;https://github.com/ruby-amqp/amqp&quot;&gt;AMQP&lt;/a&gt;
(communication with the workers)&lt;/li&gt;
&lt;li&gt;Lay better grounds for the long planned move Sproutcore (reimplementation of
the JS client)&lt;/li&gt;
&lt;li&gt;Improve test coverage and move to RSpec (for unifying test technologies and a
slightly lower barrier for new devs)&lt;/li&gt;
&lt;li&gt;Generally clean up both model and test code.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;One major intention was to generally clean up our codebase, complete and
improve the test suite and make the model design more readable. Another was
to split up the former Build model which had grown into a huge tangled monster.
And while we were at it we also wanted to better communicate the fact that the
domain model is very much about about triggering state changes through various
events and messages.&lt;/p&gt;

&lt;p&gt;You can find more information about the new domain model design &lt;a href=&quot;https://github.com/travis-ci/travis-ci/blob/statemachine_merge/docs/notes/build_tasks.md&quot;&gt;in this
document&lt;/a&gt;.
Some of the details outlined there haven't been implemented, yet. E.g. the
&lt;code&gt;Build&lt;/code&gt; model does not have the mentioned &lt;code&gt;errored&lt;/code&gt; and &lt;code&gt;cancelled&lt;/code&gt; states, the
&lt;code&gt;Task::Test&lt;/code&gt; does not have &lt;code&gt;cloned&lt;/code&gt; and &lt;code&gt;installed&lt;/code&gt; states ... simply because the
worker does not support triggering these, yet. These things will probably be
added in a later stage.&lt;/p&gt;

&lt;p&gt;When we reviewed common Ruby statemachine implementations we found none of them
do what we needed, so we came up with our own brand of it:
&lt;a href=&quot;https://github.com/svenfuchs/simple_states&quot;&gt;simple_states&lt;/a&gt; may or may not
useful for your own usecase but it does exactly what we need in Travis CI and
nothing more.&lt;/p&gt;

&lt;p&gt;Another gem that has been implemented in the course of this refactoring is
&lt;a href=&quot;https://github.com/svenfuchs/data_migrations&quot;&gt;data_migrations&lt;/a&gt;. We had quite a
bunch of columns to migrate from the &lt;code&gt;builds&lt;/code&gt; table to various other tables
(such as &lt;code&gt;commits&lt;/code&gt;, &lt;code&gt;requests&lt;/code&gt;, &lt;code&gt;tasks&lt;/code&gt;) and it seemed easier to come up with a
simple DSL for that than writing all these queries by hand.&lt;/p&gt;

&lt;p&gt;Also, we're now using &lt;a href=&quot;https://github.com/svenfuchs/hashr&quot;&gt;hashr&lt;/a&gt; in the
application, too (for &lt;code&gt;Travis.config&lt;/code&gt;, specifically). We've used it in the
&lt;a href=&quot;https://github.com/travis-ci/travis-worker&quot;&gt;worker code&lt;/a&gt; before and it worked
pretty well.&lt;/p&gt;

&lt;h2&gt;In other news ...&lt;/h2&gt;

&lt;p&gt;In other news, over the last month we have extract a &lt;a href=&quot;https://github.com/michaelklishin/sous-chef&quot;&gt;small project that we use to develop our Chef cookbooks&lt;/a&gt; and
added the following tools to the &lt;a href=&quot;https://github.com/travis-ci/travis-cookbooks/tree/master/vagrant_base&quot;&gt;VM infrastructure&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kerl to support Erlang with testing against multiple OTP releases&lt;/li&gt;
&lt;li&gt;leiningen 1.6 for Clojure projects&lt;/li&gt;
&lt;li&gt;sbt 0.10 for Scala projects&lt;/li&gt;
&lt;li&gt;Thinking Sphinx 0.9.9, 1.10 and 2.0. &lt;a href=&quot;http://freelancing-god.github.com/riddle&quot;&gt;Riddle&lt;/a&gt; and &lt;a href=&quot;http://freelancing-god.github.com/ts/en/&quot;&gt;Thinking Sphinx&lt;/a&gt; are now hosted on Travis.&lt;/li&gt;
&lt;li&gt;RabbitMQ now installs HTTP API plugin&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  
  <entry>
    <title>Hello, World</title>
    <link href="http://about.travis-ci.org/blog/hello_world"/>
    <published>2011-08-20T00:00:00-07:00</published>
    <updated>2011-08-20T00:00:00-07:00</updated>
    <id>http://about.travis-ci.org/blog/hello_world</id>
    <content type="html">&lt;pre&gt;&lt;code&gt;puts &quot;Hello, world!&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I think that's required for first blog posts on technical topics.&lt;/p&gt;

&lt;h2&gt;Now that that's out of the way&lt;/h2&gt;

&lt;p&gt;Welcome to the first post on the Travis blog! Hopefully we'll end up having a
bunch of great content for you here.&lt;/p&gt;

&lt;h2&gt;We? Who's this 'we'?&lt;/h2&gt;

&lt;p&gt;Me, of course. Duh. Specifically? I'm &lt;a href=&quot;https://github.com/steveklabnik&quot;&gt;Steve Klabnik&lt;/a&gt;.
I'm heading up the Travis documentation. But &lt;a href=&quot;https://github.com/travis-ci/travis-ci.github.com/&quot;&gt;this entire website is on
GitHub&lt;/a&gt;, so if you
were so inclined, 'we' could also mean 'you!'&lt;/p&gt;

&lt;p&gt;Got a new fun project on Travis? Have you recently added some fun code,
or found a new feature useful? Write a post! It's good for you!&lt;/p&gt;

&lt;h2&gt;Why you should read this blog&lt;/h2&gt;

&lt;p&gt;I'll &lt;em&gt;also&lt;/em&gt; be trying to make posts roughly once a week letting you know
what's new in the world of Travis. We've got a bunch of contributors,
and lots of exciting stuff going on, so it's hard to keep up! Just check
out this blog, it's much easier than reading the commit list. ;)&lt;/p&gt;

&lt;p&gt;Oh, and if you want to subscribe via RSS, grab the &lt;a href=&quot;/blog.xml&quot;&gt;Travis blog feed
here&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
</feed>

