Capistrano部署assets预编译失败:SSHKit::Command::Failed错误
问题
此前部署项目无异常,近期执行deploy:assets:precompile任务时突然编译失败。远程服务器运行命令/usr/local/rvm/bin/rvm default do bundle exec rake assets:precompile,yarn安装完成后抛出Error: write EPIPE错误,最终触发SSHKit::Command::Failed: rake exit status: 1异常。
本地执行RAILS_ENV=production bundle exec rake assets:precompile可正常编译,查询得知write EPIPE或与内存泄漏相关,但无法理解突发原因。本地yarn版本为1.22.19,远程服务器为1.22.5。
错误日志:
00:10 deploy:assets:precompile 01 /usr/local/rvm/bin/rvm default do bundle exec rake assets:precompile 01 01 yarn install v1.22.5 01 [1/4] Resolving packages... 01 log writing failed. "\xE2" from ASCII-8BIT to UTF-8 01 ⠁ 01 01 01 [2/4] Fetching packages... 01 info fsevents@2.3.2: The platform "linux" is incompatible with this module. info "fsevents@2.3.2" is an optional dependency and failed compatibility check. Excluding it from installation. info fsevents@1.2.13: The platform "linux" is incompatible with this module. info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation. [3/4] Linking dependencies... 01 warning " > @stripe/react-stripe-js@1.4.0" has incorrect peer dependency "react@^16.8.0 || ^17.0.0". 01 warning " > @stripe/react-stripe-js@1.4.0" has incorrect peer dependency "react-dom@^16.8.0 || ^17.0.0". 01 warning " > react-daterange-picker@2.0.1" has incorrect peer dependency "moment-range@^3.0.3". 01 01 warning " > react-daterange-picker@2.0.1" has incorrect peer dependency "react@0.14.x || 15.x.x || 16.x.x". warning " > react-daterange-picker@2.0.1" has incorrect peer dependency "react-dom@0.14.x || 15.x.x || 16.x.x". warning " > react-day-picker@7.4.8" has incorrect peer dependency "react@~0.13.x || ~0.14.x || ^15.0.0 || ^16.0.0". warning "react-router-dom > react-router > mini-create-react-context@0.4.1" has incorrect peer dependency "react@^0.14.0 || ^15.0.0 || ^16.0.0 || ^17… [4/4] Building fresh packages... 01 01 Done in 9.94s. 01 Compiling... 01 Compilation failed: 01 events.js:174 01 throw er; // Unhandled 'error' event 01 ^ 01 01 Error: write EPIPE 01 at ChildProcess.target._send (internal/child_process.js:762:20) 01 at ChildProcess.target.send (internal/child_process.js:634:19) 01 at ChildProcessWorker.send (/var/www/vhosts/admired-leadership/releases/20230124214219/node_modules/jest-worker/build/workers/ChildProcessWorker.js:291:1… 01 at WorkerPool.send (/var/www/vhosts/admired-leadership/releases/20230124214219/node_modules/jest-worker/build/WorkerPool.js:32:34) 01 at Farm._process (/var/www/vhosts/admired-leadership/releases/20230124214219/node_modules/jest-worker/build/Farm.js:129:10) 01 at Farm._enqueue (/var/www/vhosts/admired-leadership/releases/20230124214219/node_modules/jest-worker/build/Farm.js:152:10) 01 at Farm._push (/var/www/vhosts/admired-leadership/releases/20230124214219/node_modules/jest-worker/build/Farm.js:159:12) 01 at Promise (/var/www/vhosts/admired-leadership/releases/20230124214219/node_modules/jest-worker/build/Farm.js:90:14) 01 at new Promise (<anonymous>) 01 at Farm.doWork (/var/www/vhosts/admired-leadership/releases/20230124214219/node_modules/jest-worker/build/Farm.js:56:12) 01 at JestWorker._callFunctionWithArgs (/var/www/vhosts/admired-leadership/releases/20230124214219/node_modules/jest-worker/build/index.js:143:23) 01 at TaskRunner.runTask (/var/www/vhosts/admired-leadership/releases/20230124214219/node_modules/@rails/webpacker/node_modules/terser-webpack-plugin/dist/T… 01 at enqueue (/var/www/vhosts/admired-leadership/releases/20230124214219/node_modules/@rails/webpacker/node_modules/terser-webpack-plugin/dist/TaskRunner.j… 01 at cache.get.then (/var/www/vhosts/admired-leadership/releases/20230124214219/node_modules/@rails/webpacker/node_modules/terser-webpack-plugin/dist/TaskR… 01 Emitted 'error' event at: 01 at process.nextTick (internal/child_process.js:766:39) 01 at process._tickCallback (internal/process/next_tick.js:61:11) 01 #<Thread:0x00000001312c51c8@/Users/jaepark/.rvm/gems/ruby-2.6.6/gems/sshkit-1.19.1/lib/sshkit/runners/parallel.rb:10 run> terminated with exception (report_on_exception is true): Traceback (most recent call last): 13: from /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/sshkit-1.19.1/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute' 12: from /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/sshkit-1.19.1/lib/sshkit/backends/abstract.rb:31:in `run' 11: from /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/sshkit-1.19.1/lib/sshkit/backends/abstract.rb:31:in `instance_exec' 10: from /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/capistrano-rails-1.4.0/lib/capistrano/tasks/assets.rake:67:in `block (4 levels) in <top (required)>' 9: from /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/sshkit-1.19.1/lib/sshkit/backends/abstract.rb:92:in `within' 8: from /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/capistrano-rails-1.4.0/lib/capistrano/tasks/assets.rake:68:in `block (5 levels) in <top (required)>' 7: from /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/sshkit-1.19.1/lib/sshkit/backends/abstract.rb:100:in `with' 6: from /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/capistrano-rails-1.4.0/lib/capistrano/tasks/assets.rake:69:in `block (6 levels) in <top (required)>' 5: from /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/sshkit-1.19.1/lib/sshkit/backends/abstract.rb:80:in `execute' 4: from /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/sshkit-1.19.1/lib/sshkit/backends/abstract.rb:148:in `create_command_and_execute' 3: from /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/sshkit-1.19.1/lib/sshkit/backends/abstract.rb:148:in `tap' 2: from /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/sshkit-1.19.1/lib/sshkit/backends/abstract.rb:148:in `block in create_command_and_execute' 1: from /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/sshkit-1.19.1/lib/sshkit/backends/netssh.rb:169:in `execute_command' /Users/jaepark/.rvm/gems/ruby-2.6.6/gems/sshkit-1.19.1/lib/sshkit/command.rb:97:in `exit_status=': rake exit status: 1 (SSHKit::Command::Failed) yarn install v1.22.5
解决办法
- 统一yarn版本:将远程服务器的yarn升级到与本地一致的1.22.19,消除版本差异引发的兼容问题:
npm install -g yarn@1.22.19 - 检查服务器内存:
write EPIPE通常是子进程因内存不足被终止导致,执行free -h查看内存使用情况。若内存不足,可临时添加swap空间或升级服务器配置。 - 清理缓存:
- 清理yarn缓存:
yarn cache clean - 清理Rails资产缓存:
bundle exec rake assets:clobber
- 清理yarn缓存:
- 调整webpack并行编译配置:若为webpacker的terser插件并行编译占用过多内存,可修改
config/webpack/production.js,减少并行进程数:const TerserPlugin = require('terser-webpack-plugin'); module.exports = { optimization: { minimizer: [ new TerserPlugin({ parallel: 1, // 可根据服务器CPU核心数调整 }), ], }, }; - 修复依赖兼容性:日志中显示多个React相关依赖存在peer dependency警告,虽不一定直接导致编译失败,但可尝试更新依赖到兼容版本,比如更新
@stripe/react-stripe-js适配当前React版本,或调整React版本匹配依赖要求。
内容的提问来源于stack exchange,提问作者Jae
相关产品推荐
相关产品推荐

