EC2 a manqué de mémoire pendant que les actifs de capistrano: la précompilation était en cours d'exécution, et à la suite du redémarrage de l'instance, le déploiement s'est terminé à mi-chemin. Si le serveur Web s'exécute en fonction du résultat de la compilation à moitié terminé et qu'une erreur d'exécution se produit, je ne peux pas le voir, j'ai donc essayé de le ramener à un état propre.
rails (5.2.4.2)
capistrano (3.11.0)
sprockets (3.7.2)
sprockets-rails (3.2.1)
current_path est ce chemin
shared_path doit être ce chemin
En conclusion, voici ce que vous devez faire.
Il y a une mise en garde.
capistrano est livré en standard avec des commandes comme deploy: clobber_assets
qui sont susceptibles d'effacer des actifs.
Cela signifie que vous pouvez l'effacer à la main sans l'utiliser. La raison sera décrite plus tard.
Tout d'abord, la structure à l'intérieur du / var / www / app_name
du serveur déployé par capistrano est la suivante.
├── actuel (le lien symbolique est attaché au dernier répertoire des versions)
├── releases
│ ├── 20200601101105
│ ├── 20200601102714
│ └── 20200601105159
├── repo
├── revisions.log
└── shared
Sous ce courant, c'est-à-dire sous les versions / 2006001105159, il sera configuré comme dans le référentiel de votre projet. Il devrait y avoir app /, config / et public /.
Sous ce public / est-il des actifs / emballés avec des fichiers statiques construits ... prétendant être
/ var / www / app_name / current / public / assets
est un lien symbolique vers / var / www / app_name / shared / assets
.
Et / var / www / app_name / current / tmp / cache
est aussi un lien symbolique vers / var / www / app_name / shared / tmp / cache
.
[Rails Guide Asset Cash Store](https://railsguides.jp/asset_pipeline.html#%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%81% AE% E3% 82% AD% E3% 83% A3% E3% 83% 83% E3% 82% B7% E3% 83% A5% E3% 82% B9% E3% 83% 88% E3% 82% A2)
Les Sprockets par défaut mettent en cache les actifs dans tmp / cache / assets dans les environnements de développement et de production.
Comme il est écrit, il y a un cache du résultat de la compilation dans tmp / cache / assets, supprimez-le donc.
Dans le cas de capistrano, / var / www / app_name / shared / tmp / cache / assets
correspond à cela, supprimez-le.
Outre les atouts: cache de précompilation, Sprockets conserve également le fichier de résultat du déploiement. Le code dans Sprockets dit quelque chose comme ceci:
module Sprockets
module Exporters
# Writes a an asset file to disk
class FileExporter < Exporters::Base
def skip?(logger)
if ::File.exist?(target)
logger.debug "Skipping #{ target }, already exists"
true
else
logger.info "Writing #{ target }"
false
end
end
def call
write(target) do |file|
file.write(asset.source)
end
end
end
end
end
Lors du déploiement: assets: precompile, avez-vous vu un tas de journaux dans la sortie standard? C'est probablement le code ci-dessus qui s'en rend compte.
Voir logger.info" Ecriture
.
Comme ça:
01 I, [2020-06-01T08:56:09.691790 #10361] INFO -- : Writing /var/www/app_name/releases/20200601085319/public/assets/develop/application-232387090aed00e6b038…
01 I, [2020-06-01T08:56:09.692557 #10361] INFO -- : Writing /var/www/app_name/releases/20200601085319/public/assets/develop/application-232387090aed00e6b038…
01 I, [2020-06-01T08:56:17.418572 #10361] INFO -- : Writing /var/www/app_name/releases/20200601085319/public/assets/lb-0002/application-d1bedc9937772b59211a…
01 I, [2020-06-01T08:56:17.418856 #10361] INFO -- : Writing /var/www/app_name/releases/20200601085319/public/assets/lb-0002/application-d1bedc9937772b59211a…
01 I, [2020-06-01T08:56:21.414096 #10361] INFO -- : Writing /var/www/app_name/releases/20200601085319/public/assets/lb-0003/application-5a60e0a26af1e40a9188…
01 I, [2020-06-01T08:56:21.414368 #10361] INFO -- : Writing /var/www/app_name/releases/20200601085319/public/assets/lb-0003/application-5a60e0a26af1e40a9188…
Si vous êtes coincé dans ce "saut?" Jugement.
En d'autres termes, dans cet exemple, si le fichier contenant le résumé de / var / www / app_name / releases / 20200601085319 / public / assets / develop / application-232387090aed00e6b038…
existe déjà,
Sprockets n'exporte pas les fichiers.
Donc, avec capistrano, si le même fichier existe dans / var / www / app_name / shared / assets
, il sera ignoré par ce saut?.
Vous devez l'effacer.
capistrano affichera toutes les commandes avec cap -T
.
Vous pouvez trouver une telle commande en relation avec les actifs.
cap deploy:cleanup_assets # Cleanup expired assets
cap deploy:clobber_assets # Clobber assets
La commande deploy: clobber_assets
n'est-elle pas fournie par défaut?
clobber signifie frapper. Il semble qu'ils vous obligeront à faire de nouveaux actifs! C'est bon! Si vous y réfléchissez et que vous l'utilisez, il ne se comportera pas comme prévu.
$ bundle exec cap review deploy:clobber_assets
00:00 deploy:clobber_assets
01 bundle exec rake assets:clobber
01 I, [2020-06-01T11:22:46.062204 #6756] INFO -- : Removed /var/www/app_name/releases/20200601094959/public/assets
01 Removed webpack output path directory /var/www/app_name/releases/20200601094959/public/packs
Il semble que les actifs sont supprimés avec le répertoire, mais si vous regardez de plus près, ce n'est qu'un lien symbolique qui est supprimé et le contenu essentiel n'est pas supprimé. Vraiment? Et, en premier lieu, tmp / cache, qui est le cache au moment de la compilation, n'est pas supprimé.
Il semble que problème a également été soulevé à ce sujet.
Donc, comme je l'ai écrit dans la "Conclusion", il semble préférable d'exécuter manuellement la commande pour la supprimer, ou de définir la commande vous-même.