Wrap node commands with Capistrano

This code is based on what the rvm1-capistrano and capistrano-nvm gems
do, but simplified a bit to take advantage of the `fnm exec` command.

Since ExecJS will check for a JavaScript runtime every time the
application is started, we need to include commands like `bundle` (used
when running `bin/delayed_job`), `puma` and `rake`, so Node.js is found
when running these commands. I'm not sure whether `pumactl` is also
necessary, but I've added it for consistency.

We're also including the default commands gems like capistrano-nvm use
because we will add the `npm` command in the near future.

Note that, in order to setup FNM, we need to enter the actual release
folder (using `within release_path` isn't enough). So we have to run
this task after the actual release is created; otherwise many commands
would run in the previous release's folder.
This commit is contained in:
Javi Martín
2023-07-22 06:42:28 +02:00
parent 8ab66dd12f
commit f209325b90

View File

@@ -46,6 +46,7 @@ set :fnm_setup_command, -> do
"cd #{release_path} && fnm env > /dev/null && eval \"$(fnm env)\"" "cd #{release_path} && fnm env > /dev/null && eval \"$(fnm env)\""
end end
set :fnm_install_node_command, -> { "#{fetch(:fnm_setup_command)} && fnm use --install-if-missing" } set :fnm_install_node_command, -> { "#{fetch(:fnm_setup_command)} && fnm use --install-if-missing" }
set :fnm_map_bins, %w[bundle node npm puma pumactl rake yarn]
set :puma_conf, "#{release_path}/config/puma/#{fetch(:rails_env)}.rb" set :puma_conf, "#{release_path}/config/puma/#{fetch(:rails_env)}.rb"
@@ -59,6 +60,8 @@ namespace :deploy do
Rake::Task["delayed_job:default"].clear_actions Rake::Task["delayed_job:default"].clear_actions
Rake::Task["puma:smart_restart"].clear_actions Rake::Task["puma:smart_restart"].clear_actions
after "git:create_release", "map_node_bins"
after :updating, "install_node" after :updating, "install_node"
after :updating, "install_ruby" after :updating, "install_ruby"
@@ -120,6 +123,20 @@ task :install_node do
end end
end end
task :map_node_bins do
on roles(:app) do
within release_path do
with rails_env: fetch(:rails_env) do
prefix = "#{fetch(:fnm_setup_command)} && fnm exec"
fetch(:fnm_map_bins).each do |command|
SSHKit.config.command_map.prefix[command.to_sym].unshift(prefix)
end
end
end
end
end
task :refresh_sitemap do task :refresh_sitemap do
on roles(:app) do on roles(:app) do
within release_path do within release_path do