capistrano put()和upload()都失败了

时间:2010-01-04 19:48:55

标签: ruby-on-rails deployment capistrano

使用capistrano,我正在部署从Mac OS X 10.5到CentOS 5.2的Rails应用程序

请注意,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 个答案:

答案 0 :(得分:4)

如果我理解你的问题,听起来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 :(得分:4)

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'

答案 2 :(得分:1)

这纯粹来自服务器端视图,但您是否已检查以确保您用于上传的用户具有该目录的适当权限?

根据您的服务器环境对用户(或组)进行递归更改应解决此问题。

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

您可能还想清理所有代码存储库,例如git gcsvn cleanup。以及更新任何符号链接。

答案 3 :(得分:0)

尝试将文件复制到不存在的目标路径时,会出现“无此类文件或目录”错误。据我所知,Capistrano的put和upload方法只是尝试传输文件,但是没有制作所需的路径。当您尝试上传此文件时,是否可能尚未创建config /目录,甚至还没有创建shared_pa​​th本身?