大厅:如何将作业的输出传递给不同的作业

标签 concourse

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

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

我如何看待管道:

  • 第一份工作:
  • 从 github repo
  • 拉取代码
  • 使用 maven
  • 构建项目
  • 将工件部署到 maven 存储库 ( mvn deploy )
  • 更新 SNAPSHOT Maven 项目子模块的版本
  • 将工件(jar 文件)复制到输出目录(outputtask )
  • 第二份工作:
  • 拿起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
    

    最佳答案

    一一回答你的问题。

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

  • 此外,为了解决您的具体错误,您看到 missing inputs 的原因是因为 concourse 将查找命名每个输入的目录(由资源 gets 创建)。所以你需要get名为 gist-upd 的资源实例和 gist-out在开始任务之前。

    关于大厅:如何将作业的输出传递给不同的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42634934/

    相关文章:

    continuous-integration - 大厅 : multiple steps on_failure

    concourse - 如何在大厅中制作 self 更新管道

    amazon-web-services - 配置Concourse CI以使用AWS Secrets Manager

    docker - 使用 Concourse 的 docker 资源获取要在 docker compose 中使用的容器

    docker - 测试容器完成时终止 docker compose

    concourse - 如何使用特定用户运行 Concourse CI 作业任务?

    authentication - Dockerhub 的访问 token

    到 Git 的 Concourse Webhook

    docker - Concourse 无法访问 Docker 注册表

    docker - 大厅gradle java build CI