持续集成 - 如何在脱机服务器上运行npm install

时间:2017-09-11 18:07:01

标签: node.js jenkins npm ansible

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

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

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

由于这是一个较低的环境,我愿意在此服务器上提前做一些具体的事情,以便绕过这个问题。但是,由于playbook任务会在安装新代码之前将用户帐户下的所有现有文件置于回滚zip文件中,因此我在此用户帐户下在服务器上引入的任何内容都将被删除(。文件和目录除外)

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

2 个答案:

答案 0 :(得分:1)

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

  • 设置本地NPM注册表,例如sinopia并将其配置为默认注册表。没有互联网访问权限的节点将收到该软件包的最新缓存版本(假设它以前是由节点下载的)
  • 运行npm install一次,打包节点并在环境中共享工件

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

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

答案 1 :(得分:0)

另一种方法是设置内部NPM注册表,以便您的脱机Jenkins服务器可以与您的内部NPM通信,但是与公共NPM存储库保持同步可能会成为一场噩梦,会出现许多问题。 / p>

您需要允许“仅限出站”互联网访问此Jenkins服务器,以便在没有解决方法的情况下有效地工作。