以下是一个基本的构建流程(使用gradle任务):
- 编译/运行单元测试(gradle clean build)
- 集成测试(gradle integrationTest)
- 验收测试(gradle acceptanceTest)
- 部署(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实现上述流程呢?