Search code examples
ruby-on-railsamazon-ec2capistranojruby

Deploying Torquebox app on EC2 with Capistrano


I'm running a rails app using JRuby 1.7.1 with Torquebox and trying to deploy on EC2 but I'm seeing the following error when I run 'cap deploy':

 * 2013-10-08 21:28:55 executing `deploy'
  * 2013-10-08 21:28:55 executing `deploy:update'
 ** transaction: start
  * 2013-10-08 21:28:55 executing `deploy:update_code'
    updating the cached checkout on all servers
    executing locally: "git ls-remote https://github.com/mygithubhandle/myreponame.git master"
    command finished in 503ms
  * executing "if [ -d /opt/apps/myappname/shared/cached-copy ]; then cd /opt/apps/myappname/shared/cached-copy && git fetch  origin && git fetch --tags  origin && git reset  --hard 3c4a0fa3d6d2d67979b117439092d652896b3e44 && git clean  -d -x -f; else git clone -b master  /opt/apps/myappname/shared/cached-copy && cd /opt/apps/myappname/shared/cached-copy && git checkout -b deploy 3c4a0fa3d6d2d67979b117439092d652896b3e44; fi"myappname/shared/cached-copy && git fetch  origin && git fetch --tags  origin && git reset  --hard 3c4a0fa3d6d2d67979b117439092d652896b3e44 && git clean  -d -x -f; else git clone -b master https://github.com/mygithubhandle/myreponame.git /opt/apps/myappname/shared/cached-copy && cd /opt/apps/myappname/shared/cached-copy && git checkout -b deploy 3c4a0fa3d6d2d67979b117439092d652896b3e44; fi"
    servers: ["XX.XXX.XXX.XX"]
    [[email protected]] executing command
 ** [XX.XXX.XXX.XX :: out] sh: git: command not found
    command finished in 268ms
*** [deploy:update_code] rolling back
  * executing "rm -rf /opt/apps/pickemup-api/releases/20131009042856; true"
    servers: ["XX.XXX.XXX.XX"]
    [[email protected]] executing command
    command finished in 259ms
failed: "env JRUBY_OPTS=--1.9 PATH=/opt/torquebox/current/jboss/bin:/opt/torquebox/current/jruby/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/root/bin sh -c 'if [ -d /opt/apps/myappname/shared/cached-copy ]; then cd /opt/apps/myappname/shared/cached-copy && git fetch  origin && git fetch --tags  origin && git reset  --hard 3c4a0fa3d6d2d67979b117439092d652896b3e44 && git clean  -d -x -f; else git clone -b master https://github.com/mygithubhandle/myreponame.git /opt/apps/myappname/shared/cached-copy && cd /opt/apps/myappname/shared/cached-copy && git checkout -b deploy 3c4a0fa3d6d2d67979b117439092d652896b3e44; fi'" on [email protected]

My deploy.rb file:

require 'torquebox-capistrano-support'
require 'bundler/capistrano'

set :ssh_options, {:forward_agent => true}
server       "[email protected]", :web, :app, :primary => true
set :repository,  "https://github.com/mygithubhandle/mygithubrepo.git"
set :branch,            "master"
set :user,              "torquebox"
set :scm,               :git
set :scm_verbose,       true
set :use_sudo,          false
set :deploy_via, :remote_cache

default_run_options[:pty] = true
ssh_options[:auth_methods] = ["publickey"]
ssh_options[:keys] = ["path/to/my/pem/key"]

set :deploy_to,         "/opt/apps/myappname"
set :torquebox_home,    "/opt/torquebox/current"
set :jboss_init_script, "/etc/init.d/jboss-as-standalone"
set :rails_env, 'production'
set :app_context,       "/"
set :app_ruby_version, '1.9'
set :application, "myappname"
set :jruby_home,      '/usr/local/jruby'

default_environment['JRUBY_OPTS'] = '--1.9'
default_environment['PATH'] = '/opt/torquebox/current/jboss/bin:/opt/torquebox/current/jruby/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/root/bin'

after 'deploy:update_code', 'deploy:assets:precompile'
after 'deploy:update', 'deploy:resymlink'
before 'deploy:finalize_update', 'deploy:assets:symlink'

namespace :deploy do
  desc "relink db directory"
   #if you use sqlite
   task :resymlink, :roles => :app do
     run "mkdir -p #{shared_path}/db; rm -rf #{current_path}/db && ln -s #{shared_path}/db #{current_path}/db && chown -R torquebox:torquebox  #{current_path}/db"
   end


   # This is a weird part. I've found that asset complation with JRuby can really hog up the memory, which can cause the application to crash
   # when doing a deploy. So, I like to compile the assets locally and SCP them to the server instead.
   # Just make sure you've commented out the load deploy/assets in your Capfile.
  namespace :assets do
    # If you want to force the compilation of assets, just set the ENV['COMPILE_ASSETS']
     task :precompile, :roles => :web do
       force_compile = ENV['COMPILE_ASSETS']
       begin # on first deploys, there is no current_revision so an error gets raised. in this case we want to just compile assets and upload them.
         from = source.next_revision(current_revision)
       rescue
         force_compile = true
       end
       if ( force_compile) or (capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ lib/assets/ app/assets/ | wc -l").to_i > 0 )
         run_locally("rake assets:clean && rake assets:precompile")
         run_locally "cd public && tar -jcf assets.tar.bz2 assets"
         top.upload "public/assets.tar.bz2", "#{shared_path}", :via => :scp
         run "cd #{shared_path} && tar -jxf assets.tar.bz2 && rm assets.tar.bz2"
         run_locally "rm public/assets.tar.bz2"
         run_locally("rake assets:clean")
       else
        logger.info "Skipping asset precompilation because there were no asset changes"
       end
     end

     task :symlink, roles: :web do
       run ("rm -rf #{latest_release}/public/assets &&
             mkdir -p #{latest_release}/public &&
             mkdir -p #{shared_path}/assets &&
             ln -s #{shared_path}/assets #{latest_release}/public/assets")
     end
  end
end

Any ideas on what could be going wrong here?


Solution

  • Git client isn't installed on the box you are deploying to. You can fix it by logging in as root to your ec2 instance and installing get. (yum install git or apt-get install git)

    Or you can change your deployment strategy to copy, which is slower than :remote_cache. Copy will checkout on your local machine and scp/sftp all the files over to the server being deployed to.

    set :deploy_via, :copy