A Generic Buildpack for Cloud Foundry
Isn't it simply amazing to see these demos, where they throw a bunch of php, ruby, Java or python code at a Cloud Foundry site and it gets magically turned into a running web applications. Alas for me, life is often a wee bit more complicated than that. My projects always seem to required a few extra libraries or they are even written in an dead scripting language like Perl.
sourcey-buildpack comes in. It allows you to easily compile
any libraries and binaries from source. It takes care of putting everything
into the right spot so that the end result happily lives in
/home/vcap/sourcey and it even knows that it does, and therefore does not
LD_LIBRARY_PATH or other special magic to make it work.
The sourcey-buildpack expects to find three special files in your application directory:
SourceyBuild.sh (optional) to compile all the binaries you need.
SourceyBuildApp.sh (optional) to prepare the actual application if this needs any prepping.
SourceyStart.sh (mandatory) to launch the application at runtime.
In this script you build your third-party software. At the most basic level,
you just have to make sure to install the result into
You may want to use
$WORK_DIR to unpack your source. And if you need other
files from your application you can find them in
For a classic autotools packaged application, your setup instructions might look like this:
cd $WORK_DIR wget http://cool-site.com/tool.tar.gz tar xf tool.tar.gz cd tool ./configure --prefix=$PREFIX make install cd .. rm -r tool
When your script has run through, Sourcey goes to work.
It moves the content of
$STAGE_DIR/sourcey, ready for packaging.
It creates a copy of
$CACHE_DIRand tags it with the md5 sum of your
SourceyBuild.sh. If you re-deploy the same app again, without changing
SourceyBuild.shthe content of the
$CACHE_DIRwill be used instead of rebuilding everything.
The directory layout at build time:
/home /vcap (aka $HOME) /app /sourcey (aka $PREFIX) /tmp /sourcey.$$ (aka $WORK_DIR) /cache (aka $CACHE_DIR) /stage /app (aka $BUILD_DIR) /sourcey
/home/vcap/app directory is where your application will reside at runtime. By compiling
your binaries into that location, their world view will be intact at runtime as well.
/tmp/stage/app directory gets packaged up and transfered to the run-time
environment. At first only your application will be sitting there (in the
The content of the
/tmp/cache directory will be made available whenever you
push your application again. Sourcey uses this location to cache compiled
binaries and restore them when you push an update without changing the
To make life a bit simpler still, Sourcey provides a few helper functions:
buildAuto <url> [options]
Does essentially the same build process as described in the autotools example above. If you want to specify extra configure options, just add them as extra arguments at the end of the function call:
buildAuto http://mysite/tool.tar.gz --default-answer=42 --switch-off
Creates the Perl version of your choice.
Since most Cloud Foundry setups are on Ubuntu lucid (10.04) stacks, perl is at version 5.10.1 which is about 100 years out of date. This is was what got me to write this in the first place.
buildPerlModule [any cpanm option]
This is a wrapper for
cpanm which you can use to install extra perl
modules. The new modules will get installed into your freshly installed
Perl. If you have not installed your own perl with the
buildPerl call the
system Perl will be used and the modules will go to
/home/vcap/sourcey/lib/perl5. Sourcey will take care of setting the
PERL5LIB variable accordingly.
SourceyBuildApp.sh script ...
can do whatever you deem necessary to get your actual application into shape for execution. Nothing will be cached. If you push an update for your application, this script will run again.
SourceyStart.sh script ...
gets executed when your application should be started. Sourcey will
take care of setting the
$PATH variable so that all these shiny new 3rd
party tools get found automatically. If you have not setup your own copy of
$PERL5LIB path will be set, so that the system Perl finds any
new modules you may have compiled.
At the end of your
SourceyStart.sh someone should be listening port
$PORT for incoming web requests.
In order for your application to integrate with the Cloud Foundry
infrastructure, you want to JSON decode the content of the environment
The directory layout at runtime.
/home /vcap /app (aka $HOME !!!) /sourcey
If things are not going according to plan. You can put the following variables
SOURCEY_VERBOSE=1 will cause all output generated at build time to be sent
to STDOUT. Note that this does look like an environment variable, but
the compile script actually runs
grep on your
SourceyBuild.sh to detect it.
SOURCEY_REBUILD=1 will ignore any cached copy of your binaries and rebuild the lot
every time you push a new version.
The code in the example directory demonstrates how to setup a simple Mojolicious Perl app.
The following instructions assume you have already setup a Cloud Foundry
account and you have logged yourself in with
cf login. Make sure to modify
manifest.yml file in the example directory to suit your needs.
cd example cf push