Ich habe ein Docker-Image, nennen wir es frontend.image
, das ich für einen Jenkins-Build-Slave verwende. Das Jenkins Docker-Plug- in dreht einen Container aus diesem Image und erstellt Artefakte im Container. Das alles funktioniert super. In diesem Fall frontend.image
wird die zum Erstellen einer AngularJs-App verwendet. Zum Erstellen dieser Angular-App gehört auch die Installation von npm-Paketen, die die App benötigt.
Dieser Prozess, npm install, scheint lange zu dauern, 3 Minuten, npm installiert anscheinend jedes Mal jedes Paket.
Also habe ich ein Volume für meinen Slave hinzugefügt, es ist ein vom Host gemountetes Volume. Das Docker-Plugin verwendet dieses Volume jedes Mal, wenn es den Frontend-Container ausführt:
Der Benutzer, der den Befehl ausführt, npm install
ist jenkins
. npm speichert einen Cache, den Sie mit befehl npm config get cache
welche Ausgaben finden können/home/jenkins/.npm
Aus diesem Grund habe ich das Host-Volume /slaves/volumes/tsl.frontend:/home/jenkins
auf meinem Webcontainer-Slave gemountet.
Ich baue meine Angular-App mit einem Jenkins-Projekt, baue kein Problem, viele npm-Pakete sind installiert. Wenn ich in meinen Docker-Host ssh und cmd starte, ls /slaves/volumes/tsl.frontend
sehe ich viele npm-Pakete. Dies bedeutet, dass mein Host-Volume-Mount für den Slave funktioniert hat.
Jetzt erstelle ich das Jenkins-Projekt erneut. Npm installiert jedes einzelne Paket erneut, obwohl der Docker-Slave-Build-Container den Volume-Host-Mount verwendet. Ich kann dies sogar bestätigen, indem ich mit cmd, docker exec -it <some_clever_random_container_id> bash
cmd su jenkins
und cmd in den Slave-Container schlage, in npm cache ls
dem viele zwischengespeicherte npm-Pakete aufgelistet sind.
Selbst mit meinem Host-Mount-Volume, chmod 777
für das übrigens keine Berechtigungsprobleme bestehen, kann ich npm install
den Cache nicht verwenden.
In meinem Jenkins-Build, der den Docker-Slave-Container hochfährt, wird der erste Cmd ausgeführt, npm cache ls
und viele Pakete werden aufgelistet. Bedeutet dies nicht, dass mein Host-Volume wie erwartet funktioniert und der npm-Cache-Index die Integrität aufweist, auch wenn er nicht beschädigt ist?
Ich habe das reguläre npm install
cmd ausprobiert , das, wenn ich es auf meinem localhost-Rechner ausführe, beim ersten Mal alle Pakete und beim nächsten Mal fast keine Pakete installiert. Und auch der npm-Cache "Hack" npm --cache-min 9999999 install
, entnommen aus dieser SO-Antwort sowie cmdnpm --skip-installed --cache-min 9999999 install
Eine verwandte Frage wurde auf StackOverflow gestellt.
npm cache ls
und ein RAW ls ~/.npm/* -al
in das Build-Skript selbst vor jedem anderen Build-Schritt einfügen, um den Zustand des Containers beim Starten des Builds sicherzustellen.