The main difference between this buildpack and heroku's standard Ruby buildpack is that you can run an app in a project subdirectory. In other words, your project doesn't need to be in the root directory; it could be in a subdirectory like
To make this work, you need to:
Set two environment variables BEFORE pushing to a new heroku app:
BUNDLE_GEMFILE. For example, if we're deploying a Rails app that lives in a subdirectory
web, you would need to set:
APP_SUBDIR=webis the name of the subdirectory that your Rails app lives in
BUNDLE_GEMFILE=web/Gemfileis the location of the
Gemfileof your Rails app
Make a copy of your Rakefile in the root directory, and edit the require line to point to your rails subdirectory. For example:
# Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require File.expand_path('../web/config/application', __FILE__) Rails.application.load_tasks
TODO: One of these can be determined from the other; update the code to only require one environment variable.
The other feature of this buildpack is the ability to suppress deploy warnings about the rails_12factor gem. This is particularly useful for people who are using
rails-api and do not want to install the rails_serve_static_assets gem and have configured Rails to log to STDOUT, either on their own or using the rails_stdout_logging gem.
You can enable this feature by setting an ENV variable using the heroku CLI:
heroku config:set SUPPRESS_12FACTOR_WARNINGS=true
$ ls Gemfile Gemfile.lock $ heroku create --buildpack https://github.com/heroku/heroku-buildpack-ruby.git $ git push heroku master ... -----> Heroku receiving push -----> Fetching custom buildpack -----> Ruby app detected -----> Installing dependencies using Bundler version 1.1.rc Running: bundle install --without development:test --path vendor/bundle --deployment Fetching gem metadata from http://rubygems.org/.. Installing rack (1.3.5) Using bundler (1.1.rc) Your bundle is complete! It was installed into ./vendor/bundle Cleaning up the bundler cache. -----> Discovering process types Procfile declares types -> (none) Default types for Ruby -> console, rake
The buildpack will detect your app as Ruby if it has a
Gemfile.lock files in the root directory. It will then proceed to run
bundle install after setting up the appropriate environment for ruby and Bundler.
Gemfile.lock files, the
--deployment flag will be used. In the case of windows, the Gemfile.lock will be deleted and Bundler will do a full resolve so native gems are handled properly. The
vendor/bundle directory is cached between builds to allow for faster
bundle install times.
bundle clean is used to ensure no stale gems are stored between builds.
$ ls app config db doc Gemfile Gemfile.lock lib log public Rakefile README script test tmp vendor $ ls config/environment.rb config/environment.rb $ heroku create --buildpack https://github.com/heroku/heroku-buildpack-ruby.git $ git push heroku master ... -----> Heroku receiving push -----> Ruby/Rails app detected -----> Installing dependencies using Bundler version 1.1.rc ... -----> Writing config/database.yml to read from DATABASE_URL -----> Rails plugin injection Injecting rails_log_stdout -----> Discovering process types Procfile declares types -> (none) Default types for Ruby/Rails -> console, rake, web, worker
The buildpack will detect your app as a Rails 2 app if it has a
environment.rb file in the
Any vendored plugin can be stopped from being installed by creating the directory it's installed to in the slug. For instance, to prevent rails_log_stdout plugin from being injected, add
vendor/plugins/rails_log_stdout/.gitkeep to your git repo.
$ ls app config config.ru db doc Gemfile Gemfile.lock lib log Procfile public Rakefile README script tmp vendor $ ls config/application.rb config/application.rb $ heroku create --buildpack https://github.com/heroku/heroku-buildpack-ruby.git $ git push heroku master -----> Heroku receiving push -----> Ruby/Rails app detected -----> Installing dependencies using Bundler version 1.1.rc Running: bundle install --without development:test --path vendor/bundle --deployment ... -----> Writing config/database.yml to read from DATABASE_URL -----> Preparing app for Rails asset pipeline Running: rake assets:precompile -----> Rails plugin injection Injecting rails_log_stdout Injecting rails3_serve_static_assets -----> Discovering process types Procfile declares types -> web Default types for Ruby/Rails -> console, rake, worker
The buildpack will detect your apps as a Rails 3 app if it has an
application.rb file in the
To enable static assets being served on the dyno, rails3_serve_static_assets is installed by default. If the execjs gem is detected then node.js will be vendored. The
assets:precompile rake task will get run if no
public/manifest.yml is detected. See this article on how rails 3.1 works on cedar.
For more information about using Ruby and buildpacks on Heroku, see these Dev Center articles:
To use this buildpack, fork it on Github. Push up changes to your fork, then create a test app with
--buildpack <your-github-url> and push to it.
To change the vendored binaries for Bundler, Node.js, and rails plugins, use the rake tasks provided by the
Rakefile. You'll need an S3-enabled AWS account and a bucket to store your binaries in as well as the vulcan gem to build the binaries on heroku.
For example, you can change the vendored version of Bundler to 1.1.rc.
First you'll need to build a Heroku-compatible version of Node.js:
$ export AWS_ID=xxx AWS_SECRET=yyy S3_BUCKET=zzz $ s3 create $S3_BUCKET $ rake gem:install[bundler,1.1.rc]
lib/language_pack/ruby.rb in your editor, and change the following line:
BUNDLER_VERSION = "1.1.rc"
lib/language_pack/base.rb in your editor, and change the following line:
VENDOR_URL = "https://s3.amazonaws.com/zzz"
Commit and push the changes to your buildpack to your Github fork, then push your sample app to Heroku to test. You should see:
-----> Installing dependencies using Bundler version 1.1.rc
NOTE: You'll need to vendor the plugins, node, Bundler, and libyaml by running the rake tasks for the buildpack to work properly.
The tests on this buildpack are written in Rspec to allow the use of
focused: true. Parallelization of testing is provided by
https://github.com/grosser/parallel_tests this lib spins up an arbitrary
number of processes and running a different test file in each process,
it does not parallelize tests within a test file. To run the tests: clone the repo, then
bundle install then clone the test fixtures by running:
$ bundle exec hatchet install
Now run the tests:
$ bundle exec parallel_rspec -n 6 spec/
If you don't want to run them in parallel you can still:
$ bundle exec rake spec
Now go take a nap or something for a really long time.
Copy the snippet above into CLI.