現場で Capistrano を使ってデプロイする
(株)永和システムマネジメント || Rails勉強会@東京
諸橋 恭介(もろはし きょうすけ)
[email protected] (work)[email protected] (private)
•RailsアプリのデプロイにはCapistranoが便利•設定をしたり、環境を作ったりするだけの価値がある•制約も多いが乗り越える方法もいろいろ用意されている
まとめ
Capistranoってなに?
•Rubyで書かれたデプロイツール
•Railsのデプロイにも最適
アジャイルなプロジェクトではデプロイを重視する
•顧客/マネージャへの進捗報告としてのデモ• 頻繁なデモでフィードバックを得る
• 本リリース直前の環境リスクを低減
デプロイに必要なこと•サービスの一時停止•アプリケーションの入換•古いバージョンの退避•DBスキーマの更新•サービスの再起動
などなど
よくあるデプロイ手順書• コマンドXXXでアプリケーションを停止する。• 古いバージョンを_(日付YYYYMMDD)にリネームする。• DBチームからの作業指示書に従い、mysqlコマンドを実行しDB上で作業する。
• レポジトリから最新のソースコードを取得し、圧縮する。• FTPで圧縮したソースコードを転送、展開する。• コマンドXXXで起動する。
デプロイは難しい
•いつの間にか手順書が古くなる•手作業のオペレーションミス• 担当者のスキルに依存
デプロイの頻度が下がる
•いつの間にか手順書が古くなる•手作業のオペレーションミス• 担当者のスキルに依存
デプロイの頻度が下がる
手作業のデプロイは難しい
Capistranoを使うと•デプロイを•自動化して•速くかつ簡単に•できるようになります。
デプロイの自動化
•誰でもデプロイできる•煩雑な手順もミスなく•手動作業にはオペレーションミスがつきもの
設定ファイルこそが動く手順書
•記述性の高いRubyを使った動作する手順書•“Capistrano設定ファイル”というオープンなフォーマットの手順書
効能•自動化によって速く簡単になれば繰り返しデプロイできる
cap前 cap後
業務システム A 1時間 10分
業務システム B(開発中・テスト環境)
半日 5分
B2Cサービス(稼働中) 1日 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"
Rubyon
Rails
Deploymenton
Capistrano
Capistranoのレールに乗るために
• アプリケーションは /u/apps に配置すること
• 作業ユーザとして"app"というユーザがいること
• 各サーバにsshでログインできること
• 各サーバからレポジトリにアクセスできること
• sshでログインしたユーザがサーバ上のファイルの作成/削除できること
• などなど
ほとんどは設定で変えられるが、実プロジェクトに適用するのは難しいことも
Capistranoの基本的な設定
http://amazon.jp/gp/product/4797336625
Recipe 177 (p.515)
Capistranoを設定する
Recipe 178 (p.519)
Capistranoでデプロイする
今日の話
• どんなプロジェクトでも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 deploySCM Password : dank...
Capistranoのプロンプトはエコーバックされないのに• Capistranoが使っているメソッドを呼べばOK
set :scm_password, \ Capistrano::CLI.password_prompt(“SCM Password : ”)
$ cap deploySCM 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にブロックを渡しましょう
• 設定が初めて参照された時にブロックを評価• ブロックの返り値を設定として利用• 2回目以降の呼び出しは、戻り値が利用される
set :scm_password do Capistrano::CLI.password_prompt(“SCM Password : ”)end
おまけ•デプロイ先ではパスワード付きのコマンドラインが実行されます。
$ svn --username moro --password foo co http://svn.example.com/svn/myapp
• これを防ぐには scm_prefer_prompt 変数を設定します
実際の例
• Subversionのパスワードをconfig/deploy.rbから追い出すことができます
• コマンドライン履歴などにも残りません• パスワードが必要になったときに、初めて入力待ちになります
set :scm_prefer_prompt, trueset :scm_password do Capistrano::CLI.password_prompt(“SCM Password : ”)end
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コマンドを -d (--debug) と -v(--verbose)オプション付きで実行
• 詳細な実行ログ• コマンド実行前に確認
$ cap -dv deploy
•RailsアプリのデプロイにはCapistranoが便利•設定をしたり、環境を作ったりするだけの価値がある•制約も多いが乗り越える方法もいろいろ用意されている
まとめ
http://amazon.jp/gp/product/4274066940
アジャイルなプロジェクトではデプロイを重視する
15 (p.64)
早いうちにデプロイを自動化する16 (p.64)
頻繁なデモでフィードバックを得る
Capistranoの基本的な設定
http://amazon.jp/gp/product/4797336625
Recipe 177 (p.515)
Capistranoを設定する
Recipe 178 (p.519)
Capistranoでデプロイする
ご清聴ありがとうございました
Top Related