Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The deploy doesn't create node_modules and raises Sprockets::FileNotFound (after upgrading to rails 7) #259

Open
collimarco opened this issue Sep 28, 2022 · 3 comments

Comments

@collimarco
Copy link

Steps to reproduce

After upgrading an application from Rails 6.1 to Rails 7.0 the Capistrano deployment fails.
The deployment has always worked (for years) and the application still works fine in development / test environments.

This is the error when running cap production deploy:

cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as user@server1.myapp.com: rake exit status: 1
rake stdout: Nothing written
rake stderr: rake aborted!
Sprockets::FileNotFound: couldn't find file 'emojionearea/dist/emojionearea' with type 'text/css'
Checked in these paths: 
  /home/myapp/www/myapp/releases/20220928123230/app/assets/config
  /home/myapp/www/myapp/releases/20220928123230/app/assets/images
  /home/myapp/www/myapp/releases/20220928123230/app/assets/javascripts
  /home/myapp/www/myapp/releases/20220928123230/app/assets/stylesheets
  /home/myapp/www/myapp/releases/20220928123230/vendor/assets/javascripts
  /home/myapp/www/myapp/releases/20220928123230/vendor/assets/stylesheets
  /home/myapp/www/myapp/shared/bundle/ruby/3.0.0/gems/jquery-rails-4.5.0/vendor/assets/javascripts
  /home/myapp/www/myapp/shared/bundle/ruby/3.0.0/gems/actiontext-7.0.4/app/assets/javascripts
  /home/myapp/www/myapp/shared/bundle/ruby/3.0.0/gems/actiontext-7.0.4/app/assets/stylesheets
  /home/myapp/www/myapp/shared/bundle/ruby/3.0.0/gems/actioncable-7.0.4/app/assets/javascripts
  /home/myapp/www/myapp/shared/bundle/ruby/3.0.0/gems/activestorage-7.0.4/app/assets/javascripts
  /home/myapp/www/myapp/shared/bundle/ruby/3.0.0/gems/actionview-7.0.4/lib/assets/compiled
  /home/myapp/www/myapp/releases/20220928123230/node_modules
/home/myapp/www/myapp/releases/20220928123230/app/assets/stylesheets/application.scss:13
/home/myapp/www/myapp/shared/bundle/ruby/3.0.0/gems/sprockets-4.1.1/lib/sprockets/resolve.rb:62:in `resolve!'
...

After some investigation on the server I see that:

  • the folder /home/myapp/www/myapp/releases/20220928123230/ is present
  • the folder /home/myapp/www/myapp/releases/20220928123230/node_modules is not present (and this is where the file emojionearea/dist/emojionearea should be found)

This probably means that the problem is not Sprockets (which is looking in the right path) but the fact that node_modules is not generated during the deploy. So, why the command yarn install is not executed during the deploy? Everything used to work before the upgrade to Rails 7.

Expected behavior

The task deploy:assets:precompile should first download the Yarn modules to the node_modules folder on the server, then run rake assets:precompile.

Actual behavior

When you deploy, assets:precompile raises an exception Sprockets::FileNotFound.

System configuration

Rails 7.0.4
capistrano 3.17.1
capistrano-rails 1.6.2

@collimarco
Copy link
Author

collimarco commented Sep 28, 2022

I found a solution! I share it here in case anyone has the same issue.

Here's the code that I use:

namespace :yarn do
  task :install do
    on release_roles(fetch(:assets_roles)) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :rake, "yarn:install"
        end
      end
    end
  end
end
after 'bundler:install', 'yarn:install'

Probably this task should be added directly to this gem.

The issue was introduced by this change in the Rails repository: rails/rails#43641

@haseebeqx
Copy link

The code in https://github.com/rails/webpacker/blob/master/docs/deployment.md worked for me.

before "deploy:assets:precompile", "deploy:yarn_install"
namespace :deploy do
  desc "Run rake yarn install"
  task :yarn_install do
    on roles(:web) do
      within release_path do
        execute("cd #{release_path} && yarn install --silent --no-progress --no-audit --no-optional")
      end
    end
  end
end

@giedriusr
Copy link

Is this a temporary solution?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants