在我开始在我的gradle.build文件中使用Spring boot gradle插件后,jenkins的构建失败了。
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.2.RELEASE")
事情在本地运行良好,包括构建、测试和使用Jetty运行良好的webapp。唯一的问题是任务artifactoryPublish
中的Jenkins构建失败。它说:
File '/var/lib/jenkins/jobs/release-my-project/workspace/build/libs/workspace-0.2.1-SNAPSHOT.jar' does not exists, and need to be published!
不确定gradleartifactoryPublish
任务是怎么回事。我认为任务来自Jenkins。
在使用Spring boot gradle插件之前,我在gradle.build的jar任务如下:
jar {
baseName = 'my-project'
from {
configurations.compile.collect {
it.isDirectory() ? it : zipTree(it)
}
configurations.runtime.collect {
it.isDirectory() ? it : zipTree(it)
}
}
manifest {
attributes 'Main-Class':'com.example.Application'
}
// Exclude manifest signature files
exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/LICENSE'
}
由于Spring boot gradle插件禁用了jar任务,并将其替换为bootJar任务,因此我将bootjar任务配置如下:
bootJar {
baseName = 'my-project'
mainClassName = 'com.example.Application'
// Exclude manifest signature files
exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/LICENSE'
}
我从jenkins日志中注意到的一件事是,它说文件workspace-0.2.1-SNAPSHOT. jar
不存在。似乎它正在寻找错误的文件。以前,它寻找正确的文件my-project ect-0.2.1-SNAPSHOT.jar
。当我在本地构建时,创建了这个jar文件。不确定是什么让jenkins寻找workspace-0.2.1-SNAPSHOT.jar
。它应该是my-project
,因为我在bootJar任务中定义了baseName。
知道这里怎么了吗?谢谢。
除非您显式定义项目的名称,否则Gradle将使用目录名作为项目名称。在Jenkins,项目目录称为“工作区”。artifactoryPublish
大概是使用项目名称来确定要发布的JAR文件的名称。如果是这种情况,这不是一个好的做法。
无论如何,您真的应该设置项目的名称。那么您不必在Jar
任务上显式设置baseName
。只需在项目的根目录中添加一个settings. gradle文件,即build.gradle文件旁边,并将其内容设置为:
rootProject.name = "my-project"
这应该有望解决问题,尽管它实际上取决于artifactoryPublish
任务正在做什么。
我想扩展彼得的回答,Gradle的作者建议我们应该使用settings. gradle
在设置文件中定义根项目名称:“rootProject.name”有效地为整个构建分配了一个名称,这在构建扫描等报告中使用。如果未设置根项目名称,该名称将是容器目录名,这可能是不稳定的(即您可以将项目签出到任何目录)。