为什么这个Concourse管道不会一直运行?

时间:2017-12-13 12:43:47

标签: pipeline concourse

我们有一个包含3个阶段的管道:

  1. 构建lib
  2. 构建依赖于lib的应用程序。
  3. 将应用程序打包到发行版中(应用程序内联lib,因此发行版仅直接依赖于应用程序)。
  4. 如果我们提交lib,它应该构建,然后触发使用新lib构建的应用程序,最后,重新打包发行版。发行版的工作计划包括:

      - name: build-distro
        serial_groups: [grp]
        plan:
          - get: app
            passed: [build-app]
            trigger: true
          - get: distro
            trigger: true
    

    所有作业都是同一个串行组的成员,但如果通过更改lib触发管道,则不会运行发行版阶段。只有对应用程序进行更改才能运行发行版步骤。

    为了在对lib进行提交时构建发行版,必须将另一个资源依赖项添加到发行版的计划中:

      - get: lib
        passed: [build-lib]
        trigger: true
    

    在这个简化的设置中,这并不是一件坏事,但我们的实际情况有十多个库和五个应用程序,它们对libs有各种依赖关系。然后应将这些应用程序打包在一起。如果发行版必须依赖于除应用程序之外的所有库,为了针对所有更改进行构建,在YAML文件和管道的图形视图中,设置变得非常复杂。我们还想添加第四个阶段来对已完成的发行版进行UI测试,但这几乎无法管理所有必需的依赖项。

    我是否可以设置从发行版到应用程序的某种依赖项,以便每次构建应用程序时都可以构建发行版,而不依赖于lib?

1 个答案:

答案 0 :(得分:1)

所以,我想我终于知道这里发生了什么。这实际上很合乎逻辑:

依赖项触发器取决于资源,而不是构建的结论。因此,如果运行build-app作业,因为它取决于lib资源,这不会更改app所依赖的build-distro资源(具有限制) build-app通过了。

为了使这项工作,必须有build-app的{​​{1}}输出资源到下一阶段可以发现更改并触发的资源put。我们没有这样做,因为我们的构建是使用gradle完成的,构建脚本已经具有将输出资源上传到我们的本地存储库的功能,可以在下一阶段轻松下载它。