【问题标题】:capistrano put() and upload() both failingcapistrano put() 和 upload() 都失败了
【发布时间】:2010-01-04 19:48:54
【问题描述】:

使用 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 也同样失败。

相关信息:

$ 上限 -V Capistrano v2.5.10

$ 红宝石 -v ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9.6.0]

【问题讨论】:

  • 您能否提供更多有关“上传”任务的背景信息?它是仅上传 database.yml 文件还是还上传其他文件?其他文件是否正确上传?另外,您能否从 Capistrano 的错误消息中包含更多信息?尽可能多的输出会有所帮助。
  • 只是database.yml文件。这是完整的错误信息...文件成功上传到src路径:$ cat /srv/app/shared/database.yml | wc -l -> 99我也可以验证dest路径是否存在。
  • 这个错误是从哪里来的?这是您从 Rails 应用程序本身获得的东西,还是在 Capistrano 部署期间获得的东西?我以为是在部署期间,但这没有意义,现在我想多了,因为put 命令被放入共享目录,并且找不到文件错误在发布目录中.

标签: ruby-on-rails deployment capistrano


【解决方案1】:

如果我正确理解您的问题,听起来 Capistrano 已成功上传文件,但 Rails 无法启动,因为它找不到 deploy.yml 文件。这可能在 Capistrano 部署期间作为 deploy:restart 任务的一部分发生,使其看起来像 Capistrano 错误。

根据您提供给 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

【讨论】:

  • 感谢 Emily,我最终做到了。但是,出现了一个新问题 - capistrano 现在在启动服务器重新启动后的某个时间删除最新的发布目录。非常令人沮丧。
  • 最可能的原因可能是deploy:rollback 因某种原因被触发。这绝对是默认回滚任务的一部分。祝你好运!
【解决方案2】:
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'

【讨论】:

    【解决方案3】:

    这纯粹是从服务器端的角度来看,但是您是否检查过以确保您用来上传的用户对目录具有适当的权限?

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 您好,上传时路径都存在。这个 deploy.rb 已经使用了一年多,几乎没有变化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 2014-05-28
      • 2017-12-17
      • 2015-07-10
      • 1970-01-01
      相关资源
      最近更新 更多