18

从文档中我不清楚是否甚至可以将一个工作的输出传递给另一个工作(不是从一个任务到另一个任务,而是从一个工作到另一个工作)。

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

我如何看待管道:

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

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

所以问题是:

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

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

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

1 回答 1

20

一一回答你的问题。

  1. 所有构建状态都需要以资源的形式从一个作业传递到另一个作业,该资源必须存储在某种外部存储中。
  2. 有必要存储在某种外部存储上。每种资源类型都会自行处理此上传和下载,因此对于您的具体情况,我会查看这个Maven 自定义资源类型,它似乎可以满足您的需求。
  3. 是的,这种无国籍状态是大厅背后的决定性特征。大厅中唯一的有状态元素是资源,它必须严格控制版本并存储在外部数据存储中。当您将任务的容器化与外部资源存储相结合时,您将获得 concourse 提供的有保证的可重复性。资源的每个版本都将在某种数据存储上进行备份,因此即使运行 ci 的数据中心完全崩溃,您仍然可以对每个 ci 构建进行严格的可重复性。
  4. 为了获得更多信息,我建议你做一个教程来弄脏你的手并自己建立一个管道。斯塔克和韦恩有一个可能有用的教程。为了帮助理解资源,还有一个资源教程,它可能对您特别有帮助。

此外,为了解决您的特定错误,您看到的原因是因为 concourse 将查找名为每个输入missing inputs的目录(由 resource 创建)。gets因此,您需要在启动任务之前为命名的get实例提供资源。gist-updgist-out

于 2017-03-06T21:55:48.643 回答