Jenkins构建流水线与增量Gradle构建

5

以下是一个基本的构建流程(使用gradle任务):

  1. 编译/运行单元测试(gradle clean build)
  2. 集成测试(gradle integrationTest)
  3. 验收测试(gradle acceptanceTest)
  4. 部署(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实现上述流程呢?

https://wiki.jenkins-ci.org/display/JENKINS/Copy+Artifact+Plugin - Cole9350
你好,你能把你的最终解决方案发一下吗? - Dominic
2个回答

0

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


但是 integrationTest 是一个测试任务,而测试任务依赖于编译。 - smgeorge99
1
Bagheera的观点也是正确的。gradle integrationTest -x build -x clean。 - AKS
考虑到目前的情况,这是一个有效的答案,但如果在Artifactory中查找Jar文件,并且只有在没有找到Jar文件的情况下才编译代码,那岂不是更好? - Taylor

0

我没有尝试过,但你可以尝试将以下内容添加到你的项目中:

build.onlyIf { ! Boolean.getBoolean('skip.build') }

使用-Dskip.build=true参数运行gradle,将跳过构建任务。

请查看gradle文档中的Skipping Tasks section

这类似于Gradle build without tests问题中的一个答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接