From 14e5fe4ca722c3162a49d6118ff11e50a503708d Mon Sep 17 00:00:00 2001 From: Cedric Champeau Date: Wed, 17 May 2023 11:46:46 +0200 Subject: [PATCH 1/5] Make it possible to read logback version from catalog This commit adds the ability to read the default logback version from the `mnLogging` catalog instead of the `libs` catalog or Gradle properties. It also removes the default version as it is likely to be outdated in any case and raise problems. The same should probably done for objenesis and bytebuddy but it's unclear which projects use it in practice. Fixes #561 --- build.gradle | 4 +- .../build/MicronautBuildCommonPlugin.groovy | 2 +- .../build/utils/VersionHandling.java | 37 +++++++++++++++++-- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index d473f3b3..311c8535 100644 --- a/build.gradle +++ b/build.gradle @@ -170,8 +170,8 @@ gradlePlugin { java { withJavadocJar() withSourcesJar() - sourceCompatibility = 8 - targetCompatibility = 8 + sourceCompatibility = 17 + targetCompatibility = 17 } def ossUser = System.getenv("SONATYPE_USERNAME") ?: project.hasProperty("sonatypeOssUsername") ? project.sonatypeOssUsername : '' diff --git a/src/main/groovy/io/micronaut/build/MicronautBuildCommonPlugin.groovy b/src/main/groovy/io/micronaut/build/MicronautBuildCommonPlugin.groovy index 388d11e7..b0d2a1f3 100644 --- a/src/main/groovy/io/micronaut/build/MicronautBuildCommonPlugin.groovy +++ b/src/main/groovy/io/micronaut/build/MicronautBuildCommonPlugin.groovy @@ -45,7 +45,7 @@ class MicronautBuildCommonPlugin implements Plugin { } def byteBuddyVersionProvider = versionProviderOrDefault(project, 'bytebuddy', '1.12.18') def objenesisVersionProvider = versionProviderOrDefault(project, 'objenesis', '3.1') - def logbackVersionProvider = versionProviderOrDefault(project, 'logback', '1.2.3') + def logbackVersionProvider = versionProviderOrDefault(project, 'logback', List.of("mnLogging", "libs"), '') project.configurations { documentation diff --git a/src/main/java/io/micronaut/build/utils/VersionHandling.java b/src/main/java/io/micronaut/build/utils/VersionHandling.java index ddc43026..fb39dbb1 100644 --- a/src/main/java/io/micronaut/build/utils/VersionHandling.java +++ b/src/main/java/io/micronaut/build/utils/VersionHandling.java @@ -20,11 +20,17 @@ import org.gradle.api.artifacts.VersionConstraint; import org.gradle.api.provider.Provider; +import java.util.ArrayDeque; +import java.util.Collections; +import java.util.Deque; +import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.IntStream; public class VersionHandling { + private static final List DEFAULT_CATALOGS = Collections.singletonList("libs"); + /** * Returns a version defined in the catalog. If not found, * looks for a property (typically declared in gradle.properties). @@ -32,12 +38,24 @@ public class VersionHandling { private static String versionOrDefault( Project project, String alias, + List catalogNames, String defaultVersion) { VersionCatalogsExtension catalogs = project.getExtensions().findByType(VersionCatalogsExtension.class); if (catalogs == null) { return projectProperty(project, alias, defaultVersion); } - return catalogs.find("libs") + Optional version = Optional.empty(); + Deque deque = new ArrayDeque<>(catalogNames); + String catalogName; + while ((catalogName = deque.poll()) != null) { + String currentCatalog = catalogName; + version = version.or(() -> findVersionInCatalog(currentCatalog, alias, catalogs)); + } + return version.orElseGet(() -> projectProperty(project, alias, defaultVersion)); + } + + private static Optional findVersionInCatalog(String catalogName, String alias, VersionCatalogsExtension catalogs) { + return catalogs.find(catalogName) .flatMap(catalog -> { Optional version = catalog.findVersion(alias); if (version.isPresent()) { @@ -45,8 +63,18 @@ private static String versionOrDefault( } return catalog.findVersion("managed." + alias); }) - .map(VersionConstraint::getRequiredVersion) - .orElseGet(() -> projectProperty(project, alias, defaultVersion)); + .map(VersionConstraint::getRequiredVersion); + } + + /** + * Returns a version provider defined in the catalog. If not found, + * looks for a property (typically declared in gradle.properties). + */ + public static Provider versionProviderOrDefault( + Project project, + String alias, + String defaultVersion) { + return project.provider(() -> versionOrDefault(project, alias, DEFAULT_CATALOGS, defaultVersion)); } /** @@ -56,8 +84,9 @@ private static String versionOrDefault( public static Provider versionProviderOrDefault( Project project, String alias, + List catalogNames, String defaultVersion) { - return project.provider(() -> versionOrDefault(project, alias, defaultVersion)); + return project.provider(() -> versionOrDefault(project, alias, catalogNames, defaultVersion)); } private static String propertyNameFor(String alias) { From 34d278ef6115654cac30dcaeb9ff91bd34e2c171 Mon Sep 17 00:00:00 2001 From: Cedric Champeau Date: Wed, 17 May 2023 11:53:41 +0200 Subject: [PATCH 2/5] Bump JDK used to build the plugins --- .github/workflows/gradle.yml | 2 +- .github/workflows/release-notes.yml | 29 ----------------------------- .github/workflows/release.yml | 4 ++-- 3 files changed, 3 insertions(+), 32 deletions(-) delete mode 100644 .github/workflows/release-notes.yml diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 74b9affd..d2677f1d 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -23,7 +23,7 @@ jobs: uses: actions/setup-java@v3 with: distribution: 'temurin' - java-version: '8' + java-version: '17' - name: Check plugin run: ./gradlew check env: diff --git a/.github/workflows/release-notes.yml b/.github/workflows/release-notes.yml deleted file mode 100644 index 3bb0413f..00000000 --- a/.github/workflows/release-notes.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Changelog -on: - issues: - types: [closed,reopened] - push: - branches: - - master - - '[1-9]+.[0-9]+.x' -jobs: - release_notes: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Export Gradle Properties - uses: micronaut-projects/github-actions/export-gradle-properties@master - - uses: micronaut-projects/github-actions/release-notes@master - id: release_notes - with: - token: ${{ secrets.GH_TOKEN }} - - uses: ncipollo/release-action@v1.12.0 - if: steps.release_notes.outputs.generated_changelog == 'true' - with: - allowUpdates: true - commit: master - draft: true - name: ${{ env.title }} ${{ steps.release_notes.outputs.next_version }} - tag: v${{ steps.release_notes.outputs.next_version }} - bodyFile: CHANGELOG.md - token: ${{ secrets.GH_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1d671f64..b3c4d2a5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,8 +15,8 @@ jobs: - name: Set up JDK uses: actions/setup-java@v3 with: - distribution: 'adopt' - java-version: '8' + distribution: 'temurin' + java-version: '17' ref: ${{ github.head_ref }} - name: Set the current release version id: release_version From ff4d5f30763b296b8381e175477175b5d2c3b2ad Mon Sep 17 00:00:00 2001 From: Cedric Champeau Date: Mon, 22 May 2023 10:05:39 +0200 Subject: [PATCH 3/5] Remove default version for objenesis/bytebuddy In addition, dependencies will only be added if the version is found in a catalog (this is also true for logback version). For bytebuddy and objenesis, the version will be fetched from `libs`, but also from `mnTest`. Currently, the Micronaut Test catalog doesn't declare these, but it feels like "the right place". --- .../build/MicronautBuildCommonPlugin.groovy | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/groovy/io/micronaut/build/MicronautBuildCommonPlugin.groovy b/src/main/groovy/io/micronaut/build/MicronautBuildCommonPlugin.groovy index b0d2a1f3..be1d4a59 100644 --- a/src/main/groovy/io/micronaut/build/MicronautBuildCommonPlugin.groovy +++ b/src/main/groovy/io/micronaut/build/MicronautBuildCommonPlugin.groovy @@ -43,9 +43,9 @@ class MicronautBuildCommonPlugin implements Plugin { 'org.codehaus.groovy' : 'org.apache.groovy' } - def byteBuddyVersionProvider = versionProviderOrDefault(project, 'bytebuddy', '1.12.18') - def objenesisVersionProvider = versionProviderOrDefault(project, 'objenesis', '3.1') - def logbackVersionProvider = versionProviderOrDefault(project, 'logback', List.of("mnLogging", "libs"), '') + def byteBuddyVersionProvider = versionProviderOrDefault(project, 'bytebuddy', List.of("libs", "mnTest"), '') + def objenesisVersionProvider = versionProviderOrDefault(project, 'objenesis', List.of("libs", "mnTest"),'') + def logbackVersionProvider = versionProviderOrDefault(project, 'logback', List.of("libs", "mnLogging"), '') project.configurations { documentation @@ -89,13 +89,13 @@ class MicronautBuildCommonPlugin implements Plugin { "$groovyGroup:groovy-test:$groovyVersion" }) dependencies.addProvider("testImplementation", byteBuddyVersionProvider.map { - "net.bytebuddy:byte-buddy:$it" + optionalDependency("net.bytebuddy:byte-buddy", it) }) dependencies.addProvider("testImplementation", objenesisVersionProvider.map { - "org.objenesis:objenesis:$it" + optionalDependency("org.objenesis:objenesis", it) }) dependencies.addProvider("testRuntimeOnly", logbackVersionProvider.map { - "ch.qos.logback:logback-classic:$it" + optionalDependency("ch.qos.logback:logback-classic", it) }) } @@ -104,6 +104,13 @@ class MicronautBuildCommonPlugin implements Plugin { } } + private static String optionalDependency(String groupArtifact, String version) { + if (version == null || version.empty) { + return null + } + "${groupArtifact}:$version" + } + @SuppressWarnings('GrDeprecatedAPIUsage') private void configureJavaPlugin(Project project, MicronautBuildExtension micronautBuildExtension) { project.apply plugin: "groovy" From ea3624b33d6479e10b45be42fb6d4f1831e88b71 Mon Sep 17 00:00:00 2001 From: Cedric Champeau Date: Mon, 22 May 2023 10:13:07 +0200 Subject: [PATCH 4/5] Automatically import the `mnLogging` catalog --- .../build/MicronautBuildSettingsExtension.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/io/micronaut/build/MicronautBuildSettingsExtension.java b/src/main/java/io/micronaut/build/MicronautBuildSettingsExtension.java index 1c6ad346..f9714a1e 100644 --- a/src/main/java/io/micronaut/build/MicronautBuildSettingsExtension.java +++ b/src/main/java/io/micronaut/build/MicronautBuildSettingsExtension.java @@ -87,6 +87,7 @@ public abstract class MicronautBuildSettingsExtension { private final Settings settings; private final String micronautVersion; private final String micronautTestVersion; + private final String micronautLoggingVersion; private final VersionCatalogTomlModel versionCatalogTomlModel; @Inject @@ -100,6 +101,7 @@ public MicronautBuildSettingsExtension(ProviderFactory providers, Settings setti this.versionCatalogTomlModel = loadVersionCatalogTomlModel(); this.micronautVersion = determineMicronautVersion(); this.micronautTestVersion = determineMicronautTestVersion(); + this.micronautLoggingVersion = determineMicronautLoggingVersion(); } private VersionCatalogTomlModel loadVersionCatalogTomlModel() { @@ -131,6 +133,10 @@ private String determineMicronautTestVersion() { return determineMicronautVersion("micronaut-test"); } + private String determineMicronautLoggingVersion() { + return determineMicronautVersion("micronaut-logging"); + } + private String determineMicronautVersion(String moduleNameKebabCase) { Optional micronautVersion = Optional.empty(); if (versionCatalogTomlModel != null) { @@ -176,6 +182,18 @@ public void importMicronautCatalog() { }); }); } + if (micronautLoggingVersion != null) { + settings.getGradle().settingsEvaluated(unused -> { + settings.dependencyResolutionManagement(mgmt -> { + configureRepositories(mgmt); + if (mgmt.getVersionCatalogs().findByName("mnLogging") == null) { + mgmt.getVersionCatalogs().create("mnLogging", catalog -> catalog.from("io.micronaut.logging:micronaut-logging-bom:" + micronautLoggingVersion)); + } else { + LOGGER.warn("Version catalog 'mnLogging' can be automatically imported. You can remove it from settings.gradle(.kts) file."); + } + }); + }); + } } private void configureRepositories(DependencyResolutionManagement mgmt) { From c4abbadc2f2f5b1e917884a8a2304fd8c4e990c0 Mon Sep 17 00:00:00 2001 From: Cedric Champeau Date: Mon, 22 May 2023 10:14:46 +0200 Subject: [PATCH 5/5] Bump plugin version to 6.5.x --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index ff1cb5c3..4078a5ad 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -projectVersion=6.4.5-SNAPSHOT +projectVersion=6.5.0-SNAPSHOT title=Micronaut Build Plugins projectDesc=Micronaut internal Gradle plugins. Not intended to be used in user's projects projectUrl=https://micronaut.io