一分一秒真剣勝負!

Ruby, Railsなど。Web系の技術ネタを充実させたい・・が、そうなるかは分からない。

Capistrano3が良さげ

CapistranoのVersion3がリリースされてますね。変更点は以下のサイトに大量に書かれています。
Capistrano Version 3 ReleaseAnnounceme

変更点が多過ぎて全部まとめるのは諦めたので、個人的にこれはいいなーと思った点を上げます。

良かった変更点

  • マルチステージをデフォルトでサポート

もうこれでcapistrano-extはいらない。まあ、これは標準サポートされてもいいですよね。

  • デプロイの高速化

確か以前はコマンド1回実行毎にsshのセッションを貼り直していたので遅かったはず。SSHのライブラリを変更したのと同時にココらへんも改善されたのかも。ただ、やっぱりRailsをデプロイする時はassetsのコンパイルでちょっと止まりますね。

  • 実装が見やすくなった

capistrano2はネットにドキュメントが少なくて結局実装を読む事になる場合が多かったのですが、2と比較すると3の方が見やすくなってました。これは助かります。

  • linked_files, linked_dirs

これ凄い便利です。シンボリックリンクを貼りたいファイルがあった時に短く書ける。確かcapistrano2の時は確か無かったと思いますが・・どうなんだろ。
例えばdatabase.ymlのようにgitなどで管理したくないファイルを渡してやると、

set :linked_files, %w{config/database.yml}

/shared/config/database.ymlから/deploy先のバス/current/config/database.ymlにシンボリックリンクを貼ってくれる!2まではrunとかで普通にコマンドを書いていたので、これは楽です。やっぱりこういうファイルってshared配下に置く人が多いんだろうか。linked_dirsもlinked_filesと同じ感じです。

デプロイスクリプトのサンプル

とりあえずRailsアプリをデプロイするスクリプトを書いてみた。ただファイルを置くだけなんで、Webサーバの再起動とかプロセスのリスタートとかは書いてません。

Gemfile

  gem 'capistrano', '3.0.0', github: 'capistrano/capistrano'                                                                                                                                                           
  gem 'capistrano-rails'                                                                                                                                                                                               
  gem 'capistrano-rbenv', github: 'capistrano/rbenv'                                                                                                                                                                   
  gem 'capistrano-bundler', github: 'capistrano/bundler' 

Capfiile

require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/console'
require 'capistrano/rbenv'
set :rbenv_type, :user
set :rbenv_ruby, '2.0.0-p247'
require 'capistrano/bundler'
require 'capistrano/rails'

# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

config/deploy.rb

set :application, :sample
set :repo_url, 'git://hogehogehoge.com/hoge.git'
ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

set :deploy_to, '/deploy/to'
set :scm, :git

set :pty, true

set :linked_files, %w{config/database.yml config/resque.yml}
# set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}

set :keep_releases, 10

config/deploy/production.rb

set :stage, :production

# Simple Role Syntax
# ==================
# Supports bulk-adding hosts to roles, the primary
# server in each group is considered to be the first
# unless any hosts have the primary property set.
role :app, %w{app@hoge1 app@hoge2}
role :web, %w{app@hoge1 app@hoge2}
role :db,  %w{app@hoge1}, primary: true

# you can set custom ssh options
# it's possible to pass any option but you need to keep in mind that net/ssh understand limited list of options
# you can see them in [net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start)
# set it globally
set :ssh_options, {
  keys: %w(/home/app/.ssh/id_rsa),
  forward_agent: true,
  auth_methods: %w(publickey)
}
# and/or per server
# server 'example.com',
#   user: 'user_name',
#   roles: %w{web app},
#   ssh_options: {
#     user: 'user_name', # overrides user setting above
#     keys: %w(/home/user_name/.ssh/id_rsa),
#     forward_agent: false,
#     auth_methods: %w(publickey password)
#     # password: 'please use keys'
#   }
# setting per server overrides global ssh_options

# fetch(:default_env).merge!(:rails_env, :production)

サーバの再起動とか全くやってないのであまり参考にはならない。。
ま、ドキュメント読んだりちょっといじってみた結果、実行速度を理由にminaを使うならCapistrano3を使った方がいいかなと感じました。十分早いし、ちょと複雑な事をminaでやろうとすると時間がかかったりするんで。

追記

いいまとめエントリーきました!
Capistrano 3への手引き - 今日のごはんは素麺です http://takkkun.hatenablog.com/entry/2013/10/12/Capistrano_3%E3%81%B8%E3%81%AE%E6%89%8B%E5%BC%95%E3%81%8D

fatal: Could not parse object <Capistrano>

Gitサーバの参照先を変えたらCapistranoでエラー。

 ** [server_name :: out] Warning: Permanently added 'ip address' (RSA) to the list of known hosts.

実行ログを見ると旧サーバのIPを参照しているようだ。
色々とググったら以下のサイトを見て解決。
http://www.willpink.co.uk/post/1074709512/fatal-could-not-parse-object-github-capistrano
set :deploy_via, :remote_cacheをコメントアウトしてデプロイできました。
デプロイが終わったら再びコメントをはずして元通り・・・というわけではなく、デプロイ先サーバの

<deploy_to>/shared/cached-copy/.git/config

このファイルのGitサーバを書き換えないとダメですよっと。