capistrano / capistrano/rails

Capistrano::FileNotFound: Rails assets manifest file not found when using --print-config-variables option

Open
#223 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Ruby
Stars
901
Forks
262
PR merge metrics
No merged PRs in 30d

Description

### Steps to reproduce
Do a cold deploy (where the `/current` path does not exist).
Deploy with `cap --print-config-variables deploy`

### Expected behavior
The assets_manifest file should be copied from the current release_path `/releases/20180718040802/public/assets/.sprockets-manifest-abcd` to `/releases/20180718040802/assets_manifest_backup/.sprockets-manifest-abcd`.

See in the error trace below: `ls: cannot access '/home/deploy-user/test-app/current/public/assets/.sprockets-manifest*': No such file or directory`

Since the `/current` path does not yet exist, the backup fails. Maybe(?) the `/current` should not be getting used at all for the backup and instead it should be the release_path that should be used at all times?

### Actual behavior
An error is thrown:

```
WARN Rails assets manifest file not found.
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as deploy-user@127.0.0.1: Rails assets manifest file not found.

Caused by:
Capistrano::FileNotFound: Rails assets manifest file not found.

Tasks: TOP => deploy:assets:backup_manifest
(See full trace by running task with --trace)
The deploy has failed with an error: Exception while executing as deploy-user@127.0.0.1: Rails assets manifest file not found.

** DEPLOY FAILED
** Refer to log/capistrano.log for details. Here are the last 20 lines:

DEBUG [35002d68] Finished in 0.101 seconds with exit status 0 (successful).
INFO [16952ff6] Running /usr/bin/env mkdir -p /home/deploy-user/test-app/releases/20180718040802/assets_manifest_backup as deploy-user@127.0.0.1
DEBUG [16952ff6] Command: cd /home/deploy-user/test-app/releases/20180718040802 && /usr/bin/env mkdir -p /home/deploy-user/test-app/releases/20180718040802/assets_manifest_backup
INFO [eeef99ea] Finished in 0.103 seconds with exit status 0 (successful).
DEBUG [c149607f] Running /usr/bin/env ls /home/deploy-user/test-app/current/public/assets/.sprockets-manifest* as deploy-user@172.16.1.153
DEBUG [c149607f] Command: cd /home/deploy-user/test-app/releases/20180718040802 && /usr/bin/env ls /home/deploy-user/test-app/current/public/assets/.sprockets-manifest*
INFO [502f9b11] Finished in 0.101 seconds with exit status 0 (successful).
DEBUG [a569bd45] Running /usr/bin/env ls /home/deploy-user/test-app/current/public/assets/.sprockets-manifest* as deploy-user@127.0.0.1
DEBUG [a569bd45] Command: cd /home/deploy-user/test-app/releases/20180718040802 && /usr/bin/env ls /home/deploy-user/test-app/current/public/assets/.sprockets-manifest*
DEBUG [2f0f2f0c] ls: cannot access '/home/deploy-user/test-app/current/public/assets/.sprockets-manifest*': No such file or directory
DEBUG [2f0f2f0c] Finished in 0.105 seconds with exit status 2 (failed).
DEBUG [e28e7923] Running /usr/bin/env ls /home/deploy-user/test-app/current/public/assets/manifest*.* as deploy-user@127.0.0.1
DEBUG [e28e7923] Command: cd /home/deploy-user/test-app/releases/20180718040802 && /usr/bin/env ls /home/deploy-user/test-app/current/public/assets/manifest*.*
DEBUG [924d8181] ls: cannot access '/home/deploy-user/test-app/current/public/assets/.sprockets-manifest*': No such file or directory
DEBUG [924d8181] Finished in 0.112 seconds with exit status 2 (failed).
DEBUG [8b58a53b] Running /usr/bin/env ls /home/deploy-user/test-app/current/public/assets/manifest*.* as deploy-user@172.16.1.153
DEBUG [8b58a53b] Command: cd /home/deploy-user/test-app/releases/20180718040802 && /usr/bin/env ls /home/deploy-user/test-app/current/public/assets/manifest*.*
DEBUG [d9b7d0fe] ls: cannot access '/home/deploy-user/test-app/current/public/assets/manifest*.*': No such file or directory
DEBUG [d9b7d0fe] Finished in 0.105 seconds with exit status 2 (failed).
WARN Rails assets manifest file not found.
```

## Possible Fix?

```diff
diff --git i/lib/capistrano/tasks/assets.rake w/lib/capistrano/tasks/assets.rake
index f01a62f..de30734 100644
--- i/lib/capistrano/tasks/assets.rake
+++ w/lib/capistrano/tasks/assets.rake
@@ -101,8 +101,14 @@ namespace :deploy do
end
end

+ def assets_manifests_path
+ fetch(:assets_manifests).map do |pattern|
+ release_path.join("public", fetch(:assets_prefix), pattern)
+ end
+ end
+
def detect_manifest_path
- fetch(:assets_manifests).each do |candidate|
+ assets_manifests_path.each do |candidate|
return capture(:ls, candidate).strip.gsub(/(\r|\n)/, ' ') if test(:ls, candidate)
end
msg = 'Rails assets manifest file not found.'
@@ -130,10 +136,6 @@ namespace :load do
task :defaults do
set :assets_roles, fetch(:assets_roles, [:web])
set :assets_prefix, fetch(:assets_prefix, 'assets')
- set :assets_manifests, -> {
- %w[.sprockets-manifest* manifest*.*].map do |pattern|
- release_path.join("public", fetch(:assets_prefix), pattern)
- end
- }
+ set :assets_manifests, %w[.sprockets-manifest* manifest*.*]
end
end
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start in lib/capistrano/tasks/assets.rake, especially deploy:assets:backup_manifest and detect_manifest_path. Reproduce the cold deploy with cap --print-config-variables deploy, then compare the manifest candidates with the issue's proposed release_path-based change. Done means the manifest is found and backed up from the current release when no current path exists.

Written by the indexing model from the issue text.

Assessment

Tech stack
rails, ruby
Domain
devops, release
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.