Concourse:如何将工作的输出传递给不同的工作
Concourse: how to pass job's output to a different job
我从 the documentation 不清楚是否有可能将一个作业的输出传递给另一个作业(不是从一个任务到另一个任务,而是从一个作业到另一个作业)。
我不知道在概念上我做的事情是否正确,也许它应该在 Concourse 中以不同的方式建模,但我想要实现的是将 Java 项目的管道分成几个粒度作业,可以并行执行,如果我需要重新 运行 某些作业,则可以独立触发。
我如何看待管道:
- 第一份工作:
- 从 github repo
中提取代码
- 使用 maven 构建项目
- 将工件部署到 Maven 存储库 (
mvn deploy
)
- 更新
SNAPSHOT
个版本的 Maven 项目子模块
- 将工件(jar 文件)复制到输出目录(
task
的output
)
- 第二份工作:
- 从
output
中挑选 jar
- 为所有容器构建 docker 个容器(并行)
- 管道继续
我无法将 output
从作业 1 传递到作业 2。
另外,我很好奇我对原始 git repo 资源所做的任何更改是否会出现在下一个作业中(从作业 1 到作业 2)。
所以问题是:
- 将构建状态从一个作业传递到另一个作业的正确方法是什么(我知道,作业可能会安排在不同的节点上,而且肯定是在不同的容器中)?
- 是否有必要将状态存储在资源中(例如,S3/git)?
- Concourse 是否设计为无状态(在此上下文中)?
- 哪里是获取更多信息的最佳地点?我试过手册,就是没那么详细。
到目前为止我发现了什么:
output
s 不会在作业之间传递
- 对资源的任何更改(
put
对 git 集线器存储库)都将在下一个作业中获取,但工作副本中的更改不会
最小示例(如果注释行未注释并出现错误则失败:missing inputs: gist-upd, gist-out
):
---
resources:
- name: gist
type: git
source:
uri: "git@bitbucket.org:snippets/foo/bar.git"
branch: master
private_key: {{private_git_key}}
jobs:
- name: update
plan:
- get: gist
trigger: true
- task: update-gist
config:
platform: linux
image_resource:
type: docker-image
source: {repository: concourse/bosh-cli}
inputs:
- name: gist
outputs:
- name: gist-upd
- name: gist-out
run:
path: sh
args:
- -exc
- |
git config --global user.email "nobody@concourse.ci"
git config --global user.name "Concourse"
git clone gist gist-upd
cd gist-upd
echo `date` > test
git commit -am "upd"
cd ../gist
echo "foo" > test
cd ../gist-out
echo "out" > test
- put: gist
params: {repository: gist-upd}
- name: fetch-updated
plan:
- get: gist
passed: [update]
trigger: true
- task: check-gist
config:
platform: linux
image_resource:
type: docker-image
source: {repository: alpine}
inputs:
- name: gist
#- name: gist-upd
#- name: gist-out
run:
path: sh
args:
- -exc
- |
ls -l gist
cat gist/test
#ls -l gist-upd
#cat gist-upd/test
#ls -l gist-out
#cat gist-out/test
为您一一解答。
- 所有构建状态都需要以 resource 的形式从作业传递到作业,必须存储在某种外部存储中。
- 有必要存储在某种外部存储上。每种资源类型都会自行处理此上传和下载,因此对于您的特定 cific 案例,我会查看此 maven custom resource type,它似乎可以满足您的要求。
- 是的,这种无国籍状态是大厅背后的决定性特征。 concourse 中唯一的有状态元素是资源,它必须严格控制版本并存储在外部数据存储中。当您将任务的容器化与资源的外部存储相结合时,您将获得 concourse 提供的有保证的可重复性ci。资源的每个版本都将在某种数据存储上进行备份,因此即使您 ci 运行的数据中心完全崩溃,您仍然可以拥有严格的 reproduci每个 ci 构建的能力。
- 为了获得更多信息,我建议您做一些教程来亲自动手并自己构建管道。 Stark 和 wayne 有一个 tutorial that could be useful. In order to help understand resources there is also a resources tutorial,这可能对你特别ci有帮助。
此外,为了解决您的特定 cific 错误,您看到 missing inputs
的原因是因为 concourse 将查找目录(由资源 gets
创建)命名为每个这些输入。因此,在开始任务之前,您需要 get
名为 gist-upd
和 gist-out
的资源实例。
我从 the documentation 不清楚是否有可能将一个作业的输出传递给另一个作业(不是从一个任务到另一个任务,而是从一个作业到另一个作业)。
我不知道在概念上我做的事情是否正确,也许它应该在 Concourse 中以不同的方式建模,但我想要实现的是将 Java 项目的管道分成几个粒度作业,可以并行执行,如果我需要重新 运行 某些作业,则可以独立触发。
我如何看待管道:
- 第一份工作:
- 从 github repo 中提取代码
- 使用 maven 构建项目
- 将工件部署到 Maven 存储库 (
mvn deploy
) - 更新
SNAPSHOT
个版本的 Maven 项目子模块 - 将工件(jar 文件)复制到输出目录(
task
的output
)
- 第二份工作:
- 从
output
中挑选 - 为所有容器构建 docker 个容器(并行)
jar
- 从
- 管道继续
我无法将 output
从作业 1 传递到作业 2。
另外,我很好奇我对原始 git repo 资源所做的任何更改是否会出现在下一个作业中(从作业 1 到作业 2)。
所以问题是:
- 将构建状态从一个作业传递到另一个作业的正确方法是什么(我知道,作业可能会安排在不同的节点上,而且肯定是在不同的容器中)?
- 是否有必要将状态存储在资源中(例如,S3/git)?
- Concourse 是否设计为无状态(在此上下文中)?
- 哪里是获取更多信息的最佳地点?我试过手册,就是没那么详细。
到目前为止我发现了什么:
output
s 不会在作业之间传递- 对资源的任何更改(
put
对 git 集线器存储库)都将在下一个作业中获取,但工作副本中的更改不会
最小示例(如果注释行未注释并出现错误则失败:missing inputs: gist-upd, gist-out
):
---
resources:
- name: gist
type: git
source:
uri: "git@bitbucket.org:snippets/foo/bar.git"
branch: master
private_key: {{private_git_key}}
jobs:
- name: update
plan:
- get: gist
trigger: true
- task: update-gist
config:
platform: linux
image_resource:
type: docker-image
source: {repository: concourse/bosh-cli}
inputs:
- name: gist
outputs:
- name: gist-upd
- name: gist-out
run:
path: sh
args:
- -exc
- |
git config --global user.email "nobody@concourse.ci"
git config --global user.name "Concourse"
git clone gist gist-upd
cd gist-upd
echo `date` > test
git commit -am "upd"
cd ../gist
echo "foo" > test
cd ../gist-out
echo "out" > test
- put: gist
params: {repository: gist-upd}
- name: fetch-updated
plan:
- get: gist
passed: [update]
trigger: true
- task: check-gist
config:
platform: linux
image_resource:
type: docker-image
source: {repository: alpine}
inputs:
- name: gist
#- name: gist-upd
#- name: gist-out
run:
path: sh
args:
- -exc
- |
ls -l gist
cat gist/test
#ls -l gist-upd
#cat gist-upd/test
#ls -l gist-out
#cat gist-out/test
为您一一解答。
- 所有构建状态都需要以 resource 的形式从作业传递到作业,必须存储在某种外部存储中。
- 有必要存储在某种外部存储上。每种资源类型都会自行处理此上传和下载,因此对于您的特定 cific 案例,我会查看此 maven custom resource type,它似乎可以满足您的要求。
- 是的,这种无国籍状态是大厅背后的决定性特征。 concourse 中唯一的有状态元素是资源,它必须严格控制版本并存储在外部数据存储中。当您将任务的容器化与资源的外部存储相结合时,您将获得 concourse 提供的有保证的可重复性ci。资源的每个版本都将在某种数据存储上进行备份,因此即使您 ci 运行的数据中心完全崩溃,您仍然可以拥有严格的 reproduci每个 ci 构建的能力。
- 为了获得更多信息,我建议您做一些教程来亲自动手并自己构建管道。 Stark 和 wayne 有一个 tutorial that could be useful. In order to help understand resources there is also a resources tutorial,这可能对你特别ci有帮助。
此外,为了解决您的特定 cific 错误,您看到 missing inputs
的原因是因为 concourse 将查找目录(由资源 gets
创建)命名为每个这些输入。因此,在开始任务之前,您需要 get
名为 gist-upd
和 gist-out
的资源实例。