Wie kann ich die Bauzeit von Angular 5 Projekt mit Docker verbessern?

9

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%

Umgebung

DockerCloud stellt eine Verbindung zu meinem AWS her

AWS: EC2-Mikro

Ergebnis

Dieses Dockerfile funktioniert perfekt und es baut Erfolg.

Aber es dauert etwa 14 Minuten zu bauen.

Fragen

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!

    
ihue 17.01.2018, 19:20
quelle

1 Antwort

2

[TL; DR]

  • Verwenden Sie Volumes zum Speichern von node_modules und .npm
  • Teilen Sie Teile Ihres Prozesses (z. B. Tests)
  • parallel
  • Seien Sie vorsichtig, wenn Sie relative Pfade verwenden
  • Kopieren Sie nicht Ihr gesamtes Projekt mit COPY . . . Relative Pfadprobleme und mögliche Informationslecks.
  • Erstellen Sie ein separates Bild, das nur Kernabhängigkeiten zum Erstellen und Testen enthält (z. B. npm, java, chrome-driver, libgconf2).
  • Konfigurieren Sie Pipelines, um dieses Image zu verwenden
  • Lassen Sie die CI den Repo klonen und kopieren Sie Ihr Projekt in den Container zum Erstellen und Testen
  • Archivierte Dateien (z. B. dist ) und Tag basierend auf Fehlerraten
  • archivieren
  • Erstellen Sie ein neues Bild mit gerade genug Dingen, um Ihre gebauten Dateien auszuführen.

[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 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, ([EDIT] - Es scheint, dass 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.

    
ToninGuy3n 25.01.2018 14:33
quelle