Ich erstelle ein HTML5-Frontend mit NPM-basierten Tools ( grunt
).
Einer der ersten Schritte meines kontinuierlichen Integrations-Build-Prozesses ist die Ausführung von npm install
.
npm install
ist LANGSAM . Selbst mit einem lokalen NPM-Proxy-Caching von Artefakten (Sonatypes Nexus 3) dauert es immer noch 4 Minuten!
Wenn ich meinen üblichen Best Practices für die kontinuierliche Integration folge, würde ich von einem ursprünglichen SCM-Repository starten und den Build ausführen. Dies bedeutet, dass jedes Mal, wenn der CI-Build eine neue npm install
durchführen muss, die Kosten von 4 Minuten übernommen werden.
Dies ist ein signifikanter Anteil meiner Bauzeit. Ich bin unzufrieden, dass der Build so lange dauert.
Die Alternative scheint zu sein, die node_modules
zwischen Builds herum zu halten. Allerdings hatte ich Probleme damit, dass der Build instabil wurde.
Das Entfernen von Abhängigkeiten von package.json
entfernt sie nicht von node_modules
mit einem einfachen npm install
. Ich kann das mit einem npm prune
zuerst umgehen.
Was gilt hier als Best Practice?
Wenn Sie berücksichtigen, dass Sie neue Pakete installieren müssen, haben Sie keine andere Wahl als die Installation aufzurufen. Ich glaube fest daran, dass sie sich auf den "Build" -Prozess und nicht auf den "Dependency Management" -Prozess beziehen.
Warum sind sie anders? Lassen Sie uns ein Beispiel durchgehen, um es deutlicher zu machen.
Als Entwickler müssen Sie beim ersten Start Ihres Jobs "installieren" Software, die Code ermöglicht. Dies wird normalerweise einmal durchgeführt. Danach können Sie mit dem Codieren beginnen. Letzteres ist der "Build" -Teil wie Sie Wert für jede Funktion erzeugen, die Ihr Code produziert. Von Sie können Ihre Werkzeugliste von Zeit zu Zeit aktualisieren, hinzufügen oder aktualisieren.
In diesem Beispiel würde die tägliche Installation Ihrer Tools bei der Arbeit beginnen, bevor Sie mit dem Codieren beginnen würden.
Ich würde vorschlagen, dass Sie sicherstellen, dass der Bauprozess, der das Erzeugen eines Artefakts (wie zum Beispiel ein Jar) bedeutet, von der Abhängigkeitsinstallation entkoppelt ist. Das bedeutet, dass die Installation einmal durchgeführt wird und das Bauen problemlos fortgesetzt werden kann. Sie erwähnen nicht, was gebaut wird, aber Grunzen können sich sicher um den Rest kümmern.
Daher glaube ich, dass das Beschneiden und Installieren eine gute Strategie ist. Du solltest dich nicht für die ersten Male sorgen. Betrachten Sie es als einen Kaltstart. Jedes System, das mit Subkomponenten implementiert ist, die zusammen als Pipeline arbeiten, hat dieses "Problem". Nehmen Sie zum Beispiel ein Auto. Es wird nicht so kraftstoffsparend sein, wenn Sie es starten, als wenn Sie es nach einer Stunde fahren.
Planen Sie einen täglichen Job, um einen Docker-Container mit Ihren Abhängigkeiten zu erstellen. Führen Sie Ihren CI-Job im neuesten Container aus. Artefakt der Build des CI-Jobs.
Sie sollten npm
-Pakete offline auf dem lokalen Rechner oder im lokalen Netzwerk installieren, Sie können hier einige Tipps finden = & gt; Offline-Installation von npm-Paketen
Haben Sie erwogen, den npm-Link zu verwenden oder sogar Ihren gesamten node_modules-Ordner zu verlinken? Mindestens npm Link könnte für Ihre Dev-Abhängigkeiten verwendet werden, die Sie normalerweise sowieso auf dem Server als kontrollierte Version haben möchten. Dies sollte die Dinge ein wenig beschleunigen.
Tags und Links npm