38
現場Capistrano 使ってデプロイする (株)永和システムマネジメント || Rails勉強会@東京 諸橋 恭介(もろはし きょうすけ) [email protected] (work) [email protected] (private)

Capistrano in practice - WebCareer

Embed Size (px)

DESCRIPTION

talked about Capistrano in Rails Summer Festival 2008 by WebCareer

Citation preview

Page 1: Capistrano in practice - WebCareer

現場で Capistrano を使ってデプロイする

(株)永和システムマネジメント || Rails勉強会@東京

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

[email protected] (work)[email protected] (private)

Page 2: Capistrano in practice - WebCareer

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

まとめ

Page 3: Capistrano in practice - WebCareer

Capistranoってなに?

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

•Railsのデプロイにも最適

Page 4: Capistrano in practice - WebCareer

アジャイルなプロジェクトではデプロイを重視する

•顧客/マネージャへの進捗報告としてのデモ• 頻繁なデモでフィードバックを得る

• 本リリース直前の環境リスクを低減

Page 5: Capistrano in practice - WebCareer

デプロイに必要なこと•サービスの一時停止•アプリケーションの入換•古いバージョンの退避•DBスキーマの更新•サービスの再起動

などなど

Page 6: Capistrano in practice - WebCareer

よくあるデプロイ手順書• コマンドXXXでアプリケーションを停止する。• 古いバージョンを_(日付YYYYMMDD)にリネームする。• DBチームからの作業指示書に従い、mysqlコマンドを実行しDB上で作業する。

• レポジトリから最新のソースコードを取得し、圧縮する。• FTPで圧縮したソースコードを転送、展開する。• コマンドXXXで起動する。

Page 7: Capistrano in practice - WebCareer

デプロイは難しい

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

デプロイの頻度が下がる

Page 8: Capistrano in practice - WebCareer

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

デプロイの頻度が下がる

手作業のデプロイは難しい

Page 9: Capistrano in practice - WebCareer

Capistranoを使うと•デプロイを•自動化して•速くかつ簡単に•できるようになります。

Page 10: Capistrano in practice - WebCareer

デプロイの自動化

•誰でもデプロイできる•煩雑な手順もミスなく•手動作業にはオペレーションミスがつきもの

Page 11: Capistrano in practice - WebCareer

設定ファイルこそが動く手順書

•記述性の高いRubyを使った動作する手順書•“Capistrano設定ファイル”というオープンなフォーマットの手順書

Page 12: Capistrano in practice - WebCareer

効能•自動化によって速く簡単になれば繰り返しデプロイできる

cap前 cap後

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

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

半日 5分

B2Cサービス(稼働中) 1日 1時間(確認込み)

Page 13: Capistrano in practice - WebCareer

設定も簡単•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"

Page 14: Capistrano in practice - WebCareer

Rubyon

Rails

Page 15: Capistrano in practice - WebCareer

Deploymenton

Capistrano

Page 16: Capistrano in practice - WebCareer

Capistranoのレールに乗るために

• アプリケーションは /u/apps に配置すること

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

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

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

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

• などなど

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

Page 17: Capistrano in practice - WebCareer

Capistranoの基本的な設定

http://amazon.jp/gp/product/4797336625

Recipe 177 (p.515)

Capistranoを設定する

Recipe 178 (p.519)

Capistranoでデプロイする

Page 18: Capistrano in practice - WebCareer

今日の話

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

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

現場でCapistranoを使うノウハウを紹介します

Page 19: Capistrano in practice - WebCareer

•設定ファイルからパスワードを追い出す•対話実行環境の作り方

•対話実行を遅延させる

•Capistranoの歩き方を知る

お品書き

Page 20: Capistrano in practice - WebCareer

設定ファイルからパスワードを追い出す

Page 21: Capistrano in practice - WebCareer

config/deploy.rbにあ り が ち な こ と

• Subversionのパスワードを設定したい• scm_password 変数で設定できる• でもconfig/deploy.rbに書かなきゃいけない • 設定を「対話的に」設定したい • などなど

Page 22: Capistrano in practice - WebCareer

config/deploy.rbはRubyスクリプト

• そこで $stdin.gets ですよ!!print “SCM Password : ”set :scm_password, $stdin.gets.strip

$ cap deploySCM Password : dank...

Page 23: Capistrano in practice - WebCareer

Capistranoのプロンプトはエコーバックされないのに• Capistranoが使っているメソッドを呼べばOK

set :scm_password, \ Capistrano::CLI.password_prompt(“SCM Password : ”)

$ cap deploySCM Password : (エコーバックされない)

Page 24: Capistrano in practice - WebCareer

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 のドキュメント参照

Page 25: Capistrano in practice - WebCareer

config/deploy.rbは読み込み時に実行される

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

• 正直うざったい。。。

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

対話実行を遅延させる

Page 26: Capistrano in practice - WebCareer

setにブロックを渡しましょう

• 設定が初めて参照された時にブロックを評価• ブロックの返り値を設定として利用• 2回目以降の呼び出しは、戻り値が利用される

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

Page 27: Capistrano in practice - WebCareer

おまけ•デプロイ先ではパスワード付きのコマンドラインが実行されます。

$ svn --username moro --password foo co http://svn.example.com/svn/myapp

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

Page 28: Capistrano in practice - WebCareer

実際の例

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

• コマンドライン履歴などにも残りません• パスワードが必要になったときに、初めて入力待ちになります

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

Page 29: Capistrano in practice - WebCareer

Capistranoの歩き方を知る

Page 30: Capistrano in practice - WebCareer

Googleにない•Capistranoは便利ですが、検索しても情報が少ない

2件

Page 31: Capistrano in practice - WebCareer

ソースがドキュメントです

Page 32: Capistrano in practice - WebCareer

ドキュメントの調べ方

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

$ find capistrano-2.4.3/lib/ -name \*.rb | \ xargs grep -w variable

Page 33: Capistrano in practice - WebCareer

標準の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 && ...

Page 34: Capistrano in practice - WebCareer

デプロイではどんなコマンドが実行されるの?

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

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

$ cap -dv deploy

Page 35: Capistrano in practice - WebCareer

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

まとめ

Page 36: Capistrano in practice - WebCareer

http://amazon.jp/gp/product/4274066940

アジャイルなプロジェクトではデプロイを重視する

15 (p.64)

早いうちにデプロイを自動化する16 (p.64)

頻繁なデモでフィードバックを得る

Page 37: Capistrano in practice - WebCareer

Capistranoの基本的な設定

http://amazon.jp/gp/product/4797336625

Recipe 177 (p.515)

Capistranoを設定する

Recipe 178 (p.519)

Capistranoでデプロイする

Page 38: Capistrano in practice - WebCareer

ご清聴ありがとうございました