---
layout: default
title: Contributing
---

Buildr is a community effort, and we welcome all contributors.  Here's your chance to get involved and help your fellow developers.

h2(#involved).  Getting involved

All our discussions are done in the open, over "email":mailing_lists.html, and that would be the first place to look for answers, raise ideas, etc.  For bug reports, issues and patches, "see below":#bugs.


h2(#mailing_lists).  Mailing Lists

We run two mailing lists, the "users":http://buildr.markmail.org/search/list:users mailing list for developers working with Buildr, that would be you if you're using Buildr or interested in using it.  There's the "dev":http://buildr.markmail.org/search/list:dev mailing list for talking about development of Buildr itself. There's also "commits":http://buildr.markmail.org/search/list:commits mailing list for following Git commits and JIRA issues.

Check the "mailing lists":mailing_lists.html page for more information on subscribing, searching and posting to the mailing list.


h2(#irc).  Internet Relay Chat

We are live on IRC under the buildr channel on irc.freenode.net, with a broad coverage of the US timezone. We tend to idle there, so feel free to ping the channel owner (toulmean) to make noise.

Our "conversations": are logged by the "echelog":http://echelog.matzon.dk/logs/browse/buildr/1279663200 and "irclogger":http://irclogger.com/buildr/ bots. If you're really curious, we also have "activity statistics":http://echelog.matzon.dk/stats/buildr.html

Sincere thanks to Matzon and Christopher Schneider for setting these up!


h2(#bugs).  Bugs (aka Issues)

We really do try to keep bugs to a minimum, and anticipate everything you'll ever want to do with Buildr.  We're also, not perfect.  So you may have found a bug, or have an enhancement in mind, or better yet, a patch to contribute. Here's what you can do.

If it's a bug, enhancement or patch, add it to "JIRA":http://issues.apache.org/jira/browse/Buildr.  For trivial stuff, that's good enough.

If it needs more attention, start a discussion over on the mailing list.  We will still use JIRA to log the progress, but the mailing list is a better place for talking things through.

When reporting a bug, please tell us which version of Ruby, Buildr and Java you are using, and also which operating system you are on:

{% highlight sh %}
$ ruby --version
$ buildr --version
$ java --version
{% endhighlight %}


h2(#wiki).  Community Wiki

"Our community Wiki":http://cwiki.apache.org/confluence/display/BUILDR/Index.


h2(#code).  Contributing Code

Yes, please.

If you have a patch to submit, do it through "JIRA":http://issues.apache.org/jira/browse/Buildr.  We want to make sure Apache gets the right to use your contribution, and the JIRA upload form includes a simple contribution agreement.  Lawyer not included.

h3.  The Perfect Patch

If you want to get your patch accepted quickly:

#  Provide a good summary of the bug/fix.  We use that to decide which issue we can do quickly, and also copy and paste it into the changelog.
#  Provide short explanation of what failed, under what conditions, why, and what else could be affected by the change (when relevant).  The helps us understand the problem and move on to the next step.
#  Provide a patch with relevant specs, or a fix to incomplete/broken specs. First thing we have to do is replicate the problem, before applying the change, and then make sure the change fixes that problem.  And we need to have those specs in there, they make sure we don't accidentally break it again in the future.
#  Provide a patch with the fix/change itself.  Keep it separate from the specs, so it's easy to apply them individually.

If you don't know how to fix it, but can at least write a spec for the correct behavior (which, obviously would fail), do just that.  A spec is preferred to a fix.

h2(#edge).  Living on the edge

Did we mention Buildr is an open source project?  In fact, when you install Buildr you get all the source code, documentation, test case and everything you need to use it, extend it and patch it.  Have a look in your Gem directory.

h3(#git).  GIT

If you want to work with the latest and greatest, you'll want to check out Buildr from source control. You can use the "official Apache Buildr Github  clone.":https://github.com/apache/buildr  This clone is maintained by Github aand kept in sync with the "ASF Git repository":https://git-wip-us.apache.org/repos/asf?p=buildr.git

{% highlight sh %}
$ git clone git@github.com:apache/buildr.git
{% endhighlight %}

h3. Working with Source Code

To install Buildr from the source directory:

{% highlight sh %}
$ cd buildr
$ rake setup install
{% endhighlight %}

When using Buildr for JRuby:

{% highlight sh %}
$ cd buildr
$ jruby -S rake setup install
{% endhighlight %}

The _setup_ task takes care of installing all the necessary dependencies used for building, testing and running Buildr. Once in a while we upgrade or add new dependencies, if you're experiencing a missing dependency, simply run @rake setup@ again.

The _install_ task creates a Gem in your working directory (_pkg/_) and install it in your local repository. Since Ruby Gems uses version numbers to detect new releases, if you installed Buildr this way and want to upgrade to the latest official release, you need to use @gem install buildr@ rather than @gem upgrade@.

Both _setup_ and _install_ tasks use the @sudo@ command on platforms that require it (i.e. not Windows), so there's no need to run @sudo rake@ when working with the Buildr source code.

h2(#testing).  Tested and Documented

Two things we definitely encourage!

h3.  Testing/Specs

Obviously we won't turn down patches, but we'll love you even more if you include a test case.  One that will fail without the patch, and run successfully with it.  If not for our love, then think of the benefit to you: once we add that test case, we won't accidentally break that feature in the next release.

We test using "RSpec":http://rspec.info/, a Behavior-Driven Development test framework.  The main difference between RSpec and xUnit is that RSpec helps you formulate test cases in terms of specifications: you describe how the code should behave, and run RSpec to make sure it matches that specification.

You can run an individual specifications using the @spec@ command, for example:

{% highlight sh %}
$ spec spec/compiler_spec.rb
$ spec spec/compiler_spec.rb -l 409
{% endhighlight %}

The first command will run all the specifications in @compiler_spec@, the second command will run only the specification identified by line 409 of that file. You can use line numbers to point at a particular specification (lines starting with @it@), or set of specifications (lines starting with @describe@). You can also use the @-e@ command line option to name a particular specification.

To make sure your change did not break anything else, you can run all the specifications (be patient, we have a lot of these):

{% highlight sh %}
$ rake spec
{% endhighlight %}

If you get any failures, you can use @rake failed@ to run only the failed specs, and repeat until there are no more failed specs to run. The list of failed specs is stored in the file _failed_.

We always @rake spec@ before making a release.

For full test coverage:

{% highlight sh %}
$ rake coverage
{% endhighlight %}

Specification and coverage reports are HTML files you can view with a Web browser, look for them in the _reports_ directory. You can also check out the "RSpec report":specs.html and "test coverage":coverage/index.html we publish with each release.


h2(#docs).  Documentation

Yes, we do make typos, spelling errors and sometimes we write things that don't make sense, so if you find a documentation bug, or want to help make the documentation even better, here's the way to do it.

For simple typos and quick fixes, just send a message to the mailing list or log an issue in JIRA.

If you end up rewriting a significant piece of text, or add new documentation (you rock!), send a patch.  Making documentation patches is fairly easy.  All the documentation is generated from text files in the @doc/pages@ directory, so all you need to do is check it out from Git, edit, and @git diff@ to create a patch.

We use "Textile":http://www.textism.com/tools/textile/ as the markup language, it takes all of a few minutes to learn, it's intuitive to use, and produces clean HTML.  You can learn it all in a few minutes from the "Textile Reference Manual":http://redcloth.org/textile.  Also check out the "Textile Quick Reference":http://hobix.com/textile/quick.html.

Syntax highlighting handled by "Pygments":http://pygments.org.  Use the special @highlight@ tag to separate code sample from the rest of the text and to tell Pygments which language to use.  For example:

<notextile><pre>
&#123;&#37; highlight ruby &#37;&#125;
define 'project' do
  # Just a sample
end
&#123;&#37; endhighlight &#37;&#125;
</pre></notextile>

Have a look at existing documentation to see writing conventions, specifically:

* Separate paragraphs with two newlines.
* Use one newline only if you need a &lt;br&gt; tag, otherwise, no newlines inside the paragraph.
* When creating a new page, don't forget the YAML premable at the top (Jekyll needs the page title and layout).
* The layout uses H1 to render the page title; only use H2 through H4 for the page content.
* Use H2 headers for the major page sections.  Give each H2 header a unique ID so the table of contents can link to it.
* Separating sentences with two spaces, just a convenience when editing in a text editor using monospaced fonts.
* If in doubt, ask.

To go from Textile to HTML we use "Jekyll":http://github.com/mojombo/jekyll.  You can use the @jekyll@ rake task to transform the files under @doc@ and create a copy of the Web site in the directory @_site@.  For example:

{% highlight sh %}
$ rake jekyll
$ open _site/index.html
{% endhighlight %}

There is no live editing, but you can run @rake jekyll auto=true@, and when you update and save a Textile page it will regenerate the corresponding HTML page.

To go from HTML to PDF we use "PrinceXML":http://www.princexml.com/.  The target file @buildr.pdf@ is generated by first running Jekyll and then merging the generated HTML pages into a single PDF document.  For example:

{% highlight sh %}
$ rake buildr.pdf
$ open buildr.pdf
{% endhighlight %}


h2(#ci).  Continuous Integration

Buildr uses the Jenkins continuous integration tool to perform builds, run tests and report back on problems when changes are made to the source code repository.

The care and feeding of the "CI Jobs":https://builds.apache.org/view/A-F/view/Buildr is the responsibility of the committers. To get access to configure the CI Jobs a committer needs to follow the directions on the "jenkins":http://wiki.apache.org/general/Hudson documentation site.

You may also need to coordinate with the Apache infrastructure team to get accounts on the actual slave hosts that run the CI jobs. This access may be required to install tools and gems required to run the CI jobs. The main slave host to get access to is vesta.apache.org at the time of writing. You can also log on to the slave host, impersonate hudson and manually run tasks when you are attempting to track down build problems. Of course to impersonate hudson you will need to learn how to use "OPIE.":http://apache.org/dev/freebsd-jails

h3(#cilinux).  Linux Setup

The tests on the Linux hosts rely on "RVM":https://rvm.io/ to setup the ruby environment. At the time of writing the Linux/x86 nodes that Apache uses for CI are based of the old "Ubuntu 10.04.4 LTS (Lucid Lynx)" operating system. As it is a relatively old operating system, it requires a little bit of manual intervention to install RVM on the node. We have installed the required tools on vesta.apache.org manually. The script looks something like;

{% highlight sh %}
ssh my_username@vesta.apache.org
sudo su - hudson

curl -L https://get.rvm.io | bash -s stable
rvm reload
rvm pkg install readline
rvm pkg install iconv
rvm pkg install curl
rvm pkg install openssl
rvm pkg install zlib
rvm pkg install autoconf
rvm pkg install ncurses
rvm pkg install pkgconfig
rvm pkg install gettext
rvm pkg install glib
rvm pkg install mono
rvm pkg install llvm
rvm pkg install libxml2
rvm pkg install libxslt
rvm pkg install libyaml
rvm install ruby-1.8.7-p358
rvm install ruby-1.9.2-p320
rvm install jruby-1.6.7
rvm install ruby-1.9.3-p194
{% endhighlight %}

It should also be noted that jruby-1.6.7 release has a native library that is compiled using a more modern version of libc than is available on this variant of the operating system. We could download the source release and recompile the library but instead we have just avoided the need for any use of the ruby native interface library in our CI infrastructure.

h3(#ciwindows).  Windows Setup

The ci infrastructure on the windows host (hudson-win.apache.org) is a little fragile. First you need to RDP in and download the support libraries. We have manually installed the tools in the following locations. Note: it is important to make the locations read-write access to the hudson user.

{% highlight sh %}
F:\hudson\tools\Ruby193-p194
F:\hudson\tools\Ruby192-p290
F:\hudson\tools\Ruby187-p370
F:\hudson\tools\jruby-1.6.7
F:\hudson\tools\scala-2.9.0.1
{% endhighlight %}

WARNING: Several attempts were made to use GEM_HOME to install the dependent gems for each test in a separate location but we were unable to figure out the mechanisms via which sub-shells would inherit the paths and the ability to run tools such as rspec.

h2(#contributors).  Contributors

Here is the list of people who are actively working and committing on Buildr:

*"Assaf Arkin":http://labnotes.org* (assaf at apache.org)

Started working on Buildr because Maven was too much pain and Rake wasn't enough.  Assaf has been hanging around Apache since 1999, as founding contributor to XML Apache, Ode and Buildr.  Assaf is also co-author of "Ruby In Practice":http://manning.com/mcanally/.

*Alex Boisvert*

Came to Buildr as a refuge from the Maven Uncertainty Principle.  Alex has been working mostly on the Scala integration and believes Ruby scripting is a great complement to statically typed languages.

*"Matthieu Riou":http://offthelip.org*

*Victor Hugo Borja* (vborja at apache.org)

Currently a Java Developer at "http://jwmsolutions.com":http://jwmsolutions.com, Victor has been enjoying and using Apache's software since 1999 when he started with Java, now he prefers programming Ruby and is happy to help on Apache's first ruby project.

*Lacton* (lacton at apache.org)

A test-infected developer since 2001, Lacton yearns for a development infrastructure that would shorten feedback loops so much that testing, building, refactoring and committing would feel as easy and natural as breathing air.

*"Daniel Spiewak":http://www.codecommit.com/blog* (djspiewak at apache.org)

Daniel originally came to Buildr in search of a Scala build tool which was better than Ant.  He got more than he bargained for.  Now, he works to advance Buildr as the absolute best tool for supporting Scala development.

*"Antoine Toulme":http://www.lunar-ocean.com/* (toulmean at apache.org)

Antoine used Buildr first as an excuse to evade in Ruby land, creating plugins for Debian packaging, GWT compilation, or the NSIS installer. His main area of interest is the resolving of dependencies in the OSGi world. He works on making Buildr a standalone rock solid tool.

*Peter Donald*

Peter already used rake to automate jobs in his ruby and java projects. When it came time to upgrade that home grown ant/java/rake build system Buildr seemed the perfect match.
