Почему развертывание Capistrano завершается неудачно на ресурсах: прекомпилируется без ошибок? - PullRequest
0 голосов
/ 09 апреля 2020

Я перепробовал все, что мог придумать, но я не могу заставить развертывание работать.

Приложение должно быть развернуто на VPS, размещенном на Alwaysdata и работающем ruby 2.6.2, с использованием Capistrano для развертывания. Это приложение Rails 6.0.2.2, использующее веб-пакет для JS и звездочки для устаревших сценариев, все изображения и CSS.

# On local machine (MacOS)

$ bundle exec cap production deploy
00:00 git:wrapper
00:01 git:check
00:03 deploy:check:directories
00:03 deploy:check:linked_dirs
00:03 deploy:check:make_linked_dirs
00:05 git:clone
00:06 git:update
00:08 git:create_release
00:10 deploy:set_current_revision
00:10 deploy:symlink:linked_files
00:12 deploy:symlink:linked_dirs
00:18 deploy:config:bundler
00:20 bundler:install
00:20 deploy:assets:precompile
#<Thread:0x00007fb35ba959f0@/Users/Goulven/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/sshkit-1.21.0/lib/sshkit/runners/parallel.rb:10 run> terminated with exception (report_on_exception is true):
Traceback (most recent call last):
/Users/Goulven/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/sshkit-1.21.0/lib/sshkit/command.rb:97:in `exit_status=': rake exit status: 1 (SSHKit::Command::Failed)
rake stdout: Nothing written
rake stderr: Nothing written

  INFO [3def24f1] Running bundle exec rake assets:precompile as vtcontrol@ssh-vtcontrol.alwaysdata.net

 DEBUG [3def24f1] Command: cd /home/www/app/releases/20200409174918 && ( export NODE_ENVIRONMENT="production" RAILS_ENV="production" RAILS_GROUPS="" ; bundle exec rake assets:precompile )

Выполнение последней команды локально или на сервере не приводит к ошибкам, только предупреждения:

# On production server:

$ cd /home/www/app/releases/20200409174918 && ( export NODE_ENVIRONMENT="production" RAILS_ENV="production" RAILS_GROUPS="" ; bundle exec rake assets:precompile )
yarn install v1.22.4
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@1.2.12: The platform "linux" is incompatible with this module.
info "fsevents@1.2.12" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
warning " > webpack-dev-server@3.10.3" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
warning "webpack-dev-server > webpack-dev-middleware@3.7.2" has unmet peer dependency "webpack@^4.0.0".
success Already up-to-date.
Done in 0.62s.

Гипотеза, о которой я думал:

  1. Недостаточно ОЗУ. В основном это происходит с Digital Ocean, провайдер исключает эту возможность, и в любом случае он не будет компилироваться при подключении к серверу.
  2. Проблема с node против nodejs. Раньше это меня раздражало, но больше этого не происходит, сначала потому, что я использовал только звездочки и добавил гем mini_racer, который упаковывает узел для Exe cJS, а затем потому, что я включил Bootstrap, используя webpacker вместо Sprockets , таким образом, удаляя зависимость от autoprefixer-rails, которая выдает ошибку , когда рядом с узлом присутствует старая версия nodejs.
  3. Capistrano неправильно интерпретирует предупреждения пряжи / веб-упаковщика о сбоях. Я извлек Bootstrap в его собственное приложение / javascripts / bootstrap. js, потому что webpacker пожаловался на то, что сгенерированный JS был слишком большим, так что это можно исключить. Пряжа жалуется на неудовлетворенные зависимости от сверстников, но это зависимости dev, я не думаю, что это должно иметь значение. Это может быть проблемой, но как я могу это проверить?
  4. Что-нибудь еще, что я должен попробовать? Может ли использование webpack и sprockets вызвать конфликты в производстве, например? Он отлично работает в процессе разработки, и сгенерированные ресурсы не должны перезаписывать друг друга.

Вот соответствующие части моего Gemfile:

# Gemfile

# Use SCSS for stylesheets
gem 'sass-rails', '>= 6'
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 4.0'

group :production do
  # Used to load env vars from an .env file during deploy
  gem 'dotenv-rails'
end

group :development do
  gem 'capistrano', '~> 3.13.0', require: false
  gem 'capistrano-rails', '~> 1.4', require: false
  gem 'capistrano-bundler', '~> 1.6', require: false
  gem 'capistrano-rails-console', require: false
end

И, наконец, соответствующие часть моих Capfile и deploy.rb:

# Capfile

require 'capistrano/bundler'
require 'capistrano/rails'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano/rails/console'
require 'dotenv'
Dotenv.load
# config/deploy.rb

# Setup bundler
# Unset capistrano/bundler default flags because Bundler has deprecated them
set :bundle_flags,      '--quiet'
set :bundle_path,       nil
set :bundle_without,    nil
before 'bundler:install', 'deploy:config:bundler'

# Remove gems no longer used to reduce disk space used
# This command requires loading capistrano/bundler in Capfile
after 'deploy:published', 'bundler:clean'

# Skip migration if files in db/migrate were not modified
# This command requires loading capistrano/rails in Capfile
set :conditionally_migrate, true

# Rails app server manages the database
set :migration_role, :app

# Defaults to nil (no asset cleanup is performed)
# If you use Rails 4+ and you'd like to clean up old assets after each deploy,
# set this to the number of versions to keep
set :keep_assets, 2

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Спасибо, что указали мне в правильном направлении. У меня была такая же ошибка, и это оказалось проблема с памятью. Для тех, у кого такие же проблемы, проверьте, не исчерпана ли у вас память с free -m во время компиляции. Если вы закончили, вы увидите что-то вроде -bash: fork: Cannot allocate memory.

Я использую Digitalocean, и мое решение было добавить пространство подкачки: https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-18-04

0 голосов
/ 14 апреля 2020

Хорошо, после нескольких дней попыток все, что я мог придумать, я попробовал что-то, что уже проверял, но с правильным синтаксисом на этот раз, я думаю, потому что это работает сейчас.

Вот что мне нужно было добавить в конфигурационный файл Capistrano, чтобы обеспечить доступность Yarn при развертывании:

# In deploy.rb
# Add or adjust default_env to append .npm-packages to $PATH:
set :default_env, {
   PATH: '$HOME/.npm-packages/bin/:$PATH',
   NODE_ENVIRONMENT: 'production'
}

Объяснение: Пользователи VPS могут устанавливать двоичные файлы, такие как Yarn, «глобально» (используя npm install --global yarn). Под бинарным файлом бинарный файл установлен в $HOME/.npm-packages/bin, и эта папка добавлена ​​в $PATH для интерактивных сеансов оболочки / входа в систему. Поскольку Capistrano делает все возможное, чтобы НЕ поднять это, мы вынуждены принудительно кормить обновленный $PATH в deploy.rb.

...