記事概要
capistrano3の使い方をまとめた記事です。
環境
- rails4.2.5 & centos6.5
- ruby2.3.0
- rbenv
- unicorn
capistranoとは
capistrano3はデプロイツールです。rubyで記述されているので、railsアプリのdeployと相性が非常に良いです。
ruby以外の言語でも利用できますが、railsだとより多くの機能を利用できます。
なぜ使うのか
デプロイ作業は大変な作業です。一方で繊細な作業でもあります。
アプリによっては、多くの時間をリリース作業に割いているかもしれません。
capistrano3を利用すればコマンドを叩くだけでアプリをリリースできます。
セキュリティの面を考慮しても、デプロイは自動化するべきです。
cap install
では、capistrano3のインストール作業からはじめていきたいと思います。
必要なgemを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します。
cd {project_folder} rbenv exec bundle install
gemのinstall完了後にコマンドを叩きます。
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を追加します。
require 'capistrano/rbenv'
railsで利用しているrubyのバージョンを確認します。
[root@vagrant-centos65 ~]# ruby -v ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
Capfileにrailsで利用しているrubyのバージョンを設定します。
require 'capistrano/rbenv' set :rbenv_ruby, '2.3.0'次に利用しているrbenvのパスを記述します。
[root@vagrant-centos65 ~]# which rbenv /usr/local/rbenv/bin/rbenv
binの前の/usr/local/rbenvまでを設定します。
require 'capistrano/rbenv' set :rbenv_ruby, '2.3.0' set :rbenv_custom_path, '/usr/local/rbenv'
Bundlerを使ってgemを管理します。
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情報を設定します。
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はシステムインストールを利用します
set :rbenv_type, :system # :system or :user set :rbenv_ruby, '2.3.0'
シンボリックリンクを利用するパスを設定します。
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets bundle public}
unicornのpidを配置するファイルを置きます。
set :unicorn_pid, -> {"#{shared_path}/tmp/pids/unicorn.pid"}
デフォルトの環境設定を行ないます。
set :default_env, { path: "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH" }
deploy時にassets compileを実行する処理を記述します。
namespace :assets do Rake::Task['deploy:assets:precompile'].clear_actions desc "Precompile assets" task :precompile do puts "-----nothing-------" end end
deploy時にunicornを再起動するように処理を記述します。
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にログインするようにします。
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のテストをします。
cd {project_folder} bundle exec cap staging deploy:check
エラーが発生した場合は、エラーを修正してください。うまくいかない場合は、実行ユーザーのpermissionに注意を払ってください。実行ユーザーにはroot権限を設定することをオススメします。あと、必ずgit cloneができるように設定しておいてください。
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をします。せっかくなのでログを載せます。
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の自動化を設定しようとしても時間が足りないと騒いで後回しになる可能性が
高いと思います。
何事も経験です。是非、試してみてください。
以上です。
0 件のコメント:
コメントを投稿