EC2 hatte nicht genügend Arbeitsspeicher, während die Ressourcen von capistrano ausgeführt wurden: Die Vorkompilierung wurde ausgeführt, und als Ergebnis des Neustarts der Instanz wurde die Bereitstellung zur Hälfte beendet. Wenn der Webserver basierend auf dem halbfertigen Kompilierungsergebnis ausgeführt wird und ein Laufzeitfehler auftritt, kann ich ihn nicht sehen und habe versucht, ihn wieder in einen sauberen Zustand zu versetzen.
rails (5.2.4.2)
capistrano (3.11.0)
sprockets (3.7.2)
sprockets-rails (3.2.1)
current_path ist dieser Pfad
shared_path sollte dieser Pfad sein
Zusammenfassend ist dies, was Sie tun müssen.
Es gibt eine Einschränkung. capistrano wird standardmäßig mit Befehlen wie "deploy: clobber_assets" geliefert, die wahrscheinlich Assets löschen. Dies bedeutet, dass Sie es von Hand löschen können, ohne es zu verwenden. Der Grund wird später beschrieben.
Erstens ist die Struktur innerhalb des / var / www / app_name
des von capistrano bereitgestellten Servers wie folgt.
├── aktuell (symbolischer Link ist an das neueste Verzeichnis in Releases angehängt)
├── releases
│ ├── 20200601101105
│ ├── 20200601102714
│ └── 20200601105159
├── repo
├── revisions.log
└── shared
Unter dieser aktuellen, dh unter Releases / 2006001105159, wird sie wie im Repository Ihres Projekts konfiguriert. Es sollte app /, config / und public / geben.
Unter dieser öffentlichen / ist Assets / mit erstellten statischen Dateien gepackt ... so zu tun
/ var / www / app_name / current / public / assets
ist eine symbolische Verknüpfung zu / var / www / app_name / shared / Assets
.
Und / var / www / app_name / current / tmp / cache
ist auch eine symbolische Verknüpfung zu / 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)
Die Standard-Sprockets speichern Assets in Entwicklungs- und Produktionsumgebungen in tmp / cache / assets zwischen.
Während es geschrieben wird, gibt es einen Cache des Kompilierungsergebnisses in tmp / cache / assets. Löschen Sie ihn daher.
Im Fall von capistrano entspricht / var / www / app_name / shared / tmp / cache / assets
dem, also löschen Sie es.
Abgesehen von den Assets: Comp vorkompilieren, speichert Sprockets auch die Bereitstellungsergebnisdatei. Der Code in Sprockets sagt ungefähr Folgendes:
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
Haben Sie bei der Bereitstellung von: Assets: Precompile eine Reihe von Protokollen in der Standardausgabe gesehen? Es ist wahrscheinlich der obige Code, der das erkennt.
Siehe logger.info" Schreiben
.
So was:
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…
Wenn Sie in diesem "Überspringen?" Urteil stecken bleiben. Mit anderen Worten, wenn in diesem Beispiel die Datei mit dem Digest "/ var / www / app_name / release / 20200601085319 / public / assets / development / application-232387090aed00e6b038 ..." bereits vorhanden ist, Sprockets exportiert keine Dateien.
Wenn also bei capistrano dieselbe Datei in "/ var / www / app_name / shared / assets" vorhanden ist, wird sie von diesem Sprung übersprungen. Sie müssen es löschen.
capistrano zeigt alle Befehle mit cap -T
an.
Sie können einen solchen Befehl in Bezug auf Assets finden.
cap deploy:cleanup_assets # Cleanup expired assets
cap deploy:clobber_assets # Clobber assets
Ist der Befehl deploy: clobber_assets
nicht standardmäßig vorbereitet?
Clobber bedeutet zu schlagen. Es scheint, dass sie Sie zwingen werden, neue Vermögenswerte zu machen! Das ist gut! Wenn Sie darüber nachdenken und es verwenden, wird es sich nicht wie erwartet verhalten.
$ 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
Es scheint, dass die Assets zusammen mit dem Verzeichnis gelöscht werden. Wenn Sie jedoch genau hinschauen, handelt es sich bei den entfernten Assets nur um symbolische Links, und die wesentlichen Inhalte werden nicht gelöscht. "Ja wirklich?" Und erstens wird tmp / cache, der zur Kompilierungszeit der Cache ist, nicht gelöscht.
Es scheint, dass Problem auch darüber angesprochen wurde.
Wie ich in der "Schlussfolgerung" geschrieben habe, scheint es besser, den Befehl manuell auszuführen, um ihn zu löschen, oder den Befehl selbst zu definieren.