加快詹金斯的NPM建设

时间:2018-05-31 08:05:19

标签: docker jenkins npm continuous-integration npm-install

我们让Jenkins在ECS内运行。我们正在使用管道进行构建和部署过程。管道使用docker插件来提取具有一些依赖性以进行测试的图像等,然后我们的所有步骤都在这个docker容器中发生。

我们目前的问题是我们的NPM安装大约需要8分钟。我们想加快这个过程。当容器在每个构建结束时被拆除时,生成的node_modules将被丢弃。我考虑过NPM缓存,但是由于docker的性质,这似乎无关紧要,除非我们将依赖项预先安装到docker镜像中(但这几乎是图像大小的三倍)。有没有简单的解决方案可以帮助我们的NPM安装速度?

4 个答案:

答案 0 :(得分:1)

您应该使用包缓存,但不能直接缓存node_modules。而是安装程序包安装程序使用的缓存目录,并且您的安装将快速启动。 Docker通过允许您在容器中挂载目录来实现这一点,该容器在构建中持久存在。

对于yarn装载~/.cache~/.cache/yarn
对于npm mount ~/.npm

docker run -it -v ~/.npm:/.npm ~/.cache:/.cache /my-app:/my-app testing-image:1.0.0 bash -c 'npm ci && npm test`

注意:我在这里使用npm ci始终删除node_modules 并使用package-lock.json中的确切版本重新安装,所以你获得非常一致的构建。 (在纱线中,这是yarn install --frozen-lockfile

答案 1 :(得分:0)

您可以设置Http代理并缓存所有依赖项(*)(**)。

然后使用--build-arg设置 HTTP_PROXY variable

docker build --build-arg HTTP_PROXY=http://<cache ip>:3128 .

*:这不能提高需要编译的依赖项的性能(即:c / c ++绑定)

**:我使用Squid container来共享缓存配置

答案 2 :(得分:0)

在我的情况下,这是一堆安装在计算机中的公司软件,当我将项目文件夹安装在主机上时,显然是一些防病毒软件分析了容器中的所有node_modules文件,我所做的就是避免在本地安装node_modules。立即从25分钟加速到5分钟。

答案 3 :(得分:0)

我已经解释了我用一个可能的实现 here 做了什么。我没有使用 package-lock.json 而是使用 npm ls 命令来检查 node_modules 文件夹中的更改,以便我可以跳过在绑定安装上重新上传缓存模块的步骤。


@bkucera 的回答通过绑定安装为您指明了正确的方向,通常在容器化环境中最简单的选择是创建一个存储缓存包的卷。这些包可以归档在 tarball 中,这是最常见的选项,或者甚至在必要时进行压缩(.tar 中的文件未压缩)。