Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bundler ignoring install of MySQL2 gem when run on my 'production' server

I'm attempting to install the 'mysql2' gem on my production server using Capistrano.

I want to use SQLite in development, and MySQL in production.

I develop on a Windows 7 machine, and production is using Ubuntu.

When I run bundle install on my development machine, it installs MySQL2.

When Capistrano runs it against my production machine, it doesn't even get a mention in the output.

When I run the same command on my production machine directly on the shell, it too doesn't mention the gem.

I'm also finding that gem 'therubyracer', :platforms => :ruby isn't being installed. I added this after the mysql2 entry. I'm hoping the two are related. mysql2 wasn't working before I added therubyracer.

As a result of all of the above, I'm getting the following error when I'm attempting to view my site:

Please install the mysql2 adapter: gem install activerecord-mysql2-adapter (mysql2 is not part of the bundle. Add it to Gemfile.)

Additional Info

I hope the amount of info I'm including below is more useful than it is a pain.

gemfile

I appreciate I could place mysql2 in 'production' but that didn't work.

source 'http://rubygems.org'

gem 'rails', '3.1.1'
gem 'nokogiri'
gem 'bcrypt-ruby'
gem 'faker'
gem 'will_paginate'
gem 'capistrano'
gem 'capistrano-ext'
gem 'mysql2', "~> 0.3"
gem 'therubyracer', :platforms => :ruby
gem 'sqlite3'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '~> 3.1.4'
  gem 'coffee-rails', '~> 3.1.1'
  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'

group :test do
  # Pretty printed test output
  gem 'turn', :require => false
end

Output of Capistrano Bundle Install command

  * executing "cd /home/gannicott.co.uk/production/listen/www/releases/20120223225131 && bundle install --gemfile /home/gannicott.co.uk/prod
uction/listen/www/releases/20120223225131/Gemfile --path /home/gannicott.co.uk/production/listen/www/shared/bundle --deployment --without de
velopment test"
    servers: ["homer.gannicott.co.uk"]
    [homer.gannicott.co.uk] executing command
    [homer.gannicott.co.uk] sh -c 'cd /home/gannicott.co.uk/production/listen/www/releases/20120223225131 && bundle install --gemfile /home/
