SlideShare a Scribd company logo
現場で
 Capistrano を
使ってデプロイする
  (株)永和システムマネジメント ¦¦ Rails勉強会@東京

   諸橋 恭介            (もろはし きょうすけ)

     k-morohashi@esm.co.jp (work)
    moronatural@gmail.com (private)
まとめ

•Railsアプリのデプロイには
 Capistranoが便利
•設定をしたり、環境を作ったりす
 るだけの価値がある
•制約も多いが乗り越える方法もい
 ろいろ用意されている
Capistranoってなに?


•
Rubyで書かれたデプロイ
ツール

•Railsのデプロイにも最適
アジャイルなプロジェクトでは
  デプロイを重視する

•顧客/マネージャへの進捗報告
 としてのデモ
• 頻繁なデモでフィードバックを得る
• 本リリース直前の環境リスクを
 低減
デプロイに必要なこと
•サービスの一時停止
•アプリケーションの入換
 •古いバージョンの退避
•DBスキーマの更新
•サービスの再起動
               などなど
よくあるデプロイ手順書
•   コマンドXXXでアプリケーションを停止する。

•   古いバージョンを_(日付YYYYMMDD)にリネームする。

•   DBチームからの作業指示書に従い、mysqlコマンドを実行し
    DB上で作業する。

•   レポジトリから最新のソースコードを取得し、圧縮する。

•   FTPで圧縮したソースコードを転送、展開する。

•   コマンドXXXで起動する。
デプロイは難しい

•いつの間にか手順書が古くなる
•手作業のオペレーションミス
• 担当者のスキルに依存

 デプロイの頻度が下がる
手作業の
 デプロイは難しい
•いつの間にか手順書が古くなる
•手作業のオペレーションミス
• 担当者のスキルに依存

 デプロイの頻度が下がる
Capistranoを使うと
•デプロイを

 • 自動化して

 • 速くかつ簡単に

• できるようになります。
デプロイの自動化

•誰でもデプロイできる

• 煩雑な手順もミスなく
•手動作業にはオペレーションミス
 がつきもの
設定ファイルこそが
      動く手順書

•
記述性の高いRubyを使った
動作する手順書
• Capistrano設定ファイル という
    オープンなフォーマットの手順書
効能
•自動化によって速く簡単になれば
  繰り返しデプロイできる
               cap前   cap後

業務システム A       1時間    10分

業務システム B
               半日      5分
(開発中・テスト環境)

                      1時間
B2Cサービス(稼働中)   1日
                      (確認込み)
設定も簡単
  •Capistranoは設定も簡単
    • Railsと同じように 設定よりも規約
    • レールに乗れば6行でデプロイできる
set :application, "myapp"
set :repository, "http://example.com/svn/myapp"

role :web, "web.example.com"
role :app, "app.example.com"
role :db, "db.example.com"
Ruby
 on
Rails
Deployment
    on
Capistrano
Capistranoの
           レールに乗るために
 •   アプリケーションは /u/apps に配置すること

 •   作業ユーザとして"app"というユーザがいること

 •   各サーバにsshでログインできること

 •   各サーバからレポジトリにアクセスできること

 •   sshでログインしたユーザがサーバ上のファイルの作成/削除できること

     •   などなど



ほとんどは設定で変えられるが、
実プロジェクトに適用するのは難しいことも
Capistranoの基本的な設定

                Recipe 177 (p.515)
                Capistranoを設定する


                Recipe 178 (p.519)
                Capistranoでデプロイ
                する

http://amazon.jp/gp/product/4797336625
今日の話
 現場でCapistranoを使う
 ノウハウを紹介します

• どんなプロジェクトでもCapistranoを使える
 ようになるわけではありません。

• もともとCapistranoのレールに乗って環境を
 作ることをお進めします
お品書き

•設定ファイルからパスワードを
 追い出す
• 対話実行環境の作り方
• 対話実行を遅延させる
•Capistranoの歩き方を知る
設定ファイルから
パスワードを追い出す
config/deploy.rbに
あ り が ち な こ と

• Subversionのパスワードを設定したい
 • scm_password 変数で設定できる
 • でもconfig/deploy.rbに書かなきゃいけない
• 設定を「対話的に」設定したい 
 •   などなど
