capistrano put () и upload () оба не работают - PullRequest
2 голосов
/ 04 января 2010

В Capistrano я развертываю приложение Rails из Mac OS X 10.5 в CentOS 5.2

Обратите внимание, что deploy.rb и серверная среда не изменились за год.

В нашем файле 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 не может быть загружена должным образом. Я убедился, что это не наше интернет-соединение, так как это происходит на трех разных соединениях и двух разных системах.

Я также пытался поменять метод put () на 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]

Ответы [ 4 ]

4 голосов
/ 03 мая 2010
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'
4 голосов
/ 05 января 2010

Если я правильно понимаю ваш вопрос, похоже, что Capistrano успешно загружает файлы, но Rails не запускается, потому что не может найти файл deploy.yml. Это может происходить во время развертывания Capistrano как часть задачи deploy:restart, что делает его похожим на ошибку Capistrano.

На основании предоставленной вами информации Capistrano загружает файл в /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
1 голос
/ 04 января 2010

Это чисто с серверной стороны, но вы проверили, чтобы убедиться, что пользователь, которого вы используете для загрузки, имеет надлежащие разрешения для каталога?

Выполнение рекурсивного изменения для пользователя (или группы) в зависимости от среды вашего сервера должно исправить это.

chown -R user_name_here /srv/ourapp/releases/
chgrp -R group_name_here /srv/ourapp/releases/

Вы также можете очистить любые репозитории кода, например, git gc или svn cleanup. А также обновление любых символических ссылок.

0 голосов
/ 04 января 2010

Ошибка «Нет такого файла или каталога» возникает при попытке скопировать файл в путь назначения, который не существует. Насколько я знаю, методы загрузки и загрузки Capistrano просто пытаются передать файл, но не делают требуемый путь. Возможно ли, что каталог config / или даже сам shared_path не был создан при попытке загрузить этот файл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...