From 32244bfc70ad77c80c49bacec491bc1120bf21bd Mon Sep 17 00:00:00 2001 From: piotradamczyk5 <65554637+piotradamczyk5@users.noreply.github.com> Date: Mon, 24 May 2021 14:24:51 +0200 Subject: [PATCH] ci: Validate Maven version on publish (#1949) * ci: Validate Gradle version on publish * use composite build plugin to validate version --- buildSrc/build.gradle.kts | 2 +- buildSrc/src/main/kotlin/Plugins.kt | 1 + maven_version_check/build.gradle.kts | 20 ++++++++++ maven_version_check/settings.gradle.kts | 1 + .../src/main/kotlin/MavenVersionCheck.kt | 27 +++++++++++++ .../src/test/kotlin/MavenVersionCheckTest.kt | 40 +++++++++++++++++++ settings.gradle.kts | 2 + test_runner/build.gradle.kts | 3 +- 8 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 maven_version_check/build.gradle.kts create mode 100644 maven_version_check/settings.gradle.kts create mode 100644 maven_version_check/src/main/kotlin/MavenVersionCheck.kt create mode 100644 maven_version_check/src/test/kotlin/MavenVersionCheckTest.kt diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 5a41975548..d317042e8c 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,5 +1,5 @@ repositories { - jcenter() + mavenCentral() } plugins { diff --git a/buildSrc/src/main/kotlin/Plugins.kt b/buildSrc/src/main/kotlin/Plugins.kt index 005ea91135..c8a21c6f86 100644 --- a/buildSrc/src/main/kotlin/Plugins.kt +++ b/buildSrc/src/main/kotlin/Plugins.kt @@ -5,6 +5,7 @@ object Plugins { const val MAVEN_PUBLISH = "maven-publish" const val NEXUS_STAGING = "io.codearte.nexus-staging" const val BEN_MANES_PLUGIN = "com.github.ben-manes.versions" + const val MAVEN_VERSION_CHECK = "maven-version-check" object Kotlin { const val PLUGIN_JVM = "jvm" const val PLUGIN_SERIALIZATION = "plugin.serialization" diff --git a/maven_version_check/build.gradle.kts b/maven_version_check/build.gradle.kts new file mode 100644 index 0000000000..eb453adce9 --- /dev/null +++ b/maven_version_check/build.gradle.kts @@ -0,0 +1,20 @@ +repositories { + mavenCentral() +} + +plugins { + `kotlin-dsl` + `java-gradle-plugin` +} + +gradlePlugin { + plugins.register("maven-version-check") { + id = "maven-version-check" + implementationClass = "com.github.flank.gradle.MavenVersionCheck" + } +} + +dependencies { + testImplementation("junit:junit:4.13.2") // unfortunately it does not work with buildSrc Dependencies +} + diff --git a/maven_version_check/settings.gradle.kts b/maven_version_check/settings.gradle.kts new file mode 100644 index 0000000000..eca578127a --- /dev/null +++ b/maven_version_check/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "mavenVersionCheck" diff --git a/maven_version_check/src/main/kotlin/MavenVersionCheck.kt b/maven_version_check/src/main/kotlin/MavenVersionCheck.kt new file mode 100644 index 0000000000..92418c89c0 --- /dev/null +++ b/maven_version_check/src/main/kotlin/MavenVersionCheck.kt @@ -0,0 +1,27 @@ +package com.github.flank.gradle + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.artifacts.PublishException +import org.gradle.api.publish.maven.tasks.PublishToMavenRepository +import org.gradle.internal.impldep.org.jetbrains.annotations.VisibleForTesting +import org.gradle.kotlin.dsl.withType + +class MavenVersionCheck : Plugin { + override fun apply(project: Project) { + project.tasks.withType().configureEach { + doFirst { + assertValidVersion(publication.version) + } + } + } + + @VisibleForTesting + internal fun assertValidVersion(version: String) { + val validSnapshots = arrayOf("master-SNAPSHOT", "local-SNAPSHOT") + val versionRegex = "2\\d\\.\\d{2}\\.\\d{1,2}".toRegex() + if (version !in validSnapshots && !versionRegex.matches(version)) { + throw PublishException("Maven version is not valid!") + } + } +} diff --git a/maven_version_check/src/test/kotlin/MavenVersionCheckTest.kt b/maven_version_check/src/test/kotlin/MavenVersionCheckTest.kt new file mode 100644 index 0000000000..92c1bf4737 --- /dev/null +++ b/maven_version_check/src/test/kotlin/MavenVersionCheckTest.kt @@ -0,0 +1,40 @@ +package com.github.flank.gradle + +import org.junit.Assert.assertTrue +import org.junit.Test + +class MavenVersionCheckTest { + + @Test + fun `Should properly validate maven version for snapshots`() { + with(MavenVersionCheck()) { + assertValidVersion("master-SNAPSHOT") + assertValidVersion("local-SNAPSHOT") + } + } + + @Test + fun `Should properly validate maven version for not snapshots`() { + with(MavenVersionCheck()) { + assertValidVersion("21.02.0") + assertValidVersion("22.01.1") + assertValidVersion("23.11.11") + } + } + + @Test + fun `Should throw exception for not proper maven version`() { + with(MavenVersionCheck()) { + assertTrue(runCatching { assertValidVersion("master_SNAPSHOT") }.isFailure) + assertTrue(runCatching { assertValidVersion("local_version") }.isFailure) + assertTrue(runCatching { assertValidVersion("version") }.isFailure) + assertTrue(runCatching { assertValidVersion("test") }.isFailure) + assertTrue(runCatching { assertValidVersion("snapshot") }.isFailure) + assertTrue(runCatching { assertValidVersion("2113") }.isFailure) + assertTrue(runCatching { assertValidVersion("2020.12.21") }.isFailure) + assertTrue(runCatching { assertValidVersion("21.2.1") }.isFailure) + assertTrue(runCatching { assertValidVersion("v21.02.01") }.isFailure) + assertTrue(runCatching { assertValidVersion("19.02.1") }.isFailure) + } + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 0cb0c23cac..0273693e02 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,6 +3,8 @@ import org.gradle.kotlin.dsl.support.serviceOf rootProject.name = "flank" +includeBuild("maven_version_check") + include( ":test_runner", ":firebase_apis:test_api", diff --git a/test_runner/build.gradle.kts b/test_runner/build.gradle.kts index ecb2da9727..25addffbb6 100644 --- a/test_runner/build.gradle.kts +++ b/test_runner/build.gradle.kts @@ -2,10 +2,8 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import groovy.util.Node import groovy.util.NodeList import org.gradle.api.tasks.testing.logging.TestExceptionFormat -import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import java.io.ByteArrayOutputStream -import java.nio.file.Paths plugins { application @@ -14,6 +12,7 @@ plugins { id(Plugins.MAVEN_PUBLISH) signing id(Plugins.PLUGIN_SHADOW_JAR) version Versions.SHADOW + id(Plugins.MAVEN_VERSION_CHECK) } val artifactID = "flank"