Skip to content

Commit

Permalink
multiple micronaut releases (#28)
Browse files Browse the repository at this point in the history
* support for multiple Micronaut versions

* upgraded gradle to the latest 6.x

* fixed micronaut-hibernate-gorm coordinates for MN 2.+

* using the micronautMigratedDependency to obtain the appropriate group id

* safeguard MN 2.x dependencies

* migrated Nonnull annotation

* fixed property to update

* using newer version of micronaut locally, newer version of MN AWS SDK

* fixed nonnull migration, local version based on MN 2.x

* fixed resolution of available entries for EachProperty beans

* removed @OverRide from the method which only exists in 2.x and newer

* using Grails 5.x for Micronaut 2.x and 3.x

* few more compatibility tweaks

* added introspected to the entity so it's found in Micronaut 3

* added grails source folders to migration

* disabled integration tests for MN 2.x due Grails 5 supports on MN 3.x

* upgraded codenarc and fixed violations

* trying to harmonize plugins and classpath deps for gorm/hibernate

* varying gorm.version number

* using non-deprecated method to create application context instance

* removed offedning plugins from the example application

* simplify example

* fixed wrong local rollbacks

* fixed client payload for ping action

* verify health response, back to 1.x on the main branch
  • Loading branch information
musketyr committed Jan 31, 2022
1 parent 0bb82a4 commit 23b3e57
Show file tree
Hide file tree
Showing 39 changed files with 382 additions and 169 deletions.
39 changes: 23 additions & 16 deletions .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: Check

on: [push, pull_request]
on: [ push, pull_request ]
jobs:
check:
name: Check
Expand All @@ -9,19 +9,26 @@ jobs:
GRADLE_OPTS: "-Xmx6g -Xms4g"
CI: true
COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}

