采用这个基本构建管道(使用gradle任务):
根据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的最佳实践?
答案 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问题。