taskの中で upload しようとしたらハマった。
はじめに
前回の記事からだいぶ時間が経ってしまった。 最近はもっぱら Rails でWebアプリをつくってます。
今日は capistrano でdeployしようとしてハマったことがあったのでメモっておきます。
構成
今回の構成は、ステージサーバーが1台, Webサーバーが2台で
ステージングサーバーからWebサーバー2台に capistrano で deploy するという形をとりました。 そして、各サーバーのconfigファイル( database,yml など ) は staging に置いておき 更新する度に
staging から web01, staging から web02
とそれぞれのwebサーバーへステージングサーバーからconfigファイルをコピーする形にしました。
deploy.rb は下記の様な感じになっています。 ( 所々はっしょっています )
set :application, "appname" set :user, "user_name" ... set :deploy_to, "/home/hoge/app/#{application}" role :web, "web01" role :web, "web02" namespace :deploy do task :start do ; end task :stop do ; end task :default do update upload_config end task :upload_config do upload "/home/staging/config-file/production/database.yml", "/home/hoge/apps/prod/current/config/database.yml", :via => :scp upload "/home/staging/config-file/production/settings.yml", "/home/hoge/apps/prod/current/config/settings.yml", :via => :scp upload "/home/staging/config-file/production/sns.yml", "/home/hoge/apps/prod/current/config/sns.yml", :via => :scp end end
はじめは upload_config タスクのなかで
run "scp /home/staging/hoge.file #{host}:/home/hoge/"
のように scpコマンド をそれぞれを実行してが capistrano に upload というのが あったので、upload で行うようにした。
ハマった
が、 upload に書き換えたら下記のエラーが出てファイルがコピーできない
/home/homepage/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/capistrano-2.13.5/lib/capistrano/configuration/name spaces.rb:110:in `block in define_task': wrong number of arguments (3 for 0) (ArgumentError) from ./config/deploy.rb:41:in `block (2 levels) in load'
引数がおかしいというのでドキュメントを見てみたが特に問題も無さそう...
色々とためしてみると task の外で実行してみると問題なく動いているのがわかった。
解決方法
taskの中で upload をすると何か他の upload にメソッド を奪われてるっぽいので それで調べてみると 同じ境遇の人がいたどうやら helper の upload に task内で実行しようとしたuploadが奪われているっぽい。
書いてあるように upload の部分を
top.upload
と書きかえたら問題なく実行できた。
めでたしめでたし。