2013-04-17 30 views
4

我似乎无法使用捆绑器与独角兽配合部署。我正在使用capistrano进行部署。独角兽找不到捆绑使用capistrano

望着麒麟日志,同时部署,我收到以下错误:

/home/deployer/apps/my-app/releases/20130417145122) 
I, [2013-04-17T14:53:04.982369 #6565] INFO -- : forked child re-executing... 
/home/deployer/.rvm/gems/[email protected]/gems/bundler-1.3.5/lib/bundler/definition.rb:16:in `build': /home/deployer/apps/my-app/releases/20130417020329/Gemfile not found (Bundler::GemfileNotFound) 
    from /home/deployer/.rvm/gems/[email protected]/gems/bundler-1.3.5/lib/bundler.rb:148:in `definition' 
    from /home/deployer/.rvm/gems/[email protected]/gems/bundler-1.3.5/lib/bundler.rb:116:in `setup' 
    from /home/deployer/.rvm/gems/[email protected]/gems/bundler-1.3.5/lib/bundler/setup.rb:17:in `<top (required)>' 
    from /home/deployer/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require' 
    from /home/deployer/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require' 
E, [2013-04-17T14:53:05.054942 #18166] ERROR -- : reaped #<Process::Status: pid 6565 exit 1> exec()-ed 

Capistrano的是清理过去5个版本的应用程序,我看到打捆试图访问一个不存在的(最后删除)发布。

我发现这个代码,我放在unicorn.rb.erb,但它并没有帮助(我想硬编码以及): http://davidvollbracht.com/blog/headachenewunicorn-capistrano-bundler-usr2

before_exec do |server| 
    ENV['BUNDLE_GEMFILE'] = "<%= current_path %>/Gemfile" 
end 

部署后我的代码,我已经开始和停止NGINX,并开始和停止独角兽,但我得到同样的问题。

我原来的职位上的堆栈溢出来了,但我认为它有与资产管道做:Asset pipeline not working in rails production environment

的思考?

这是我的unicorn.rb.erb文件:

working_directory "<%= current_path %>" 
pid "<%= unicorn_pid %>" 
stderr_path "<%= unicorn_log %>" 
stdout_path "<%= unicorn_log %>" 

listen "/tmp/unicorn.<%= application %>.sock" 
worker_processes <%= unicorn_workers %> 
timeout 30 

preload_app true 

before_exec do |server| 
    ENV['BUNDLE_GEMFILE'] = "<%= current_path %>/Gemfile" 
end 

before_fork do |server, worker| 
    # Disconnect since the database connection will not carry over 
    if defined? ActiveRecord::Base 
    ActiveRecord::Base.connection.disconnect! 
    end 

    # Quit the old unicorn process 
    old_pid = "#{server.config[:pid]}.oldbin" 
    if File.exists?(old_pid) && server.pid != old_pid 
    begin 
     Process.kill("QUIT", File.read(old_pid).to_i) 
    rescue Errno::ENOENT, Errno::ESRCH 
     # someone else did our job for us 
    end 
    end 
end 

after_fork do |server, worker| 
    # Start up the database connection again in the worker 
    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.establish_connection 
    end 
end 

这是我的unicorn_init.sh文件:

#!/bin/sh 
### BEGIN INIT INFO 
# Provides:   unicorn 
# Required-Start: $remote_fs $syslog 
# Required-Stop:  $remote_fs $syslog 
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: Manage unicorn server 
# Description:  Start, stop, restart unicorn server for a specific application. 
### END INIT INFO 
set -e 

# Feel free to change any of the following variables for your app: 
TIMEOUT=${TIMEOUT-60} 
APP_ROOT=/home/deployer/apps/my-app/current 
PID=$APP_ROOT/tmp/pids/unicorn.pid 
CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production" 
AS_USER=deployer 
set -u 

OLD_PIN="$PID.oldbin" 

sig() { 
    test -s "$PID" && kill -$1 `cat $PID` 
} 

oldsig() { 
    test -s $OLD_PIN && kill -$1 `cat $OLD_PIN` 
} 

run() { 
    if [ "$(id -un)" = "$AS_USER" ]; then 
    eval $1 
    else 
    su -c "$1" - $AS_USER 
    fi 
} 

case "$1" in 
start) 
    sig 0 && echo >&2 "Already running" && exit 0 
    run "$CMD" 
    ;; 
stop) 
    sig QUIT && exit 0 
    echo >&2 "Not running" 
    ;; 
force-stop) 
    sig TERM && exit 0 
    echo >&2 "Not running" 
    ;; 
restart|reload) 
    sig USR2 && echo reloaded OK && exit 0 
    echo >&2 "Couldn't reload, starting '$CMD' instead" 
    run "$CMD" 
    ;; 
upgrade) 
    if sig USR2 && sleep 2 && sig 0 && oldsig QUIT 
    then 
    n=$TIMEOUT 
    while test -s $OLD_PIN && test $n -ge 0 
    do 
     printf '.' && sleep 1 && n=$(($n - 1)) 
    done 
    echo 

    if test $n -lt 0 && test -s $OLD_PIN 
    then 
     echo >&2 "$OLD_PIN still exists after $TIMEOUT seconds" 
     exit 1 
    fi 
    exit 0 
    fi 
    echo >&2 "Couldn't upgrade, starting '$CMD' instead" 
    run "$CMD" 
    ;; 
reopen-logs) 
    sig USR1 
    ;; 
*) 
    echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>" 
    exit 1 
    ;; 
esac 

回答

0

我遇到了类似的问题,在这里使用“before_fork”块设置BUNDLE_GEMFILE实际上并没有解决问题,尽管Rails应用程序想ENV [“BUNDLE_GEMFILE”]是通过电流/符号链接指向的Gemfile 。

我还没有完全理解它,但我们也在生产中使用RVM。我设法通过添加以下内容来解决问题:

export BUNDLE_GEMFILE="${APP_ROOT}/Gemfile" 

到init脚本。这能解决你的问题吗?