【问题标题】:Continuous Integration - How to run npm install on offline server持续集成 - 如何在离线服务器上运行 npm install
【发布时间】:2017-09-12 08:36:41
【问题描述】:

我们的持续集成系统使用 ansible playbook 将我们的 repo(包括节点模块)部署到我们的 ansible 主机文件中指定的服务器列表。我们有许多在单独的主机文件中配置的环境。 Jenkins 是我们的构建服务器,用于按计划启动每个 ansible 运行。 ansible playbook 中的任务之一是 npm install。

我们的问题出现是因为只有一个环境离线,所以当 playbook 在这个特定环境上执行 npm install 任务(读取“主机文件”)时,由于缺乏互联网连接而失败。

我已经看到很多关于如何手动解决此问题的答案,但我们持续集成系统的全部意义在于自动且一致地运行(从环境到环境)。所以我不想在 playbook 和/或 repo 中引入一堆解决方法来捆绑节点模块等,只是为了解决这个特定的主机离线问题。

由于这是一个较低的环境,我愿意提前做一些具体的事情,作为一个时间步骤,在这个服务器上绕过这个问题。但是由于剧本任务在安装新代码之前将用户帐户下的所有现有文件压缩为一个回滚 zip 文件,因此我在该用户帐户下的服务器上引入的任何内容都将基本上被删除(. 文件和目录除外) .

那么,我们如何通过 CI 在单个离线服务器上运行 npm install 而无需人工干预?

【问题讨论】:

  • 我们是大量使用 nodejs 应用程序。 @James 提到的第二个解决方案,我们就是这样工作的。如果您需要这方面的帮助,我可以逐步指导您
  • 进一步详细说明问题/解决方案 - 由于我们的 package.json 频繁更改,npm install 命令可能会从一次运行更改为下一次。因此,在每个构建中运行它可能很重要。所以我的方向是在克隆之后,在启动 Ansible 部署到主机之前,在 Jenkins 服务器(确实有互联网连接)上运行它。
  • 我们也在做同样的事情,检查代码,执行 npm 安装,归档代码并上传到存储位置,然后启动 ansible 作业,它从存储服务器下载它并完成剩余的任务。

标签: node.js jenkins npm ansible


【解决方案1】:

我对 ansible 不熟悉,但您遇到的问题并不少见,而且肯定有自动解决方法,例如

  • 设置本地 NPM 注册表,例如sinopia 并将其配置为您的默认注册表。无法访问 Internet 的节点将收到最新的缓存版本的包(假设它之前已由节点下载)
  • 运行一次npm install,将节点打包并在环境之间共享工件

就个人而言,我更喜欢并提倡第二种解决方案,因为:

  • 更快的 CI 运行(只需下载一次)
  • 包版本在所有环境中都有保证(尽管严格的版本控制也可以解决这个问题)

【讨论】:

  • 我认为我们将采纳您的第二个建议 - 这样它是依赖项的冻结实现并且可在所有环境中重复。
【解决方案2】:

另一种方法是设置一个内部 NPM 注册表,以便您的离线 Jenkins 服务器可以与您的内部 NPM 通信,但是与公共 NPM 存储库保持同步可能是一场噩梦,会带来许多问题。

您需要允许“仅出站” Internet 访问此 Jenkins 服务器,以使其在没有变通办法的情况下有效工作。

【讨论】:

  • 所以在这种情况下,我们的 jenkins 服务器仅用于在本地提取 repo,除了启动 ansible playbook 之外,它不执行任何 shell 命令。此外,jenkins 确实可以访问互联网,而不是部署到的节点。因此,当 ansible ssh 连接到节点时,它需要有权运行 npm install 任务。我们的其他环境没有这个问题,所以如果我们不需要的话,不想让剧本陷入不必要的任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 2022-01-18
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多