Ich versuche, die Build-Zeit meiner Automatisierung zu verbessern. Gerade jetzt dauert es 14 Minuten, nur um das Front-End zu bauen.
Das ist, was ich bis jetzt bekommen habe
web.dockerfile
%Vor%RUN $ (npm bin) / ng bauen --prod --build-optimizer
Diese Zeile oben dauert fast die gesamten 99% der Bauzeit.
.angular-cli.json
%Vor%DockerCloud stellt eine Verbindung zu meinem AWS her
AWS: EC2-Mikro
Dieses Dockerfile funktioniert perfekt und es baut Erfolg.
Aber es dauert etwa 14 Minuten zu bauen.
Wie würde man vorgehen und dies verbessern?
Ist es wegen meiner Instanz zu wenig Prozessor?
Ich bin offen für irgendwelche Vorschläge in diesem Moment.
Irgendwelche Hinweise / Vorschläge / Hilfe dazu werden sehr geschätzt!
[TL; DR]
COPY . .
. Relative Pfadprobleme und mögliche Informationslecks. dist
) und Tag basierend auf Fehlerraten [LANGE VERSION]
Es besteht eine gute Chance, dass Ihre npm-Abhängigkeiten erneut heruntergeladen werden und / oder Ihre Docker-Images für jeden Build neu erstellt werden, den Sie ausführen.
Anstatt Dateien in ein Docker-Image zu kopieren, wäre es besser, Volumes für Module und Cache bereitzustellen, sodass später zusätzliche Abhängigkeiten nicht erneut heruntergeladen werden müssen. Typische Verzeichnisse, für die Sie Volumes erstellen sollten, sind npm_modules (eins für global und eins für local) und .npm (cache).
Ihr package.json
wird in root /
kopiert und dasselbe package.json
wird in /web
mit COPY . .
kopiert.
Der erste Lauf von ([EDIT] - Es scheint, dass npm i
wird in /
installiert und Sie führen ihn erneut für /web
aus. Sie laden Abhängigkeiten zweimal herunter, aber werden die Module in /
für irgendwas verwendet? Unabhängig davon, Sie scheinen die gleiche package.json in npm i
und ng build
zu verwenden, also wird das Gleiche zweimal gemacht, ng build
Pakete nicht erneut herunterladen ), aber node_modules ist nicht in /
verfügbar, daher erstellt der Befehl npm i
einen anderen und lädt alle Pakete erneut herunter.
Sie erstellen ein web
-Verzeichnis in root /
, aber es gibt noch andere Befehle, die zu relativen Pfaden ./web
führen. Sind Sie sicher, dass die Dinge an den richtigen Stellen laufen? Es gibt keine Garantie, dass Programme in den Verzeichnissen suchen, die Sie möchten, wenn Sie relative Pfade verwenden. Während es scheint, dass es für dieses Bild funktioniert, wird die gleiche Vorgehensweise nicht konsistent mit anderen Bildern sein, die andere ursprüngliche Arbeitsverzeichnisse haben können.
[kann oder darf keine relevante Information sein]
Obwohl ich Bitbucket nicht zum Automatisieren von Builds verwende, war ich bei der Ausführung von Jenkins-Pipelines mit einem ähnlichen Problem konfrontiert. Jenkins hat das Projekt in ein anderes Verzeichnis gestellt, so dass jedes Mal, wenn es läuft, alle Abhängigkeiten erneut heruntergeladen werden. Ich dachte ursprünglich, dass das Projekt in /home/agent/project
wäre, aber es wurde tatsächlich woanders platziert. Ich habe das Verzeichnis gefunden, in das das Projekt kopiert wurde, indem ich in einem Build-Schritt den Befehl pwd
und npm cache verify
verwendete, und dann die Volumes an den richtigen Stellen gemountet. Sie können die Ausgabe in den für Builds erstellten Logs anzeigen.
Sie können die Ausgabe anzeigen, indem Sie den Abschnitt innerhalb der Pipelineseite erweitern.
Wenn das Image bei jedem Lauf neu erstellt wird, erstellen Sie Ihr Image separat und schieben Sie das Image dann in eine Registrierung. Konfigurieren Sie die Pipelinedatei stattdessen so, dass sie Ihr Image verwendet. Sie sollten versuchen, wenn immer möglich, bereits verfügbare Basisimages zu verwenden, es sei denn, es gibt andere Abhängigkeiten, die im Basisimage nicht verfügbar sind (Dinge wie APK-Pakete von alpine und nicht npm. Abhängigkeiten von npm können in Volumes gespeichert werden). Wenn Sie eine öffentliche Registrierung verwenden, speichern Sie keine Dateien, die möglicherweise vertrauliche Daten enthalten. Konfigurieren Sie Ihre Pipeline so, dass Dinge mit Volumes gemountet werden und / oder Geheimnisse verwendet werden.
Eine grundlegende Umstrukturierung der Test- und Build-Schritte.
%Vor%Sie müssen es nicht vollständig befolgen, aber es sollte Ihnen eine Idee geben, wie Sie parallele Schritte verwenden können, um Dinge zu trennen und die Bearbeitungszeiten zu verbessern.
Tags und Links nginx docker angular-cli dockerfile angular5