2011-05-26 38 views
3

我有以下deploy.rb麒麟,Capistrano的安装

# RVM bootstrap 
# $:.unshift(File.expand_path("/home/tim/.rvm/lib")) 
$:.unshift(File.expand_path('./lib', ENV['rvm_path'])) 
require 'rvm/capistrano' 
set :rvm_ruby_string, '1.9.2' 
set :rvm_type, :user 

# bundler bootstrap 
require 'bundler/capistrano' 

# main details 
set :application, "polco" 
role :web, "13.213.13.94" 
role :app, "13.213.13.94" 
role :db, "13.213.13.94", :primary => true 
set :rails_env, "production" 

default_run_options[:pty] = true 
ssh_options[:forward_agent] = true 
set :deploy_to, "/home/passenger/cba" 
set :deploy_via, :remote_cache 
set :user, "passenger" 
set :use_sudo, false 

# repo details 
set :scm, :git 
set :scm_username, "tbbooher" 
set :repository, "[email protected]:tbbooher/foo.git" 
set :branch, "master" 
set :git_enable_submodules, 1 
set :keep_releases, 5 

# # server details 
set :unicorn_pid, "#{shared_path}/pids/unicorn.pid" 

after "deploy", "deploy:cleanup" 

namespace :unicorn do 
    desc "start unicorn" 
    task :start, :roles => :app, :except => {:no_release => true} do 
    run "cd #{current_path} && bundle exec unicorn_exec start" 
    end 
    desc "stop unicorn" 
    task :stop, :roles => :app, :except => {:no_release => true} do 
    run "#{current_path}/bundle exec unicorn_exec stop" 
    end 
    desc "unicorn reload" 
    task :reload, :roles => :app, :except => {:no_release => true} do 
    run "#{current_path}/bundle exec unicorn_exec reload" 
    end 
    desc "graceful stop unicorn" 
    task :graceful_stop, :roles => :app, :except => {:no_release => true} do 
    run "#{try_sudo} kill -s QUIT `cat #{unicorn_pid}`" 
    end 
    desc "restart unicorn" 
    task :restart, :roles => :app, :except => {:no_release => true} do 
    run "#{current_path}/bundle exec ./unicorn_exec restart" 
    end 

    after "deploy:restart", "unicorn:restart" 
end 

after "deploy:update_code", "deploy:config_symlink" 
# hope this works 
before "deploy:restart", "deploy:fix_file_permissions" 

namespace :deploy do 

    task :config_symlink do 
    run "ln -s #{shared_path}/application.yml #{release_path}/config/application.yml" 
    run "ln -s #{shared_path}/mongoid.yml #{release_path}/config/mongoid.yml" 
    run "ln -s #{shared_path}/mailserver_setting.rb #{release_path}/config/mailserver_setting.rb" 
    run "ln -s #{shared_path}/omniauth_settings.rb #{release_path}/config/omniauth_settings.rb" 
    end 

    desc "Fix file permissions" 
    task :fix_file_permissions do 
    run "chmod a+x #{current_path}/unicorn_exec" 
    end 
end 

namespace :deploy do 
    task :restart do 
    end 
end 

及以下bash脚本,%RAILS_ROOT%unicorn_exec

#! /bin/sh 

### BEGIN INIT INFO 
# Provides:   unicorn 
# Required-Start: $local_fs $remote_fs $network $syslog 
# Required-Stop:  $local_fs $remote_fs $network $syslog 
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: starts the unicorn web server 
# Description:  starts unicorn 
### END INIT INFO 

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
DAEMON=/home/passenger/.rvm/gems/ruby-1.9.2-p180/bin/unicorn_rails 
DAEMON_OPTS="-c /home/passenger/cba/current/config/unicorn_tacitus.rb -E production -D" 


NAME=unicorn_rails 
DESC=unicorn_rails 
PID=/home/passenger/cba/shared/pids/unicorn.pid 

case "$1" in 
    start) 
    echo -n "Starting $DESC: " 
    $DAEMON $DAEMON_OPTS 
    echo "$NAME." 
    ;; 
    stop) 
    echo -n "Stopping $DESC: " 
     kill -QUIT `cat $PID` 
    echo "$NAME." 
    ;; 
    restart) 
    echo -n "Restarting $DESC: " 
     kill -QUIT `cat $PID` 
    sleep 1 
    $DAEMON $DAEMON_OPTS 
    echo "$NAME." 
    ;; 
    reload) 
     echo -n "Reloading $DESC configuration: " 
     kill -HUP `cat $PID` 
     echo "$NAME." 
     ;; 
    *) 
    echo "Usage: $NAME {start|stop|restart|reload}" >&2 
    exit 1 
    ;; 
esac 

exit 0 

其中采用以下配置:配置/unicorn_tacitus.rb

worker_processes 2 
base_dir = "/home/passenger/cba/current" 
shared_path = "/home/passenger/cba/shared" 
working_directory base_dir 

preload_app true 

# we destroy all workers who are taking too long 
timeout 30 

# This is where we specify the socket. 
# We will point the upstream Nginx module to this socket later on 
listen "/tmp/sockets/unicorn.sock", :backlog => 64 

pid "#{shared_path}/pids/unicorn.pid" 

# Set the path of the log files inside the log folder of the testapp 
stderr_path "#{shared_path}/log/unicorn.stderr.log" 
stdout_path "#{shared_path}/log/unicorn.stdout.log" 

before_fork do |server, worker| 
# This option works in together with preload_app true setting 
# What is does is prevent the master process from holding 
# the database connection 
    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.connection.disconnect! 
end 

after_fork do |server, worker| 
# Here we are establishing the connection after forking worker 
# processes 
    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.establish_connection 
end 

我在cap部署中遇到下面的错误。我应该如何调用unicorn_exec来重新启动?看起来bundle bundle不运行。总的来说,我正在寻找关于整个过程的反馈信息,因为我对mongodb,独角兽和nginx是新手,并且确定至少有一件事情我没有做到最佳。

executing "/home/passenger/cba/current/bundle exec ./unicorn_exec restart" 
    servers: ["16.213.39.23"] 
    [16.213.39.23] executing command 
** [out :: 16.213.39.23] bash: /home/passenger/cba/current/bundle: No such file or directory 
    command finished in 613ms 
failed: "rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.2' -c '/home/passenger/cba/current/bundle exec ./unicorn_exec restart'" on 16.223.39.23 

回答

4

我没有看看你的整个设置,但我想我知道是什么导致了这个特定的错误。

看你有这样的:

desc "start unicorn" 
task :start, :roles => :app, :except => {:no_release => true} do 
    run "cd #{current_path} && bundle exec unicorn_exec start" 
end 

这是正确的方法来调用,据我所知捆绑,但随后你的其他任务做到这一点:

desc "stop unicorn" 
task :stop, :roles => :app, :except => {:no_release => true} do 
    run "#{current_path}/bundle exec unicorn_exec stop" 
end 

所以注意到,在这个情况下,您的run调用格式不同。转到unicorn:stopunicorn:reloadunicorn:restart任务和改变:

#{current_path}/bundle 

部分

cd #{current_path} && bundle 

所以,最终结果是这样的:

run "cd #{current_path} && bundle exec unicorn_exec <whatever the command is>" 
+0

优秀。欣赏你的洞察力,现在就起作用。仍然担心我打破了由聪明的编码员设定的约定,但它现在正在工作。 – bonhoffer 2011-05-26 11:06:57