2017-03-06 38 views
5

the documentation我不清楚如果甚至有可能将一个作业的输出传递给另一个作业(不是从任务到任务,而是从作业到作业)。Concourse:如何将作业的输出传递给另一个作业

我不知道在概念上我做的是正确的事情,也许它应该在Concourse中以不同的方式建模,但是我试图实现的是将Java项目的管道拆分成几个粒度化作业,并行执行,并在需要重新运行某项工作时独立触发。

我怎么看管道:

  1. 第一份工作:
    • 拉从GitHub回购
    • 代码编译的Maven项目
    • 部署文物的Maven仓库(mvn deploy
    • 更新SNAPSHOT版本的Maven项目子模块
    • 副本工件(JAR文件)到输出目录
  2. 二作业(taskoutput):
    • 拾起jar的从output
    • 建立搬运工容器所有的人(并行)
  3. 流水线继续

我无法将output从作业1传递给作业2. 此外,我很好奇,如果我介绍的原始git repo资源的任何更改将出现在下一个作业(从作业1到作业2)中。

所以问题是:

  1. 什么是通过从转换工作状态建立一个适当的方式(我知道,乔布斯可能会安排不同的节点上,肯定在不同的容器)?
  2. 是否需要将状态存储在资源中(比如S3/git)?
  3. 设计中的Concourse stateless(在这种情况下)?
  4. 哪里是获取更多信息的最佳地点?我已经尝试过这本手册,但没有详细说明。

我到目前为止已经发现:

  1. output s的不是从作业传递到工作
  2. 到资源(put到GitHub库)的任何变化都在接下来的工作中取出,但在工作副本的变化并不

小例子,(它失败,如果注释行是注释掉错误:missing inputs: gist-upd, gist-out):

--- 
resources: 
    - name: gist 
    type: git 
    source: 
     uri: "[email protected]: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 "[email protected]" 
       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 

回答

8

要一一解答您的问题。

  1. 所有构建状态需要通过resource形式传递给作业,作业必须存储在某种外部存储上。
  2. 有必要存储在某种外部商店。每种资源类型都会处理这个上传并自行下载,因此对于您的特定情况,我会检查此maven custom resource type,这似乎是您想要的。
  3. 是的,这种无国籍状态是大厅背后的典型特征。汇总中唯一有状态的元素是资源,必须严格版本化并存储在外部数据存储上。当您将任务的集装箱化与资源的外部存储相结合时,您可以获得大厅提供的有保证的可重复性。资源的每个版本都将在某种数据存储上进行备份,因此即使您的ci运行的数据中心完全失效,您仍然可以对每个ci版本进行严格的重现性。
  4. 为了获得更多的信息,我会建议做一些类似的教程,让自己的手变脏,并自己建立一条管道。大厅团队制作了flight school,而且斯塔克和韦恩还有一点点advanced tutorial,这也可能有用。为了帮助理解资源,还有一个resources tutorial,这可能对您有所帮助。

此外,去你的特定错误,您看到missing inputs是因为中央大厅将寻找名为每个这样的输入目录(由资源gets制造)的原因。因此,在启动任务之前,您需要get资源实例名为gist-updgist-out

+1

太棒了,谢谢! –

+0

没问题,我只是编辑了答案,添加了一些更多信息。 –

+1

我会注意到,虽然工作对工作状态需要声明的资源,但它并未明确要求使用外部资源在同一工作的各个步骤之间传递数据。任务或资源的获取/放入会自动复制为目录。一个任务可以声明一个新的put:资源,这个资源对于作业来说是本地的,并且不会在流水线中声明为资源,同一个作业中的另一个任务可以有get:来匹配它。 –

相关问题