diff --git a/.github/renovate.json b/.github/renovate.json index aaa729b5..ccd88d42 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -2,7 +2,7 @@ "extends": [ "config:base" ], - "addLabels": ["dependency-upgrade"], + "addLabels": ["type: dependency-upgrade"], "schedule": [ "every weekend" ], diff --git a/.github/workflows/graalvm.yml b/.github/workflows/graalvm.yml index f6689b21..25f4ec7d 100644 --- a/.github/workflows/graalvm.yml +++ b/.github/workflows/graalvm.yml @@ -3,79 +3,74 @@ # https://github.com/micronaut-projects/micronaut-project-template/tree/master/.github/workflows # # and edit them there. Note that it will be sync'ed to all the Micronaut repos -name: GraalVM CE CI +name: GraalVM Dev CI on: - push: - branches: - - master - - '[1-9]+.[0-9]+.x' - pull_request: - branches: - - master - - '[1-9]+.[0-9]+.x' + schedule: + - cron: "0 1 * * 1-5" # Mon-Fri at 1am UTC + workflow_dispatch: jobs: build: if: github.repository != 'micronaut-projects/micronaut-project-template' runs-on: ubuntu-latest strategy: matrix: + graalvm: [ 'dev'] java: ['17'] - graalvm: ['latest'] + env: + GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} + GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USERNAME }} + GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }} + GH_TOKEN_PUBLIC_REPOS_READONLY: ${{ secrets.GH_TOKEN_PUBLIC_REPOS_READONLY }} + GH_USERNAME: ${{ secrets.GH_USERNAME }} + TESTCONTAINERS_RYUK_DISABLED: true + PREDICTIVE_TEST_SELECTION: "${{ github.event_name == 'pull_request' && 'true' || 'false' }}" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: # https://github.com/actions/virtual-environments/issues/709 - - name: Free disk space + - name: "🗑 Free disk space" run: | sudo rm -rf "/usr/local/share/boost" sudo rm -rf "$AGENT_TOOLSDIRECTORY" sudo apt-get clean df -h - - uses: actions/checkout@v3 - - uses: actions/cache@v3 + + - name: "📥 Checkout repository" + uses: actions/checkout@v3 with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} - restore-keys: | - ${{ runner.os }}-gradle- - - name: Setup GraalVM CE + fetch-depth: 0 + + - name: "🔧 Setup GraalVM CE" uses: graalvm/setup-graalvm@v1 with: version: ${{ matrix.graalvm }} java-version: ${{ matrix.java }} components: 'native-image' github-token: ${{ secrets.GITHUB_TOKEN }} - - name: Setup Gradle - uses: gradle/gradle-build-action@v2.4.0 - - name: Build with Gradle + + - name: "🔧 Setup Gradle" + uses: gradle/gradle-build-action@v2 + + - name: "❓ Optional setup step" + run: | + [ -f ./setup.sh ] && ./setup.sh || [ ! -f ./setup.sh ] + + - name: "🛠 Build with Gradle" id: gradle run: | - if ./gradlew tasks --no-daemon --all | grep -w "testNativeImage" - then - ./gradlew check testNativeImage --continue --no-daemon - else - ./gradlew check --continue --no-daemon - fi - env: - TESTCONTAINERS_RYUK_DISABLED: true - GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} - GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USERNAME }} - GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }} - PREDICTIVE_TEST_SELECTION: "${{ github.event_name == 'pull_request' && 'true' || 'false' }}" - - name: Add build scan URL as PR comment - uses: actions/github-script@v5 - if: github.event_name == 'pull_request' && failure() - with: - github-token: ${{secrets.GITHUB_TOKEN}} - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: '❌ ${{ github.workflow }} ${{ matrix.java }} ${{ matrix.graalvm }} failed: ${{ steps.gradle.outputs.build-scan-url }}' - }) - - name: Publish Test Report + ./gradlew check --no-daemon --continue + + - name: "📊 Publish Test Report" if: always() - uses: mikepenz/action-junit-report@v3.7.5 + uses: mikepenz/action-junit-report@v3 with: - check_name: GraalVM CE CI / Test Report (Java ${{ matrix.java }}) + check_name: Java CI / Test Report (${{ matrix.java }}) report_paths: '**/build/test-results/test/TEST-*.xml' check_retries: 'true' + + - name: "📜 Upload binary compatibility check results" + if: always() + uses: actions/upload-artifact@v3 + with: + name: binary-compatibility-reports + path: "**/build/reports/binary-compatibility-*.html" + diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index b8948118..d0c741c8 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -19,82 +19,88 @@ jobs: runs-on: ubuntu-latest strategy: matrix: + graalvm: [ 'latest'] java: ['17'] + env: + GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} + GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USERNAME }} + GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }} + GH_TOKEN_PUBLIC_REPOS_READONLY: ${{ secrets.GH_TOKEN_PUBLIC_REPOS_READONLY }} + GH_USERNAME: ${{ secrets.GH_USERNAME }} + TESTCONTAINERS_RYUK_DISABLED: true + PREDICTIVE_TEST_SELECTION: "${{ github.event_name == 'pull_request' && 'true' || 'false' }}" + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: # https://github.com/actions/virtual-environments/issues/709 - - name: Free disk space + - name: "🗑 Free disk space" run: | sudo rm -rf "/usr/local/share/boost" sudo rm -rf "$AGENT_TOOLSDIRECTORY" sudo apt-get clean df -h - - uses: actions/checkout@v3 - - name: Set up JDK - uses: actions/setup-java@v3 + + - name: "📥 Checkout repository" + uses: actions/checkout@v3 with: - distribution: 'temurin' + fetch-depth: 0 + + - name: "🔧 Setup GraalVM CE" + uses: graalvm/setup-graalvm@v1 + with: + version: ${{ matrix.graalvm }} java-version: ${{ matrix.java }} - - name: Setup Gradle - uses: gradle/gradle-build-action@v2.4.0 - - name: Optional setup step - env: - GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} - GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USERNAME }} - GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }} + components: 'native-image' + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: "🔧 Setup Gradle" + uses: gradle/gradle-build-action@v2 + + - name: "❓ Optional setup step" run: | - [ -f ./setup.sh ] && ./setup.sh || true - - name: Build with Gradle + [ -f ./setup.sh ] && ./setup.sh || [ ! -f ./setup.sh ] + + - name: "🛠 Build with Gradle" id: gradle run: | - ./gradlew check --no-daemon --parallel --continue - env: - TESTCONTAINERS_RYUK_DISABLED: true - GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} - GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USERNAME }} - GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }} - PREDICTIVE_TEST_SELECTION: "${{ github.event_name == 'pull_request' && 'true' || 'false' }}" - - name: Add build scan URL as PR comment - uses: actions/github-script@v5 - if: github.event_name == 'pull_request' && failure() - with: - github-token: ${{secrets.GITHUB_TOKEN}} - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: '❌ ${{ github.workflow }} failed: ${{ steps.gradle.outputs.build-scan-url }}' - }) - - name: Publish Test Report + ./gradlew check --no-daemon --continue + + - name: "🔎 Run static analysis" + if: env.SONAR_TOKEN != '' + run: | + ./gradlew sonar + + - name: "📊 Publish Test Report" if: always() - uses: mikepenz/action-junit-report@v3.7.5 + uses: mikepenz/action-junit-report@v3 with: check_name: Java CI / Test Report (${{ matrix.java }}) report_paths: '**/build/test-results/test/TEST-*.xml' check_retries: 'true' + - name: "📜 Upload binary compatibility check results" if: always() uses: actions/upload-artifact@v3 with: name: binary-compatibility-reports path: "**/build/reports/binary-compatibility-*.html" - - name: Publish to Sonatype Snapshots + + - name: "📦 Publish to Sonatype Snapshots" if: success() && github.event_name == 'push' && matrix.java == '17' env: SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} - GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} - GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USERNAME }} - GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }} run: ./gradlew publishToSonatype docs --no-daemon - - name: Determine docs target repository + + - name: "❓ Determine docs target repository" uses: haya14busa/action-cond@v1 id: docs_target with: cond: ${{ github.repository == 'micronaut-projects/micronaut-core' }} if_true: "micronaut-projects/micronaut-docs" if_false: ${{ github.repository }} - - name: Publish to Github Pages + + - name: "📑 Publish to Github Pages" if: success() && github.event_name == 'push' && matrix.java == '17' uses: micronaut-projects/github-pages-deploy-action@master env: diff --git a/.github/workflows/release-notes.yml b/.github/workflows/release-notes.yml deleted file mode 100644 index 35c3bf7a..00000000 --- a/.github/workflows/release-notes.yml +++ /dev/null @@ -1,50 +0,0 @@ -# WARNING: Do not edit this file directly. Instead, go to: -# -# https://github.com/micronaut-projects/micronaut-project-template/tree/master/.github/workflows -# -# and edit them there. Note that it will be sync'ed to all the Micronaut repos -name: Changelog -on: - issues: - types: [closed,reopened] - push: - branches: - - master - - '[1-9]+.[0-9]+.x' -jobs: - release_notes: - if: github.repository != 'micronaut-projects/micronaut-project-template' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Check if it has release drafter config file - id: check_release_drafter - run: | - has_release_drafter=$([ -f .github/release-drafter.yml ] && echo "true" || echo "false") - echo ::set-output name=has_release_drafter::${has_release_drafter} - - # If it has release drafter: - - uses: release-drafter/release-drafter@v5 - if: steps.check_release_drafter.outputs.has_release_drafter == 'true' - env: - GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} - - # Otherwise: - - name: Export Gradle Properties - if: steps.check_release_drafter.outputs.has_release_drafter == 'false' - uses: micronaut-projects/github-actions/export-gradle-properties@master - - uses: micronaut-projects/github-actions/release-notes@master - if: steps.check_release_drafter.outputs.has_release_drafter == 'false' - id: release_notes - with: - token: ${{ secrets.GH_TOKEN }} - - uses: ncipollo/release-action@v1 - if: steps.check_release_drafter.outputs.has_release_drafter == 'false' && steps.release_notes.outputs.generated_changelog == 'true' - with: - allowUpdates: true - commit: ${{ steps.release_notes.outputs.current_branch }} - 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 70ddd455..3eb1a55d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,7 @@ jobs: java-version: '17' - name: Set the current release version id: release_version - run: echo ::set-output name=release_version::${GITHUB_REF:11} + run: echo "release_version=${GITHUB_REF:11}" >> $GITHUB_OUTPUT - name: Run pre-release uses: micronaut-projects/github-actions/pre-release@master env: @@ -66,23 +66,25 @@ jobs: # Store the hash in a file, which is uploaded as a workflow artifact. echo $(sha256sum $ARTIFACTS | base64 -w0) > artifacts-sha256 - name: Upload build artifacts - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@v3 with: name: gradle-build-outputs path: build/repo/${{ steps.publish.outputs.group }}/*/${{ steps.publish.outputs.version }}/* retention-days: 5 - name: Upload artifacts-sha256 - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0 + uses: actions/upload-artifact@v3 with: name: artifacts-sha256 path: artifacts-sha256 retention-days: 5 - name: Generate docs + run: ./gradlew docs env: GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USERNAME }} GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }} - run: ./gradlew docs + GH_TOKEN_PUBLIC_REPOS_READONLY: ${{ secrets.GH_TOKEN_PUBLIC_REPOS_READONLY }} + GH_USERNAME: ${{ secrets.GH_USERNAME }} - name: Export Gradle Properties uses: micronaut-projects/github-actions/export-gradle-properties@master - name: Publish to Github Pages @@ -128,7 +130,7 @@ jobs: artifacts-sha256: ${{ steps.set-hash.outputs.artifacts-sha256 }} steps: - name: Download artifacts-sha256 - uses: actions/download-artifact@9782bd6a9848b53b110e712e20e42d89988822b7 # v3.0.1 + uses: actions/download-artifact@v3 with: name: artifacts-sha256 # The SLSA provenance generator expects the hash digest of artifacts to be passed as a job @@ -147,7 +149,7 @@ jobs: actions: read # To read the workflow path. id-token: write # To sign the provenance. contents: write # To add assets to a release. - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.4.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.5.0 with: base64-subjects: "${{ needs.provenance-subject.outputs.artifacts-sha256 }}" upload-assets: true # Upload to a new release. @@ -159,18 +161,18 @@ jobs: if: startsWith(github.ref, 'refs/tags/') steps: - name: Checkout repository - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3.0.2 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3.3.0 - name: Download artifacts - uses: actions/download-artifact@9782bd6a9848b53b110e712e20e42d89988822b7 # v3.0.1 + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 with: name: gradle-build-outputs path: build/repo + - name: Create artifacts archive + shell: bash + run: find build/repo -regextype sed -regex '\(.*\.jar\|.*\.pom\|.*\.module\|.*\.toml\)' | xargs zip artifacts.zip - name: Upload assets - # Upload the artifacts and SLSA L3 provenance as assets to the existing - # release. Note that the provenance will attest to each artifact file and - # not the aggregated ZIP file. - run: | - find build/repo -regextype sed -regex '\(.*\.jar\|.*\.pom\|.*\.module\|.*\.toml\)' | xargs zip artifacts.zip - gh release upload ${{ github.ref_name }} artifacts.zip - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # Upload the artifacts to the existing release. Note that the SLSA provenance will + # attest to each artifact file and not the aggregated ZIP file. + uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v0.1.15 + with: + files: artifacts.zip diff --git a/.github/workflows/sonarqube.yml b/.github/workflows/sonarqube.yml deleted file mode 100644 index d238115f..00000000 --- a/.github/workflows/sonarqube.yml +++ /dev/null @@ -1,58 +0,0 @@ -# WARNING: Do not edit this file directly. Instead, go to: -# -# https://github.com/micronaut-projects/micronaut-project-template/tree/master/.github/workflows -# -# and edit them there. Note that it will be sync'ed to all the Micronaut repos -name: Static Analysis -on: - push: - branches: - - master - - '[1-9]+.[0-9]+.x' - pull_request: - branches: - - master - - '[1-9]+.[0-9]+.x' -jobs: - build: - if: github.repository != 'micronaut-projects/micronaut-project-template' - runs-on: ubuntu-latest - steps: - # https://github.com/actions/virtual-environments/issues/709 - - name: Free disk space - run: | - sudo rm -rf "/usr/local/share/boost" - sudo rm -rf "$AGENT_TOOLSDIRECTORY" - sudo apt-get clean - df -h - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - uses: actions/cache@v3 - with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} - restore-keys: | - ${{ runner.os }}-gradle- - - name: Set up JDK - uses: actions/setup-java@v3 - with: - distribution: 'temurin' - java-version: 17 - - name: Optional setup step - env: - GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} - GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USERNAME }} - GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }} - run: | - [ -f ./setup.sh ] && ./setup.sh || true - - name: Analyse with Gradle - run: | - ./gradlew check sonarqube --no-daemon --parallel --continue - env: - TESTCONTAINERS_RYUK_DISABLED: true - GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} - GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USERNAME }} - GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index f6faafbe..8a897279 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -1,7 +1,12 @@ +# WARNING: Do not edit this file directly. Instead, go to: +# +# https://github.com/micronaut-projects/micronaut-project-template/tree/master/.github/workflows +# +# and edit them there. Note that it will be sync'ed to all the Micronaut repos name: Update Gradle Wrapper on: schedule: - - cron: '0 0 * * MON' + - cron: '0 3 * * SAT' jobs: update-wrapper: if: github.repository == 'micronaut-projects/micronaut-project-template' @@ -12,9 +17,13 @@ jobs: token: ${{ secrets.GH_TOKEN }} - name: "Update Gradle Wrapper" id: update + env: + GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} + GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GRADLE_ENTERPRISE_CACHE_USERNAME }} + GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }} run: | latest=`curl -s https://services.gradle.org/versions/current | jq -cr ".version"` - echo ::set-output name=latest_version::${latest} + echo "latest_version=${latest}" >> $GITHUB_OUTPUT ./gradlew wrapper --gradle-version $latest - uses: gradle/wrapper-validation-action@v1 - uses: stefanzweifel/git-auto-commit-action@v4 @@ -22,4 +31,4 @@ jobs: commit_message: Upgrade Gradle Wrapper to ${{ steps.update.outputs.latest_version }} commit_user_name: micronaut-build commit_user_email: ${{ secrets.MICRONAUT_BUILD_EMAIL }} - commit_author: micronaut-build <${{ secrets.MICRONAUT_BUILD_EMAIL }}> \ No newline at end of file + commit_author: micronaut-build <${{ secrets.MICRONAUT_BUILD_EMAIL }}> diff --git a/gradle.properties b/gradle.properties index 3ec47581..3f7dcbe3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,13 +1,6 @@ projectVersion=3.0.0-SNAPSHOT projectGroup=io.micronaut.mqtt -micronautDocsVersion=2.0.0 -micronautVersion=4.0.0-SNAPSHOT -micronautTestVersion=4.0.0-SNAPSHOT - -groovyVersion=4.0.6 -spockVersion=2.3-groovy-4.0 - title=Micronaut MQTT projectDesc=Integration between Micronaut and MQTT projectUrl=https://micronaut.io diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e37e0ebd..a4f399d4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,20 +1,28 @@ [versions] +micronaut-docs = "2.0.0" +micronaut = "4.0.0-M1" + +groovy = "4.0.10" +spock = "2.3-groovy-4.0" + managed-mqttv3 = "1.2.5" managed-mqttv5 = "1.2.5" awaitility = "4.2.0" bcpkix-jdk15on = "1.70" -kotlin = "1.7.21" +kotlin = "1.8.10" testcontainers = "1.17.6" -micronaut-serde = "2.0.0-SNAPSHOT" -micronaut-test = "4.0.0-SNAPSHOT" +micronaut-serde = "2.0.0-M1" +micronaut-test = "4.0.0-M1" +micronaut-validation = "4.0.0-M2" [libraries] managed-paho-mqttv3-client = { module = "org.eclipse.paho:org.eclipse.paho.client.mqttv3", version.ref = "managed-mqttv3" } managed-paho-mqttv5-client = { module = "org.eclipse.paho:org.eclipse.paho.mqttv5.client", version.ref = "managed-mqttv5" } micronaut-serde = { module = "io.micronaut.serde:micronaut-serde-bom", version.ref = "micronaut-serde" } +micronaut-validation = { module = "io.micronaut.validation:micronaut-validation-bom", version.ref = "micronaut-validation" } awaitility = { module = "org.awaitility:awaitility", version.ref = "awaitility" } bcpkix-jdk15on = { module = "org.bouncycastle:bcpkix-jdk15on", version.ref = "bcpkix-jdk15on" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 50832291..bdc9a83b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/mqtt-core/src/main/java/io/micronaut/mqtt/intercept/AbstractMqttIntroductionAdvice.java b/mqtt-core/src/main/java/io/micronaut/mqtt/intercept/AbstractMqttIntroductionAdvice.java index 5db7adac..ada7a648 100644 --- a/mqtt-core/src/main/java/io/micronaut/mqtt/intercept/AbstractMqttIntroductionAdvice.java +++ b/mqtt-core/src/main/java/io/micronaut/mqtt/intercept/AbstractMqttIntroductionAdvice.java @@ -19,6 +19,7 @@ import io.micronaut.aop.MethodInterceptor; import io.micronaut.aop.MethodInvocationContext; import io.micronaut.core.annotation.AnnotationValue; +import io.micronaut.core.convert.DefaultMutableConversionService; import io.micronaut.core.type.Argument; import io.micronaut.inject.ExecutableMethod; import io.micronaut.mqtt.annotation.Qos; @@ -64,7 +65,7 @@ public AbstractMqttIntroductionAdvice(MqttBinderRegistry binderRegistry) { public Object intercept(MethodInvocationContext context) { if (context.hasAnnotation(getRequiredAnnotation())) { - InterceptedMethod interceptedMethod = InterceptedMethod.of(context); + InterceptedMethod interceptedMethod = InterceptedMethod.of(context, new DefaultMutableConversionService()); try { MqttPublisherState publisherState = getPublisherState(context); diff --git a/mqtt-ssl/build.gradle b/mqtt-ssl/build.gradle index 93049a95..53debd4f 100644 --- a/mqtt-ssl/build.gradle +++ b/mqtt-ssl/build.gradle @@ -4,8 +4,8 @@ plugins { dependencies { implementation(mn.micronaut.http) - api projects.mqttCore + api projects.micronautMqttCore implementation(libs.bcpkix.jdk15on) testImplementation(libs.testcontainers.spock) - testImplementation projects.mqttv5 + testImplementation projects.micronautMqttv5 } diff --git a/mqttv3/build.gradle b/mqttv3/build.gradle index 2cdf3123..5de5cb1f 100644 --- a/mqttv3/build.gradle +++ b/mqttv3/build.gradle @@ -3,9 +3,14 @@ plugins { } dependencies { + annotationProcessor(mnValidation.micronaut.validation.processor) + implementation(mnValidation.micronaut.validation) + api(libs.managed.paho.mqttv3.client) - api projects.mqttCore + api projects.micronautMqttCore compileOnly(mn.micronaut.management) + + testImplementation(mnValidation.micronaut.validation) testImplementation(mn.micronaut.management) testImplementation(mn.reactor) testImplementation(projects.testSuiteUtils) diff --git a/mqttv3/src/main/java/io/micronaut/mqtt/v3/config/MqttClientConfigurationProperties.java b/mqttv3/src/main/java/io/micronaut/mqtt/v3/config/MqttClientConfigurationProperties.java index 08436c50..459f325e 100644 --- a/mqttv3/src/main/java/io/micronaut/mqtt/v3/config/MqttClientConfigurationProperties.java +++ b/mqttv3/src/main/java/io/micronaut/mqtt/v3/config/MqttClientConfigurationProperties.java @@ -17,13 +17,12 @@ import io.micronaut.context.annotation.ConfigurationBuilder; import io.micronaut.context.annotation.ConfigurationProperties; -import io.micronaut.context.annotation.Context; import io.micronaut.mqtt.config.MqttSSLConfiguration; -import org.eclipse.paho.client.mqttv3.*; +import jakarta.validation.constraints.NotNull; +import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import javax.net.SocketFactory; import javax.net.ssl.HostnameVerifier; -import javax.validation.constraints.NotNull; import java.time.Duration; import java.util.Optional; import java.util.Properties; @@ -35,7 +34,6 @@ * @since 1.0.0 */ @ConfigurationProperties("mqtt.client") -@Context public class MqttClientConfigurationProperties implements MqttSSLConfiguration { private String serverUri; diff --git a/mqttv3/src/test/groovy/io/micronaut/mqtt/MicronautMqttEnabledSpec.groovy b/mqttv3/src/test/groovy/io/micronaut/mqtt/MicronautMqttEnabledSpec.groovy index 76d6a396..e007ebf9 100644 --- a/mqttv3/src/test/groovy/io/micronaut/mqtt/MicronautMqttEnabledSpec.groovy +++ b/mqttv3/src/test/groovy/io/micronaut/mqtt/MicronautMqttEnabledSpec.groovy @@ -1,8 +1,6 @@ package io.micronaut.mqtt import io.micronaut.context.BeanContext -import io.micronaut.context.annotation.Property -import io.micronaut.core.util.StringUtils import io.micronaut.mqtt.v3.intercept.MqttSubscriberAdvice import io.micronaut.test.extensions.spock.annotation.MicronautTest import jakarta.inject.Inject @@ -19,4 +17,4 @@ class MicronautMqttEnabledSpec extends Specification { beanContext.containsBean(MqttSubscriberAdvice) } -} \ No newline at end of file +} diff --git a/mqttv5/build.gradle b/mqttv5/build.gradle index b3a11d77..27ef377c 100644 --- a/mqttv5/build.gradle +++ b/mqttv5/build.gradle @@ -3,8 +3,10 @@ plugins { } dependencies { + annotationProcessor(mnValidation.micronaut.validation.processor) + implementation(mnValidation.micronaut.validation) api(libs.managed.paho.mqttv5.client) - api projects.mqttCore + api projects.micronautMqttCore compileOnly(mn.micronaut.management) testImplementation(mn.micronaut.management) testImplementation(mn.reactor) diff --git a/mqttv5/src/main/java/io/micronaut/mqtt/v5/config/MqttClientConfigurationProperties.java b/mqttv5/src/main/java/io/micronaut/mqtt/v5/config/MqttClientConfigurationProperties.java index 0fca9d02..51cb63a1 100644 --- a/mqttv5/src/main/java/io/micronaut/mqtt/v5/config/MqttClientConfigurationProperties.java +++ b/mqttv5/src/main/java/io/micronaut/mqtt/v5/config/MqttClientConfigurationProperties.java @@ -24,7 +24,7 @@ import javax.net.SocketFactory; import javax.net.ssl.HostnameVerifier; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import java.time.Duration; import java.util.Properties; diff --git a/mqttv5/src/test/groovy/io/micronaut/mqtt/MicronautMqttEnabledSpec.groovy b/mqttv5/src/test/groovy/io/micronaut/mqtt/MicronautMqttEnabledSpec.groovy index 5654da80..3c048216 100644 --- a/mqttv5/src/test/groovy/io/micronaut/mqtt/MicronautMqttEnabledSpec.groovy +++ b/mqttv5/src/test/groovy/io/micronaut/mqtt/MicronautMqttEnabledSpec.groovy @@ -1,8 +1,6 @@ package io.micronaut.mqtt import io.micronaut.context.BeanContext -import io.micronaut.context.annotation.Property -import io.micronaut.core.util.StringUtils import io.micronaut.mqtt.v5.intercept.MqttSubscriberAdvice import io.micronaut.test.extensions.spock.annotation.MicronautTest import jakarta.inject.Inject @@ -19,4 +17,4 @@ class MicronautMqttEnabledSpec extends Specification { beanContext.containsBean(MqttSubscriberAdvice) } -} \ No newline at end of file +} diff --git a/settings.gradle b/settings.gradle index b77e18d6..0d18b5d7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -25,6 +25,8 @@ include 'test-suite-kotlin' micronautBuild { addSnapshotRepository() + useStandardizedProjectNames = true importMicronautCatalog() importMicronautCatalog("micronaut-serde") + importMicronautCatalog("micronaut-validation") } diff --git a/test-suite-groovy/build.gradle b/test-suite-groovy/build.gradle index 5a7f5950..896a49c1 100644 --- a/test-suite-groovy/build.gradle +++ b/test-suite-groovy/build.gradle @@ -5,9 +5,10 @@ plugins { dependencies { testCompileOnly(mn.micronaut.inject.groovy) - testImplementation(mn.micronaut.validation) + testCompileOnly(mnValidation.micronaut.validation.processor) + testCompileOnly(mnValidation.micronaut.validation) testImplementation projects.testSuiteUtils - testImplementation projects.mqttv5 + testImplementation projects.micronautMqttv5 } tasks.named('test') { diff --git a/test-suite-kotlin/build.gradle b/test-suite-kotlin/build.gradle index 939c4228..fb13fdde 100644 --- a/test-suite-kotlin/build.gradle +++ b/test-suite-kotlin/build.gradle @@ -8,21 +8,15 @@ dependencies { runtimeOnly mn.logback.classic api(mn.micronaut.inject) testAnnotationProcessor(mn.micronaut.inject.java) + testAnnotationProcessor(mnValidation.micronaut.validation.processor) + testImplementation(mnValidation.micronaut.validation) testImplementation(mnTest.micronaut.test.kotest5) - kaptTest(mn.micronaut.inject.java) testImplementation projects.testSuiteUtils - testImplementation projects.mqttv5 + testImplementation projects.micronautMqttv5 } tasks.named('test') { useJUnitPlatform() } - -compileTestKotlin { - kotlinOptions { - jvmTarget = '17' - javaParameters = true - } -} diff --git a/test-suite-kotlin/src/test/kotlin/io/micronaut/mqtt/AbstractMqttKotest.kt b/test-suite-kotlin/src/test/kotlin/io/micronaut/mqtt/AbstractMqttKotest.kt index 6ed91cdf..f3a1dd12 100644 --- a/test-suite-kotlin/src/test/kotlin/io/micronaut/mqtt/AbstractMqttKotest.kt +++ b/test-suite-kotlin/src/test/kotlin/io/micronaut/mqtt/AbstractMqttKotest.kt @@ -4,6 +4,7 @@ import io.kotest.core.spec.style.BehaviorSpec import io.micronaut.context.ApplicationContext import org.testcontainers.containers.BindMode import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy +import java.util.* abstract class AbstractMqttKotest(body: BehaviorSpec.() -> Unit = {}): BehaviorSpec(body) { @@ -30,9 +31,9 @@ abstract class AbstractMqttKotest(body: BehaviorSpec.() -> Unit = {}): BehaviorS fun getDefaultConfig(specName: String): MutableMap { return mutableMapOf( "mqtt.client.server-uri" to "tcp://localhost:${mqttContainer.getMappedPort(1883)}", + "mqtt.client.client-id" to UUID.randomUUID().toString(), "spec.name" to specName) } - } } diff --git a/test-suite-utils/build.gradle b/test-suite-utils/build.gradle index fdfcf830..5bfcaf15 100644 --- a/test-suite-utils/build.gradle +++ b/test-suite-utils/build.gradle @@ -9,6 +9,6 @@ dependencies { api(mn.micronaut.runtime) api(mnTest.micronaut.test.spock) - api projects.mqttCore + api projects.micronautMqttCore api(libs.testcontainers.spock) } diff --git a/test-suite/build.gradle b/test-suite/build.gradle index e23d0c96..c74a4d89 100644 --- a/test-suite/build.gradle +++ b/test-suite/build.gradle @@ -6,9 +6,8 @@ plugins { dependencies { testAnnotationProcessor(mn.micronaut.inject.java) - testAnnotationProcessor(mn.micronaut.validation) - - testImplementation(mn.micronaut.validation) + testAnnotationProcessor(mnValidation.micronaut.validation.processor) + testImplementation(mn.micronaut.http.validation) testImplementation(libs.junit.jupiter.api) testImplementation(mnTest.micronaut.test.junit5) @@ -16,7 +15,7 @@ dependencies { testImplementation(libs.awaitility) testImplementation projects.testSuiteUtils - testImplementation projects.mqttv5 + testImplementation projects.micronautMqttv5 } tasks.named('test') {