代码之家  ›  专栏  ›  技术社区  ›  Jørgen Sivesind

为什么这条中央大厅管道没有贯穿始终?

  •  0
  • Jørgen Sivesind  · 技术社区  · 7 年前

    我们的管道分为三个阶段:

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

    如果我们提交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和五个对libs有各种依赖关系的应用程序。然后应将这些应用打包在一起。如果发行版必须依赖于除应用程序之外的所有lib,以便针对所有更改进行构建,那么无论是在YAML文件中还是在管道的图形视图中,设置都会变得非常复杂。我们还想添加第四个阶段来对已完成的发行版进行UI测试,但对于所有必需的依赖项来说,这几乎是无法管理的。

    我是否可以在发行版和应用程序之间建立某种依赖关系,以便发行版在每次构建应用程序时都能构建,而不依赖lib?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Jørgen Sivesind    7 年前

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

    依赖触发器取决于资源,而不是构建的结论。那么,如果 build-app 作业正在运行,因为它取决于 lib 资源,这不会更改 app 资源,其中 build-distro 取决于(有以下限制 生成应用程序 已通过)。

    为了实现这一目标,必须有来自 生成应用程序 那是 put 到下一阶段可以发现更改并触发的资源。我们没有这样做,因为我们的构建是用gradle完成的,构建脚本已经具备了将输出资源上传到本地存储库的功能,可以在下一阶段轻松下载。