使用增量Gradle构建的Jenkins Build Pipeline

时间:2013-07-16 21:10:13

标签: jenkins gradle continuous-delivery build-pipeline

采用这个基本构建管道(使用gradle任务):

  1. 编译/运行单元测试(gradle clean build)
  2. 集成测试(gradle integrationTest)
  3. 验收测试(gradle acceptanceTest)
  4. 部署(gradle myCustomDeployTask)
  5. 根据Jez Humble的“持续交付”一书,你应该只建立一次二进制文件。所以在上面的理论管道中,在步骤1中我们清理,编译和构建WAR,在步骤2中我们运行集成测试(使用步骤1中的编译代码),在步骤3中我们运行验收测试(使用编译)来自步骤1)的代码,并且在步骤4中我们部署WAR(在步骤1中构建)。到目前为止一切都很好。

    我正在尝试在Jenkins中实现此管道。因为每个工作都有自己的工作空间,所以步骤2,3和& 4最终重新编译代码并构建WAR,这违反了仅仅构建二进制文件的“持续交付”口号。

    为了解决这个问题,我使用了“Clone Workspace SCM”Jenkins插件,它将从第一个版本压缩工作区,并成为构建2,3和&的工作区的源。但是,gradle仍会在每个步骤中重新编译代码,因为it apparently uses the absolute path of the files to determine if a task needs to be executed。由于插件将文件移动到新工作区,因此绝对路径发生了变化,这使得gradle认为它需要从头开始而不是执行增量构建。

    现在我们可以在Jenkins中共享工作区,但是由于可能有两个作业针对共享工作区运行,所以也不赞成。

    那么如何使用Jenkins和Gradle实现上述管道,同时遵循Continuous Delivery,Jenkins和Gradle的最佳实践?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

查看gradle文档中的Skipping Tasks section

这类似于答案 Gradle build without tests问题。