【问题标题】:Speed Up NPM Build in Jenkins在 Jenkins 中加速 NPM 构建
【发布时间】:2018-11-10 04:29:14
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    您应该使用包缓存而不是直接缓存node_modules。而是挂载 软件包安装程序使用的缓存目录,您的安装将快速。 Docker 确实通过允许您在容器中挂载目录来实现这一点,这些目录在构建中持续存在。

    对于yarn 挂载~/.cache~/.cache/yarn
    对于npm 挂载~/.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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 以前使用yarn cache需要15分钟,现在需要2分钟。
        【解决方案4】:

        我已经解释了我对可能的实现 here 所做的事情。我没有使用package-lock.json,而是使用npm ls 命令来检查node_modules 文件夹中的更改,这样我就有可能跳过在绑定挂载上重新上传缓存模块的步骤。


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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-26
          • 2015-02-24
          • 2012-07-18
          • 1970-01-01
          • 1970-01-01
          • 2021-09-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多