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 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/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 diff --git a/src/main/groovy/io/micronaut/build/MicronautBuildCommonPlugin.groovy b/src/main/groovy/io/micronaut/build/MicronautBuildCommonPlugin.groovy index 388d11e7..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', '1.2.3') + 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" 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) { 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) {