从文档中我不清楚是否甚至可以将一个工作的输出传递给另一个工作(不是从一个任务到另一个任务,而是从一个工作到另一个工作)。
我不知道在概念上我是否在做正确的事情,也许它应该在 Concourse 中以不同的方式建模,但我想要实现的是将 Java 项目的管道拆分为几个细粒度的作业,这些作业可以并行执行, 如果我需要重新运行某些工作,则独立触发。
我如何看待管道:
- 第一份工作:
- 从 github repo 中提取代码
- 使用 maven 构建项目
- 将工件部署到 Maven 存储库 (
mvn deploy
) - 更新
SNAPSHOT
Maven 项目子模块的版本 - 将工件(jar 文件)复制到输出目录(
output
的task
)
- 第二份工作:
- 从
jar
_output
- 为所有容器构建 docker 容器(并行)
- 从
- 管道继续
我无法将output
工作 1 传递到工作 2。此外,我很好奇我对原始 git repo 资源引入的任何更改是否会出现在下一个工作中(从工作 1 到工作 2)。
所以问题是:
- 将构建状态从作业传递到作业的正确方法是什么(我知道,作业可能会安排在不同的节点上,并且肯定是在不同的容器中)?
- 是否有必要将状态存储在资源中(例如 S3/git)?
- Concourse 在设计上是无状态的吗(在这种情况下)?
- 获取更多信息的最佳地点在哪里?手册我试过了,不是很详细。
到目前为止我发现了什么:
output
s 不会在工作之间传递- 对资源的任何更改(
put
对 github 存储库)都会在下一个作业中获取,但工作副本中的更改不会
最小的示例(如果注释行未注释错误,则会失败:)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