Skip to content

Commit

Permalink
Refactor publication to local repository for integration tests
Browse files Browse the repository at this point in the history
  • Loading branch information
tbroyer committed Jan 21, 2023
1 parent 1ae5002 commit 4a41209
Show file tree
Hide file tree
Showing 4 changed files with 125 additions and 72 deletions.
108 changes: 77 additions & 31 deletions build-logic/src/main/kotlin/local/maven-publish.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -29,47 +29,52 @@ val sonatypeRepository = publishing.repositories.maven {
}
}

val mavenPublication = publishing.publications.create<MavenPublication>("maven") {
from(components["java"])
afterEvaluate {
artifactId = base.archivesName.get()
}

versionMapping {
usage("java-api") {
fromResolutionOf("runtimeClasspath")
fun createPublication(publicationName: String) =
publishing.publications.create<MavenPublication>(publicationName) {
from(components["java"])
afterEvaluate {
artifactId = base.archivesName.get()
}
usage("java-runtime") {
fromResolutionResult()
}
}

pom {
name.set(provider { "$groupId:$artifactId" })
description.set(provider { project.description ?: name.get() })
url.set("https://github.com/tbroyer/gradle-incap-helper")
developers {
developer {
name.set("Thomas Broyer")
email.set("t.broyer@ltgt.net")
versionMapping {
usage("java-api") {
fromResolutionOf("runtimeClasspath")
}
usage("java-runtime") {
fromResolutionResult()
}
}
scm {
connection.set("https://github.com/tbroyer/gradle-incap-helper.git")
developerConnection.set("scm:git:ssh://github.com:tbroyer/gradle-incap-helper.git")

pom {
name.set(provider { "$groupId:$artifactId" })
description.set(provider { project.description ?: name.get() })
url.set("https://github.com/tbroyer/gradle-incap-helper")
}
licenses {
license {
name.set("The Apache License, Version 2.0")
url.set("https://www.apache.org/licenses/LICENSE-2.0.txt")
developers {
developer {
name.set("Thomas Broyer")
email.set("t.broyer@ltgt.net")
}
}
scm {
connection.set("https://github.com/tbroyer/gradle-incap-helper.git")
developerConnection.set("scm:git:ssh://github.com:tbroyer/gradle-incap-helper.git")
url.set("https://github.com/tbroyer/gradle-incap-helper")
}
licenses {
license {
name.set("The Apache License, Version 2.0")
url.set("https://www.apache.org/licenses/LICENSE-2.0.txt")
}
}
}
}
}

val mavenPublication = createPublication("maven")

tasks.withType<PublishToMavenRepository>().configureEach {
onlyIf { if (repository == sonatypeRepository) publication == mavenPublication else true }
if (repository == sonatypeRepository) {
onlyIf { publication == mavenPublication }
}
}

signing {
Expand All @@ -80,3 +85,44 @@ signing {

inline val Project.isSnapshot
get() = version.toString().endsWith("-SNAPSHOT")
//
// For integration tests
//
// Inspired by https://github.com/sigstore/sigstore-java/pull/264/files

// name must already be capitalized for computing task name below
val localPublication = createPublication("Local")

val localRepoDir = layout.buildDirectory.dir("local-maven-repo")

val localRepository = publishing.repositories.maven {
name = "Local" // must already be capitalized for computing task name below
url = uri(localRepoDir)
}

tasks {
val cleanLocalRepository by registering(Delete::class) {
delete(localRepoDir)
}
withType<PublishToMavenRepository>().configureEach {
if (repository == localRepository) {
onlyIf { publication == localPublication }
dependsOn(cleanLocalRepository)
}
}
}

val localRepoElements by configurations.creating {
isCanBeConsumed = true
isCanBeResolved = false
description = "Shares local maven repository directory that contains the artifacts produced by the current project"
attributes {
attribute(Category.CATEGORY_ATTRIBUTE, objects.named("maven-repository"))
attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.EXTERNAL))
}
outgoing {
artifact(localRepoDir) {
builtBy(tasks.named("publish${localPublication.name}PublicationTo${localRepository.name}Repository"))
}
}
}
53 changes: 24 additions & 29 deletions integTest/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,49 +1,44 @@
plugins {
id("local.kotlin-base")
`embedded-kotlin`
`maven-publish`
}

// XXX: separate "dependency bucket" from resolvable configuration?
val localMavenRepositories by configurations.creating {
isCanBeConsumed = false
isCanBeResolved = true
// Same attributes as in local.maven-publish convention plugin
attributes {
attribute(Category.CATEGORY_ATTRIBUTE, objects.named("maven-repository"))
attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.EXTERNAL))
}
}

dependencies {
testImplementation(libs.junit)
testImplementation(libs.truth)
testImplementation(gradleTestKit())
}

evaluationDependsOn(projects.lib.dependencyProject.path)
evaluationDependsOn(projects.processor.dependencyProject.path)

publishing {
repositories {
maven(url = "$buildDir/repository") {
name = "test"
}
}
publications {
create<MavenPublication>("lib") {
from(projects.lib.dependencyProject.components["java"])
groupId = projects.lib.group.toString()
artifactId = projects.lib.dependencyProject.base.archivesName.get()
version = projects.lib.version.toString()
}
create<MavenPublication>("processor") {
from(projects.processor.dependencyProject.components["java"])
groupId = projects.processor.group.toString()
artifactId = projects.processor.dependencyProject.base.archivesName.get()
version = projects.processor.version.toString()
}
}
localMavenRepositories(projects.lib)
localMavenRepositories(projects.processor)
}

tasks {
test {
inputs.files(
project.projects.lib.dependencyProject.tasks.named("jar"),
project.projects.processor.dependencyProject.tasks.named("jar")
localMavenRepositories.asFileTree.matching {
exclude("**/maven-metadata.*")
}
)
.withPropertyName("testRepositories")
.withPathSensitivity(PathSensitivity.RELATIVE)

systemProperty("version", rootProject.version.toString())

dependsOn("publishLibPublicationToTestRepository", "publishProcessorPublicationToTestRepository")
// systemProperty doesn't support providers, so fake it with CommandLineArgumentProvider
jvmArgumentProviders.add(
CommandLineArgumentProvider {
listOf("-DtestRepositories=${localMavenRepositories.joinToString(File.pathSeparator) { project.relativePath(it) }}")
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ class DynamicIncrementalProcessorIntegrationTest {
val testProjectDir = TemporaryFolder()

private val version = System.getProperty("version")!!
private val testRepositories = System.getProperty("testRepositories")!!.splitToSequence(File.pathSeparator).joinToString("\n") {
"""
maven { url = uri("${File(it).toURI().toASCIIString()}") }
""".trimIndent()
}

@Test
fun testDynamicProcessor() {
Expand Down Expand Up @@ -80,19 +85,20 @@ class DynamicIncrementalProcessorIntegrationTest {
private fun setupProject() {
testProjectDir.newFile("settings.gradle.kts").writeText(
"""
dependencyResolutionManagement {
repositories {
${testRepositories.prependIndent(" ".repeat(2))}
}
}
include(":processor")
""".trimIndent()
)

val testRepository = File("build/repository").absolutePath.replace(File.separatorChar, '/')
testProjectDir.newFile("build.gradle.kts").writeText(
"""
plugins {
`java-library`
}
repositories {
maven { url = uri("$testRepository") }
}
dependencies {
annotationProcessor(project(":processor"))
}
Expand Down Expand Up @@ -127,9 +133,6 @@ class DynamicIncrementalProcessorIntegrationTest {
plugins {
`java-library`
}
repositories {
maven { url = uri("$testRepository") }
}
dependencies {
implementation("net.ltgt.gradle.incap:incap:$version")
annotationProcessor("net.ltgt.gradle.incap:incap-processor:$version")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,20 +30,29 @@ class IncrementalAnnotationProcessorProcessorIntegrationTest {
val testProjectDir = TemporaryFolder()

private val version = System.getProperty("version")!!
private val testRepositories = System.getProperty("testRepositories")!!.splitToSequence(File.pathSeparator).joinToString("\n") {
"""
maven { url = uri("${File(it).toURI().toASCIIString()}") }
""".trimIndent()
}

@Test fun testIncrementality() {
// given
testProjectDir.newFile("settings.gradle.kts")
testProjectDir.newFile("settings.gradle.kts").writeText(
"""
dependencyResolutionManagement {
repositories {
${testRepositories.prependIndent(" ".repeat(2))}
}
}
""".trimIndent()
)

val testRepository = File("build/repository").absolutePath.replace(File.separatorChar, '/')
testProjectDir.newFile("build.gradle.kts").writeText(
"""
plugins {
`java-library`
}
repositories {
maven { url = uri("$testRepository") }
}
dependencies {
implementation("net.ltgt.gradle.incap:incap:$version")
annotationProcessor("net.ltgt.gradle.incap:incap-processor:$version")
Expand Down

0 comments on commit 4a41209

Please sign in to comment.