使用Capistrano在EC2上部署Torquebox应用程序

时间:2013-10-09 04:49:49

标签: ruby-on-rails amazon-ec2 capistrano jruby

我正在使用带有Torquebox的JRuby 1.7.1运行rails应用程序并尝试在EC2上部署,但是当我运行'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"]
    [ec2-user@XX.XXX.XXX.XX] 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"]
    [ec2-user@XX.XXX.XXX.XX] 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 ec2-user@XX.XXX.XXX.XX

我的deploy.rb文件:

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

set :ssh_options, {:forward_agent => true}
server       "ec2-user@XX.XXX.XXX.XX", :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

关于这里可能出现什么问题的任何想法?

2 个答案:

答案 0 :(得分:0)

Git客户端未安装在您要部署的盒子上。您可以通过以root身份登录到ec2实例并安装get来修复它。 (yum install git或apt-get install git)

或者您可以将部署策略更改为复制,速度比:remote_cache慢。复制将在本地计算机上签出,并将scp / sftp所有文件复制到正在部署的服务器上。

set :deploy_via, :copy

答案 1 :(得分:0)

您的系统中需要“git”。 apt-get install git应该做到这一点。但是,您可以偶然发现一些可能的问题。我在我公司的博客上写了article来记录我的斗争和解决方案。