Capistrano3 をファイル転送のためだけに使ってみる
はじめに
以前メモってた ビルドツール capistrano メモ - zonote は Capitrano2 のはなしで今はもう有用ではありません。
この記事で使ってるもののバージョンとかは以下です。
$ ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-darwin12]
$ gem -v
2.2.1
$ cap -V
Capistrano Version: 3.1.0 (Rake Version: 10.1.1)
Mac で Capistrano 3 をつかう
Macのruby を最新のバージョンにアップデート: rubyメモ
MacPortsのバージョンは次のコマンドで確認できます。
port -v
MacPortsはけっこう前にインストールしたので以下のコマンドで最新にしておきましょう
sudo port -d selfupdate
sudo port -d sync
以下のコマンドでインストールできるrubyの一覧を確認できます
port list ruby*
表示されたのは以下の内容
ruby @1.8.7-p371 lang/ruby
ruby-build @20130501 ruby/ruby-build
ruby19 @1.9.3-p392 lang/ruby19
ruby20 @2.0.0-p0 lang/ruby20
ruby186 @1.8.6-p420 lang/ruby186
ruby_select @1.0 sysutils/ruby_select
次のコマンドでrubyの1.9がインストールできます。
sudo port install ruby19
MacPortsでインストールしたrubyは以下のコマンドで切り替えられます。
sudo port select ruby ruby19
gem 自体のアップデート
CmdNote - Search Results: tag:gem
gem update --system
Capistrano インストール
sudo gem install capistrano
sudo gem install capistrano_colors
sudo gem install capistrano-ext
sudo gem install railsless-deploy
※ railsless-deploy
は Capistrano3 では不要なようです。
これで
cap install
ができるようになった。これは Capistrano 2.x の capify コマンドにあたるもの。
やりたいこととやるための方法
で、Capistrano 3 はずいぶんと色々かわったそうです。
わたしがやりたいことは、20台にスクリプトを配布するだけ、だったんですが何もわからずにやるとやっぱりだめですね。
入門 Capistrano 3 ~ 全ての手作業を生まれる前に消し去りたい | GREE Engineers' Blog
ここを読んでようやく雰囲気がわかった。。。
Capifile
# Load DSL and Setup Up Stages
require 'capistrano/setup'
# Includes default deployment tasks
require 'capistrano/deploy'
framework_tasks = [:starting, :started, :updating, :updated, :publishing, :published, :finishing, :finished]
framework_tasks.each do |t|
Rake::Task["deploy:#{t}"].clear
end
Rake::Task[:deploy].clear
# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }
↑ 初心者向けデフォルトタスクの消去、ここでやるのがただしいのかわかりませんがこれで。
deploy.rb
# config valid only for Capistrano 3.1
lock '3.1.0'
set :dist_dir_name, 'dev_java_load_db'
set :dist_base_dir, '/Users/user/IdeaProjects'
set :deploy_to, '/home/ec2-user'
task :update do
run_locally do
end
end
# カレントパス配下にある application名のディレクトリをターボールにするだけ。
task :archive => :update do
run_locally do
execute "cd #{fetch :dist_base_dir}; tar -zcvf #{fetch :dist_dir_name}.tgz #{fetch :dist_dir_name}"
end
end
# ターボールにしたファイルをサーバにアップロード。
# サーバのホームディレクトリに application名のディレクトリを作ってそこにアップ、
# 解凍して中身をホームディレクトリに展開
task :deploy => :archive do
deploy_from = "#{fetch :dist_base_dir}/#{fetch :dist_dir_name}.tgz"
on roles(:web) do
unless test "[ -d #{deploy_to} ]"
execute "mkdir -p #{deploy_to}"
end
info deploy_from
info deploy_to
upload! deploy_from, deploy_to
execute "cd #{deploy_to}; tar -zxvf #{fetch :dist_dir_name}.tgz; rm -fr #{fetch :dist_dir_name}.tgz"
end
end
# end
production.rb
role :web, %w{ec2-user@xxx.xxx.xxx.xxx ec2-user@xxx.xxx.xxx.xxx}
set :ssh_options, {
keys: %w(/Users/user/.ssh/hoge.pem),
forward_agent: false,
}
↑
WEBサーバで、ユーザ名@ホスト名
の指定を忘れないように。
実行する
cap production deploy