Come abilitare la cache npm in uno slave build Jenkins che funziona nella finestra mobile?


13

Ho un'immagine Docker, chiamiamola frontend.image, che uso per uno schiavo build Jenkins. Il plugin Jenkins Docker farà girare un contenitore da questa immagine e costruirà artefatti all'interno del contenitore. Tutto funziona alla grande. In questo caso, frontend.imageviene utilizzato per creare un'app AngularJs. Parte della creazione di questa app Angular è l'installazione dei pacchetti npm richiesti dall'app.

Questo processo, npm install, sembra richiedere molto tempo, 3 minuti sembra, npm installa sempre ogni pacchetto.

Quindi ho aggiunto un volume per il mio slave, è un volume montato sull'host, il plug-in Docker utilizzerà questo volume ogni volta che esegue il contenitore frontend:

inserisci qui la descrizione dell'immagine

L'utente che esegue il comando npm installè jenkins. npm mantiene una cache che puoi trovare con il comando npm config get cachequali output/home/jenkins/.npm

Questo è il motivo per cui ho il volume host /slaves/volumes/tsl.frontend:/home/jenkinsmontato sul mio web container slave.

Costruisco la mia app Angular usando un progetto Jenkins, non crea problemi, molti pacchetti npm sono installati. Se ssh nel mio host Docker ed ls /slaves/volumes/tsl.frontendeseguo cmd vedo molti pacchetti npm. Ciò significa che il mio volume di montaggio host per lo slave ha funzionato. inserisci qui la descrizione dell'immagine

Ora ricostruisco di nuovo il progetto Jenkins, npm installa di nuovo ogni singolo pacchetto, anche se il contenitore di compilazione dello schiavo Docker sta usando il mount dell'host di volume. Posso persino confermare cestinando nel contenitore slave con cmd docker exec -it <some_clever_random_container_id> bashquindi cmd su jenkinsquindi cmd npm cache lsche elenca molti pacchetti npm che sono memorizzati nella cache. inserisci qui la descrizione dell'immagine

Quindi, anche con il mio volume di montaggio host, che ha le autorizzazioni chmod 777a proposito quindi non ci sono problemi di autorizzazioni, non riesco npm installa usare la cache.

Nella mia build Jenkins, che fa girare il contenitore slave Docker, il primo cmd che eseguo è npm cache lse sono elencati molti pacchetti, questo non significa che il mio volume host funziona come previsto e l'indice della cache npm ha integrità aka non corrotta?

inserisci qui la descrizione dell'immagine

Ho provato il normale npm installcmd che, quando corro sul mio computer localhost, installa tutti i pacchetti la prima volta e quasi nessun pacchetto la prossima volta. E anche la cache npm "hack" npm --cache-min 9999999 install, tratta da questa risposta SO e da cmdnpm --skip-installed --cache-min 9999999 install

Una domanda correlata è stata pubblicata su StackOverflow.


Scommetto che l'indice della cache non è memorizzato in ~ / .npm secondo la tua descrizione
Tensibai,

@Tensibai sei errato e ne sono molto sicuro, l'utente è jenkins, perché è quello che stai dicendo in altro modo, perché eseguo npm cache ls come utente jenkins e che elenca i pacchetti, stai dicendo che npm install è eseguito da un altro utente
Brian Ogden il

no, sto dicendo che l'indice stesso è probabilmente memorizzato altrove, in / usr / local o qualunque sia il percorso npm installato o quant'altro, non ne ho idea. Sembra proprio che npm si comporti come se non ci fosse nulla nella cache, quindi immagino che non elenchi la directory ma si basi su un qualche tipo di indice altrove.
Tensibai,

@Tensibai ma la configurazione di cmd npm ottiene la cache restituisce /home/jenkins.npm come quel percorso non pensi che confermi la posizione della cache?
Brian Ogden,

La posizione della cache sì, che non impone l'indice della cache è nella stessa posizione. Aggiungerei ae npm cache lsraw ls ~/.npm/* -alnello script di compilazione stesso prima di qualsiasi altro passaggio di compilazione solo per garantire lo stato del contenitore all'avvio della compilazione.
Tensibai,

Risposte:


5

Ho finalmente risolto questo problema utilizzando la memorizzazione nella cache del layer di immagini Docker per l'installazione di npm, seguendo questa risposta

Questo significa che ho spostato l'installazione di npm dall'immagine dello slave Docker e nell'immagine realmente front-end, ecco il mio file Docker finale che memorizza davvero nella cache l'installazione di npm tra le build se package.config non ha modifiche:

FROM centos:7
MAINTAINER Brian Ogden

# Not currently being used but may come in handy
ARG ENVIRONMENT
ENV NODE_VERSION 6.11.1

RUN yum -y update && \
    yum clean all && \
    yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \
    yum -y makecache && \
    yum -y install nginx-1.12.0 wget

# Cleanup some default NGINX configuration files we don’t need
RUN rm /etc/nginx/conf.d/default.conf

#############################################
# NodeJs Install
#############################################

#Download NodeJs package
RUN wget -q -O - https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz \
    | tar --strip-components=1 -xzf - -C /usr/local

# /programming//a/35774741/1258525
# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY ./package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir /app && cp -a /tmp/node_modules /app/

WORKDIR /app
COPY . /app

RUN npm run build-$ENVIRONMENT

RUN cd /app && cp -a dist/* /usr/share/nginx/html
COPY ./docker/conf/frontend.conf /etc/nginx/conf.d/frontend.conf
COPY ./docker/conf/nginx.conf /etc/nginx/nginx.conf


EXPOSE 80

CMD ["nginx"]

2
non risolve il problema descritto nelle domande. È solo un altro modo per memorizzare nella cache. Conosci ancora il motivo? @Brian
An Nguyen

@AnNguyen no, e ho passato molto tempo a cercare di far funzionare la cache npm. Ti suggerisco di usare la mia soluzione
Brian Ogden,

la mia situazione è diversa. Ogni volta che viene attivato un build, viene eseguito il provisioning di uno slave su k8s. Quindi non posso memorizzare nella cache in base al processo di compilazione della finestra mobile. Voglio basarmi sulla cache NPM in modo da poter montare un volume persistente nello slave ogni volta che viene eseguito il provisioning
An Nguyen

0

Un altro approccio che puoi fare è impostare un server di repository nexus in cui ospiti i tuoi moduli npm e proxy quelli esterni. Non sfrutta la cache, ma poiché le risorse sono all'interno della tua rete locale o forse nello stesso sciame, non dovrebbe impiegare molto tempo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.