config/deploy.rbは
       Rubyスクリプト
 • そこで $stdin.gets       ですよ!!

print “SCM Password : ”
set :scm_password, $stdin.gets.strip




$ cap deploy
SCM Password : dank...
Capistranoのプロンプトは
 エコーバックされないのに

 • Capistranoが使っているメソッドを呼べばOK
set :scm_password, 
  Capistrano::CLI.password_prompt(“SCM Password : ”)




$ cap deploy
SCM Password : (エコーバックされない)
Capistrano::CLI
# パスワードなど、エコーバックされないもの
Capistrano::CLI.password_prompt(“SCM Password : ”)

# エコーバックしたい場合
Capistrano::CLI.ui.ask("hogehoge : ")

# 1文字だけ入れたい場合 [y/n]など
Capistrano::CLI.ui.ask("hogehoge : "){|q|
  q.character = true
}




       詳しくは Highline のドキュメント参照
対話実行を遅延させる
config/deploy.rbは読み込み時に実行される


$ cap -T # タスク一覧を表示
SCM Password : (デプロイは実行しないのに聞かれる)



 • その変数が必要なときでなく、ファイルが読み込
   まれたときに実行されてしまう

  • 正直うざったい。。。
setにブロックを
            渡しましょう
set :scm_password do
  Capistrano::CLI.password_prompt(“SCM Password : ”)
end




   • 設定が初めて参照された時にブロックを評価
    • ブロックの返り値を設定として利用
   • 2回目以降の呼び出しは、戻り値が利用される
おまけ
•デプロイ先ではパスワード付きのコ
 マンドラインが実行されます。
 $ svn --username moro --password foo
     co http://svn.example.com/svn/myapp


• これを防ぐには scm_prefer_prompt 変数を設
 定します
実際の例

set :scm_prefer_prompt, true
set :scm_password do
  Capistrano::CLI.password_prompt(“SCM Password : ”)
end



 • Subversionのパスワードをconfig/deploy.rb
    から追い出すことができます

   • コマンドライン履歴などにも残りません
 • パスワードが必要になったときに、初めて入力待
    ちになります
Capistranoの
 歩き方を知る
Googleにない
•Capistranoは便利ですが、検索
 しても情報が少ない



              2件
ソースが
ドキュメント
  です
ドキュメントの調べ方

 • 21世紀ですがgrepがいいです。
  • set や _cset で変数を設定している箇所
  • variable や fetch での設定を読んでいる箇所

$ find capistrano-2.4.3/lib/ -name *.rb | 
  xargs grep -w variable
標準のdeploy.rb
•   capistrano-2.x.x/lib/capistrano/recipes/deploy.rb
• たくさんのデフォルト設定 (Ruby)
• 自然言語による説明 (英語)
• 実行されるコマンド (sh)
    task :finalize_update, :except => { :no_release => true } do
      run "chmod -R g+w #{latest_release}" if fetch(:group_writable, true)
     (略)
      run <<-CMD
          rm -rf #{latest_release}/log #{latest_release}/public/system
    #{latest_release}/tmp/pids &&
          mkdir -p #{latest_release}/public &&
          mkdir -p #{latest_release}/tmp &&
    ...
デプロイではどんな
   コマンドが実行されるの?

$ cap -dv deploy


• capコマンドを -d      (--debug) と -v(--verbose)
 オプション付きで実行

• 詳細な実行ログ
• コマンド実行前に確認
まとめ

•Railsアプリのデプロイには
 Capistranoが便利
•設定をしたり、環境を作ったりす
 るだけの価値がある
•制約も多いが乗り越える方法もい
 ろいろ用意されている
アジャイルなプロジェクトでは
  デプロイを重視する
               15 (p.64)
               早いうちにデプロイを自
               動化する

               16 (p.64)
               頻繁なデモでフィード
               バックを得る

http://amazon.jp/gp/product/4274066940
Capistranoの基本的な設定

                Recipe 177 (p.515)
                Capistranoを設定する


                Recipe 178 (p.519)
                Capistranoでデプロイ
                する

http://amazon.jp/gp/product/4797336625
ご清聴
 ありがとう
ございました

More Related Content

Capistrano in practice - WebCareer