我想在Concourse中为我的Web应用程序设置构建管道。该应用程序是使用Node构建的。
计划是做这样的事情:
,-> build style guide -> dockerize
source code -> npm install -> npm test -|
`-> build website -> dockerize
问题是,在安装npm之后,会创建一个新容器,导致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 '.'
这是我的工作设置
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 ]
更新2016-06-14
输入和输出只是目录。因此,您将要输出的内容放入输出目录,然后可以将其传递给同一作业中的另一个任务。输入和输出不能重叠,因此为了使用npm,您必须将node_modules或整个源文件夹从输入文件夹复制到输出文件夹,然后在下一个任务中使用它。
虽然这在作业之间不起作用。我到目前为止看到的最佳建议是使用临时git存储库或存储桶来推送所有。必须有更好的方法来实现这一点,因为我正在尝试做的部分工作是避免大量的网络IO。
答案 0 :(得分:3)
虽然这在工作之间不起作用。
这是设计的。作业中的每个步骤(get,task,put)都在一个隔离的容器中运行。输入和输出仅在单个作业中 。
连接作业的是资源。推动git是一种方式。它几乎肯定会更快更容易地使用blob存储(例如S3)或文件存储(例如FTP)。
答案 1 :(得分:3)
有一个专门为这个作业之间的npm用例设计的资源。我已经使用它几个星期了:
https://github.com/ymedlop/npm-cache-resource
它基本上允许你缓存第一次安装npm并将其作为文件夹注入到管道的下一个作业中。您也可以通过读取该资源的源来轻松设置自己的缓存资源,如果要缓存的不仅仅是node_modules。
我实际上正在将此npm-cache-resource与Nexus代理结合使用,以进一步加快初始npm安装。
请注意,某些npm软件包具有本机绑定,需要使用与容器linux版标准库匹配的标准库来构建,因此,如果您在不同类型的容器之间移动很多,您可能会遇到libmusl等的一些问题,在这种情况下,我建议流水线通过管道使用相同的容器类型或重建有问题的node_modules ...
有一个类似的gradle(npm的基础) https://github.com/projectfalcon/gradle-cache-resource