gannicott.co.uk/production/listen/www/releases/20120223225131/Gemfile --path /home/gannicott.co.uk/production/listen/www/shared/bundle --dep
loyment --without development test'
 ** [out :: homer.gannicott.co.uk] Installing rake (0.9.2.2)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing multi_json (1.1.0)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing activesupport (3.1.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing builder (3.0.0)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing i18n (0.6.0)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing activemodel (3.1.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing erubis (2.7.0)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing rack (1.3.6)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing rack-cache (1.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing rack-mount (0.8.3)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing rack-test (0.6.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing hike (1.2.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing tilt (1.3.3)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing sprockets (2.0.3)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing actionpack (3.1.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing mime-types (1.17.2)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing polyglot (0.3.3)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing treetop (1.4.10)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing mail (2.3.0)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing actionmailer (3.1.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing arel (2.2.3)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing tzinfo (0.3.31)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing activerecord (3.1.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing activeresource (3.1.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing highline (1.6.11)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing net-ssh (2.3.0)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing net-scp (1.0.4)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing net-sftp (2.0.5)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing net-ssh-gateway (1.1.0)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing capistrano (2.11.2)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing capistrano-ext (1.2.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing coffee-script-source (1.2.0)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing execjs (1.3.0)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing coffee-script (2.2.0)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing rack-ssl (1.3.2)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing json (1.6.5)
 ** [out :: homer.gannicott.co.uk] with native extensions
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing rdoc (3.12)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing thor (0.14.6)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing railties (3.1.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing coffee-rails (3.1.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing faker (1.0.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing jquery-rails (1.0.19)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Using bundler (1.0.21)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing rails (3.1.1)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing sass (3.1.15)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing sass-rails (3.1.5)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing uglifier (1.2.3)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Installing will_paginate (3.0.3)
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Updating .gem files in vendor/cache
 ** [out :: homer.gannicott.co.uk]
 ** [out :: homer.gannicott.co.uk] Your bundle is complete! It was installed into /home/gannicott.co.uk/production/listen/www/shared/bundle
 ** [out :: homer.gannicott.co.uk]
    command finished in 12924ms

capistrano's deploy.rb

require 'bundler/capistrano'
require 'capistrano/ext/multistage'
# Based on: http://guides.beanstalkapp.com/deployments/deploy-with-capistrano.html
set :application, "listen_later"

set :scm, :git
set :repository, "repos location"
set :scm_passphrase, "passphrase"

set :user, "username"

set :stages, ["staging", "production"]
set :default_stage, "staging"

# The following needs to be added to avoid a failure (http://discuss.joyent.com/viewtopic.php?id=27326)
default_run_options[:pty] = true

namespace :deploy do
  desc "Tell Passenger to restart the app."
  task :restart do
    run "touch #{current_path}/tmp/restart.txt"
  end
end

# Removed --silent so I can see what's going on
set :bundle_flags,    "--deployment"

capistrano's production deploy file

server "homer.gannicott.co.uk", :app, :web, :db, :primary => true
set :deploy_to, "/home/gannicott.co.uk/production/listen/www"

Database config file

# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: databasename
  pool: 5
  username: username
  password: password
  #socket: **/opt/local/var/run/mysql5/mysqld.sock**

#  adapter: sqlite3
#  database: db/production.sqlite3
#  pool: 5
#  timeout: 5000

Cheers!

like image 774
greggannicott Avatar asked Feb 23 '12 23:02

greggannicott


2 Answers

All sorted. Although it's with a work-around I'm not entirely happy with.

The Research

More searches of Google led me to this page:

http://redmine.autotelik.co.uk/blogs (do a search for 'mysql2' and it will find the relevant part)

This led me to... Stack Overflow (of course!):

Make bundler use different gems for different platforms

Which in turn led me to:

https://github.com/carlhuda/bundler/issues/646

The Problem

When you run Bundler on Windows, it includes an entry for the Windows version of mysql2. However, this is different to what's required on Linux. As a result, the Gemfile.lock file is inappropriate for use on Linux.

The Solution

The goal is to have the Gemfile.lock file generated by Bundler to be generated on the production server. From what I've read, this isn't generally recommended. That said, to achieve this...

I no longer include the Gemfile.lock file in my git repository:

echo 'Gemfile.lock' >> .gitignore

I've removed the file from git:

git rm Gemfile.lock
git commit -am "Removing Gemfile.lock to cope with Windows and Linux differences"
git push

I've told Capistrano to not run in deployment mode by adding the following line to my config/deploy.rb:

set :bundle_flags,    ""

You might want to include the --quiet flag in the quotes, but after this experience I'm keen to see what get's installed when I deploy.

Now when I run cap production deploy it'll regenerate the Gemfile.lock file each time. This means the correct version of mysql2 is now used on my production server.

I'd imagine this can be improved upon, but for now it's working for me.

Hope this helps someone someday.

like image 111
greggannicott Avatar answered Nov 12 '22 20:11

greggannicott


I have same problem with the therubyracer gem. Coding on windows, deploying on linux.

In my Gemfile, I use :

group :production do
  gem 'libv8', '= 3.3.10.4'
  gem 'therubyracer'
end

On windows, I generate the Gemfile.lock with :

bundle install --without production

therubyracer depends on libv8, and it's should not be state explicitly but as 'bundle install' resolves dependency on windows, the libv8 version on windows could be different than libv8 on linux. I was trapped into this version problem, and that was really tricky to find out what the hell was going wrong!

Generated Gemfile.lock : (shortened)

GEM  
  specs:
    libv8 (3.3.10.4)
    therubyracer (0.10.2)
      libv8 (~> 3.3.10)    

PLATFORMS
  x86-mingw32

DEPENDENCIES  
  libv8 (= 3.3.10.4)
  therubyracer

And then, this works perfectly without any script or not versioning Gemfile.lock

bundle install --deployment
like image 36
Totor Avatar answered Nov 12 '22 20:11

Totor