Jenkins 使用增量 Gradle 构建构建管道

smg*_*e99 5 gradle jenkins build-pipeline continuous-delivery

以这个基本的构建管道(带有 gradle 任务)为例:

  1. 编译/运行单元测试(gradle clean build)
  2. 集成测试(gradle integrationTest)
  3. 验收测试(gradleacceptanceTest)
  4. 部署(gradle myCustomDeployTask)

根据 Jez Humble 的“Continuous Delivery”一书,您应该只构建一次二进制文件。所以在上面的理论管道中,在第 1 步中我们清理、编译和构建 WAR,在第 2 步中我们运行集成测试(使用第 1 步中编译的代码),在第 3 步中我们运行验收测试(使用编译后的代码)步骤 1 中的代码),并在步骤 4 中部署 WAR(在步骤 1 中构建)。到现在为止还挺好。

我正在尝试在 Jenkins 中实现这个管道。因为每个作业都有自己的工作区,所以第 2、3 和 4 步最终会重新编译代码并构建 WAR,这违反了只构建一次二进制文件的“持续交付”准则。

为了解决这个问题,我使用了“克隆工作区 SCM ”Jenkins 插件,它将从第一个构建中压缩工作区,并成为构建 2、3 和 4 的工作区源。但是,gradle 仍然重新编译每个构建中的代码步骤,因为它显然使用文件的绝对路径来确定是否需要执行任务。由于插件将文件移动到了新的工作空间,因此绝对路径发生了变化,这让 gradle 认为它需要从头开始而不是执行增量构建。

现在我们可以在 Jenkins 中共享工作区,但由于可能有两个作业针对共享工作区运行,因此这也令人不悦。

那么如何在坚持持续交付、Jenkins 和 Gradle 的最佳实践的同时,使用 Jenkins 和 Gradle 实现上述管道呢?

ott*_*akt 0

首先确保后面的目标(integrationTest 等)不依赖于编译。接下来,将第一个作业中生成的 war 文件作为 jenkins 工件发布。然后使用复制工件插件之类的工具将 war 文件复制到目标工作区。