capistrano put() と Upload() が両方とも失敗する
-
18-09-2019 - |
質問
capistrano を使用して、Rails アプリケーションを Mac OS X 10.5 から CentOS 5.2 にデプロイしています。
deploy.rb とサーバー環境は 1 年以上変わっていないことに注意してください。
というタスクがdeploy.rbファイル内にあります。 upload
:
put(File.read( file ),"#{shared_path}/#{filename}", :via => :scp)
これは、次の例外を除いて毎回失敗します。
No such file or directory - /srv/ourapp/releases/20100104194410/config/database.yml
config/database.yml のローカル コピーが正しくアップロードできません。これは 3 つの異なる接続と 2 つの異なるシステムで発生するため、私たちのインターネット接続ではないことを確認しました。
また、output() を Upload() に交換しようとしましたが、同じ結果が得られました。また、 :via => :scp を削除したり、代わりに :sftp を強制しようとすると、同様に失敗します。
関連情報:
$ CAP -V Capistrano V2.5.10
$ ruby -v Ruby 1.8.7(2008-08-11 Patchlevel 72)[i686-Darwin9.6.0
解決
、それはカピストラーノが正常にファイルをアップロードされたように聞こえるが、Railsはそれがdeploy.yml
ファイルを見つけることができないため、起動に失敗しています。これはカピストラーノは、それがCapistranoのエラーのように見せること、deploy:restart
タスクの一部として展開中に起こっている可能性があります。
あなたはカピストラーノは/svr/ourapp/shared/
し、ファイルをアップロードしているとRailsは、ほぼ間違いなく/svr/ourapp/releases/20100104194410/config/
でそれを探している与えてくれた情報に基づいています。
、何をする必要がありますと、そのタスクがfinalize_update後に実行されるようにフックを追加し期待場所に共有データベースファイルをシンボリックリンクタスクを作成しています。たとえばます:
task :symlink_database do
run "ln -s #{shared_path}/database.yml #{latest_release}/config/database.yml"
end
after 'deploy:finalize_update', :symlink_database
他のヒント
namespace :deploy do
task :upload_settings, :roles => :app do
run "mkdir -p #{shared_path}/config/"
top.upload "config/database.yml", "#{shared_path}/config/database.yml", :via => :scp
end
task :symlink_yml, :roles => :app do
run "ln -sf #{shared_path}/config/database.yml #{release_path}/config/database.yml"
end
end
after 'deploy:setup', 'deploy:upload_settings'
after 'deploy:update_code', 'deploy:symlink_yml'
これは、サーバー側のビューから純粋であるが、あなたは、あなたがアップロードに使用しているユーザーがディレクトリのための適切な権限を持っていることを確認するためにチェックしている?
サーバー環境に応じて、ユーザー(またはグループ)を再帰的に変更を行うと、この問題を解決する必要があります。
chown -R user_name_here /srv/ourapp/releases/
chgrp -R group_name_here /srv/ourapp/releases/
また、任意のコードリポジトリなどをクリーンアップすることがありますgit gc
またはsvn cleanup
。ならびに任意のシンボリックリンクを更新します。
「そのようなファイルまたはディレクトリはありません」エラーは、存在しない宛先パスにファイルをコピーしようとすると発生します。私の知る限り、Capistrano の put メソッドと Upload メソッドはファイルの転送を試みるだけで、必要なパスを作成しません。このファイルをアップロードしようとしているときに、config/ ディレクトリ、あるいはshared_path自体が作成されていない可能性はありますか?