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)

MacCapistrano 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