2016年2月6日土曜日

【Rails4.2.xx】 Capistrano3を使用する

記事概要

capistrano3の使い方をまとめた記事です。

read in English

環境

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

capistranoとは

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

なぜ使うのか

デプロイ作業は大変な作業です。一方で繊細な作業でもあります。
アプリによっては、多くの時間をリリース作業に割いているかもしれません。
capistrano3を利用すればコマンドを叩くだけでアプリをリリースできます。
セキュリティの面を考慮しても、デプロイは自動化するべきです。

cap install

では、capistrano3のインストール作業からはじめていきたいと思います。

必要なgemをGemfileに設定します。

{project_folder}/Gemfile

group :development do
  # Access an IRB console on exception pages or by using <%= console %> in views
  gem 'web-console', '~> 2.0'
  gem 'capistrano', '~> 3.2.1'
  gem 'capistrano-ssh-doctor', '~> 1.0'
  gem 'capistrano-rails'
  gem 'capistrano-rbenv', github: "capistrano/rbenv"
  gem 'capistrano-bundler', "~> 1.1.0"
  gem 'capistrano3-unicorn' # unicornを使っている場合のみ
end

記述したgemをinstallします。

terminal

cd {project_folder}

rbenv exec bundle install

gemのinstall完了後にコマンドを叩きます。

terminal

cd {project_folder}

bundle exec cap install

mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
Capified

capコマンドで自動deployに必要なファイルが作成されます。
上記以外にもdelpoy環境が必要な人はファイルを手動で増やします。
私の場合は、ローカルで開発、 stagingで検証、productionで本番を扱っています。
なので、デフォルトのままです。
では、deployの詳細な設定をしていきましょう。

Capfileの設定

まずはCapfileを設定します。
rbenvを利用するので、requireを追加します。

{project_folder}/Capfile

require 'capistrano/rbenv'

railsで利用しているrubyのバージョンを確認します。

terminal

[root@vagrant-centos65 ~]# ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

Capfileにrailsで利用しているrubyのバージョンを設定します。

{project_folder}/Capfile

require 'capistrano/rbenv'

set :rbenv_ruby, '2.3.0'

次に利用しているrbenvのパスを記述します。

terminal

[root@vagrant-centos65 ~]# which rbenv
/usr/local/rbenv/bin/rbenv

binの前の/usr/local/rbenvまでを設定します。

{project_folder}/Capfile

require 'capistrano/rbenv'

set :rbenv_ruby, '2.3.0'
set :rbenv_custom_path, '/usr/local/rbenv'

Bundlerを使ってgemを管理します。

{project_folder}/Capfile

require 'capistrano/bundler'

続いてdeploy時に必要な処理を記述します。
assets compile, unicornの再起動, DB migrate, site-mapの更新は自動化しておきたいところです。
下記のサンプルでは、site-map以外全ての設定を行っています。


require 'capistrano/rbenv'

set :rbenv_ruby, '2.3.0'
set :rbenv_custom_path, '/usr/local/rbenv'

require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano/rails'
require 'capistrano/bundler'
require 'capistrano3/unicorn'

config/deploy.rb

続けてdeploy.rbの設定を行います。このファイルにはdeployの共通処理を記述します。
まずはgit情報を設定します。

{project_folder}/Capfile

set :application, 'sampleweb'
set :repo_url, 'git@xxxxxxxx:test/sample_web.git'

# Default value for :scm is :git
set :scm, :git

capistranoでは、git cloneでソースコードを取得します。
サーバーでユーザーがソースコードを取得できるよう、前もって設定する必要があります

rbenvはシステムインストールを利用します

{project_folder}/Capfile

set :rbenv_type, :system # :system or :user
set :rbenv_ruby, '2.3.0'

シンボリックリンクを利用するパスを設定します。

{project_folder}/Capfile

set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets bundle public}

unicornのpidを配置するファイルを置きます。

{project_folder}/Capfile

set :unicorn_pid, -> {"#{shared_path}/tmp/pids/unicorn.pid"}

デフォルトの環境設定を行ないます。

{project_folder}/Capfile

set :default_env, { path: "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH" }

deploy時にassets compileを実行する処理を記述します。

{project_folder}/Capfile

  namespace :assets do
    Rake::Task['deploy:assets:precompile'].clear_actions
    
    desc "Precompile assets"
    task :precompile do
      puts "-----nothing-------"
    end
  end

deploy時にunicornを再起動するように処理を記述します。

{project_folder}/Capfile

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      invoke 'unicorn:restart'
      # Your restart mechanism here, for example:
      # execute :touch, release_path.join('tmp/restart.txt')
    end
  end

deploy環境設定

最後に、環境ごとにdeployファイルを設定します。
サンプルとして、staging.rbを設定します。

私は検証環境としてvagrantを利用しています。なので、sshでvagrantにログインするようにします。

{project_folder}/config/deploy/staging.rb

role :app, %w{root@192.168.33.50}
role :web, %w{root@192.168.33.50}
role :db,  %w{root@192.168.33.50}

set :ssh_options, {
  verbose: :debug,
  auth_methods: %w(password),
  password: "vagrant"
}

ssh接続でvagrantにログインする設定です。今回は同一サーバーにdeployをしてみます。

deployテスト

deployのテストをします。

terminal

cd {project_folder}

bundle exec cap staging deploy:check

エラーが発生した場合は、エラーを修正してください。うまくいかない場合は、実行ユーザーのpermissionに注意を払ってください。実行ユーザーにはroot権限を設定することをオススメします。あと、必ずgit cloneができるように設定しておいてください。

terminal

D, [2016-02-01T08:48:42.485315 #11434] DEBUG -- tcpsocket[3fe196317614]: received packet nr 55 type 96 len 12
I, [2016-02-01T08:48:42.485343 #11434]  INFO -- net.ssh.connection.session[3fe1963eb554]: channel_eof: 7
D, [2016-02-01T08:48:42.485384 #11434] DEBUG -- tcpsocket[3fe196317614]: received packet nr 56 type 97 len 12
I, [2016-02-01T08:48:42.485407 #11434]  INFO -- net.ssh.connection.session[3fe1963eb554]: channel_close: 7
D, [2016-02-01T08:48:42.485469 #11434] DEBUG -- tcpsocket[3fe196317614]: queueing packet nr 46 type 97 len 28
INFO [ca5786bf] Finished in 0.034 seconds with exit status 0 (successful).

うまくいったので、実際に本番deplyをします。

本番deploy

本番deployをします。せっかくなのでログを載せます。

terminal

I, [2016-01-26T06:40:47.922269 #745]  INFO -- net.ssh.connection.session[3fdd4a672b9c]: channel_data: 66 29b
DEBUG [159535d3]    Successful ping of Google
D, [2016-01-26T06:40:47.923078 #745] DEBUG -- tcpsocket[3fdd4a0a92ec]: received packet nr 465 type 94 len 44
I, [2016-01-26T06:40:47.923165 #745]  INFO -- net.ssh.connection.session[3fdd4a672b9c]: channel_data: 66 27b
DEBUG [159535d3]    Successful ping of Bing
D, [2016-01-26T06:40:47.923676 #745] DEBUG -- tcpsocket[3fdd4a0a92ec]: received packet nr 466 type 98 len 44

... // something 

INFO [db1051b1] Finished in 0.102 seconds with exit status 0 (successful).

これだけでリリース完了になります。

まとめ

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

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

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

以上です。

PICK UP オススメ書籍

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


関連記事

English

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

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

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...