capistrano設定の共通化 (+ Tips集) 2013/02/15 kyoto.rb
capistrano設定の共通化(+ Tips集)
2013/02/15 kyoto.rb
shiba_yu36
• Perl• JavaScript• (Rubyはあんまり使ってない...)
capistrano使ってますか?
注) capistranoはdeploy用のツールです
capistranoとは? •デプロイ用ツール
•コマンド一つでアプリケーションのデプロイが出来たりする
•特にRailsに特化してる
•知らない人が多かったらデモするかも
capistranoにまつわるよくある(?)ストーリー
このprojectではcapを使おう!便利!
便利だからこっちのprojectでも使おう
適当に設定コピペ
あ、このprojectちょっとだけdeploy方法違うから適当に修正
しちゃおう
それから数カ月後....
自分が別のprojectへ...
さてdeployだ適当にcap deployとかしたら
いいんでしょ
cap deploy
微妙に方法違ってサーバ全台落ちる
何が問題か•各プロジェクトでCapfileをそれぞれ作る
• deploy手順がそれぞれ違う
•人が気をつけないとdeploy出来ない状態に
共通化したい•同じような処理はきちんとまとめたい
•便利なツールは社内で共有したい
•出来るだけdeploy方法がばらばらにならないようにしたい
例)common-deploy.rb•各project共通処理をまとめておく
• update, restart, log, etc...•あとはCapfileでloadする運用
例)common-deploy.rbdesc "Update remote files"task :update do |o| run "mkdir -p #{releases_path}" strategy.deploy!
if ENV['ROLES'] =~ /proxy/ && server_type == 'daemontools' puts "### SEEMS LIKE PROXY; UPDATE CURRENT ###" daemontools.update_current end
if ENV['ROLES'] && update_timestamp_filter && !update_timestamp_filter.include?(ENV['ROLES']) update_static_timestamps endend
問題点•少し便利なオレオレ設定を共通ファイルに書き出す
•行数が多くなってくる
•微妙にタスク間でconflictしだす
• common-deploy.rbを更新できなくなる
•結局元の状況に............
問題点
wc -l common-deploy.rb 981 common-deploy.rb
最近の共通化の方針•やりたいことごとにファイルを作って共通化する
• default設定, deploy用, cron, perlbrew, rbenv, daemontools, etc...
•それぞれのサービスは必要な物だけload
最近の共通化の方針•それぞれのサービスは必要な物だけload
•サービスの差異を吸収しながら共通化できる
• task名とその内容の標準化は別途必要
例.!"" Capfile # サービスごとの設定#"" config !"" cron.rb # cron設定 !"" daemontools.rb # svc操作用関数 !"" default.rb # 共通deploy設定 !"" perlbrew.rb # perlbrew用 #"" utils.rb # その他便利関数
demo(っぽいもの)• Capfile• default設定
• cron設定など
•実際のdeployとか
•随時質問を受けます
これにより•オレオレ設定でも違うファイルにしておけば良い
• load対象を分けるので、一定の互換性が保たれる
ここからはcapistranoのtipsを紹介します
plugin編
plugin編• gem install capistrano_colors -> 色付け
•目grepに便利です
deploy編
deploy編•以下が協調して動作する
•本体のdeploy.rb
• deploy/scm,
• deploy/strategy
deploy編• scm : version管理ツールの種類ごとのdeploy設定
• strategy : どのようなdeploy方法をとるか
git設定set :scm, :git # git使うset :git_shallow_clone, 1 # depth=1でやってくれるset :git_enable_submodules, 1 # submoduleも
set :branch, "master"
set :repository do "git@host:projects/Hoge.git"end
strategy設定•deploy_viaを設定すればstrategyを決められる
• 様々な方法でdeploy
strategy設定•いろんな方法でdeployしてくれる
• checkout• copy• remote_cache
•独自
strategy checkout• remoteでcloneしてcheckout
• versionで区切る方法だと毎回cloneされそう
• versions/20130208みたいなやつ
strategy copy•手元のファイルをupload
•なんかいろいろやっててよくわからん
strategy remote_cache• cached-copy dirにclone
•それをrsyncでコピーしてdeploy
•毎回cloneするよりだいぶ速い
strategy設定•とりあえずremote_cache使うとよい
set :deploy_via, :remote_cache
環境ごとに設定変える
環境ごとに設定変える• capistrano-ext• taskでroleを動的定義する
capistrano-ext• production.rbとかstaging.rbとか
•もうちょい調べる
roleを動的定義するtask '@production' do role :app, 'production01.host' role :cron, 'production01.host'end
task '@development' do role :app, 'development01.host' role :cron, 'development01.host'end
roleを動的定義する
cap @production deploycap @development deploy
task実行サーバを制限する
role制限
role :app, 'app.host'role :db, 'db.host'task :restart, :roles => [:app] do ...end
only制限
role :app, 'app.host', :perl => truerole :db, 'db.host'task :perl_setup, :only => { :perl => true } do ...end
defaultタスク
defaultタスク• defaultというタスクを作っておく
•するとnamespaceでタスクを呼べる
defaultタスクnamespace :deploy do task :default do update restart end task :update do ... end task :restart do ... endend
defaultタスク
cap deploy
cap deploy:update deploy:restart
他にも話せそうだけどとりあえず終わります!