J'ai une image Docker, appelons-la frontend.image
, que j'utilise pour un esclave de génération Jenkins. Le plugin Jenkins Docker fera tourner un conteneur à partir de cette image et construira des artefacts à l'intérieur du conteneur. Tout cela fonctionne très bien. Dans ce cas, le frontend.image
est utilisé pour créer une application AngularJs. Une partie de la construction de cette application angulaire consiste à installer les packages npm requis par l'application.
Ce processus, l'installation de npm, semble prendre beaucoup de temps, il semble que 3 minutes, npm installe toujours chaque paquet à chaque fois.
J'ai donc ajouté un volume pour mon esclave, c'est un volume monté sur l'hôte, le plugin Docker utilisera ce volume à chaque fois qu'il exécutera le conteneur frontal:
L'utilisateur qui exécute la commande npm install
est jenkins
. npm conserve un cache que vous pouvez trouver avec une commande npm config get cache
qui génère/home/jenkins/.npm
C'est pourquoi j'ai le volume hôte /slaves/volumes/tsl.frontend:/home/jenkins
monté sur mon esclave de conteneur Web.
Je crée mon application Angular à l'aide d'un projet Jenkins, ne génère aucun problème, de nombreux packages npm sont installés. Si ssh dans mon hôte Docker et exécute cmd, ls /slaves/volumes/tsl.frontend
je vois beaucoup de packages npm. Cela signifie que le volume de mon hôte pour l'esclave a fonctionné.
Maintenant, je reconstruis le projet Jenkins, npm installe à nouveau chaque package, même si le conteneur de construction esclave Docker utilise le montage hôte de volume. Je peux même confirmer en bashing dans le conteneur esclave avec cmd docker exec -it <some_clever_random_container_id> bash
puis cmd su jenkins
puis cmd npm cache ls
qui répertorie de nombreux packages npm qui sont mis en cache.
Donc, même avec mon volume de montage hôte, qui a d'ailleurs des autorisations chmod 777
donc il n'y a pas de problèmes d'autorisations, je ne peux pas npm install
utiliser le cache.
Dans ma build Jenkins, qui fait tourner le conteneur esclave Docker, le premier cmd que j'exécute est npm cache ls
et de nombreux packages sont répertoriés, cela ne signifie-t-il pas que mon volume hôte fonctionne comme prévu et que l'index de cache npm a l'intégrité aka non corrompu?
J'ai essayé la npm install
cmd régulière , qui, lorsque j'exécute sur ma machine localhost, installe tous les packages la première fois et presque aucun package la prochaine fois. Et aussi le cache npm "hack" npm --cache-min 9999999 install
, tiré de cette réponse SO ainsi que cmdnpm --skip-installed --cache-min 9999999 install
Une question connexe a été publiée sur StackOverflow.
npm cache ls
et un brutls ~/.npm/* -al
dans le script de build lui-même avant toute autre étape de build juste pour assurer l'état du conteneur au démarrage de la build.Réponses:
J'ai finalement résolu cela en utilisant la mise en cache de la couche d'image Docker pour l'installation de npm, en suivant cette réponse
Cela signifie que j'ai déplacé l'installation npm hors de l'image esclave Docker et dans l'image réellement frontale, voici mon fichier Docker final qui met vraiment en cache l'installation npm entre les builds si package.config n'a pas de modifications:
la source
Une autre approche que vous pouvez faire est de configurer un serveur de référentiel nexus où vous hébergez vos modules npm et proxy ceux externes. Il ne tire pas parti du cache, mais comme les ressources se trouvent dans votre réseau local ou peut-être dans le même essaim, cela ne devrait pas prendre autant de temps.
la source