diff --git a/sonar/src/main/kotlin/com/bakdata/gradle/SonarPlugin.kt b/sonar/src/main/kotlin/com/bakdata/gradle/SonarPlugin.kt index dffe25f..33089ec 100644 --- a/sonar/src/main/kotlin/com/bakdata/gradle/SonarPlugin.kt +++ b/sonar/src/main/kotlin/com/bakdata/gradle/SonarPlugin.kt @@ -31,7 +31,12 @@ import org.gradle.api.logging.Logging import org.gradle.api.plugins.JavaPlugin import org.gradle.api.tasks.SourceSetContainer import org.gradle.api.tasks.testing.Test -import org.gradle.kotlin.dsl.* +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.register +import org.gradle.kotlin.dsl.the +import org.gradle.kotlin.dsl.withType import org.gradle.testing.jacoco.plugins.JacocoPluginExtension import org.gradle.testing.jacoco.tasks.JacocoReport diff --git a/sonar/src/test/resources/DemoTest.java b/sonar/src/test/resources/DemoTest.java index e5fbea0..9f92f63 100644 --- a/sonar/src/test/resources/DemoTest.java +++ b/sonar/src/test/resources/DemoTest.java @@ -1,9 +1,10 @@ +import static org.junit.jupiter.api.Assertions.assertEquals; + import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; public class DemoTest { @Test public void shouldBeEven() { assertEquals(true, 4 % 2 == 0); } -} \ No newline at end of file +} diff --git a/sonatype/src/main/kotlin/com/bakdata/gradle/SonatypePlugin.kt b/sonatype/src/main/kotlin/com/bakdata/gradle/SonatypePlugin.kt index 73846fb..f450f9e 100644 --- a/sonatype/src/main/kotlin/com/bakdata/gradle/SonatypePlugin.kt +++ b/sonatype/src/main/kotlin/com/bakdata/gradle/SonatypePlugin.kt @@ -1,7 +1,7 @@ /* * The MIT License * - * Copyright (c) 2025 bakdata GmbH + * Copyright (c) 2026 bakdata GmbH * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -39,7 +39,16 @@ import org.gradle.api.publish.maven.tasks.AbstractPublishToMaven import org.gradle.api.publish.maven.tasks.GenerateMavenPom import org.gradle.api.publish.maven.tasks.PublishToMavenLocal import org.gradle.api.tasks.bundling.Jar -import org.gradle.kotlin.dsl.* +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.create +import org.gradle.kotlin.dsl.extra +import org.gradle.kotlin.dsl.findByType +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.getByType +import org.gradle.kotlin.dsl.named +import org.gradle.kotlin.dsl.the +import org.gradle.kotlin.dsl.withType import org.gradle.plugins.signing.Sign import org.gradle.plugins.signing.SigningExtension import java.net.URI @@ -231,7 +240,8 @@ class SonatypePlugin : Plugin { withJavadocJar() } - project.tasks.matching { it.name == "dokkaJavadoc" }.all { + // Dokka v1 uses dokkaJavadoc, Dokka v2 uses dokkaGeneratePublicationJavadoc + project.tasks.matching { it.name == "dokkaJavadoc" || it.name == "dokkaGeneratePublicationJavadoc" }.all { val javadocTask: Task = this tasks.named("javadocJar") { from(javadocTask) diff --git a/sonatype/src/test/kotlin/com/bakdata/gradle/SonatypePluginIT.kt b/sonatype/src/test/kotlin/com/bakdata/gradle/SonatypePluginIT.kt index d3f4b3e..15ff711 100644 --- a/sonatype/src/test/kotlin/com/bakdata/gradle/SonatypePluginIT.kt +++ b/sonatype/src/test/kotlin/com/bakdata/gradle/SonatypePluginIT.kt @@ -25,7 +25,13 @@ package com.bakdata.gradle import com.github.tomakehurst.wiremock.WireMockServer -import com.github.tomakehurst.wiremock.client.WireMock.* +import com.github.tomakehurst.wiremock.client.WireMock.get +import com.github.tomakehurst.wiremock.client.WireMock.ok +import com.github.tomakehurst.wiremock.client.WireMock.okJson +import com.github.tomakehurst.wiremock.client.WireMock.okXml +import com.github.tomakehurst.wiremock.client.WireMock.post +import com.github.tomakehurst.wiremock.client.WireMock.put +import com.github.tomakehurst.wiremock.client.WireMock.urlMatching import com.github.tomakehurst.wiremock.http.RequestMethod import com.github.tomakehurst.wiremock.stubbing.Scenario.STARTED import groovy.json.StringEscapeUtils @@ -361,6 +367,135 @@ internal class SonatypePluginIT { assertThat(getUploadedFilesInGroup(wiremock)).containsExactlyInAnyOrderElementsOf(expectedUploads) } + @Test + fun testDokka2Project(@TempDir testProjectDir: Path, @Wiremock wiremock: WireMockServer) { + Files.writeString(testProjectDir.resolve("build.gradle.kts"), """ + plugins { + id("java") + id("com.bakdata.sonatype") + id("org.gradle.kotlin.kotlin-dsl") version "6.6.4" + id("org.jetbrains.dokka-javadoc") version "2.2.0" + } + repositories { + mavenCentral() + } + group = "$TEST_GROUP" + version = "$TEST_VERSION" + configure { + disallowLocalRelease = false + osshrUsername = "dummy user" + osshrPassword = "dummy pw" + signingKeyId = "72217EAF" + signingPassword = "test_password" + signingSecretKeyRingFile = "${getSecringFile()}" + nexusUrl = "${wiremock.baseUrl()}" + allowInsecureProtocol = true + } + configure { + description = "dummy description" + developers { + developer { + name.set("dummy name") + id.set("dummy id") + } + } + } + """.trimIndent()) + + Files.createDirectories(testProjectDir.resolve("src/main/kotlin/")) + Files.copy(SonatypePluginIT::class.java.getResourceAsStream("/Demo.kt"), + testProjectDir.resolve("src/main/kotlin/Demo.kt")) + + mockNexusProtocol(wiremock) + + val result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments("publishToNexus", "closeAndReleaseStagingRepositories", "--stacktrace", "--info") + .withPluginClasspath() + .build() + + SoftAssertions.assertSoftly { softly -> + softly.assertThat(result.tasks) + .haveExactly(1, taskWithPathAndOutcome(":signSonatypePublication", TaskOutcome.SUCCESS)) + .haveExactly(1, taskWithPathAndOutcome(":publishSonatypePublicationToNexusRepository", TaskOutcome.SUCCESS)) + .haveExactly(1, taskWithPathAndOutcome(":closeAndReleaseStagingRepositories", TaskOutcome.SUCCESS)) + } + + val projectName = testProjectDir.fileName.toString() + val expectedUploads = listOf(".jar", ".pom", "-javadoc.jar", "-sources.jar", ".module") + .map { classifier -> "$projectName/$TEST_VERSION/$projectName-$TEST_VERSION$classifier" } + .flatMap { baseFile -> listOf(baseFile, "$baseFile.asc") } + .plus("$projectName/maven-metadata.xml") + .flatMap { file -> listOf(file, "$file.md5", "$file.sha1", "$file.sha256", "$file.sha512") } + .flatMap { file -> listOf(file, file) } //FIXME somehow elements are uploaded twice + assertThat(getUploadedFilesInGroup(wiremock)).containsExactlyInAnyOrderElementsOf(expectedUploads) + } + + @Test + fun testDokka1Project(@TempDir testProjectDir: Path, @Wiremock wiremock: WireMockServer) { + Files.writeString(testProjectDir.resolve("build.gradle.kts"), """ + plugins { + id("java") + id("com.bakdata.sonatype") + id("org.gradle.kotlin.kotlin-dsl") version "6.6.4" + // V1 is enabled by default + id("org.jetbrains.dokka") version "2.0.0" + } + repositories { + mavenCentral() + } + group = "$TEST_GROUP" + version = "$TEST_VERSION" + configure { + disallowLocalRelease = false + osshrUsername = "dummy user" + osshrPassword = "dummy pw" + signingKeyId = "72217EAF" + signingPassword = "test_password" + signingSecretKeyRingFile = "${getSecringFile()}" + nexusUrl = "${wiremock.baseUrl()}" + allowInsecureProtocol = true + } + configure { + description = "dummy description" + developers { + developer { + name.set("dummy name") + id.set("dummy id") + } + } + } + """.trimIndent()) + + Files.createDirectories(testProjectDir.resolve("src/main/kotlin/")) + Files.copy(SonatypePluginIT::class.java.getResourceAsStream("/Demo.kt"), + testProjectDir.resolve("src/main/kotlin/Demo.kt")) + + mockNexusProtocol(wiremock) + + val result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments("publishToNexus", "closeAndReleaseStagingRepositories", "--stacktrace", "--info") + .withPluginClasspath() + .build() + + SoftAssertions.assertSoftly { softly -> + softly.assertThat(result.tasks) + .haveExactly(1, taskWithPathAndOutcome(":signSonatypePublication", TaskOutcome.SUCCESS)) + .haveExactly(1, taskWithPathAndOutcome(":publishSonatypePublicationToNexusRepository", TaskOutcome.SUCCESS)) + .haveExactly(1, taskWithPathAndOutcome(":closeAndReleaseStagingRepositories", TaskOutcome.SUCCESS)) + } + + val projectName = testProjectDir.fileName.toString() + val expectedUploads = listOf(".jar", ".pom", "-javadoc.jar", "-sources.jar", ".module") + .map { classifier -> "$projectName/$TEST_VERSION/$projectName-$TEST_VERSION$classifier" } + .flatMap { baseFile -> listOf(baseFile, "$baseFile.asc") } + .plus("$projectName/maven-metadata.xml") + .flatMap { file -> listOf(file, "$file.md5", "$file.sha1", "$file.sha256", "$file.sha512") } + .flatMap { file -> listOf(file, file) } //FIXME somehow elements are uploaded twice + assertThat(getUploadedFilesInGroup(wiremock)).containsExactlyInAnyOrderElementsOf(expectedUploads) + } + private fun getSecringFile(): String? = StringEscapeUtils.escapeJava( File( diff --git a/sonatype/src/test/resources/Demo.kt b/sonatype/src/test/resources/Demo.kt new file mode 100644 index 0000000..ce5e095 --- /dev/null +++ b/sonatype/src/test/resources/Demo.kt @@ -0,0 +1,5 @@ +public class Demo { + fun isEven(num: Int): Boolean { + return num % 2 == 0 + } +}