Capistrano在钩子之前/之后,use_sudo,一些不起作用的东西

时间:2013-12-24 12:43:11

标签: ruby-on-rails deployment capistrano

我的deploy.rb

中有以下配置
before("deploy:cleanup") { set :use_sudo, true }
  after "deploy:restart", "deploy:cleanup"
after("deploy:cleanup") { set :use_sudo, false }

这是因为我的设置中的其他一些因素会创建具有不同用户的文件,我需要能够清理它们。在其他地方,我将其设置为false默认值。

问题是,当我运行deploy时,我无法运行cleanup,我收到权限错误,并且我看到生成的命令为

ls -1dt /u/apps/MYAPP/releases/* | tail -n +6 |  xargs rm -rf

但是,如果我直接运行deploy:cleanup,它可以正常使用以下命令。

sudo -p 'sudo password: ' ls -1dt /u/apps/netprice/releases/* | tail -n +6 | sudo -p 'sudo password: ' xargs rm -rf

我不确定这是否符合预期,我理解capistrano错误,如果有更清洁(:P)的方法来实现这个目标?

我正在使用Rails 3.2和capistrano 2.15

2 个答案:

答案 0 :(得分:1)

您的代码无效的原因是您尝试设置错误的配置密钥。 deploy:cleanup任务在内部使用try_sudo方法。如果您看到该方法的source,您会注意到它会根据run_method键而不是use_sudo的内容执行命令。

这意味着,如果您将代码更改为set :run_method, :sudo(然后又返回:run),您应该得到所需内容。

作为旁注,当capistrano启动时,use_sudo键实际为used internally,以将适当的值设置为run_method

答案 1 :(得分:0)

通常的方法是使用Unix权限组:使两个用户成为同一权限组的成员,并向组成员授予删除操作(+ w)。然后,您的部署用户'将能够删除其他用户创建的文件。