Heroku buildpack env with working {detect,release}
This commit is contained in:
parent
02ca331708
commit
26bfc04768
15 changed files with 269 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
tmp/
|
||||
.rvmrc
|
11
.rvmrc.example
Normal file
11
.rvmrc.example
Normal file
|
@ -0,0 +1,11 @@
|
|||
rvm use 1.9.2@cabal-heroku-buildpack
|
||||
BUILDPACK_GHC_BASE_URL="http://www.haskell.org/ghc/dist"
|
||||
GHC_BOOTSTRAP_VERSION=7.0.4
|
||||
|
||||
export GHC_BOOTSTRAP_VERSION BUILDPACK_GHC_BASE_URL
|
||||
|
||||
# Aruba envvars
|
||||
ARUBA_REPORT_TEMPLATES=templates
|
||||
ARUBA_REPORT_DIR=doc
|
||||
|
||||
export ARUBA_REPORT_TEMPLATES ARUBA_REPORT_DIR
|
5
Gemfile
Normal file
5
Gemfile
Normal file
|
@ -0,0 +1,5 @@
|
|||
source :rubygems
|
||||
|
||||
group :testing do
|
||||
gem 'aruba'
|
||||
end
|
37
Gemfile.lock
Normal file
37
Gemfile.lock
Normal file
|
@ -0,0 +1,37 @@
|
|||
GEM
|
||||
remote: http://rubygems.org/
|
||||
specs:
|
||||
aruba (0.4.11)
|
||||
childprocess (>= 0.2.3)
|
||||
cucumber (>= 1.1.1)
|
||||
ffi (>= 1.0.11)
|
||||
rspec (>= 2.7.0)
|
||||
builder (3.0.0)
|
||||
childprocess (0.3.1)
|
||||
ffi (~> 1.0.6)
|
||||
cucumber (1.1.5)
|
||||
builder (>= 2.1.2)
|
||||
diff-lcs (>= 1.1.2)
|
||||
gherkin (~> 2.8.0)
|
||||
json (>= 1.4.6)
|
||||
term-ansicolor (>= 1.0.6)
|
||||
diff-lcs (1.1.3)
|
||||
ffi (1.0.11)
|
||||
gherkin (2.8.0)
|
||||
json (>= 1.4.6)
|
||||
json (1.6.5)
|
||||
rspec (2.8.0)
|
||||
rspec-core (~> 2.8.0)
|
||||
rspec-expectations (~> 2.8.0)
|
||||
rspec-mocks (~> 2.8.0)
|
||||
rspec-core (2.8.0)
|
||||
rspec-expectations (2.8.0)
|
||||
diff-lcs (~> 1.1.2)
|
||||
rspec-mocks (2.8.0)
|
||||
term-ansicolor (1.0.7)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
aruba
|
47
README.md
Normal file
47
README.md
Normal file
|
@ -0,0 +1,47 @@
|
|||
# GHC/Cabal Heroku Buildpack
|
||||
|
||||
This is a custom Heroku buildpack for Haskell applications that are built
|
||||
using GHC and Cabal.
|
||||
|
||||
## Version / Dependencies
|
||||
|
||||
Based on the current (as of this writing) Haskell Platform (2011.4.0.0 ->
|
||||
GHC v7.0.4).
|
||||
|
||||
Work will be done after some level of stability to update this buildpack
|
||||
to support GHC 7.4.x soon thereafter.
|
||||
|
||||
The goal will be to allow some variance of GHC and Platform versions. At
|
||||
present there are zero plans to actively support GHC 6.x with this
|
||||
buildpack. If it happens to work, then great, otherwise you are free to fork
|
||||
this repository to make it work for your needs.
|
||||
|
||||
## Status
|
||||
|
||||
Experimental; in progress - still testing.
|
||||
|
||||
## Usage
|
||||
|
||||
Like other buildpacks you will need to specify the buildpack when creating
|
||||
your Heroku application. Something like the following:
|
||||
|
||||
heroku create --stack cedar --buildpack https://github.com/mbbx6spp/cabal-heroku-buildpack
|
||||
|
||||
You will also need to specify environment variables after your app is
|
||||
created. For instance,
|
||||
|
||||
BUILDPACK_GHC_BASE_URL
|
||||
BUILDPACK_PLATFORM_BASE_URL
|
||||
|
||||
These should be your S3 base URL for the GHC bootstrap and Platform
|
||||
distributions respectively.
|
||||
|
||||
More to be said, but I am too tired to write it now.
|
||||
|
||||
Check back soon.
|
||||
|
||||
## Contributors
|
||||
|
||||
* Susan Potter [mbbx6spp on GitHub](https://github.com/mbbx6spp)
|
||||
|
||||
|
22
Rakefile
Normal file
22
Rakefile
Normal file
|
@ -0,0 +1,22 @@
|
|||
# encoding: utf-8
|
||||
require 'rubygems'
|
||||
require 'bundler'
|
||||
Bundler.setup(:testing)
|
||||
|
||||
require 'cucumber/rake/task'
|
||||
|
||||
def darwin?
|
||||
os=%x[uname -s]
|
||||
"Darwin" === os
|
||||
end
|
||||
|
||||
Cucumber::Rake::Task.new do |t|
|
||||
opts = defined?(JRUBY_VERSION) ? %w{--tags ~@jruby} : []
|
||||
opts += %w{--tags ~@fails-on-darwin} if darwin?
|
||||
t.cucumber_opts = opts
|
||||
end
|
||||
|
||||
desc "Run Cucumber features"
|
||||
task :test => [:cucumber]
|
||||
|
||||
task :default => :test
|
30
bin/compile
Executable file
30
bin/compile
Executable file
|
@ -0,0 +1,30 @@
|
|||
#!/usr/bin/env bash
|
||||
# bin/compile BUILD_DIR CACHE_DIR
|
||||
|
||||
set -e
|
||||
|
||||
source scripts/functions
|
||||
|
||||
BUILD_DIR=$1
|
||||
CACHE_DIR=$2
|
||||
|
||||
## CHECK BUILDPACK_GHC_BASE_URL is set
|
||||
if [ "$BUILDPACK_GHC_BASE_URL" != "" ]; then
|
||||
arch=$(uname -m)
|
||||
ghcver=$GHC_BOOTSTRAP_VERSION
|
||||
bsdir=$CACHE_DIR/bootstrap
|
||||
ghcurl="$BUILDPACK_GHC_BASE_URL/$ghcver/ghc-$ghcver-$arch-unknown-linux.tar.bz2"
|
||||
echo "Info: bootstrap directory: ${bsdir}";
|
||||
echo "Info: bootstrap URL: $ghcurl";
|
||||
if [ -f "$bsdir.completed" ]; then
|
||||
echo "Info: already downloaded GHC bootstrap version ${ghcver}";
|
||||
else
|
||||
echo "Info: downloading GHC $ghcver form $ghcurl";
|
||||
$(downloadAndExtract $bsdir $ghcurl);
|
||||
$(configureMakeInstall $bsdir/ghc-$ghcver $BUILD_DIR/bootstrap/ghc-$ghcver);
|
||||
touch $bsdir.completed
|
||||
fi;
|
||||
else
|
||||
echo "Error: please set BUILDPACK_GHC_BASE_URL";
|
||||
exit 1;
|
||||
fi
|
15
bin/detect
Executable file
15
bin/detect
Executable file
|
@ -0,0 +1,15 @@
|
|||
#!/usr/bin/env bash
|
||||
# bin/detect BUILD_DIR
|
||||
set -e
|
||||
|
||||
BUILD_DIR=$1
|
||||
echo $BUILD_DIR
|
||||
|
||||
CABAL_FILE="$(find $BUILD_DIR -maxdepth 1 -name '*.cabal' -print -quit)"
|
||||
|
||||
# Check a *.cabal file exists at the root of the source tree
|
||||
if [[ -e $CABAL_FILE ]]; then
|
||||
echo "GHC/Cabal" && exit 0
|
||||
else
|
||||
echo "nada" && exit 1
|
||||
fi
|
19
bin/release
Executable file
19
bin/release
Executable file
|
@ -0,0 +1,19 @@
|
|||
#!/usr/bin/env bash
|
||||
# bin/release BUILD_DIR
|
||||
|
||||
BUILD_DIR=$1
|
||||
|
||||
cat <<EOF
|
||||
---
|
||||
config_vars:
|
||||
GHC_PACKAGE_PATH: "$BUILD_DIR/ghc-packages.conf:"
|
||||
GHCRTS: "-M512m -c70 -H128m"
|
||||
HASKELL_PLATFORM_VERSION: 2011.4.0.0
|
||||
GHC_BOOTSTRAP_VERSION: 7.0.4
|
||||
BUILDPACK_GHC_BASE_URL:
|
||||
BUILDPACK_PLATFORM_BASE_URL:
|
||||
addons:
|
||||
- shared-database:5mb
|
||||
default_process_types:
|
||||
EOF
|
||||
|
15
features/detect.feature
Normal file
15
features/detect.feature
Normal file
|
@ -0,0 +1,15 @@
|
|||
Feature: Detect
|
||||
|
||||
In order to build and deploy an application
|
||||
As the bin/detect script of the buildpack
|
||||
I want to determine if the source tree is buildable
|
||||
|
||||
Scenario: no *.cabal file
|
||||
When I run `detect ../features/fixtures/invaliddir`
|
||||
Then the output should contain "nada"
|
||||
And the exit status should be 1
|
||||
|
||||
Scenario: a *.cabal file
|
||||
When I run `detect ../features/fixtures/validdir`
|
||||
Then the output should contain "GHC/Cabal"
|
||||
And the exit status should be 0
|
0
features/fixtures/validdir/bla.cabal
Normal file
0
features/fixtures/validdir/bla.cabal
Normal file
12
features/release.feature
Normal file
12
features/release.feature
Normal file
|
@ -0,0 +1,12 @@
|
|||
Feature: Release
|
||||
|
||||
In order to build and deploy an application
|
||||
As the bin/release script of the buildpack
|
||||
I want to setup the build environment
|
||||
|
||||
Scenario: default
|
||||
When I run `release`
|
||||
Then the output should contain "addons:"
|
||||
And the output should contain "config_vars:"
|
||||
And the output should contain "default_process_types:"
|
||||
And the exit status should be 0
|
0
features/step_definitions/core.rb
Normal file
0
features/step_definitions/core.rb
Normal file
17
features/support/env.rb
Normal file
17
features/support/env.rb
Normal file
|
@ -0,0 +1,17 @@
|
|||
require 'rubygems'
|
||||
require 'aruba/cucumber'
|
||||
require 'fileutils'
|
||||
require 'rspec/expectations'
|
||||
|
||||
ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
|
||||
|
||||
Before do
|
||||
@aruba_timeout_seconds = 5
|
||||
@dirs = ["bin"]
|
||||
end
|
||||
|
||||
Aruba.configure do |config|
|
||||
config.before_cmd do |cmd|
|
||||
puts "About to run '#{cmd}'"
|
||||
end
|
||||
end
|
37
scripts/functions
Normal file
37
scripts/functions
Normal file
|
@ -0,0 +1,37 @@
|
|||
|
||||
function indent() {
|
||||
c='s/^/ /'
|
||||
case $(uname) in
|
||||
Darwin) sed -l "$c";;
|
||||
*) sed -u "$c";;
|
||||
esac
|
||||
}
|
||||
|
||||
function clearEnvironment() {
|
||||
unset GIT_DIR
|
||||
}
|
||||
|
||||
function downloadAndExtract() {
|
||||
mkdir -p $1 && curl $2 -o - | tar jxf - -C $1
|
||||
}
|
||||
|
||||
function configureMakeInstall() {
|
||||
pushd $1
|
||||
echo -n "Info: configure --prefix=$2"
|
||||
./configure --prefix=$2;
|
||||
echo "[OK]"
|
||||
echo -n "Info: make"
|
||||
make
|
||||
echo "[OK]";
|
||||
echo -n "Info: make install"
|
||||
make install
|
||||
echo "[OK]"
|
||||
popd
|
||||
}
|
||||
|
||||
function mkCompilerDir() {
|
||||
local compilerDir=$CACHE_DIR/compilers/$1;
|
||||
[[ ! -d "$compilerDir" ]]; mkdir -p $compilerDir;
|
||||
echo $compilerDir;
|
||||
}
|
||||
|
Loading…
Reference in a new issue