Concourse CI - 在源代码中构建工件,将所有工件传递给下一个任务
Concourse CI - Build Artifacts inside source, pass all to next task
我想在 Concourse 中为我的 Web 应用程序设置构建管道。该应用程序是使用 Node.
构建的
计划是这样的:
,-> build style guide -> dockerize
source code -> npm install -> npm test -|
`-> build website -> dockerize
问题是,在 npm install 之后,创建了一个新容器,因此 node_modules
目录丢失了。我想将 node_modules
传递到后面的任务中,但因为它是 "inside" 源代码,所以它不喜欢它并给了我
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。
This doesn't work between jobs though.
这是设计使然。 Job 中的每个步骤(get、task、put)都 运行 在一个独立的容器中。输入和输出仅在单个作业内有效。
连接乔布斯的是资源。推到 git 是一种方法。使用 blob 存储(例如 S3)或文件存储(例如 FTP)几乎肯定会更快更容易。
有专门为作业之间的 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
我想在 Concourse 中为我的 Web 应用程序设置构建管道。该应用程序是使用 Node.
构建的计划是这样的:
,-> build style guide -> dockerize
source code -> npm install -> npm test -|
`-> build website -> dockerize
问题是,在 npm install 之后,创建了一个新容器,因此 node_modules
目录丢失了。我想将 node_modules
传递到后面的任务中,但因为它是 "inside" 源代码,所以它不喜欢它并给了我
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。
This doesn't work between jobs though.
这是设计使然。 Job 中的每个步骤(get、task、put)都 运行 在一个独立的容器中。输入和输出仅在单个作业内有效。
连接乔布斯的是资源。推到 git 是一种方法。使用 blob 存储(例如 S3)或文件存储(例如 FTP)几乎肯定会更快更容易。
有专门为作业之间的 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