2016年2月24日水曜日

【Rails4.2.xx】 Capistrano3でよく発生するエラー

記事概要

capistrano3でよく発生するエラーをまとめた記事です。

環境

  • centos6.5
  • rails4.2.5
  • ruby2.3.0
  • rbenv
  • unicorn

capistrano3とは

capistrano3はデプロイツールです。rubyで記述されているので、railsアプリのdeployと相性が非常に良いです。
ruby以外の言語でも利用できますが、railsだとより多くの機能を利用できます。
公式サイト

エラーについて

capistrano3は便利である反面、うまく動作するまでは、エラーに悩まされます。
特に初心者は、うまく実行できる前に心が折れてしまう可能があります。
なので、よく発生するエラーの修正方法を記載しようと思います。

db:createについて

capistrano3を実行する前には、rake db:createを実行してdatabaseを作成しておく必要があります。
capistrano3は、dbに変更がある場合にdeployと同時にrake db:migrateを実行します。しかし、rake db:createは実行しません。
なので、databaseはあらかじめ作成しておく必要があります。

capistrano3はデプロイ(更新)ツールなので、databaseは作成しません。
なので、rake db:migrateがきちんと動作するように、db:createでdatabaseを前もって作成しておく必要があります。

assetsコンパイルの失敗

はじめてのcapistrano3の実行でassets compileをしようとすると、初回deployで失敗する可能性があります。

この場合、自分でassets compileを実行する必要があります。

{project_folder}/current/

cd {project_folder}/current

// staging
bundle exec rake assets:precompile RAILS_ENV=staging.

// production
bundle exec rake assets:precompile RAILS_ENV=production.

二回目以降は自動でassets compileが実行されるようになります。これはassets_manifest_backupというフォルダが生成されるからです。

また、assets compileは重い処理です。なので、capistrano3でなく手動で実行するのもありだと思います。

assetsフォルダが読みこまれない

nginxとunicornを連携したrailsアプリをcapistrano3でdeployすると、assetsフォルダ配下がブラウザで読みこまれないケースがあります。

これは、pathが{project_folder}/current/public/assets/になってしまうためです。
なので、nginxでassetsファイルのpathを指定する必要があります。

/etc/nginx/conf.d/app.conf

    location ~ ^/assets/ {
        root /var/www/rails/app/current/public;
    }

unicorn startの環境設定

capistrano3-unicornを利用してunicornの起動や再起動を実行している人は多いでしょう。
capistrano3-unicornを使ったunicornの起動では、以下のコマンドが実行されています。

capistrano3-unicorn/lib/capistrano3/tasks/unicorn.rake

execute :bundle, "exec unicorn", "-c", fetch(:unicorn_config_path), "-E", fetch(:unicorn_rack_env), "-D", fetch(:unicorn_options)

見ての通り、unicorn_rack_envの設定が必要になります。この変数は以下のように設定されます。

capistrano3-unicorn/lib/capistrano3/tasks/unicorn.rake

set :unicorn_rack_env, -> { fetch(:rails_env) == "development" ? "development" : "deployment" }

設定がない場合は、developmentで動作するような実装になっています。

なので、development以外の環境で実行する場合は、明示的に指定してやる必要があります。

project_folder/config/deploy/staging.rb

set :stage, :staging
set :rails_env, 'staging'
set :unicorn_rack_env, :staging

{project_folder}/config/deploy/production.rb

set :stage, :production
set :rails_env, 'production'
set :unicorn_rack_env, :production

上記のように変更したら、deployを実行してみましょう。

terminal

cd /vagrant_data/{project_folder}
bundle exec cap staging deploy

INFO [b8410ed9] Running /usr/local/rbenv/bin/rbenv exec bundle exec unicorn -c /var/www/rails/app/current/config/unicorn/staging.rb -E staging -D  as root@192.XXX.XX.XX

きちんとstagingで実行されています。

まとめ

capistrano3は強力なdeployツールです。最初はとっつきにくいしれませんが、慣れると手放せなくなると思います。
私はphpやjavaのdeployでもcapistrano3を利用しています。

本番環境のデプロイは必ず自動化しましょう。できればプロジェクト開始時に設定してしまうのが良いと思います。
プロジェクトの後半になって、deployの自動化を設定しようとしても時間が足りなくて後回しになる可能性があります。

何事も経験です。是非、試してみてください。

以上です。

PICK UP オススメ書籍

運営サイト(railsで作成しています)


関連記事

参考記事

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...