Jak włączyć pamięć podręczną npm w urządzeniu podrzędnym kompilacji Jenkins działającym w oknie dokowanym?

13

Mam obraz Dockera, nazwijmy go frontend.image, którego używam dla kompilatora Jenkins. Wtyczka Jenkins Docker rozdzieli pojemnik z tego obrazu i zbuduje artefakty wewnątrz kontenera. To wszystko działa świetnie. W tym przypadku frontend.imagesłuży do zbudowania aplikacji AngularJs. Częścią budowy tej aplikacji Angular jest instalacja pakietów npm wymaganych przez aplikację.

Wydaje się, że ten proces, npm install, zajmuje dużo czasu, wydaje się, że 3 minuty, npm zawsze instaluje każdy pakiet za każdym razem.

Więc dodałem wolumin dla mojego urządzenia podrzędnego, jest to wolumin zamontowany na hoście, wtyczka Docker będzie używać tego woluminu za każdym razem, gdy uruchamia kontener frontonu:

wprowadź opis zdjęcia tutaj

Użytkownik wykonujący polecenie npm installto jenkins. npm utrzymuje pamięć podręczną, którą można znaleźć za pomocą polecenia, npm config get cachektóre dane wyjściowe/home/jenkins/.npm

Dlatego mam wolumin hosta /slaves/volumes/tsl.frontend:/home/jenkinspodłączony do mojego slave kontenera WWW.

Buduję moją aplikację Angular przy użyciu projektu Jenkins, nie buduje żadnego problemu, zainstalowanych jest wiele pakietów npm. Jeśli ssh na moim hoście Docker i uruchom cmd ls /slaves/volumes/tsl.frontend, widzę wiele pakietów npm. Oznacza to, że działało podłączenie woluminu mojego hosta dla urządzenia slave. wprowadź opis zdjęcia tutaj

Teraz ponownie buduję projekt Jenkins, npm ponownie instaluje każdy pakiet, nawet jeśli kontener kompilacji podrzędnej Docker korzysta z podłączenia hosta woluminu. Mogę nawet potwierdzić, uderzając w kontener podrzędny za pomocą cmd, docker exec -it <some_clever_random_container_id> basha następnie cmd, su jenkinsa następnie cmd, npm cache lsktóry zawiera listę wielu pakietów npm, które są buforowane. wprowadź opis zdjęcia tutaj

Więc nawet z moim woluminem montowania hosta, który ma chmod 777przy okazji uprawnienia , więc nie ma problemów z uprawnieniami, nie mogę npm installużyć pamięci podręcznej.

W mojej kompilacji Jenkins, która obraca kontener Docker slave, uruchomiłem pierwsze polecenie cmd npm cache lsi wymieniono wiele pakietów, czy to nie oznacza, że ​​wolumin hosta działa zgodnie z oczekiwaniami, a indeks pamięci podręcznej npm ma integralność, czyli nie jest uszkodzony?

wprowadź opis zdjęcia tutaj

Próbowałem zwykłego npm installcmd, który, kiedy uruchamiam na moim komputerze lokalnym, instaluje wszystkie pakiety za pierwszym razem i prawie żadnych pakietów za następnym razem. A także „hack” pamięci podręcznej npm npm --cache-min 9999999 install, wzięty z tej odpowiedzi SO oraz cmdnpm --skip-installed --cache-min 9999999 install

Podobne pytanie zostało opublikowane na StackOverflow.

Brian Ogden
źródło
Założę się, że indeks pamięci podręcznej nie jest przechowywany w ~ / .npm zgodnie z twoim opisem
Tensibai
@Tensibai jesteś niepoprawny i jestem bardzo pewien, że użytkownik jest Jenkins, ponieważ to, co mówisz w inny sposób, ponieważ uruchamiam pamięć podręczną npm ls jako użytkownik Jenkins i wyświetla listę pakietów, mówisz, że instalacja npm jest wykonywany przez innego użytkownika
Briana Ogdena
nie, mówię, że sam indeks jest prawdopodobnie przechowywany gdzie indziej, w / usr / local lub w jakiejkolwiek ścieżce npm zainstalowanej lub whatelse, nie mam pojęcia. Brzmi to tak, jakby npm zachowywał się tak, jakby nic nie było w pamięci podręcznej, więc chyba nie zawiera katalogu, ale opiera się na jakimś indeksie gdzie indziej.
Tensibai
@Tensibai, ale konfiguracja cmd npm get cache zwraca /home/jenkins.npm, ponieważ nie uważasz, że ta ścieżka potwierdza lokalizację bufora?
Brian Ogden,
Lokalizacja pamięci podręcznej tak, która nie wymusza indeksu pamięci podręcznej, w ogóle znajduje się w tej samej lokalizacji. Dodam a npm cache lsi raw ls ~/.npm/* -alw samym skrypcie kompilacji przed jakimkolwiek innym krokiem kompilacji, aby zapewnić stan kontenera podczas uruchamiania kompilacji.
Tensibai

Odpowiedzi:

5

W końcu rozwiązałem ten problem, używając buforowania warstwy obrazu Docker dla instalacji npm, zgodnie z tą odpowiedzią

Oznacza to, że przeniosłem instalację npm z obrazu podrzędnego Docker do rzeczywistego obrazu interfejsu użytkownika, oto mój ostateczny plik Docker, który naprawdę buforuje instalację npm między kompilacjami, jeśli pakiet.config nie ma zmian:

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"]
Brian Ogden
źródło
2
nie rozwiązuje problemu opisanego w pytaniach. To tylko inny sposób buforowania. Znasz już powód? @Brian
An Nguyen
@AnNguyen nie, i spędziłem dużo czasu próbując dostać pamięć podręczną npm do pracy. Sugeruję skorzystanie z mojego rozwiązania
Brian Ogden
moja sytuacja jest inna. Za każdym razem, gdy uruchamiana jest kompilacja, na k8s jest zapewniony niewolnik. Nie mogę więc buforować w oparciu o proces kompilacji dokera. Chcę opierać się na pamięci podręcznej NPM, aby móc zamontować trwały wolumin w urządzeniu slave za każdym razem, gdy jest on udostępniany
An Nguyen
0

Innym podejściem, jakie możesz zrobić, jest skonfigurowanie serwera repozytorium nexus, na którym hostujesz swoje moduły npm i proxy zewnętrzne. Nie wykorzystuje pamięci podręcznej, ale ponieważ zasoby znajdują się w sieci lokalnej lub w tym samym roju, nie powinno to zająć tak długo.

Archimedes Trajano
źródło