Capistrano v3无法清除旧版本

时间:2013-10-23 15:47:27

标签: capistrano

由于我以root身份运行rails应用程序,因此它会在tmp目录中创建root用户所拥有的文件。因为这个

cap production deploy:cleanup

无法删除旧版本,因为它不是以root身份运行。

我查看了capistrano v3代码,但我没有看到以root身份运行cleanup命令的方法。这个选项是否缺失或是否出现此问题,因为我在部署流程的另一个地方做错了。

我以root身份启动应用程序,因为我需要绑定到端口80.

4 个答案:

答案 0 :(得分:11)

您还可以做的是在清理旧版本之前触发任务:

namespace :deploy do

  before :cleanup, :cleanup_permissions

  desc 'Set permissions on old releases before cleanup'
  task :cleanup_permissions do
    on release_roles :all do |host|
      releases = capture(:ls, '-x', releases_path).split
      if releases.count >= fetch(:keep_releases)
        info "Cleaning permissions on old releases"
        directories = (releases - releases.last(1))
        if directories.any?
          directories.each do |release|
            within releases_path.join(release) do
                execute :sudo, :chown, '-R', 'deployuser', 'path/to/your/files/writtend/by/root'
            end
          end
        else
          info t(:no_old_releases, host: host.to_s, keep_releases: fetch(:keep_releases))
        end
      end
    end
  end

end

请注意,您需要为部署用户提供执行此特定sudo命令的权限(使用sudoers定义文件。

答案 1 :(得分:3)

  

我查看了capistrano v3代码,但我没有看到以root身份运行cleanup命令的方法。这个选项是否缺失或是否出现此问题,因为我在部署流程的另一个地方做错了。

Capistrano没有任何秘密,我们依靠您正确设置部署用户的权限,如http://www.capistranorb.com/所述

删除目录需要父目录的write权限,也就是说,给定以下目录结构:

/var/www/releases/
              \- 20131015180000
              \- 20131015181500
              \- 20131015183000

您需要<{1}}目录上的 write 权限,因为该目录中的文件和目录列表存储在目录中。

来自similar StackSverflow question

  

在UNIX和Linux中,删除文件的能力不是由该文件的访问位决定的。它由包含该文件的目录的访问位确定。

来自Wikipedia article on Unix File Permissions

  

写入权限授予修改文件的权限。为目录设置时,此权限授予修改目录中条目的权限。这包括创建文件,删除文件和重命名文件。

答案 2 :(得分:1)

您可能想要做的一件事是在Linux框中创建一个名为appweb的组,并将rootdeploy用户添加到同组。然后,作为部署的一部分,chmod release_pathg+s的{​​{1}}权限,这将确保root用户创建的任何新文件都是可写组的。

然后,您应该能够将旧文件夹删除为deploy用户。

答案 3 :(得分:0)

我遇到了类似的问题,因此,要确认,通过SSH登录我的Web服务器,并尝试rm -rf [directory],由于相同的权限问题也失败了,甚至以管理员身份登录。然而,运行chmod -R 755 [directory]/,然后rm -rf [directory]/确实有效。

要修复它,在项目的silverstripe.rake文件中,我更改了运行的命令: execute :chown, "-R [user]:[group] /path/to/project"

于: execute :chmod, "-R 755 /path/to/project"

到目前为止,在运行cap [release name] deploy

时删除最旧版本时不再存在问题