为什么这个 Concourse 管道没有 运行 一直通过?

Why does this Concourse pipeline not run all the way through?

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

  1. 构建库
  2. 构建依赖库的应用程序。
  3. 正在将应用程序打包成发行版(应用程序内联库,因此发行版仅直接依赖于应用程序)。

如果我们对 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

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

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

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

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

为了使这项工作正常进行,必须有从 build-appput 的输出资源到下一阶段可以发现更改并触发的资源。我们没有这样做,因为我们的构建是使用 gradle 完成的,并且 build-scripts 已经具有将输出资源上传到我们的本地存储库的功能,可以在下一阶段轻松下载。