Capistrano + Rails: Automatically skipping asset compilation when assets have not changed
Prefer to configure Capistrano so Sprockets can reuse its asset cache: https://makandracards.com/makandra/60699-capistrano-speeding-up-sprockets-asset-compile-during-deploy
In medium-sized to large Rails applications, asset compilation can take several minutes. In order to speed up deployment, asset precompilation can be skipped. This card automates the process.
Capistrano 3
Copynamespace :deploy do desc 'Automatically skip asset compile if possible' task :auto_skip_assets do asset_locations = %r(^(Gemfile\.lock|app/assets|lib/assets|vendor/asset)) revisions = [] on roles :app do within current_path do revisions << capture(:cat, 'REVISION').strip end end # Never skip asset compile when servers are running on different code next if revisions.uniq.length > 1 changed_files = `git diff --name-only #{revisions.first}`.split if changed_files.grep(asset_locations).none? puts Airbrussh::Colors.green('** Assets have not changed since last deploy.') invoke 'deploy:skip_assets' end end desc 'Skip asset compile' task :skip_assets do puts Airbrussh::Colors.yellow('** Skipping asset compile.') Rake::Task['deploy:assets:precompile'].clear_actions end end
To use this for all stages, add this line to your Capfile
:
Copybefore 'deploy:starting', 'deploy:auto_skip_assets'
I have been using this in production successfully. To activate it for staging only, put that line into config/deploy/staging.rb
instead.
Note that skip_assets
is a separate task, so you'll still be able to skip assets manually.
Does your version of Ruby on Rails still receive security updates?
Rails LTS provides security patches for unsupported versions of Ruby on Rails (2.3, 3.2, 4.2 and 5.2).