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.rb
desc "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
    end
end
問題点
• 少し便利なオレオレ設定を共通ファイ
  ルに書き出す

• 行数が多くなってくる
• 微妙にタスク間で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 deploy
cap @development deploy
task実行サーバを制限する
role制限


role :app, 'app.host'
role :db, 'db.host'
task :restart, :roles => [:app] do
  ...
end
only制限

role :app, 'app.host', :perl => true
role :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
    ...
  end
end
defaultタスク

          cap deploy


cap deploy:update deploy:restart
他にも話せそうだけど
とりあえず終わります!

130207 kyotorb