Jenkins Docker constrói escravo - cache npm não funciona

1

Eu tenho uma imagem do Docker, vamos chamá-la de frontend.image , que eu uso para um escravo de construção do Jenkins. O plug-in do Docker do Jenkins gerará um contêiner a partir dessa imagem e criará artefatos dentro do contêiner. Isso tudo funciona muito bem. Nesse caso, o frontend.image é usado para criar um aplicativo AngularJs. Parte da construção deste aplicativo Angular é instalar pacotes npm que o aplicativo requer.

Este processo, npm install, parece demorar muito tempo, 3 minutos ao que parece, o npm sempre instala cada pacote todas as vezes.

Então eu adicionei um volume para o meu escravo, é um volume montado no host, o plug-in do Docker usará esse volume toda vez que ele executar o contêiner do frontend:

Ousuárioqueexecutaocomandonpminstalléjenkins.Onpmmantémumcachequevocêpodeencontrarcomocomandonpmconfiggetcache,quegera/home/jenkins/.npm

Éporissoquetenhoovolumedohost/slaves/volumes/tsl.frontend:/home/jenkinsmontadonomeuescravodocontêinerdaweb.

EuconstruomeuaplicativoAngularusandoumprojetoJenkins,nãocriaproblema,muitospacotesnpmsãoinstalados.SeforsshnomeuhostdoDockereexecutarcmdls/slaves/volumes/tsl.frontend,vejomuitospacotesnpm.Issosignificaqueminhamontagemdevolumedohostparaoescravofuncionou.

AgoraeuconstruooprojetoJenkinsnovamente,onpminstalacadapacotenovamente,mesmoqueocontêinerdeconstruçãoescravodoDockerestejausandoamontagemdohostdevolume.Possoatémesmoconfirmar,baseando-menocontêinerescravocomcmddockerexec-it<some_clever_random_container_id>bash,emseguida,cmdsujenkins,emseguida,cmdnpmcachels,quelistamuitospacotesnpmquesãoarmazenadosemcache.

Portanto,mesmocomomeuvolumedemontagemdohost,quetempermissõeschmod777pelocaminhoparaquenãohajaproblemasdepermissões,nãoconsigousarnpminstallparausarocache.

Eutenteio%normalnpminstallcmd,que,quandoeucorronaminhamáquinalocalhost,instalatodosospacotespelaprimeiravezequasenenhumpacotenapróximavez.Etambémocachenpm"hack" npm --cache-min 9999999 install , tirado de essa resposta SO , além de cmd npm --skip-installed --cache-min 9999999 install

    
por Brian 26.10.2017 / 18:20

1 resposta

0

Eu finalmente resolvi isso usando o cache da camada de imagem do Docker para a instalação do npm, seguindo esta resposta

Isso significa que eu mudei a instalação do npm da imagem escrava do Docker para a imagem do frontend, aqui está o arquivo final do Docker que armazena a instalação do npm entre builds se o package.config não tiver alterações:

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

# https://stackoverflow.com/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"]
    
por 20.12.2017 / 22:29