diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 4630d210..06dfe7b6 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -24,7 +24,7 @@ jobs: - uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 with: distribution: "liberica" - java-version: 21 + java-version: 25 - uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0 with: cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} diff --git a/.sdkmanrc b/.sdkmanrc index fea384dc..2b4236b4 100644 --- a/.sdkmanrc +++ b/.sdkmanrc @@ -1,3 +1,3 @@ # Enable auto-env through the sdkman_auto_env config # Add key=value pairs of SDKs to use below -java=21.0.8-librca +java=25-librca diff --git a/Dockerfile b/Dockerfile index 31fba86c..9fdeb7be 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM bellsoft/liberica-runtime-container:jdk-21.0.9_11-cds-musl@sha256:5496387564e4d750e81e9f0ecb01efa372a8e83caa39fbac793d29ecf9881e5d AS build +FROM bellsoft/liberica-runtime-container:jdk-25.0.1_11-cds-musl@sha256:b0c86d868c5ef7a5828fbf8b511910f0019491f0b04b739cf25bb340a63a6601 AS build WORKDIR /usr/src/app # cache dependencies COPY ./buildSrc/*.gradle.kts ./buildSrc/ @@ -26,7 +26,7 @@ ARG BUILD_ARG="bootJar" RUN --mount=type=cache,target=/root/.gradle \ ./gradlew ${BUILD_ARG} -FROM bellsoft/liberica-runtime-container:jre-25-cds-musl@sha256:67bd5da45bfceacc89d642ad38771fbfbe44c00ea73e90ec646e417df8d940e5 AS app +FROM bellsoft/liberica-runtime-container:jre-25.0.1_11-cds-musl@sha256:67bd5da45bfceacc89d642ad38771fbfbe44c00ea73e90ec646e417df8d940e5 AS app # use non-root user RUN addgroup -S spring && adduser -S spring -G spring USER spring:spring diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 5e0e3006..5d7ef4e0 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -11,54 +11,31 @@ dependencies { implementation(libs.plugin.springBoot) implementation(libs.plugin.spotless) implementation(libs.plugin.detekt) - implementation(kotlin("allopen", "2.2.21")) - implementation(kotlin("gradle-plugin", "2.2.21")) + implementation(libs.kotlin.allopen) + implementation(libs.kotlin.gradle.plugin) // required for kotlin plugin jpa - implementation(kotlin("reflect", "2.2.21")) - implementation(kotlin("stdlib-jdk8", "2.2.21")) - implementation(kotlin("noarg", "2.2.21")) + implementation(libs.kotlin.reflect) + implementation(libs.kotlin.stdlib.jdk8) + implementation(libs.kotlin.noarg) } gradlePlugin { - plugins.create("dependency-management") { - id = "hu.bsstudio.gradle.dependency-management" - implementationClass = "hu.bsstudio.gradle.DependencyManagementPlugin" - } - plugins.create("detekt-convention") { - id = "hu.bsstudio.gradle.detekt-convention" - implementationClass = "hu.bsstudio.gradle.DetektConventionPlugin" - } - plugins.create("integration-test-convention") { - id = "hu.bsstudio.gradle.integration-test-convention" - implementationClass = "hu.bsstudio.gradle.IntegrationTestConventionPlugin" - } - plugins.create("jacoco-convention") { - id = "hu.bsstudio.gradle.jacoco-convention" - implementationClass = "hu.bsstudio.gradle.JacocoConventionPlugin" - } - plugins.create("java-convention") { - id = "hu.bsstudio.gradle.java-convention" - implementationClass = "hu.bsstudio.gradle.JavaConventionPlugin" - } - plugins.create("java-library-convention") { - id = "hu.bsstudio.gradle.java-library-convention" - implementationClass = "hu.bsstudio.gradle.JavaLibraryConventionPlugin" - } - plugins.create("kotlin-convention") { - id = "hu.bsstudio.gradle.kotlin-convention" - implementationClass = "hu.bsstudio.gradle.KotlinConventionPlugin" - } - plugins.create("spotless-convention") { - id = "hu.bsstudio.gradle.spotless-convention" - implementationClass = "hu.bsstudio.gradle.SpotlessConventionPlugin" - } - plugins.create("spring-app-convention") { - id = "hu.bsstudio.gradle.spring-app-convention" - implementationClass = "hu.bsstudio.gradle.SpringAppConventionPlugin" - } - plugins.create("testing-convention") { - id = "hu.bsstudio.gradle.test-convention" - implementationClass = "hu.bsstudio.gradle.TestConventionPlugin" + mapOf( + "dependency-management" to "hu.bsstudio.gradle.DependencyManagementPlugin", + "detekt-convention" to "hu.bsstudio.gradle.DetektConventionPlugin", + "integration-test-convention" to "hu.bsstudio.gradle.IntegrationTestConventionPlugin", + "jacoco-convention" to "hu.bsstudio.gradle.JacocoConventionPlugin", + "java-convention" to "hu.bsstudio.gradle.JavaConventionPlugin", + "java-library-convention" to "hu.bsstudio.gradle.JavaLibraryConventionPlugin", + "kotlin-convention" to "hu.bsstudio.gradle.KotlinConventionPlugin", + "spotless-convention" to "hu.bsstudio.gradle.SpotlessConventionPlugin", + "spring-app-convention" to "hu.bsstudio.gradle.SpringAppConventionPlugin", + "testing-convention" to "hu.bsstudio.gradle.TestConventionPlugin", + ).forEach { (id, implementationClass) -> + plugins.create(id) { + this.id = "hu.bsstudio.gradle.$id" + this.implementationClass = implementationClass + } } } diff --git a/buildSrc/src/main/kotlin/hu/bsstudio/gradle/DependencyManagementPlugin.kt b/buildSrc/src/main/kotlin/hu/bsstudio/gradle/DependencyManagementPlugin.kt index 41f30d5f..89046475 100644 --- a/buildSrc/src/main/kotlin/hu/bsstudio/gradle/DependencyManagementPlugin.kt +++ b/buildSrc/src/main/kotlin/hu/bsstudio/gradle/DependencyManagementPlugin.kt @@ -9,6 +9,9 @@ class DependencyManagementPlugin : Plugin { override fun apply(project: Project) { project.repositories { mavenCentral() + maven { + url = project.uri("https://redirector.kotlinlang.org/maven/bootstrap") + } } project.dependencies { diff --git a/buildSrc/src/main/kotlin/hu/bsstudio/gradle/DetektConventionPlugin.kt b/buildSrc/src/main/kotlin/hu/bsstudio/gradle/DetektConventionPlugin.kt index 0059e5e0..768814ba 100644 --- a/buildSrc/src/main/kotlin/hu/bsstudio/gradle/DetektConventionPlugin.kt +++ b/buildSrc/src/main/kotlin/hu/bsstudio/gradle/DetektConventionPlugin.kt @@ -1,7 +1,7 @@ package hu.bsstudio.gradle -import io.gitlab.arturbosch.detekt.DetektPlugin -import io.gitlab.arturbosch.detekt.extensions.DetektExtension +import dev.detekt.gradle.extensions.DetektExtension +import dev.detekt.gradle.plugin.DetektPlugin import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.apply @@ -12,7 +12,6 @@ class DetektConventionPlugin : Plugin { project.pluginManager.apply(DetektPlugin::class) project.extensions.configure { - buildUponDefaultConfig = true config.setFrom(project.layout.settingsDirectory.file("detekt.yml")) } } diff --git a/buildSrc/src/main/kotlin/hu/bsstudio/gradle/JavaConventionPlugin.kt b/buildSrc/src/main/kotlin/hu/bsstudio/gradle/JavaConventionPlugin.kt index c4b051b7..906e0982 100644 --- a/buildSrc/src/main/kotlin/hu/bsstudio/gradle/JavaConventionPlugin.kt +++ b/buildSrc/src/main/kotlin/hu/bsstudio/gradle/JavaConventionPlugin.kt @@ -15,7 +15,7 @@ class JavaConventionPlugin : Plugin { project.extensions.configure(JavaPluginExtension::class) { toolchain { - languageVersion.set(JavaLanguageVersion.of(21)) + languageVersion.set(JavaLanguageVersion.of(25)) } } diff --git a/buildSrc/src/main/kotlin/hu/bsstudio/gradle/JavaLibraryConventionPlugin.kt b/buildSrc/src/main/kotlin/hu/bsstudio/gradle/JavaLibraryConventionPlugin.kt index ee3797d5..ff35e62f 100644 --- a/buildSrc/src/main/kotlin/hu/bsstudio/gradle/JavaLibraryConventionPlugin.kt +++ b/buildSrc/src/main/kotlin/hu/bsstudio/gradle/JavaLibraryConventionPlugin.kt @@ -15,7 +15,7 @@ class JavaLibraryConventionPlugin : Plugin { project.extensions.configure(JavaPluginExtension::class) { toolchain { - languageVersion.set(JavaLanguageVersion.of(21)) + languageVersion.set(JavaLanguageVersion.of(25)) } } diff --git a/buildSrc/src/main/kotlin/hu/bsstudio/gradle/KotlinConventionPlugin.kt b/buildSrc/src/main/kotlin/hu/bsstudio/gradle/KotlinConventionPlugin.kt index 32ffd2e4..364c9aba 100644 --- a/buildSrc/src/main/kotlin/hu/bsstudio/gradle/KotlinConventionPlugin.kt +++ b/buildSrc/src/main/kotlin/hu/bsstudio/gradle/KotlinConventionPlugin.kt @@ -16,7 +16,7 @@ class KotlinConventionPlugin : Plugin { freeCompilerArgs = listOf("-Xjsr305=strict") extraWarnings = true allWarningsAsErrors = true - jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_21 + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_25 } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d43b0270..4c768224 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,8 @@ springdoc = "2.8.14" springBoot = "3.5.8" kotest = "6.0.5" spotless = "8.1.0" -detekt = "1.23.8" +detekt = "2.0.0-alpha.1" +kotlin = "2.3.0-Beta2" [plugins] spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } @@ -14,4 +15,9 @@ kotestAssertionsJson = { module = "io.kotest:kotest-assertions-json", version.re plugin-springBoot = { module = "org.springframework.boot:spring-boot-gradle-plugin", version.ref = "springBoot" } plugin-spotless = { module = "com.diffplug.spotless:spotless-plugin-gradle", version.ref = "spotless" } -plugin-detekt = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt" } +plugin-detekt = { module = "dev.detekt:detekt-gradle-plugin", version.ref = "detekt" } +kotlin-allopen = { module = "org.jetbrains.kotlin:kotlin-allopen", version.ref = "kotlin" } +kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } +kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } +kotlin-stdlib-jdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" } +kotlin-noarg = { module = "org.jetbrains.kotlin:kotlin-noarg", version.ref = "kotlin" } diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 00ca9d6b..09252804 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -4,6 +4,7 @@ plugins { id("hu.bsstudio.gradle.spotless-convention") id("hu.bsstudio.gradle.kotlin-convention") id("hu.bsstudio.gradle.spring-app-convention") + id("hu.bsstudio.gradle.test-convention") `jacoco-report-aggregation` `test-report-aggregation` } @@ -14,6 +15,10 @@ dependencies { // todo these scopes were only supported by the spring gradle dependency management plugin // annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") // developmentOnly("org.springframework.boot:spring-boot-devtools") + testImplementation("org.springframework.boot:spring-boot-testcontainers") + testImplementation("org.testcontainers:testcontainers") + testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:junit-jupiter") } tasks.test { diff --git a/server/src/test/kotlin/hu/bsstudio/bssweb/BssWebApplicationTest.kt b/server/src/test/kotlin/hu/bsstudio/bssweb/BssWebApplicationTest.kt new file mode 100644 index 00000000..c0260351 --- /dev/null +++ b/server/src/test/kotlin/hu/bsstudio/bssweb/BssWebApplicationTest.kt @@ -0,0 +1,11 @@ +package hu.bsstudio.bssweb + +import org.junit.jupiter.api.Test +import org.springframework.boot.test.context.SpringBootTest + +@SpringBootTest +class BssWebApplicationTest { + @Test + fun contextLoads() { + } +} diff --git a/server/src/test/resources/application.yml b/server/src/test/resources/application.yml new file mode 100644 index 00000000..64be21f5 --- /dev/null +++ b/server/src/test/resources/application.yml @@ -0,0 +1,13 @@ +bss: + file-api: + url: http://localhost:8888 +spring: + datasource: + url: jdbc:tc:postgresql:16.3-alpine3.18:///db?currentSchema=private + security: + oauth2: + resourceserver: + opaquetoken: + introspection-uri: http://localhost:8888 + client-id: client-id + client-secret: client-secret diff --git a/settings.gradle.kts b/settings.gradle.kts index ac0c1eaf..f3beafe7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,5 @@ rootProject.name = "bss-web-admin-backend" + include( "client", "integration",