【问题标题】:Capistrano fails to remove node modules during cleanupCapistrano 在清理期间无法删除节点模块
【发布时间】:2017-10-27 09:19:30
【问题描述】:

我正在尝试部署 Rails 5.1 应用程序。我已经多次部署该应用程序没有问题,但现在,我突然从 Capistrano 收到此错误消息

00:13 deploy:cleanup

SSHKit::Command::Failed: rm exit status: 1                                                                             
rm stdout: Nothing written                                                                                             
rm stderr: rm: cannot remove '/opt/www/absence-
registrator/releases/20171017091250/node_modules/jquery/dist/jquery.js': 
Permission denied

Tasks: TOP => deploy:cleanup                                                                                           
(See full trace by running task with --trace)                                                                         
The deploy has failed with an error: Exception while executing as 
user@myapp.com: rm exit status: 1           │
rm stdout: Nothing written                                                                                             
rm stderr: rm: cannot remove '/opt/www/absence-
registrator/releases/20171017091250/node_modules/jquery/dist/jquery.js':Permission denied                                                                                                     
rm: cannot remove '/opt/www/absence-registrator/releases/20171017091250/node_modules/jquery/dist/jquery.slim.js': Permission denied                                                                                                           rm: cannot remove '/opt/www/absence-registrator/releases/20171017091250/node_modules/jquery/dist/jquery.min.js': Permission denied                                                                                                            rm: cannot remove '/opt/www/absence-registrator/releases/20171017091250/node_modules/jquery/dist/jquery.min.map': Permission denied

Capistrano 用于删除旧版本的部署用户似乎没有足够的权限来删除 node_modules

我尝试通过将 node_modules 设置为链接目录来解决此问题:

set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets node_modules}

但这也没有解决问题。

有人知道如何解决这个问题吗?

感谢您的帮助,

安东尼

ps:这是当前目录下 ls -lt 命令的输出:

-rw-rw-r--  1 deploy deploy  864 Oct 27 14:04 Capfile
-rw-rw-r--  1 deploy deploy 2454 Oct 27 14:04 Gemfile
-rw-rw-r--  1 deploy deploy 8520 Oct 27 14:04 Gemfile.lock
-rw-rw-r--  1 deploy deploy  148 Oct 27 14:04 README.md
-rw-rw-r--  1 deploy deploy  227 Oct 27 14:04 Rakefile
drwxrwxr-x 10 deploy deploy 4096 Oct 27 14:04 app
drwxrwxr-x  2 deploy deploy 4096 Oct 27 14:04 bin
drwxrwxr-x  6 deploy deploy 4096 Oct 27 14:04 config
-rw-rw-r--  1 deploy deploy  130 Oct 27 14:04 config.ru
drwxrwxr-x  3 deploy deploy 4096 Oct 27 14:04 db
drwxrwxr-x  4 deploy deploy 4096 Oct 27 14:04 lib
-rw-rw-r--  1 deploy deploy  103 Oct 27 14:04 package.json
drwxrwxr-x  8 deploy deploy 4096 Oct 27 14:04 spec
drwxrwxr-x  2 deploy deploy 4096 Oct 27 14:04 vendor
-rw-rw-r--  1 deploy deploy  228 Oct 27 14:04 yarn.lock
drwxrwxr-x  2 deploy deploy 4096 Oct 27 13:58 assets_manifest_backup
drwxrwxr-x  3 deploy deploy 4096 Oct 27 13:58 public
lrwxrwxrwx  1 deploy deploy   48 Oct 27 13:58 node_modules -> 
/opt/www/absence-registrator/shared/node_modules
drwxrwxr-x  2 deploy deploy 4096 Oct 27 13:58 tmp
lrwxrwxrwx  1 deploy deploy   39 Oct 27 13:58 log -> /opt/www/absence-
registrator/shared/log
-rw-rw-r--  1 deploy deploy   41 Oct 27 13:58 REVISION

【问题讨论】:

  • 也许改变用户和组,例如chown -R deploy:deploy /opt/www/absence-registrator/shared/log

标签: ruby-on-rails capistrano


【解决方案1】:

根本原因

  • 您以“sudo 方式”设置 NodeJS/npm,因此 npm 使用 root 所有者安装包
  • Capistrano 删除旧版本(如果我没记错的话,它默认只保留 10 个最新版本)以节省空间。由于您使用deploy 用户部署应用程序,因此它无权删除所有者为root 的文件
  • 您之前没有看到此错误,因为您的发布数量未达到保留发布的最大数量(例如:10 个发布)

解决方案

由于您将node_modules 设为共享目录,因此您无需使用 sudo 修复 npm 问题。您可以简单地将releases 文件夹的所有者递归地更改为deploy:deploy。目的是使旧版本可以成功删除。该命令将是

sudo chown -R deploy:deploy /opt/www/absence-registrator/releases

【讨论】:

    【解决方案2】:

    您似乎对npmnode_modules 设置的权限有问题。您可以查看official documentation 以解决问题

    【讨论】:

    • 嗨尼基塔,感谢您的帮助。我试图更改权限,但这并没有解决问题
    • 你能显示当前发布文件夹的ls -lt 输出吗?
    • 当然,我把它放在我的问题帖子中的 ps 中
    【解决方案3】:

    尝试在您的部署者用户下对您服务器上的目录授予权限

    sudo chown -R $USER /opt
    

    【讨论】:

      猜你喜欢
      • 2018-12-06
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2019-01-21
      • 2015-07-16
      • 1970-01-01
      相关资源
      最近更新 更多