采用这个基本的构建管道(带有 gradle 任务):
- 编译/运行单元测试(gradle clean build)
- 集成测试(gradle integrationTest)
- 验收测试(gradle acceptTest)
- 部署(gradle myCustomDeployTask)
根据 Jez Humble 的“持续交付”一书,您应该只构建一次二进制文件。因此,在上述理论管道中,在第 1 步中,我们清理、编译和构建 WAR,在第 2 步中,我们运行集成测试(使用第 1 步中的编译代码),在第 3 步中,我们运行验收测试(使用已编译的步骤 1 中的代码),并在步骤 4 中部署 WAR(在步骤 1 中构建)。到目前为止,一切都很好。
我正在尝试在 Jenkins 中实现这个管道。因为每个作业都有自己的工作区,所以步骤 2、3 和 4 最终会重新编译代码并构建 WAR,这违反了只构建二进制文件一次的“持续交付”口头禅。
为了解决这个问题,我使用了“ Clone Workspace SCM ”Jenkins 插件,它将从第一个构建压缩工作区,并成为构建 2、3 和 4 的工作区的源。但是,gradle 仍然重新编译每个构建中的代码步骤,因为它显然使用文件的绝对路径来确定是否需要执行任务。由于插件将文件移动到了新的工作区,因此绝对路径发生了变化,这使得 gradle 认为它需要从头开始,而不是执行增量构建。
现在我们可以在 Jenkins 中共享工作空间,但这也令人不悦,因为可能会针对共享工作空间运行两个作业。
那么如何在坚持持续交付、Jenkins 和 Gradle 的最佳实践的同时使用 Jenkins 和 Gradle 实现上述管道呢?