[RUBY] Je veux recréer le contenu des actifs à partir de zéro dans l'environnement construit avec capistrano

Pourquoi as-tu voulu faire ça

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.

information sur la version

rails (5.2.4.2)
capistrano (3.11.0)
sprockets (3.7.2)
sprockets-rails (3.2.1)

Conditions préalables

current_path est ce chemin

shared_path doit être ce chemin

Conclusion d'abord

En conclusion, voici ce que vous devez faire.

  1. Effacez le contenu de / var / www / app_name / shared / public / assets
  2. Effacez le contenu de / var / www / app_name / shared / tmp / cache / assets
  3. Déployez comme d'habitude

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.

La description

Structure de répertoire de capistrano

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.

Fonctionnement des actifs: le cache de précompilation

[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.

Comment Sprockets déploie les résultats sont mis en cache

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.

Oh? Il semble y avoir une commande pratique ...?

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.

Recommended Posts

Je veux recréer le contenu des actifs à partir de zéro dans l'environnement construit avec capistrano
Je veux var_dump le contenu de l'intention
[Débutant] Procédure de connexion à l'environnement virtuel construit avec Vagrant
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
Je veux changer la valeur de l'attribut dans Selenium of Ruby
[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView
Je veux jouer avec l'autorisation du répertoire Windows de WSL (ubuntu)
Après tout, je voulais prévisualiser le contenu de mysql avec Docker ...
Je veux obtenir la valeur en Ruby
Je veux voir le contenu de Request sans dire quatre ou cinq
[Java] Je souhaite calculer la différence par rapport à la date
Je veux intégrer n'importe quel TraceId dans le journal
Tokoro j'ai réécrit dans la migration de Wicket 7 à 8
Je veux connaître la réponse de l'application Janken
Je souhaite afficher le nom de l'affiche du commentaire
Je souhaite utiliser le mode sombre avec l'application SWT
Je veux retourner la position de défilement de UITableView!
Pour ceux qui souhaitent utiliser MySQL pour la base de données dans la construction de l'environnement de Rails6 ~.
Je souhaite modifier le chemin après une nouvelle inscription après m'être connecté avec plusieurs appareils.
Comment utiliser git avec la puissance de jgit dans un environnement sans commandes git
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
Même si je souhaite convertir le contenu d'un objet de données en JSON en Java, il existe une référence circulaire ...
En Java, je souhaite couper plusieurs caractères spécifiés uniquement du début et de la fin.
Après avoir publié un article avec Rails Simple Calendar, je souhaite le refléter dans le calendrier.
Je souhaite modifier le paramètre de sortie du journal de UtilLoggingJdbcLogger
Comment gérer la différence dans chaque environnement avec yml sans augmenter le nombre de RAILS_ENV
Je veux obtenir une liste du contenu d'un fichier zip et sa taille non compressée
Je souhaite changer la couleur du menu de contrôle en haut de Liferay 7 / DXP
J'ai essayé d'utiliser Docker parce que je ne veux pas polluer l'environnement local dans le développement de l'onglet Microsoft Teams de MS Learn
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
J'ai essayé de développer la fonction de cache d'Application Container Cloud Service dans l'environnement local
Je veux renvoyer un type différent de l'élément d'entrée avec Java8 StreamAPI Reduce ()
Je souhaite passer au même écran dans l'état enregistré
[Ruby] Je souhaite inverser l'ordre de la table de hachage
Je veux passer la commande de démarrage à postgres avec docker-compose.
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
[Controller] Je veux récupérer la valeur numérique d'une colonne spécifique de la base de données (mon mémo)
Je veux connaître la méthode du contrôleur où l'exception a été levée dans le ExceptionHandler de Spring Boot
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
Je veux comprendre le flux des paramètres de demande de traitement Spring
Je veux revenir à l'écran précédent avec kotlin et java!