如何在docker中运行的Jenkins构建从站中启用npm缓存?


13

我有一个Docker镜像,我们称它为frontend.imageJenkins构建奴隶。Jenkins Docker插件将从该映像启动一个容器,并在该容器内构建工件。这一切都很好。在这种情况下,frontend.image可使用来构建AngularJs应用。构建此Angular应用程序的一部分是安装应用程序所需的npm软件包。

npm安装这个过程似乎要花费很长时间,似乎3分钟,npm总是每次都安装每个软件包。

因此,我为从属服务器添加了一个卷,它是主机安装的卷,Docker插件每次运行前端容器时都会使用该卷:

在此处输入图片说明

执行命令的用户npm installjenkins。npm保留了一个缓存,您可以使用npm config get cache输出命令来查找/home/jenkins/.npm

这就是为什么将主机卷/slaves/volumes/tsl.frontend:/home/jenkins安装到Web容器从属服务器的原因。

我使用Jenkins项目构建了Angular应用程序,构建没有问题,安装了许多npm软件包。如果ssh进入我的Docker主机并运行cmd,ls /slaves/volumes/tsl.frontend我会看到很多npm软件包。这意味着我的从服务器主机卷安装成功。 在此处输入图片说明

现在,我再次构建Jenkins项目,即使Docker从属构建容器正在使用卷主机安装,npm也会再次安装每个软件包。我什至可以通过先用cmd docker exec -it <some_clever_random_container_id> bash然后按cmd su jenkins然后按cmd 猛击到从属容器中来进行确认,npm cache ls其中列出了许多已缓存的npm软件包。 在此处输入图片说明

因此,即使我的主机安装卷具有权限chmod 777(因此没有权限问题),我也无法npm install使用缓存。

在运行Docker从属容器的Jenkins构建中,我运行的第一个cmd npm cache ls已经列出,并且列出了许多软件包,这是否意味着我的主机卷正在按预期工作并且npm缓存索引的完整性也未损坏?

在此处输入图片说明

我尝试了常规的npm installcmd,当我在localhost计算机上运行时,它会第一次安装所有软件包,而下次则几乎没有软件包。以及npm --cache-min 9999999 install从此SO答案以及cmd中获取的npm缓存“ hack”npm --skip-installed --cache-min 9999999 install

一个相关的问题发布在StackOverflow上。


我敢打赌,根据您的描述,缓存索引未存储在〜/ .npm内
Tensibai

@Tensibai您不正确,我对此非常确定,该用户是jenkins,因为那是您用另一种方式所说的,因为我以jenkins用户身份运行npm cache l并列出了软件包,您说的是npm install是由另一位用户执行
Brian Ogden

不,我是说索引本身可能存储在其他位置,在/ usr / local或npm安装在其中的任何路径,等等,我不知道。这听起来好像npm好像在缓存中什么都没有,所以我想它没有列出目录,而是基于其他地方的某种索引。
Tensibai

@Tensibai,但cmd npm配置获取缓存会返回/home/jenkins.npm,因为该路径您认为不会确认缓存的位置吗?
Brian Ogden

缓存的位置是,不强制执行缓存索引的位置完全在同一位置。在任何其他构建步骤之前,我都会在构建脚本本身中添加a npm cache ls和raw ls ~/.npm/* -al,只是为了确保启动构建时容器的状态。
Tensibai '17

Answers:


5

我终于通过在npm安装中使用Docker镜像层缓存解决了这个问题

这意味着我将npm安装从Docker从属映像移出并移至实际的前端映像,这是我的最终Docker文件,如果package.config没有更改,该文件确实将npm安装缓存在两次构建之间。

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

@AnNguyen不,我花了很多时间试图使npm缓存正常工作。我建议您使用我的解决方案
Brian Ogden

我的情况不同。每次触发构建时,将在k8s上配置一个从属。所以我无法基于docker构建过程进行缓存。我想基于NPM缓存,以便每次配置从属卷时都可以将永久卷装载到从属中
Nguyen

0

您可以执行的另一种方法是设置一个nexus存储库服务器,在其中托管npm模块并代理外部模块。它不利用高速缓存,但是由于资源位于本地网络内或可能位于同一群中,因此它不需要花费很长时间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.