Concourse:如何将工作的输出传递给不同的工作

Concourse: how to pass job's output to a different job

我从 the documentation 不清楚是否有可能将一个作业的输出传递给另一个作业(不是从一个任务到另一个任务,而是从一个作业到另一个作业)。

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

我如何看待管道:

  1. 第一份工作:
    • 从 github repo
    • 中提取代码
    • 使用 maven 构建项目
    • 将工件部署到 Maven 存储库 (mvn deploy)
    • 更新 SNAPSHOT 个版本的 Maven 项目子模块
    • 将工件(jar 文件)复制到输出目录(taskoutput
  2. 第二份工作:
    • output
    • 中挑选 jar
    • 为所有容器构建 docker 个容器(并行)
  3. 管道继续

我无法将 output 从作业 1 传递到作业 2。 另外,我很好奇我对原始 git repo 资源所做的任何更改是否会出现在下一个作业中(从作业 1 到作业 2)。

所以问题是:

  1. 将构建状态从一个作业传递到另一个作业的正确方法是什么(我知道,作业可能会安排在不同的节点上,而且肯定是在不同的容器中)?
  2. 是否有必要将状态存储在资源中(例如,S3/git)?
  3. Concourse 是否设计为无状态(在此上下文中)?
  4. 哪里是获取更多信息的最佳地点?我试过手册,就是没那么详细。

到目前为止我发现了什么:

  1. outputs 不会在作业之间传递
  2. 对资源的任何更改(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

为您一一解答。

  1. 所有构建状态都需要以 resource 的形式从作业传递到作业,必须存储在某种外部存储中。
  2. 有必要存储在某种外部存储上。每种资源类型都会自行处理此上传和下载,因此对于您的特定 cific 案例,我会查看此 maven custom resource type,它似乎可以满足您的要求。
  3. 是的,这种无国籍状态是大厅背后的决定性特征。 concourse 中唯一的有状态元素是资源,它必须严格控制版本并存储在外部数据存储中。当您将任务的容器化与资源的外部存储相结合时,您将获得 concourse 提供的有保证的可重复性ci。资源的每个版本都将在某种数据存储上进行备份,因此即使您 ci 运行的数据中心完全崩溃,您仍然可以拥有严格的 reproduci每个 ci 构建的能力。
  4. 为了获得更多信息,我建议您做一些教程来亲自动手并自己构建管道。 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-updgist-out 的资源实例。