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.