strategy:
fail-fast: false
matrix:
versions:
- 'check coveralls -PmicronautVersion=1.3.7 -PspockVersion=2.0-groovy-2.5 -PgroovyVersion=2.5.15 -PgrailsVersion=4.0.4 -Pgorm.version=7.0.6.RELEASE'
- 'check -x :micronaut-grails-domain-library:check -x :micronaut-grails-example:check -PmicronautVersion=2.5.13 -PspockVersion=2.0-groovy-3.0 -PgroovyVersion=3.0.9 -PgrailsVersion=5.1.1 -Pgorm.version=7.1.2'
- 'migrateImports check -PmicronautVersion=3.2.1 -PspockVersion=2.0-groovy-3.0 -PgroovyVersion=3.0.9 -PgrailsVersion=5.1.1 -Pgorm.version=7.1.2'
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- uses: eskatos/gradle-command-action@v1
with:
arguments: check aggregateTestReports coveralls --stacktrace
- name: Show Reports
uses: actions/upload-artifact@v1
if: failure()
with:
name: reports
path: build/reports/
- uses: actions/checkout@v2
- uses: actions/setup-java@v2
with:
java-version: '8'
distribution: zulu
cache: 'gradle'
- uses: eskatos/gradle-command-action@v2
with:
arguments: ${{ matrix.versions }}
- name: Show Reports
uses: actions/upload-artifact@v2
if: failure()
with:
name: reports
path: build/reports/
35 changes: 24 additions & 11 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,18 @@ jobs:
runs-on: ubuntu-latest
env:
GRADLE_OPTS: "-Xmx6g -Xms4g"
GRGIT_USER: musketyr
GRGIT_PASS: ${{ secrets.GITHUB_PERSONAL_TOKEN }}
SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }}
SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }}
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
uses: actions/setup-java@v2
with:
java-version: 1.8
java-version: '8'
distribution: zulu
cache: 'gradle'
- name: Semantic Version
id: version
uses: ncipollo/semantic-version-action@v1
Expand All @@ -26,15 +30,24 @@ jobs:
with:
fileName: 'secret.pgp'
encodedString: ${{ secrets.SIGNING_SECRET_KEY_BASE64 }}
- uses: eskatos/gradle-command-action@v1
- name: Release Micronaut 1.x
env:
SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }}
SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }}
SIGNING_SECRET_KEY_PATH: ${{ steps.write_file.outputs.filePath }}
uses: eskatos/gradle-command-action@v2
with:
arguments: gitPublishPush publishToSonatype closeAndReleaseSonatypeStagingRepository -Pversion=${{ steps.version.outputs.tag }} -Prelease=true -Dorg.ajoberstar.grgit.auth.username=${{ secrets.AGORAPULSE_BOT_PERSONAL_TOKEN }} --stacktrace
arguments: -x groovydoc publishToSonatype closeAndReleaseSonatypeStagingRepository -Pversion=${{ steps.version.outputs.tag }}-micronaut-1.0 --stacktrace -PmicronautVersion=1.3.7 -PspockVersion=2.0-groovy-2.5 -PgroovyVersion=2.5.15 -PgrailsVersion=4.0.4 -Pgorm.version=7.0.6.RELEASE -Prelease=true
- name: Release Micronaut 2.x
env:
SIGNING_SECRET_KEY_PATH: ${{ steps.write_file.outputs.filePath }}
uses: eskatos/gradle-command-action@v2
with:
arguments: -x groovydoc publishToSonatype closeAndReleaseSonatypeStagingRepository -Pversion=${{ steps.version.outputs.tag }}-micronaut-2.0 --stacktrace -PmicronautVersion=2.5.13 -PspockVersion=2.0-groovy-3.0 -PgroovyVersion=3.0.9 -PgrailsVersion=5.1.1 -Pgorm.version=7.1.2 -Prelease=true
- name: Release Micronaut 3.x
env:
SIGNING_SECRET_KEY_PATH: ${{ steps.write_file.outputs.filePath }}
uses: eskatos/gradle-command-action@v2
with:
arguments: migrateImports gitPublishPush -x groovydoc publishToSonatype closeAndReleaseSonatypeStagingRepository -Pversion=${{ steps.version.outputs.tag }}-micronaut-3.0 --stacktrace -PmicronautVersion=3.2.3 -PspockVersion=2.0-groovy-3.0 -PgroovyVersion=3.0.9 -PgrailsVersion=5.1.1 -Pgorm.version=7.1.2 -Prelease=true -Dorg.ajoberstar.grgit.auth.username=${{ secrets.AGORAPULSE_BOT_PERSONAL_TOKEN }}
ping:
name: Notify Upstream Repositories
runs-on: ubuntu-latest
Expand All @@ -55,4 +68,4 @@ jobs:
token: ${{ secrets.AGORAPULSE_BOT_PERSONAL_TOKEN }}
repository: ${{ matrix.repository }}
event-type: ap-new-version-released-event
client-payload: '{ "group": "com.agorapulse", "module": "micronaut-grails", "version": "${{ steps.version.outputs.tag }}", "property" : "micronaut.grails.version", "github" : ${{ toJson(github) }} }'
client-payload: '{ "group": "com.agorapulse", "module": "micronaut-grails", "version": "${{ steps.version.outputs.tag }}-micronaut-1.0", "property" : "micronaut.grails.version", "github" : ${{ toJson(github) }} }'
5 changes: 3 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ subprojects { Project subproject ->
apply plugin: 'groovy'
apply plugin: 'checkstyle'
apply plugin: 'codenarc'
apply plugin: 'micronaut-compatibility'

configurations {
optional.extendsFrom compile
Expand All @@ -144,7 +145,7 @@ subprojects { Project subproject ->
// Groovy
compile "org.codehaus.groovy:groovy:$groovyVersion"

compile "io.micronaut:micronaut-runtime-groovy"
compile micronautMigratedDependency('micronaut-runtime-groovy')
compile "io.micronaut:micronaut-inject"
compile "io.micronaut:micronaut-runtime"

Expand Down Expand Up @@ -192,7 +193,7 @@ subprojects { Project subproject ->
}

codenarc {
toolVersion = '1.2.1'
toolVersion = '2.1.0'
}

config {
Expand Down
6 changes: 4 additions & 2 deletions buildSrc/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
apply plugin: 'groovy'
plugins {
id 'groovy-gradle-plugin'
id 'groovy'
}

repositories {
jcenter()
mavenCentral()
maven { url 'https://plugins.gradle.org/m2/' }
}
Expand Down
110 changes: 110 additions & 0 deletions buildSrc/src/main/groovy/micronaut-compatibility.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* Copyright 2020-2021 Agorapulse.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import groovy.transform.Field

@Field static final Map<String, String> MICRONAUT_1 = [
'micronaut-runtime-groovy': 'io.micronaut',
'micronaut-function-groovy': 'io.micronaut',
'micronaut-function-aws': 'io.micronaut',
'micronaut-aws-common': 'io.micronaut.configuration',
'micronaut-security': 'io.micronaut',
'micronaut-security-jwt': 'io.micronaut',
'micronaut-jdbc-tomcat': 'io.micronaut.configuration',
'micronaut-hibernate-gorm': 'io.micronaut.configuration',
'micronaut-spring': 'io.micronaut',
]

@Field static final Map<String, String> MICRONAUT_2 = [
'micronaut-runtime-groovy': 'io.micronaut.groovy',
'micronaut-function-groovy': 'io.micronaut.groovy',
'micronaut-function-aws': 'io.micronaut.aws',
'micronaut-aws-common': 'io.micronaut.aws',
'micronaut-security': 'io.micronaut.security',
'micronaut-security-jwt': 'io.micronaut.security',
'micronaut-jdbc-tomcat': 'io.micronaut.sql',
'micronaut-hibernate-gorm': 'io.micronaut.groovy',
'micronaut-spring': 'io.micronaut.spring',
]

@Field static final Map<String, Object> IMPORTS = [
'javax.annotation.Nullable': 'io.micronaut.core.annotation.Nullable',
'javax.annotation.Nonnull': 'io.micronaut.core.annotation.NonNull',
'Nonnull': 'NonNull',
'import javax.inject': 'import jakarta.inject',
'io.micronaut.test.annotation.MicronautTest': [
java: 'io.micronaut.test.extensions.junit5.annotation.MicronautTest',
groovy: 'io.micronaut.test.extensions.spock.annotation.MicronautTest',
]
]

ext.micronautMigratedDependency = { String module ->
Map<String, String> groups = project.getProperty('micronautVersion').startsWith('1') ? MICRONAUT_1 : MICRONAUT_2
String group = groups[module]

if (!group) {
throw new IllegalArgumentException("Cannot find group for $module. Known modules: ${groups.keySet()}")
}

return "$group:$module"
}

pluginManager.withPlugin('java') {
tasks.register('migrateImports') { Task task ->
File javaSources = project.file('src/main/java')
File javaTestSources = project.file('src/test/java')
File groovySources = project.file('src/main/groovy')
File groovyTestSources = project.file('src/test/groovy')
File testResources = project.file('src/test/resources')

List<File> dirs = [
javaSources,
javaTestSources,
groovySources,
groovyTestSources,
testResources,
]

for (File dir in dirs) {
if (dir.exists()) {
task.inputs.dir dir
task.outputs.dir dir

task.doFirst {
task.inputs.files.forEach { File file ->
String content = file.text
String newContent = content

if (IMPORTS.keySet().any { String original -> content.contains(original) }) {
IMPORTS.each { String original, Object value ->
String replacement = value instanceof CharSequence ? value : (file.name.endsWith('.groovy') ? value['groovy'] : value['java'])
newContent = newContent.replace(original, replacement)
}
}

if (content != newContent) {
project.logger.lifecycle("Migrated imports in $file")
file.text = newContent
}
}
}
}
}
}
}


Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,19 @@ package com.agorapulse.micronaut.grails.domain

import grails.compiler.GrailsCompileStatic
import grails.gorm.annotation.Entity
import io.micronaut.core.annotation.Introspected

/**
* Test entity.
*/
@Entity
@Introspected
@GrailsCompileStatic
@SuppressWarnings([
'GrailsDomainHasEquals',
'GrailsDomainHasToString',
'FieldTypeRequired',
'NoDef',
])
class Manager {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,19 +37,19 @@ dependencies {

compileOnly "io.micronaut:micronaut-inject-groovy"

compile 'io.micronaut.configuration:micronaut-hibernate-gorm'
compile micronautMigratedDependency('micronaut-hibernate-gorm')

compileOnly "org.grails:grails-core:$grailsVersion"

compile "org.grails:grails-bootstrap:$grailsVersion"

annotationProcessor "io.micronaut:micronaut-inject-java"
compile "io.micronaut:micronaut-runtime-groovy"
compile micronautMigratedDependency('micronaut-runtime-groovy')
compile "io.micronaut:micronaut-validation"

testCompile project(':micronaut-grails-jpa-generator')

testCompile 'com.agorapulse.testing:fixt:0.2.1.1'
testCompile 'com.agorapulse.testing:fixt:0.2.3'

testCompile 'io.micronaut:micronaut-inject-groovy'
testCompile 'org.mariadb.jdbc:mariadb-java-client:2.7.3'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ package com.agorapulse.micronaut.grails.domain
// tag::body[]
import com.agorapulse.micronaut.grails.jpa.generator.MicronautJpaGenerator
import com.agorapulse.testing.fixt.Fixt
import groovy.transform.CompileDynamic
import io.micronaut.context.ApplicationContext
import org.grails.datastore.gorm.validation.constraints.eval.DefaultConstraintEvaluator
import org.grails.orm.hibernate.HibernateDatastore
Expand All @@ -29,6 +30,7 @@ import spock.lang.Specification
/**
* Example specification generating JPA entities from GORM entities.
*/
@CompileDynamic
class MicronautGeneratorSpec extends Specification {

Fixt fixt = Fixt.create(MicronautGeneratorSpec)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
package micronaut.grails.example

import com.agorapulse.micronaut.grails.domain.Manager
import com.agorapulse.micronaut.grails.example.DirectlyInjected
import com.agorapulse.micronaut.grails.example.InjectedUsingBridge
import com.agorapulse.micronaut.grails.example.InjectedUsingBridgeWithDifferentName
Expand All @@ -39,6 +40,10 @@ class TestController {
InjectedUsingBridge injectedUsingBridge
InjectedUsingBridgeWithDifferentName otherInjected

def health() {
render "OK"
}

def index() {
render([
someDirectlyInjected : someDirectlyInjected?.toString(),
Expand Down Expand Up @@ -71,10 +76,12 @@ class TestController {
}

def managers() {
render([
someDirectlyInjected: someDirectlyInjected?.managerCount,
injectedUsingBridge : injectedUsingBridge?.managerCount,
] as JSON)
render(Manager.withNewSession {
[
someDirectlyInjected: someDirectlyInjected?.managerCount,
injectedUsingBridge : injectedUsingBridge?.managerCount,
]
} as JSON)
}

def profiles() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
package micronaut.grails.example

import com.agorapulse.micronaut.grails.MicronautGrailsApp
import com.agorapulse.micronaut.grails.domain.Manager
import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration
Expand All @@ -39,8 +40,6 @@ import org.springframework.core.env.ConfigurableEnvironment
import org.springframework.core.env.PropertyResolver
import org.springframework.core.io.ResourceLoader

import javax.annotation.Nonnull

class DefaultApplication extends GrailsAutoConfiguration {

static ConfigurableApplicationContext context
Expand Down Expand Up @@ -116,13 +115,13 @@ class DefaultApplication extends GrailsAutoConfiguration {
try {
switch (this.webApplicationType) {
case WebApplicationType.SERVLET:
contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS)
contextClass = Class.forName(MicronautGrailsApp.DEFAULT_SERVLET_WEB_CONTEXT_CLASS)
break
case WebApplicationType.REACTIVE:
contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS)
contextClass = Class.forName(MicronautGrailsApp.DEFAULT_REACTIVE_WEB_CONTEXT_CLASS)
break
default:
contextClass = Class.forName(DEFAULT_CONTEXT_CLASS)
contextClass = Class.forName(MicronautGrailsApp.DEFAULT_CONTEXT_CLASS)
}
}
catch (ClassNotFoundException ex) {
Expand Down Expand Up @@ -173,7 +172,7 @@ class DefaultApplication extends GrailsAutoConfiguration {
def micronautContext = new DefaultApplicationContext(micronautConfiguration) {

@Override
protected DefaultEnvironment createEnvironment(@Nonnull ApplicationContextConfiguration configuration) {
protected DefaultEnvironment createEnvironment(ApplicationContextConfiguration configuration) {
return configureMicronautEnvironment.call(super.createEnvironment(configuration)) as DefaultEnvironment
}
}
Expand Down

0 comments on commit 23b3e57

Please sign in to comment.