Concourse CI - 在源代码中构建工件,将所有内容传递给下一个任务

Dan*_*elM 5 node.js npm concourse

我想在 Concourse 中为我的 Web 应用程序设置构建管道。该应用程序是使用 Node.js 构建的。

计划是做这样的事情:

                                        ,-> build style guide -> dockerize
source code -> npm install -> npm test -|
                                        `-> build website -> dockerize
Run Code Online (Sandbox Code Playgroud)

问题是,在 npm install 后,创建了一个新容器,因此node_modules目录丢失。我想传递node_modules到后面的任务,但因为它位于源代码“内部”,所以它不喜欢它并给了我

invalid task configuration:
  you may not have more than one input or output when one of them has a path of '.'
Run Code Online (Sandbox Code Playgroud)

这是我的工作设置

jobs:
  - name: test
    serial: true
    disable_manual_trigger: false
    plan:
      - get: source-code
        trigger: true

      - task: npm-install
        config:
          platform: linux
          image_resource:
            type: docker-image
            source: {repository: node, tag: "6" }
          inputs:
            - name: source-code
              path: .
          outputs:
            - name: node_modules
          run:
            path: npm
            args: [ install ]

      - task: npm-test
        config:
          platform: linux
          image_resource:
            type: docker-image
            source: {repository: node, tag: "6" }
          inputs:
            - name: source-code
              path: .
            - name: node_modules
          run:
            path: npm
            args: [ test ]
Run Code Online (Sandbox Code Playgroud)

更新2016-06-14

输入和输出只是目录。因此,您将想要输出的内容放入输出目录中,然后可以将其传递给同一作业中的另一个任务。输入和输出不能重叠,因此为了使用 npm 执行此操作,您必须将 node_modules 或整个源文件夹从输入文件夹复制到输出文件夹,然后在下一个任务中使用它。

但这在工作之间不起作用。到目前为止我看到的最好的建议是使用临时 git 存储库或存储桶来推送所有内容。必须有一种更好的方法来做到这一点,因为我想做的一部分就是避免大量的网络 IO。

Dav*_*son 4

有一个专门为作业之间的 npm 使用案例设计的资源。我已经使用它几个星期了:

https://github.com/ymedlop/npm-cache-resource

它基本上允许您缓存 npm 的第一次安装,并将其作为文件夹注入管道的下一个作业中。如果您想缓存多个node_modules,您也​​可以通过读取该资源的源代码来轻松设置自己的缓存资源。

实际上,我将此 npm-cache-resource 与 Nexus 代理结合使用,以进一步加快初始 npm 安装速度。

请注意,某些 npm 包具有本机绑定,需要使用与容器 Linux 版本标准库相匹配的标准库来构建,因此,如果您经常在不同类型的容器之间移动,您可能会遇到 libmusl 等问题,在这种情况下,我建议通过管道进行流处理以使用相同的容器类型或重建有问题的节点模块...

gradle 有一个类似的(npm 是基于它的) https://github.com/projectfalcon/gradle-cache-resource