---
layout: default
title: Settings/Profiles
---


h2(#env_vars).  Environment Variables

Buildr uses several environment variables that help you control how it works. Some environment variables you will only set once or change infrequently.  You can set these in your profile, OS settings or any tool you use to launch Buildr (e.g. continuous integration).

For example:

{% highlight sh %}
$ export HTTP_PROXY=http://myproxy:8080
{% endhighlight %}

There are other environment variables you will want to set when running Buildr, for example, to do a full build without running the tests:

{% highlight sh %}
$ buildr test=no
{% endhighlight %}

For convenience, the environment variables @TEST@ and @DEBUG@ are case insensitive, you can use either @test=no@ or @TEST=no@. Any other environment variable names are case sensitive.

You can also set environment variables from within your Buildfile.  For example, if you discover that building your project requires gobs of JVM heap space, and you want all other team members to run with the same settings:

{% highlight ruby %}
# This project builds a lot of code.
ENV['JAVA_OPTS'] ||= '-Xms1g -Xmx1g'
{% endhighlight %}

Make sure to set any environment variables at the very top of the Buildfile, above any Ruby statement (even @require@).

p(tip).  Using @||=@ sets the environment variable, if not already set, so it's still possible for other developers to override this environment variable without modifying the Buildfile.

Buildr supports the following environment variables:

|_. Variable    |_. Description |
| @BUILDR_ENV@  | Environment name (development, production, test, etc). Another way to set this is using the @-e@ command line option. |
| @DEBUG@       | Set to @no/off@ if you want Buildr to compile without debugging information (default when running the @release@ task, see "Compiling":building.html#compiling). |
| @HOME@        | Your home directory. |
| @HTTP_PROXY@  | URL for HTTP proxy server (see "Specifying Repositories":artifacts.html#repositories). |
| @HTTPS_PROXY@ | URL for HTTPS proxy server (see "Specifying Repositories":artifacts.html#repositories). |
| @IGNORE_BUILDFILE@ | Set to "true" or "yes" to ignore changes in Buildfile or its dependencies when running tests. |
| @JAVA_HOME@   | Points to your JDK, required when using Java and Ant. |
| @JAVA_OPTS@   | Command line options to pass to the JDK (e.g. @'-Xms1g'@). |
| @M2_REPO@     | Location of the Maven2 local repository.  Defaults to the @.m2@ directory in your home directory (@ENV['HOME']@). |
| @NO_PROXY@    | Comma separated list of hosts and domain that should not be proxied (see "Specifying Repositories":artifacts.html#repositories).  |
| @TEST@        | Set to @no/off@ to tell Buildr to skip tests, or @all@ to tell Buildr to run all tests and ignore failures (see "Running Tests":testing.html#running). |
| @USER@        | Tasks that need your user name, for example to log to remote servers, will use this environment variable. |

p(note). Buildr does not check any of the arguments in @JAVA_OPTS@.  A common mistake is to pass an option like @mx512mb@, where it should be @Xmx512mb@. Make sure to double check @JAVA_OPTS@.

Some extensions may use additional environment variables, and of course, you can always add your own.  This example uses two environment variables for specifying the username and password:

{% highlight ruby %}
repositories.release_to[:username] = ENV['USERNAME']
repositories.release_to[:password] = ENV['PASSWORD']
{% endhighlight %}

The same works for the @repositories.snapshot_to@ hash.

h2(#personal). Personal Settings

Some things clearly do not belong in the Buildfile.  For example, the username and password you use to upload releases.  If you're working in a team or on an open source project, you'd want to keep these in a separate place.

You may want to use personal settings for picking up a different location for the local repository, or use a different set of preferred remote repositories, and so forth.

The prefered way to store personal settings is to create a @.buildr/settings.yaml@ file under your home directory. Settings stored there will be applied the same across all builds.

Here's an example @settings.yaml@:

{% highlight yaml %}
# The repositories hash is read automatically by buildr.
repositories:

  # customize user local maven2 repository location
  local: some/path/to/my_repo

  # prefer the local or nearest mirrors
  remote:
   - https://intra.net/maven2
   - http://example.com

  # specify the corporate mirror
  mirrors:
   - http://www.corporateserver001.com/repo

  release_to:
    url: http://intra.net/maven2
    username: john
    password: secret

# You can place settings of your own, and reference them
# on buildfiles.
im:
  server: jabber.company.com
  usr: notifier@company-jabber.com
  pwd: secret
{% endhighlight %}

Later your buildfile or addons can reference user preferences using the  hash returned by the @Buildr.settings.user@ accessor.

{% highlight ruby %}
task 'release-notification' do
 usr, pwd, server = settings.user['im'].values_at('usr', 'pwd', 'server')
 jabber = JabberAPI.new(server, usr, pwd)
 jabber.msg("We are pleased to announce the last stable version #{VERSION}")
end
{% endhighlight %}


h2(#build). Build Settings

Build settings are local to the project being built, and are placed in the @build.yaml@ file located in the same directory that the @buildfile@. Normally this file would be managed by the project revision control system, so settings here are shared between developers.

They help keep the buildfile and build.yaml file simple and readable, working to the advantages of each one.  Example for build settings are gems, repositories and artifacts used by that build.

{% highlight yaml %}
# This project requires the following ruby gems, buildr addons
gems:
  # Suppose we want to notify developers when testcases fail.
  - buildr-twitter-notifier-addon >=1
  # we test with ruby mock objects
  - mocha
  - ci_reporter

# The artifact declarations will be automatically loaded by buildr, so that
# you can reference artifacts by name (a ruby-symbol) on your buildfile.
artifacts:
  spring: org.springframework:spring:jar:2.0
  log4j: log4j:log4j:jar:1.0
  j2ee: geronimo-spec:geronimo-spec-j2ee:jar:1.4-rc4

# Of course project settings can be defined here
twitter:
  notify:
    test_failure: unless-modified
    compile_failure: never
  developers:
    - joe
    - jane

jira:
  uri: https://jira.corp.org
{% endhighlight %}

When buildr is loaded, required ruby gems will be installed if needed, thus adding features like the imaginary twitter notifier addon.

Artifacts defined on @build.yaml@ can be referenced on your buildfile by supplying the ruby symbol to the @Buildr.artifact@ and @Buildr.artifacts@ methods.  The @compile.with@, @test.with@ methods can also be given these names.

{% highlight ruby %}
define 'my_project' do
  compile.with artifacts(:log4j, :j2ee)
  test.with :spring, :j2ee
end
{% endhighlight %}

Build settings can be retreived using the @Buildr.settings.build@ accessor.

{% highlight ruby %}
 task 'create_patch' do
   patch = Git.create_patch :interactive => true
   if patch && agree("Would you like to request inclusion of #{patch}")
     jira = Jira.new( Buildr.settings.build['jira']['uri'] )  # submit a patch
     jira.create(:improvement, patch.summary, :attachment => patch.blob)
   end
 end
{% endhighlight %}


h2(#variable). Non constant settings

Before loading the Buildfile, Buildr will attempt to load two other files: the @buildr.rb@ file in the @.buildr@ directory under your home directory, followed by the @_buildr.rb@ (or @.buildr.rb@) file it finds in the build directory.

The loading order allows you to place global settings that affect all your builds in your @buildr.rb@, but also over-ride those with settings for a given project.

Here's an example @buildr.rb@:

{% highlight ruby %}
# Only I should know that
repositories.release_to[:username] = 'assaf'
repositories.release_to[:password] = 'supersecret'
# Search here first, it's faster
repositories.remote << 'http://inside-the-firewall'
{% endhighlight %}

p(note). Buildr 1.3 and earlier used the file @buildr.rb@ directly in your home directory.  Starting with version 1.4, Buildr loads @buildr.rb@ from the @.buildr@ directory under your home directory in preference.  If you use Buildr 1.3 and earlier and don't want to duplicate your settings, you can move you existing @buildr.rb@ under the @.buildr@ directory and create a new @buildr.rb@ in your home directory containing:

{% highlight ruby %}
# Backward compatibility:  Buildr 1.4+ uses $HOME/.buildr/buildr.rb
load File.expand_path('buildr.rb', Buildr.application.home_dir)
{% endhighlight %}

h2(#environments). Environments

One common use case is adapting the build to different environments.  For example, to compile code with debugging information during development and testing, but strip it for production.  Another example is using different databases for development, testing and production, or running services at different URLs.

So let's start by talking about the build environment.  Buildr has a global attributes that indicates which environment it's running in, accessible from the @environment@ method.  You can set the current build environment in one of two ways.  Using the @-e/--environment@ command line option:

{% highlight sh %}
$ buildr -e test
(in /home/john/project, test)
{% endhighlight %}

Or by setting the environment variable @BUILDR_ENV@:

{% highlight text %}
$ export BUILDR_ENV=production
$ buildr
(in /home/john/project, production)
{% endhighlight %}

Unless you tell it otherwise, Buildr assumes you're developing and sets the environment to @development@.

Here's a simple example for handling different environments within the Buildfile:

{% highlight ruby %}
project 'db-module' do
  db = (Buildr.environment == 'production' ? 'oracle' : 'hsql')
  resources.from(_("src/main/#{db}"))
end
{% endhighlight %}

We recommend picking a convention for your different environments and following it across all your projects.  For example:

|_. Environment |_. Use when ... |
| development   | Developing on your machine. |
| test          | Running in test environment, continuous integration. |
| production    | Building for release/production. |


h2(#profiles).  Profiles

Different environments may require different configurations, some you will want to control with code, others you will want to specify in the profiles file.

The profiles file is a YAML file called @profiles.yaml@ that you place in the same directory as the Buildfile.  We selected YAML because it's easier to read and edit than XML.

For example, to support three different database configurations, we could write:

{% highlight yaml %}
# HSQL, don't bother storing to disk.
development:
  db: hsql
  jdbc: hsqldb:mem:devdb

# Make sure we're not messing with bigstrong.
test:
  db: oracle
  jdbc: oracle:thin:@localhost:1521:test

# The real deal.
production:
  db: oracle
  jdbc: oracle:thin:@bigstrong:1521:mighty
{% endhighlight %}

Here's a simple example for a buildfile that uses the profile information:

{% highlight ruby %}
project 'db-module' do
  # Copy SQL files specific for the database we're using,
  # for example, everything under src/main/hsql.
  resources.from(_("src/main/#{Buildr.settings.profile['db']}"))
  # Set the JDBC URL in copied resource files (config.xml needs this).
  resources.filter.using :jdbc=>Buildr.settings.profile['jdbc']
end
{% endhighlight %}

The @profile@ method returns the current profile, selected based on the current "environment":#environments.  You can get a list of all profiles by calling @profiles@.

When you run the above example in @development@, the current profile will return the hash @{ 'db'=>'hsql', 'jdbc'=>'hsqldb:mem:devdb' }@.

We recommend following conventions and using the same environments in all your projects, but sometimes the profiles end up being the same, so here's a trick you can use to keep your profiles DRY.

YAML allows you to use anchors (@&@), similar to ID attributes in XML, reference the anchored element (@*@) elsewhere, and merge one element into another (@<<@).  For example:

{% highlight yaml %}
# We'll reference this one as common.
development: &common
  db: hsql
  jdbc: hsqldb:mem:devdb
  resources:
    copyright: Me (C) 2008
# Merge the values from common, override JDBC URL.
test:
  <<: *common
  jdbc: hsqldb:file:testdb
{% endhighlight %}


You can "learn more about YAML here":http://www.yaml.org, and use this handy "YAML quick reference":http://www.yaml.org/refcard.html.
