I've installed my gems in production with:
cd /app/releases/current && bundle install --gemfile /app/releases/current/Gemfile --path /app/shared/bundle --deployment --quiet --without development test
I can't bundle exec any of my gems (except rake and gem):
$ bundle exec whenever
bundler: command not found: whenever
Install missing gem executables with `bundle install`
The gems are correctly installed in /app/shared/bundle:
$ cd /app/shared
$ find . -name whenever
./bundle/ruby/1.9.1/gems/whenever-0.6.8/bin/whenever
./bundle/ruby/1.9.1/gems/whenever-0.6.8/lib/whenever
My (generated) bundle config (in /app/current/.bundle/config) is:
---
BUNDLE_FROZEN: "1"
BUNDLE_PATH: /app/shared/bundle
BUNDLE_DISABLE_SHARED_GEMS: "1"
BUNDLE_WITHOUT: development:test
I'm running ruby 1.9.2p290, manually installed to /usr/local/bin.
Do I have to bundle install my gems with the --binstubs option? Why wouldn't bundle exec be searching the stored BUNDLE_PATH?
Using Capistrano and Rails and using deploy.rb as deployer file.
I realized that changing the order where appears require "whenever/capistrano" really matters. I put that at almost the last line:
In deploy.rb:
#first lines:
set :rvm_ruby_string, "1.9.3"
set :rvm_type, :user
set :whenever_command, "bundle exec whenever"
# others...
# last lines
require 'rvm/capistrano'
require 'bundler/capistrano'
require "whenever/capistrano"
after "deploy:update_code", "customs:config"
after "deploy:create_symlink","deploy:create_symlink"
after "deploy", "deploy:cleanup"
load 'deploy/assets'
# end
I had this problem and had the requires in the correct order, i.e.
require 'rvm/capistrano'
require 'bundler/capistrano'
require 'whenever/capistrano'
It still wanted to run the crontab update before bundle:install. The solution was to update my local bundler with
gem update bundler
After that it started working again. Not sure exactly what changed between versions that broke all of this.
Check where your bundle:install is being set, and try moving it above require 'whenever/capistrano' in your deploy.rb file.
It seems like this was triggered when I did a bundle update that increased the whenever gem version in my Gemfile.lock.
It looks like whenever tries to run it's chrontab update before my deploy file runs bundle:install
from https://github.com/javan/whenever/blob/master/lib/whenever/capistrano.rb
before "deploy:finalize_update", "whenever:update_crontab"
And my deploy.rb had
after 'deploy:finalize_update', 'bundle:install'
Like everyone else in this thread, I tried a few things and I'm not sure this is what fixed it for me, but changing bundle install to before deploy:finalize_update, and also setting it as "before" above requiring 'whenever/capistrano' seems like it's the likely fix in my scenario.
I think when whenever gem is not in your Gemfile, or it's in the test or development section of your Gemfile
I changed the --path from /app/shared/bundle to vendor/bundle, which made it work.
This seemed wrong to me, so I removed /app/shared/bundle and vendor/bundle, and ran bundle install again to /app/shared/bundle.
This clean bundle install fixed the problem. I have no idea why!
If anyone has an explanation for this, I'd love to mark you as the accepted answer. But this fixed the problem for me.
Probably different issues cause the same error message. For me, I had to update capistrano gem after having updated whenever gem to get roles support. bundle exec whenever had worked prior to my upgrade of whenever.
Using the brightbox deployment gem, which handles bundler etc for me (by magic, in some other recipes) I found this works:
Replace
require "whenever/capistrano"
with the contents of https://github.com/javan/whenever/blob/master/lib/whenever/capistrano/v2/hooks.rb
then modify it to load after bundler:install finishes (you may or may not have that task, I don't know if it's standard)
# require "whenever/capistrano"
# hacked whenever/lib/whenever/capistrano/v2/hooks.rb below to work with brightbox bundler installation
require "whenever/capistrano/v2/recipes"
# Write the new cron jobs near the end.
after "bundler:install", "whenever:update_crontab"
# If anything goes wrong, undo.
after "deploy:rollback", "whenever:update_crontab"
Related
On a GitLab installation from source, I'm having problems running binaries such as rake. I've never seen similar problems with my own Ruby or Rails projects:
# bundle config
Set for your local app (/mnt/data/www/gitlab.bitcetera.com/source/gitlab/.bundle/config): "1"
path
Set for your local app (/mnt/data/www/gitlab.bitcetera.com/source/gitlab/.bundle/config): "vendor/bundle"
without
Set for your local app (/mnt/data/www/gitlab.bitcetera.com/source/gitlab/.bundle/config): "development:test:unicorn:mysql:kerberos:metrics"
disable_shared_gems
Set for your local app (/mnt/data/www/gitlab.bitcetera.com/source/gitlab/.bundle/config): "true"
# bundle install --deployment --without development test unicorn mysql kerberos metrics
# bundle config
The Gemfile's dependencies are satisfied
# bundle exec rake --tasks
rake aborted!
LoadError: cannot load such file -- haml_lint/rake_task
Looking at the relevant section of the Gemfile:
group :development, :test do
[...]
gem 'haml_lint', '~> 0.21.0', require: false
[...]
end
Of course the haml_lint gem is missing, after all, it's in the "development" and "test" groups only which I've excluded by "without".
Any idea what's going on here?
Figured it out, kinda daft reason: RAILS_ENV should have been set automatically yet it wasn't so of course things go awry.
I set up Capistrano to make the deploy of my app. I made it in steps, so first I set up the code deployment, so I commented all the roles but :app.
I'm using rvm and I had some problems with it. The biggest problem was an error that said /usr/bin/env: ruby: No such file or directory. I solved them using the gem capistrano/rvm and requiring it in the Capfile and adding the following line to the deploy.rb file:
set :default_env, { path: "/usr/local/rvm/gems/ruby-2.0.0-p247#global/bin:$PATH" }
Once the code deploying runned correctly I activated de :db role in order to perform migrations. I get the same error but I can't find the solution this time.
~$ cap production deploy:migrate
…
…
INFO [85d6241d] Running bundle exec rake db:migrate on 10.10.51.10
DEBUG [85d6241d] Command: cd [PROJECT_SRC]/current
&& ( PATH=/usr/local/rvm/gems/ruby-2.0.0-p247#global/bin:$PATH RAILS_ENV=production bundle exec rake db:migrate )
DEBUG [85d6241d] /usr/bin/env: ruby: No such file or directory
cap aborted!
This command runs correctly when I execute it directly in the shell.
Thank you in advance!
Finally it worked using gem 'rvm1-capistrano3', require: false. It seems the best option for my setup (Rails4.0.1, ruby-2.0.0-p247, capistrano3). It didn't require special configuration.
You can find it here.
Hope it helps someone!
I had similar problem and this gem helped me:
https://github.com/wayneeseguin/rvm-capistrano
If you are not using rvm, then the issue is usually you'll have to manually install bundler gem on the server.
gem install bundler
Have you tried offical capistrano gems? That helped me, maybe your use case is similiar.
Gemfile:
...
gem 'capistrano', '~> 3.2.0'
gem 'capistrano-rvm'
gem 'capistrano-rails'
...
Capfile:
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rvm'
require 'capistrano/bundler'
require 'capistrano/rails/migrations'
...
When I run cap deploy, the gems in the :assets group are not installed.
This is a problem because I'm using precompiled assets, and Capistrano has to run rake assets:precompile on the server. That will fail unless the assets gems are installed.
I can work around this problem by manually running bundle install within the correct release directory. But obviously this isn't the proper workflow.
Here's the full command Capistrano is executing to install the gems on each deploy:
rvm_path=/usr/local/rvm /usr/local/rvm/bin/rvm-shell 'default' -c 'cd
/home/deploy/rails_apps/vlc/releases/20120223192328 && bundle install --gemfile
/home/deploy/rails_apps/vlc/releases/20120223192328/Gemfile --path
/home/deploy/rails_apps/vlc/shared/bundle --deployment --quiet --without development test'
Here's the end, which I think might be part of the problem:
--deployment --quiet --without development test'
Evidently, these flags cause Bundler to install without the :assets group. What is the expected behavior here? Is what I'm seeing out of the ordinary? (I'm guessing so, since it doesn't make sense for Capistrano to deliberately refrain from installing a gem group that it's about to use.)
As a side note, I also note this line in application.rb:
Bundler.require(*Rails.groups(:assets => %w(development test)))
I'm assuming nothing in application.rb would affect a bundle install, since Rails doesn't boot for that. But please correct me if this line is actually relevant to my problem.
--without is remembered option, check in your project dir / on server the file .bundle/config it's possible it already contains something like this:
---
BUNDLE_WITHOUT: assets
Having some issues deploying this. I've tried to deploy it twice now. Here's what I've done so far....
Installed the gems and versions required on the install page:
gem install -v=2.3.5 rails
gem install -v=1.0.1 rack
gem install -v=0.8.7 rake
gem install -v=0.4.2 i18n
Downloaded the package:
git clone git://github.com/chiliproject/chiliproject.git
cd chiliproject
git checkout stable
Had to find and set bundle since it wasn't in my path:
BUNDLE="/usr/lib/ruby/gems/1.8/bin/bundle"
Put my database info into database.yml:
And then started the bundle stuff:
$BUNDLE install --without=postgres rmagick
$BUNDLE exec rake generate_session_store
The last command got the error:
rake aborted!
can't activate rails (= 2.3.5, runtime), already activated rails-2.3.12. Make sure all dependencies are added to Gemfile.
So I changed 2.3.12 to 2.3.5 in the Gemfile and carried on:
RAIL_ENV=production $BUNDLE exec rake db:migrate
Then I got an error on this command too:
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
rake aborted!
undefined method `autoload_paths' for #<Rails::Configuration:0x68a68dbb82c0>
/home/USERNAME/DOMAIN/public/config/environment.rb:44
I tried commenting out line 44 there, but then it threw another error undefined methodconvert_to_without_fallback_on_iso_8859_1' for class Class' so I didn't want to play around with it further. Note this only happened the second time I tried to deploy it. The first time I tried db:migrate succeeded (and I checked there was not data already in the DB).
*So for the second try I am stuck here :-( *
But this is what happened the first time after db:migrate succeded....
RAILS_ENV=production $BUNDLE exec rake redmine:load_default_data
With the last command however it failed saying permission denied for mysql 'user'#'173.236.128.0/255.255.128.0' and I was like WTF is it trying to connect to a network as if it were a host?
So I moved on, copied my configuration file and environment files in. Changed/added these lines:
# Uncomment below to force Rails into production mode when
# you don't control web/app server and can't set it the proper way
ENV['RAILS_ENV'] ||= 'production'
# Specifies gem version of Rails to use when vendor/rails is not present
RAILS_GEM_VERSION = '2.3.5'# unless defined? RAILS_GEM_VERSION
if ENV['RAILS_ENV'] == 'production' # don't bother on dev
ENV['GEM_PATH'] = '/home/USERNAME/.gems' + ':/usr/lib/ruby/gems/1.8'
end
Then made this stuff writable and restarted Passenger:
chmod -R 777 files log tmp public/plugin_assets/
touch tmp/restart.txt
Sorry for the wall of text, is anybody able to shine some light on something I've done wrong?
Thanks in advance.
EDIT: So this is all wrong, here's how I got it working
rm ~/.gem*
gem install bundler
PATH=$PATH:/usr/lib/ruby/gems/1.8/bin
cd ~
git clone git://github.com/chiliproject/chiliproject.git
cd chiliproject
git checkout stable
cp * ../example.com/ -R
cd ../example.com
# Make sure database is working
bundle install --without postgres rmagick test
bundle exec rake generate_session_store
RAILS_ENV=production bundle exec rake db:migrate
# No output is no good, check database.yml
RAILS_ENV=production bundle exec rake redmine:load_default_data
Or see this: https://gist.github.com/1127306
The current ChiliProject stable releases (2.x) require the use of bundler. Thus the answer by Slotos is incorrect here. gen install doesn't work anymore, we NEED bundler.
Also, we require Rails 2.3.12 now. You won't get any working results if you arbitrarily edit files. On certain platforms, you need to adapt the Gemfile (e.g. when using Ruby 1.8.6 or for certain versions of ImageMagick). For the currently suggested setup using Ruby 1.8.7 or REE, you don't need to adapt anything though.
For installing the dependencies of the currently stable ChiliProject 2.x releases, you basically need to do the following:
At first you need to make sure that the directory where gem binaries re installed to is in your $PATH. This can be temporarily be achieved by running this (in your case)
export PATH=/usr/lib/ruby/gems/1.8/bin:$PATH
Then you need to install the bundler gem and instruct it to install all dependencies
gem install bundler
bundle install --without rmagick postgres test # in your case
What is really strange in your case is that rake seems to try to enable Rails 2.3.5. It should not do that (and doesn't unless you have changed certain files). I strongly recommend to start with a new clean source tree and don't change any arbitrary files.
Don't mix up gem install commands with bundler package management. You will get unexpected results from doing so.
If you really want to use bundler - add all the gems you want into a Gemfile.
Otherwise just omit it.
Quick search for "bundler chiliproject" lead me to chiliproject-gemfile. Apparently it have been merged into unstable already.
Currently, I'm just running the following:
after 'deploy:update_code', 'deploy:bundle'
namespace :deploy do
task :bundle do
run "cd #{release_path} && bundle install --deployment --without development test staging"
end
end
Now this works fine, but the bundler ends up installing all the gems to vendor/gems every time. While I understand the merit in isolating the gems to each release (as opposed to using the shared folder, which (?) might result in errors on rollback and such), surely there is a better way to do this that doesn't take as much time to deploy and saves on disk space.
Things have changed after the release of bundler 1.0
You don't need to create a custom task from deploy.
just use require 'bundler/capistrano'
take a look at this http://blog.josephholsten.com/2010/09/deploying-with-bundler-and-capistrano/ for more details