Как включить кэш npm в ведомом устройстве Jenkins, работающем в докере?

13

У меня есть изображение Docker, давайте назовем его frontend.image, которое я использую для сборки-сборки Jenkins. Плагин Jenkins Docker раскручивает контейнер из этого изображения и создает артефакты внутри контейнера. Это все прекрасно работает. В этом случае frontend.imageиспользуется для создания приложения AngularJs. Частью создания этого приложения Angular является установка пакетов npm, требуемых приложением.

Этот процесс, установка npm, кажется, занимает много времени, кажется, 3 минуты, npm всегда устанавливает каждый пакет каждый раз.

Поэтому я добавил том для своего ведомого устройства, это том, смонтированный на хосте, плагин Docker будет использовать этот том каждый раз при запуске контейнера внешнего интерфейса:

введите описание изображения здесь

Пользователь , который выполняет команду npm installявляется jenkins. npm хранит кеш, который вы можете найти с помощью команды, npm config get cacheкоторая выводит/home/jenkins/.npm

Вот почему у меня есть том хоста, /slaves/volumes/tsl.frontend:/home/jenkinsподключенный к моему ведомому веб-контейнеру.

Я создаю свое Angular-приложение, используя проект Jenkins, без проблем, много пакетов npm установлено. Если на моем хосте Docker запустить ssh и запустить cmd, ls /slaves/volumes/tsl.frontendя вижу множество пакетов npm. Это означает, что мой хост том монтируется для подчиненного. введите описание изображения здесь

Теперь я снова собираю проект Jenkins, npm снова устанавливает каждый пакет, хотя подчиненный сборочный контейнер Docker использует монтирование тома на хосте. Я даже могу подтвердить это, установив в ведомый контейнер команду cmd, docker exec -it <some_clever_random_container_id> bashзатем cmd, а su jenkinsзатем cmd, в npm cache lsкоторой перечислено много кэшированных пакетов npm. введите описание изображения здесь

Таким образом, даже с моим томом монтирования хоста, который chmod 777, кстати , имеет разрешения , поэтому проблем с разрешениями нет, я не могу npm installиспользовать кеш.

В моей сборке Jenkins, которая раскручивает подчиненный контейнер Docker, первый cmd, который я запускаю, npm cache lsи многие пакеты указаны в списке, не означает ли это, что мой том хоста работает должным образом, а индекс кэша npm имеет целостность, то есть не повреждена?

введите описание изображения здесь

Я попробовал обычный npm installcmd, который при запуске на моем локальном компьютере устанавливает все пакеты в первый раз и почти без пакетов в следующий раз. А также "взломать" кэш npm npm --cache-min 9999999 install, взятый из этого ответа SO, а также cmdnpm --skip-installed --cache-min 9999999 install

Соответствующий вопрос был опубликован в StackOverflow.

Брайан Огден
источник
Могу поспорить, что индекс кеша не хранится в ~ / .npm в соответствии с вашим описанием
Тенсибай
@ Тенсибай, вы не правы, и я уверен в этом, пользователь jenkins, потому что это то, что вы говорите по-другому, потому что я запускаю npm cache ls от имени пользователя jenkins и в нем перечислены пакеты, вы говорите, что установка npm казнен другим пользователем
Брайаном Огденом
нет, я говорю, что сам индекс, вероятно, хранится в другом месте, в / usr / local или любом другом пути, по которому установлен npm, или в любом другом, я понятия не имею. Это просто звучит так, как будто npm ведет себя так, как будто в кеше ничего не было, поэтому я предполагаю, что он не перечисляет каталог, а основывается на каком-то другом индексе в другом месте.
Тенсибай
@Tensibai, но конфигурация cmd npm get кеша возвращает /home/jenkins.npm, так как этот путь, как вы думаете, не подтверждает местоположение кеша?
Брайан Огден
Расположение кеша да, это не означает, что индекс кеша находится в одном и том же месте. Я бы добавил a npm cache lsи raw ls ~/.npm/* -alв сам скрипт сборки перед любым другим шагом сборки, просто чтобы гарантировать состояние контейнера при запуске сборки.
Тенсибай

Ответы:

5

Наконец-то я решил эту проблему, используя кеширование слоя изображений Docker для установки npm, следуя этому ответу

Это означает, что я переместил установку npm из ведомого образа Docker в фактически внешний интерфейс, вот мой последний файл Docker, который действительно кэширует установку npm между сборками, если package.config не имеет изменений:

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
это не решит вашу проблему, которая была описана в вопросах. Это просто еще один способ кеширования. Вы уже знаете причину? @Brian
An Nguyen
@ AnNguyen Нет, и я потратил много времени, пытаясь заставить работать кэш npm. Я предлагаю вам использовать мое решение
Брайан Огден
моя ситуация другая. Каждый раз, когда запускается сборка, раб получает на k8s. Поэтому я не могу кешировать на основе процесса сборки докера. Я хочу опираться на кэш NPM, чтобы можно было монтировать постоянный том в подчиненный каждый раз, когда он предоставляется
Nguyen
0

Другой подход, который вы можете использовать, - это настроить сервер репозитория Nexus, на котором вы размещаете свои модули npm и проксируете внешние. Он не использует кеш, но поскольку ресурсы находятся в вашей локальной сети или, возможно, в одном и том же рое, это не займет много времени.

Архимед Траяно
источник