使用 gradle bootJar 而不是 jar 任务并且在 Jenkins 中构建失败

Sim*_*imo 4 java build gradle jenkins spring-boot

在我的 gradle.build 文件中开始使用 spring boot gradle 插件后,jenkins 上的构建失败。

classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.2.RELEASE")
Run Code Online (Sandbox Code Playgroud)

一切都在本地运行良好,包括构建、测试和 web 应用程序在 Jetty 上运行良好。唯一的问题是任务中 Jenkins 的构建失败artifactoryPublish。它说:

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!
Run Code Online (Sandbox Code Playgroud)

不确定 gradleartifactoryPublish任务发生了什么。我认为任务来自詹金斯。

在使用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'
}   
Run Code Online (Sandbox Code Playgroud)

由于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'
}
Run Code Online (Sandbox Code Playgroud)

我从 jenkins 日志中注意到的一件事是它说该文件workspace-0.2.1-SNAPSHOT.jar不存在。似乎它正在寻找错误的文件。以前,它会查找正确的文件my-project-0.2.1-SNAPSHOT.jar. 当我在本地构建时,创建了这个 jar 文件。不知道是什么让詹金斯寻找workspace-0.2.1-SNAPSHOT.jar。它应该my-project像我在 bootJar 任务中定义 baseName 一样。

知道这里有什么问题吗?谢谢。

Pet*_*ook 5

除非您明确定义项目名称,否则 Gradle 将使用目录名称作为项目名称。在 Jenkins 上,项目目录被称为“工作区”。artifactoryPublish大概是使用项目名称来确定要发布的 JAR 文件的名称。如果是这种情况,那可不是好习惯。

无论如何,您确实应该设置项目的名称。你不会有明确设置baseNameJar任务,然后。只需在项目的根目录,即build.gradle文件旁边添加一个settings.gradle文件,并将其内容设置为:

rootProject.name = "my-project"
Run Code Online (Sandbox Code Playgroud)

这应该有望解决问题,尽管这实际上取决于artifactoryPublish任务在做什么。