upgrade Java-25 Kotlin-2.3.0 usw.

This commit is contained in:
2025-12-22 14:12:51 +01:00
parent 7b5fd063fb
commit 98a9504cbd
12 changed files with 137 additions and 179 deletions
+4 -4
View File
@@ -9,10 +9,10 @@ RESTART_POLICY=no
# Docker build versions (optional overrides) # Docker build versions (optional overrides)
DOCKER_VERSION=1.0.0-SNAPSHOT DOCKER_VERSION=1.0.0-SNAPSHOT
DOCKER_BUILD_DATE=2025-12-04T15:00:00Z DOCKER_BUILD_DATE=2025-12-22T15:00:00Z
DOCKER_GRADLE_VERSION=9.1.0 DOCKER_GRADLE_VERSION=9.2.1
DOCKER_JAVA_VERSION=21 DOCKER_JAVA_VERSION=25
DOCKER_NODE_VERSION=22.21.0 DOCKER_NODE_VERSION=24.12.0
DOCKER_NGINX_VERSION=1.28.0-alpine DOCKER_NGINX_VERSION=1.28.0-alpine
# Postgres # Postgres
+2 -2
View File
@@ -47,7 +47,7 @@ GF_ADMIN_PASSWORD=admin
# Docker build versions (optional overrides) # Docker build versions (optional overrides)
DOCKER_GRADLE_VERSION=9.1.0 DOCKER_GRADLE_VERSION=9.1.0
DOCKER_JAVA_VERSION=21 DOCKER_JAVA_VERSION=25
DOCKER_NODE_VERSION=22.21.0 DOCKER_NODE_VERSION=24.12.0
DOCKER_NGINX_VERSION=1.28.0-alpine DOCKER_NGINX_VERSION=1.28.0-alpine
WEB_BUILD_PROFILE=dev WEB_BUILD_PROFILE=dev
+1 -1
View File
@@ -23,7 +23,7 @@ node_modules/
Thumbs.db Thumbs.db
# Logs # Logs
logs/ _backup/logs/
**/*.log **/*.log
# Kotlin/Java # Kotlin/Java
@@ -475,9 +475,7 @@ Das System integriert sich nahtlos in die bestehende Docker-Versionsverwaltung u
```dockerfile ```dockerfile
# BEFORE: Redundante Hardcodierung in 12+ Dockerfiles # BEFORE: Redundante Hardcodierung in 12+ Dockerfiles
ARG GRADLE_VERSION=9.0.0 ARG GRADLE_VERSION=9.2.1
ARG GRADLE_VERSION=9.0.0
ARG GRADLE_VERSION=9.0.0
# ... 9 weitere Male identisch wiederholt! # ... 9 weitere Male identisch wiederholt!
``` ```
@@ -486,9 +484,9 @@ ARG GRADLE_VERSION=9.0.0
```toml ```toml
# docker/versions.toml - SINGLE SOURCE OF TRUTH # docker/versions.toml - SINGLE SOURCE OF TRUTH
[versions] [versions]
gradle = "9.0.0" gradle = "9.2.1"
java = "21" java = "25"
node = "20.12.0" node = "24.12.0"
nginx = "1.25-alpine" nginx = "1.25-alpine"
prometheus = "v2.54.1" prometheus = "v2.54.1"
grafana = "11.3.0" grafana = "11.3.0"
@@ -515,8 +513,8 @@ docker/
Verwendet von **allen** Dockerfiles: Verwendet von **allen** Dockerfiles:
```bash ```bash
# --- Build Tools --- # --- Build Tools ---
GRADLE_VERSION=9.0.0 GRADLE_VERSION=9.2.1
JAVA_VERSION=21 JAVA_VERSION=25
# --- Build Metadata --- # --- Build Metadata ---
BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
@@ -545,7 +543,7 @@ MEMBERS_SERVICE_PORT=8083
**Clients** (`docker/build-args/clients.env`): **Clients** (`docker/build-args/clients.env`):
```bash ```bash
NODE_VERSION=20.11.0 NODE_VERSION=24.12.0
NGINX_VERSION=1.25-alpine NGINX_VERSION=1.25-alpine
WEB_APP_PORT=4000 WEB_APP_PORT=4000
DESKTOP_APP_VNC_PORT=5901 DESKTOP_APP_VNC_PORT=5901
@@ -583,10 +581,10 @@ AUTH_SERVER_PORT=8087
./scripts/docker-versions-update.sh show ./scripts/docker-versions-update.sh show
# Java auf Version 22 upgraden # Java auf Version 22 upgraden
./scripts/docker-versions-update.sh update java 22 ./scripts/docker-versions-update.sh update java 25
# Gradle auf 9.1.0 upgraden # Gradle auf 9.1.0 upgraden
./scripts/docker-versions-update.sh update gradle 9.1.0 ./scripts/docker-versions-update.sh update gradle 9.2.1
# Prometheus auf neueste Version upgraden # Prometheus auf neueste Version upgraden
./scripts/docker-versions-update.sh update prometheus v2.54.1 ./scripts/docker-versions-update.sh update prometheus v2.54.1
@@ -630,8 +628,8 @@ api-gateway:
dockerfile: dockerfiles/infrastructure/gateway/Dockerfile dockerfile: dockerfiles/infrastructure/gateway/Dockerfile
args: args:
# Zentrale Versionen via Environment-Variablen # Zentrale Versionen via Environment-Variablen
GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0} GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.2.1}
JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21} JAVA_VERSION: ${DOCKER_JAVA_VERSION:-25}
BUILD_DATE: ${BUILD_DATE} BUILD_DATE: ${BUILD_DATE}
VERSION: ${DOCKER_APP_VERSION:-1.0.0} VERSION: ${DOCKER_APP_VERSION:-1.0.0}
SPRING_PROFILES_ACTIVE: ${DOCKER_SPRING_PROFILES_DEFAULT:-default} SPRING_PROFILES_ACTIVE: ${DOCKER_SPRING_PROFILES_DEFAULT:-default}
@@ -641,15 +639,15 @@ api-gateway:
#### **DRY-Prinzip Durchsetzung** #### **DRY-Prinzip Durchsetzung**
- **Vor Version 3.0.0**: `GRADLE_VERSION=9.0.0` in 12 Dockerfiles - **Vor Version 3.0.0**: `GRADLE_VERSION=9.2.1` in 12 Dockerfiles
- **Ab Version 3.0.0**: `gradle = "9.0.0"` **einmalig** in `docker/versions.toml` - **Ab Version 3.0.0**: `gradle = "9.2.1"` **einmalig** in `docker/versions.toml`
#### **Wartungsaufwand drastisch reduziert** ✅ #### **Wartungsaufwand drastisch reduziert** ✅
```bash ```bash
# BEFORE: 12 Dateien manuell editieren für Gradle-Update # BEFORE: 12 Dateien manuell editieren für Gradle-Update
# AFTER: Ein Befehl für alle Services # AFTER: Ein Befehl für alle Services
./scripts/docker-versions-update.sh update gradle 9.1.0 ./scripts/docker-versions-update.sh update gradle 9.2.1
``` ```
#### **Konsistenz garantiert** ✅ #### **Konsistenz garantiert** ✅
@@ -126,8 +126,8 @@ docker/
Verwendet von **allen** Dockerfiles: Verwendet von **allen** Dockerfiles:
```bash ```bash
# --- Build Tools --- # --- Build Tools ---
GRADLE_VERSION=9.1.0 GRADLE_VERSION=9.2.1
JAVA_VERSION=21 JAVA_VERSION=25
# --- Build Metadata --- # --- Build Metadata ---
BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
@@ -135,8 +135,8 @@ VERSION=1.0.0
# --- Common Base Images --- # --- Common Base Images ---
ALPINE_VERSION=3.19 ALPINE_VERSION=3.19
ECLIPSE_TEMURIN_JDK_VERSION=21-jdk-alpine ECLIPSE_TEMURIN_JDK_VERSION=25-jdk-alpine
ECLIPSE_TEMURIN_JRE_VERSION=21-jre-alpine ECLIPSE_TEMURIN_JRE_VERSION=25-jre-alpine
# --- Monitoring & Infrastructure Services --- # --- Monitoring & Infrastructure Services ---
DOCKER_PROMETHEUS_VERSION=v2.54.1 DOCKER_PROMETHEUS_VERSION=v2.54.1
@@ -8,7 +8,7 @@ import org.springframework.test.context.ActiveProfiles
/** /**
* Basis-Test zur Überprüfung, dass der Gateway-Anwendungskontext erfolgreich lädt. * Basis-Test zur Überprüfung, dass der Gateway-Anwendungskontext erfolgreich lädt.
* Verwendet Test-Profil um Produktions-Filter und externe Abhängigkeiten zu deaktivieren. * Verwendet ein Test-Profil, um Produktions-Filter und externe Abhängigkeiten zu deaktivieren.
*/ */
@SpringBootTest( @SpringBootTest(
classes = [GatewayApplication::class], classes = [GatewayApplication::class],
+38 -73
View File
@@ -1,3 +1,12 @@
import groovy.json.JsonSlurper
import io.gitlab.arturbosch.detekt.Detekt
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jlleitschuh.gradle.ktlint.KtlintExtension
import org.jlleitschuh.gradle.ktlint.reporter.ReporterType
import java.io.ByteArrayOutputStream
import java.util.zip.GZIPOutputStream
plugins { plugins {
// Version management plugin for dependency updates // Version management plugin for dependency updates
id("com.github.ben-manes.versions") version "0.51.0" id("com.github.ben-manes.versions") version "0.51.0"
@@ -101,13 +110,13 @@ subprojects {
environment("NODE_OPTIONS", merged) environment("NODE_OPTIONS", merged)
// Also set the legacy switch to silence warnings entirely // Also set the legacy switch to silence warnings entirely
environment("NODE_NO_WARNINGS", "1") environment("NODE_NO_WARNINGS", "1")
// Set Chrome binary path to avoid snap permission issues // Set a Chrome binary path to avoid snap permission issues
environment("CHROME_BIN", "/usr/bin/google-chrome-stable") environment("CHROME_BIN", "/usr/bin/google-chrome-stable")
environment("CHROMIUM_BIN", "/usr/bin/chromium") environment("CHROMIUM_BIN", "/usr/bin/chromium")
environment("PUPPETEER_EXECUTABLE_PATH", "/usr/bin/chromium") environment("PUPPETEER_EXECUTABLE_PATH", "/usr/bin/chromium")
} }
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> { tasks.withType<KotlinCompile> {
compilerOptions { compilerOptions {
freeCompilerArgs.add("-Xannotation-default-target=param-property") freeCompilerArgs.add("-Xannotation-default-target=param-property")
} }
@@ -117,14 +126,14 @@ subprojects {
// Detekt & Ktlint default setup // Detekt & Ktlint default setup
// ------------------------------ // ------------------------------
plugins.withId("io.gitlab.arturbosch.detekt") { plugins.withId("io.gitlab.arturbosch.detekt") {
extensions.configure(io.gitlab.arturbosch.detekt.extensions.DetektExtension::class.java) { extensions.configure(DetektExtension::class.java) {
buildUponDefaultConfig = true buildUponDefaultConfig = true
allRules = false allRules = false
autoCorrect = false autoCorrect = false
config.setFrom(files(rootProject.file("config/detekt/detekt.yml"))) config.setFrom(files(rootProject.file("config/detekt/detekt.yml")))
basePath = rootDir.absolutePath basePath = rootDir.absolutePath
} }
tasks.withType<io.gitlab.arturbosch.detekt.Detekt>().configureEach { tasks.withType<Detekt>().configureEach {
jvmTarget = "21" jvmTarget = "21"
reports { reports {
xml.required.set(false) xml.required.set(false)
@@ -136,13 +145,13 @@ subprojects {
} }
plugins.withId("org.jlleitschuh.gradle.ktlint") { plugins.withId("org.jlleitschuh.gradle.ktlint") {
extensions.configure(org.jlleitschuh.gradle.ktlint.KtlintExtension::class.java) { extensions.configure(KtlintExtension::class.java) {
android.set(false) android.set(false)
outputToConsole.set(true) outputToConsole.set(true)
ignoreFailures.set(false) ignoreFailures.set(false)
reporters { reporters {
reporter(org.jlleitschuh.gradle.ktlint.reporter.ReporterType.CHECKSTYLE) reporter(ReporterType.CHECKSTYLE)
reporter(org.jlleitschuh.gradle.ktlint.reporter.ReporterType.PLAIN) reporter(ReporterType.PLAIN)
} }
} }
} }
@@ -220,11 +229,11 @@ tasks.register("archGuardNoFeatureToFeatureDeps") {
!n.contains("test") && !n.contains("debug") // ignore test/debug configs !n.contains("test") && !n.contains("debug") // ignore test/debug configs
} }
.forEach { cfg -> .forEach { cfg ->
cfg.dependencies.withType(org.gradle.api.artifacts.ProjectDependency::class.java).forEach { dep -> cfg.dependencies.withType(ProjectDependency::class.java).forEach { dep ->
// Use reflection to avoid compile-time issues with dependencyProject property // Use reflection to avoid compile-time issues with dependencyProject property
val proj = val proj =
try { try {
dep.javaClass.getMethod("getDependencyProject").invoke(dep) as org.gradle.api.Project dep.javaClass.getMethod("getDependencyProject").invoke(dep) as Project
} catch (e: Throwable) { } catch (e: Throwable) {
null null
} }
@@ -270,7 +279,7 @@ tasks.register("checkBundleBudget") {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val parsed = val parsed =
groovy.json.JsonSlurper().parseText(text) as Map<String, Map<String, Any?>> JsonSlurper().parseText(text) as Map<String, Map<String, Any?>>
val budgets = val budgets =
parsed.mapValues { (_, v) -> parsed.mapValues { (_, v) ->
val raw = (v["rawBytes"] as Number).toLong() val raw = (v["rawBytes"] as Number).toLong()
@@ -279,8 +288,8 @@ tasks.register("checkBundleBudget") {
} }
fun gzipSize(bytes: ByteArray): Long { fun gzipSize(bytes: ByteArray): Long {
val baos = java.io.ByteArrayOutputStream() val baos = ByteArrayOutputStream()
java.util.zip.GZIPOutputStream(baos).use { it.write(bytes) } GZIPOutputStream(baos).use { it.write(bytes) }
return baos.toByteArray().size.toLong() return baos.toByteArray().size.toLong()
} }
@@ -296,7 +305,7 @@ tasks.register("checkBundleBudget") {
} }
shells.forEach { shell -> shells.forEach { shell ->
val key = shell.path.trimStart(':').replace(':', '/') // or use colon form for budgets keys below val key = shell.path.trimStart(':').replace(':', '/') // or use a colon form for budgets keys below
val colonKey = shell.path.trimStart(':').replace('/', ':').trim() // ensure ":a:b:c" val colonKey = shell.path.trimStart(':').replace('/', ':').trim() // ensure ":a:b:c"
// Budgets are keyed by a Gradle path with colons but without leading colon in config for readability // Budgets are keyed by a Gradle path with colons but without leading colon in config for readability
val budgetKeyCandidates = val budgetKeyCandidates =
@@ -307,7 +316,7 @@ tasks.register("checkBundleBudget") {
shell.name, shell.name,
) )
val budgetEntry = budgetKeyCandidates.asSequence().mapNotNull { budgets[it] }.firstOrNull() val budgetEntry = budgetKeyCandidates.firstNotNullOfOrNull { budgets[it] }
if (budgetEntry == null) { if (budgetEntry == null) {
report.appendLine("- ${shell.path}: No budget configured (skipping)") report.appendLine("- ${shell.path}: No budget configured (skipping)")
return@forEach return@forEach
@@ -383,7 +392,7 @@ tasks.register("archGuards") {
tasks.register("staticAnalysis") { tasks.register("staticAnalysis") {
group = "verification" group = "verification"
description = "Run static analysis (detekt, ktlint) and architecture guards" description = "Run static analysis (detekt, ktlint) and architecture guards"
// These tasks are provided by plugins; only depend if tasks exist // Plugins provide these tasks; only 'depend on' if tasks exist
dependsOn( dependsOn(
tasks.matching { it.name == "detekt" }, tasks.matching { it.name == "detekt" },
tasks.matching { it.name == "ktlintCheck" }, tasks.matching { it.name == "ktlintCheck" },
@@ -395,80 +404,36 @@ tasks.register("staticAnalysis") {
// ### DOKKA (Multi-Module) ### // ### DOKKA (Multi-Module) ###
// ################################################################## // ##################################################################
// Apply Dokka automatically to Kotlin subprojects to enable per-module docs // Apply Dokka (V2) automatically to Kotlin subprojects
subprojects { subprojects {
plugins.withId("org.jetbrains.kotlin.jvm") { plugins.withId("org.jetbrains.kotlin.jvm") { apply(plugin = "org.jetbrains.dokka") }
apply(plugin = "org.jetbrains.dokka") plugins.withId("org.jetbrains.kotlin.multiplatform") { apply(plugin = "org.jetbrains.dokka") }
}
plugins.withId("org.jetbrains.kotlin.multiplatform") {
apply(plugin = "org.jetbrains.dokka")
}
// Minimal sourceLink configuration when running in GitHub Actions
tasks.withType(org.jetbrains.dokka.gradle.DokkaTask::class.java).configureEach {
dokkaSourceSets.configureEach {
val repo = System.getenv("GITHUB_REPOSITORY")
if (!repo.isNullOrBlank()) {
sourceLink {
localDirectory.set(project.file("src"))
remoteUrl.set(
java.net.URI.create(
"https://github.com/$repo/blob/main/" + project.path.trimStart(':').replace(':', '/') + "/src",
).toURL(),
)
}
}
// Keep module names short and stable
moduleName.set(project.path.trimStart(':'))
}
}
} }
// Aggregate tasks to build multi-module docs in Markdown (GFM) and HTML // Aggregate tasks to build multi-module docs in Markdown (GFM) and HTML
val dokkaGfmAll = // Unified V2 aggregator: builds docs via `dokkaGenerate` in subprojects and aggregates outputs
tasks.register("dokkaGfmAll") { val dokkaAll =
tasks.register("dokkaAll") {
group = "documentation" group = "documentation"
description = "Builds Dokka GFM for all modules and aggregates outputs under build/dokka/gfm" description = "Builds Dokka (V2) for all modules and aggregates outputs under build/dokka/all"
// Depend on all dokkaGfm tasks that exist in subprojects // Trigger Dokka generation in all subprojects that have the Dokka plugin
dependsOn( dependsOn(
subprojects subprojects
.filter { it.plugins.hasPlugin("org.jetbrains.dokka") } .filter { it.plugins.hasPlugin("org.jetbrains.dokka") }
.map { "${it.path}:dokkaGfm" }, .map { "${it.path}:dokkaGenerate" },
) )
doLast { doLast {
val dest = layout.buildDirectory.dir("dokka/gfm").get().asFile val dest = layout.buildDirectory.dir("dokka/all").get().asFile
if (dest.exists()) dest.deleteRecursively() if (dest.exists()) dest.deleteRecursively()
dest.mkdirs() dest.mkdirs()
subprojects.filter { it.plugins.hasPlugin("org.jetbrains.dokka") }.forEach { p -> subprojects.filter { it.plugins.hasPlugin("org.jetbrains.dokka") }.forEach { p ->
val out = p.layout.buildDirectory.dir("dokka/gfm").get().asFile // Dokka V2 writes into build/dokka; copy everything to keep format/plugins agnostic
val out = p.layout.buildDirectory.dir("dokka").get().asFile
if (out.exists()) { if (out.exists()) {
out.copyRecursively(File(dest, p.path.trimStart(':').replace(':', '/')), overwrite = true) out.copyRecursively(File(dest, p.path.trimStart(':').replace(':', '/')), overwrite = true)
} }
} }
println("[DOKKA] Aggregated GFM into ${dest.absolutePath}") println("[DOKKA] Aggregated Dokka V2 outputs into ${dest.absolutePath}")
}
}
val dokkaHtmlAll =
tasks.register("dokkaHtmlAll") {
group = "documentation"
description = "Builds Dokka HTML for all modules and aggregates outputs under build/dokka/html"
dependsOn(
subprojects
.filter { it.plugins.hasPlugin("org.jetbrains.dokka") }
.map { "${it.path}:dokkaHtml" },
)
doLast {
val dest = layout.buildDirectory.dir("dokka/html").get().asFile
if (dest.exists()) dest.deleteRecursively()
dest.mkdirs()
subprojects.filter { it.plugins.hasPlugin("org.jetbrains.dokka") }.forEach { p ->
val out = p.layout.buildDirectory.dir("dokka/html").get().asFile
if (out.exists()) {
out.copyRecursively(File(dest, p.path.trimStart(':').replace(':', '/')), overwrite = true)
}
}
println("[DOKKA] Aggregated HTML into ${dest.absolutePath}")
} }
} }
@@ -491,7 +456,7 @@ tasks.withType<Exec>().configureEach {
val merged = if (current.isNullOrBlank()) "--no-deprecation" else "$current --no-deprecation" val merged = if (current.isNullOrBlank()) "--no-deprecation" else "$current --no-deprecation"
environment("NODE_OPTIONS", merged) environment("NODE_OPTIONS", merged)
environment("NODE_NO_WARNINGS", "1") environment("NODE_NO_WARNINGS", "1")
// Set Chrome binary path to avoid snap permission issues // Set a Chrome binary path to avoid snap permission issues
environment("CHROME_BIN", "/usr/bin/google-chrome-stable") environment("CHROME_BIN", "/usr/bin/google-chrome-stable")
environment("CHROMIUM_BIN", "/usr/bin/chromium") environment("CHROMIUM_BIN", "/usr/bin/chromium")
environment("PUPPETEER_EXECUTABLE_PATH", "/usr/bin/chromium") environment("PUPPETEER_EXECUTABLE_PATH", "/usr/bin/chromium")
+7 -7
View File
@@ -243,7 +243,7 @@ services:
args: args:
# Build-Args aus deinen .env Dateien (werden hier statisch benötigt für den Build) # Build-Args aus deinen .env Dateien (werden hier statisch benötigt für den Build)
GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}" GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}"
JAVA_VERSION: "${DOCKER_JAVA_VERSION:-21}" JAVA_VERSION: "${DOCKER_JAVA_VERSION:-25}"
VERSION: "${DOCKER_VERSION:-1.0.0-SNAPSHOT}" VERSION: "${DOCKER_VERSION:-1.0.0-SNAPSHOT}"
BUILD_DATE: "${DOCKER_BUILD_DATE}" BUILD_DATE: "${DOCKER_BUILD_DATE}"
labels: labels:
@@ -317,7 +317,7 @@ services:
args: args:
# Build-Args aus deinen .env Dateien (werden hier statisch benötigt für den Build) # Build-Args aus deinen .env Dateien (werden hier statisch benötigt für den Build)
GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}" GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}"
JAVA_VERSION: "${DOCKER_JAVA_VERSION:-21}" JAVA_VERSION: "${DOCKER_JAVA_VERSION:-25}"
VERSION: "${DOCKER_VERSION:-1.0.0-SNAPSHOT}" VERSION: "${DOCKER_VERSION:-1.0.0-SNAPSHOT}"
BUILD_DATE: "${DOCKER_BUILD_DATE}" BUILD_DATE: "${DOCKER_BUILD_DATE}"
labels: labels:
@@ -373,7 +373,7 @@ services:
dockerfile: backend/services/entries/Dockerfile dockerfile: backend/services/entries/Dockerfile
args: args:
GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}" GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}"
JAVA_VERSION: "${DOCKER_JAVA_VERSION:-21}" JAVA_VERSION: "${DOCKER_JAVA_VERSION:-25}"
VERSION: "${DOCKER_VERSION:-1.0.0-SNAPSHOT}" VERSION: "${DOCKER_VERSION:-1.0.0-SNAPSHOT}"
BUILD_DATE: "${DOCKER_BUILD_DATE}" BUILD_DATE: "${DOCKER_BUILD_DATE}"
labels: labels:
@@ -411,7 +411,7 @@ services:
dockerfile: backend/services/results/results-service/Dockerfile dockerfile: backend/services/results/results-service/Dockerfile
args: args:
GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}" GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}"
JAVA_VERSION: "${DOCKER_JAVA_VERSION:-21}" JAVA_VERSION: "${DOCKER_JAVA_VERSION:-25}"
VERSION: "${DOCKER_VERSION:-1.0.0-SNAPSHOT}" VERSION: "${DOCKER_VERSION:-1.0.0-SNAPSHOT}"
BUILD_DATE: "${DOCKER_BUILD_DATE}" BUILD_DATE: "${DOCKER_BUILD_DATE}"
labels: labels:
@@ -449,7 +449,7 @@ services:
dockerfile: backend/services/scheduling/scheduling-service/Dockerfile dockerfile: backend/services/scheduling/scheduling-service/Dockerfile
args: args:
GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}" GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}"
JAVA_VERSION: "${DOCKER_JAVA_VERSION:-21}" JAVA_VERSION: "${DOCKER_JAVA_VERSION:-25}"
VERSION: "${DOCKER_VERSION:-1.0.0-SNAPSHOT}" VERSION: "${DOCKER_VERSION:-1.0.0-SNAPSHOT}"
BUILD_DATE: "${DOCKER_BUILD_DATE}" BUILD_DATE: "${DOCKER_BUILD_DATE}"
labels: labels:
@@ -492,9 +492,9 @@ services:
dockerfile: config/docker/nginx/web-app/Dockerfile dockerfile: config/docker/nginx/web-app/Dockerfile
args: args:
GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}" GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}"
JAVA_VERSION: "${DOCKER_JAVA_VERSION:-21}" JAVA_VERSION: "${DOCKER_JAVA_VERSION:-25}"
# Frontend spezifisch: # Frontend spezifisch:
NODE_VERSION: "${DOCKER_NODE_VERSION:-22.21.0}" NODE_VERSION: "${DOCKER_NODE_VERSION:-24.12.0}"
NGINX_IMAGE_TAG: "${DOCKER_NGINX_VERSION:-1.28.0-alpine}" NGINX_IMAGE_TAG: "${DOCKER_NGINX_VERSION:-1.28.0-alpine}"
WEB_BUILD_PROFILE: "${WEB_BUILD_PROFILE:-dev}" # dev oder prod WEB_BUILD_PROFILE: "${WEB_BUILD_PROFILE:-dev}" # dev oder prod
# Metadaten: # Metadaten:
+1 -1
View File
@@ -12,7 +12,7 @@ kotlin.incremental.multiplatform=true
kotlin.incremental.js=true kotlin.incremental.js=true
kotlin.caching.enabled=true kotlin.caching.enabled=true
kotlin.compiler.execution.strategy=in-process kotlin.compiler.execution.strategy=in-process
kotlin.compiler.preciseCompilationResultsBackup=true # kotlin.compiler.preciseCompilationResultsBackup=true
kotlin.stdlib.default.dependency=true kotlin.stdlib.default.dependency=true
# Gradle Configuration # Gradle Configuration
+41 -45
View File
@@ -4,11 +4,11 @@
[versions] [versions]
# --- Android Ecosystem --- # --- Android Ecosystem ---
agp = "8.1.4" # agp = "8.1.4"
# --- Kotlin Ecosystem --- # --- Kotlin Ecosystem ---
kotlin = "2.2.20" kotlin = "2.3.0"
kotlin-logging = "7.0.3" kotlin-logging = "7.0.13"
kotlinx = "1.10.2" kotlinx = "1.10.2"
kotlinx-serialization-json = "1.9.0" kotlinx-serialization-json = "1.9.0"
kotlinx-datetime = "0.7.1" kotlinx-datetime = "0.7.1"
@@ -16,44 +16,37 @@ kotlinx-coroutines = "1.10.2"
# --- Spring Ecosystem --- # --- Spring Ecosystem ---
springBoot = "3.5.6" springBoot = "3.5.9"
springCloud = "2025.0.0" springCloud = "2025.1.0"
springCloudGateway = "4.3.0" # springCloudGateway = "4.3.0"
springDependencyManagement = "1.1.7" springDependencyManagement = "1.1.7"
springdoc = "2.8.13" springdoc = "3.0.0"
# --- Ktor (API Layer & Client) --- # --- Ktor (API Layer & Client) ---
ktor = "3.3.3" ktor = "3.3.3"
# --- DI --- # --- DI ---
koin = "4.1.0" koin = "4.1.1"
koinCompose = "4.0.0" koinCompose = "4.1.1"
# --- Compose UI --- # --- Compose UI ---
androidx-lifecycle = "2.9.4" androidx-lifecycle = "2.9.6"
composeHotReload = "1.0.0-rc02" composeHotReload = "1.0.0"
composeMultiplatform = "1.9.0" composeMultiplatform = "1.9.3"
# coroutinesVersion = "1.10.2"
# dateTimeVersion = "0.7.1"
# koin = "4.1.0"
# ktor = "3.3.3"
# sqlDelight = "2.1.0"
# material3 = "1.3.2"
# --- Database & Persistence --- # --- Database & Persistence ---
exposed = "0.61.0" exposed = "0.61.0"
postgresql = "42.7.8" postgresql = "42.7.8"
hikari = "7.0.2" hikari = "7.0.2"
h2 = "2.3.232" h2 = "2.4.240"
flyway = "11.7.2" flyway = "11.19.1"
redisson = "3.52.0" redisson = "4.0.0"
lettuce = "6.6.0.RELEASE" lettuce = "7.2.1.RELEASE"
sqldelight = "2.1.0" sqldelight = "2.2.1"
# --- Service Discovery & Monitoring --- # --- Service Discovery & Monitoring ---
micrometer = "1.15.4" micrometer = "1.16.1"
micrometerTracing = "1.5.4" micrometerTracing = "1.6.1"
zipkin = "3.5.1" zipkin = "3.5.1"
zipkinReporter = "3.5.1" zipkinReporter = "3.5.1"
@@ -62,26 +55,29 @@ auth0Jwt = "4.5.0"
keycloakAdminClient = "26.0.7" keycloakAdminClient = "26.0.7"
# --- Testing --- # --- Testing ---
junitJupiter = "5.12.2" junitJupiter = "6.0.1"
junitPlatform = "1.12.2" junitPlatform = "6.0.1"
mockk = "1.14.6" mockk = "1.14.7"
assertj = "3.27.4" assertj = "3.27.6"
testcontainers = "1.21.3" testcontainers = "2.0.3"
testcontainersKeycloak = "3.9.0" testcontainersKeycloak = "4.0.1"
testcontainersJunitJupiter = "1.21.4"
testcontainersPostgresql = "1.21.4"
testcontainersKafka = "1.21.4"
# --- Resilience4j --- # --- Resilience4j ---
resilience4j = "2.3.0" resilience4j = "2.3.0"
# --- Utilities --- # --- Utilities ---
#uuid = "0.9.0" # uuid = "0.9.0"
bignum = "0.3.10" bignum = "0.3.10"
logback = "1.5.19" logback = "1.5.22"
caffeine = "3.2.2" caffeine = "3.2.3"
reactorKafka = "1.3.23" # reactorKafka = "1.3.23"
jackson = "2.19.2" jackson = "3.0.3"
jakartaAnnotation = "3.0.0" jakartaAnnotation = "3.0.0"
roomCommonJvm = "2.8.2" roomCommonJvm = "2.8.4"
uiDesktop = "1.9.3" uiDesktop = "1.7.0"
# --- Logging --- # --- Logging ---
slf4j = "2.0.17" slf4j = "2.0.17"
@@ -235,9 +231,9 @@ reactor-test = { module = "io.projectreactor:reactor-test" } # Version wird von
mockk = { module = "io.mockk:mockk", version.ref = "mockk" } mockk = { module = "io.mockk:mockk", version.ref = "mockk" }
assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertj" } assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertj" }
testcontainers-core = { module = "org.testcontainers:testcontainers", version.ref = "testcontainers" } testcontainers-core = { module = "org.testcontainers:testcontainers", version.ref = "testcontainers" }
testcontainers-junit-jupiter = { module = "org.testcontainers:junit-jupiter", version.ref = "testcontainers" } testcontainers-junit-jupiter = { module = "org.testcontainers:junit-jupiter", version.ref = "testcontainersJunitJupiter" }
testcontainers-postgresql = { module = "org.testcontainers:postgresql", version.ref = "testcontainers" } testcontainers-postgresql = { module = "org.testcontainers:postgresql", version.ref = "testcontainersPostgresql" }
testcontainers-kafka = { module = "org.testcontainers:kafka", version.ref = "testcontainers" } testcontainers-kafka = { module = "org.testcontainers:kafka", version.ref = "testcontainersKafka" }
testcontainers-keycloak = { module = "com.github.dasniko:testcontainers-keycloak", version.ref = "testcontainersKeycloak" } testcontainers-keycloak = { module = "com.github.dasniko:testcontainers-keycloak", version.ref = "testcontainersKeycloak" }
room-common-jvm = { module = "androidx.room:room-common-jvm", version.ref = "roomCommonJvm" } room-common-jvm = { module = "androidx.room:room-common-jvm", version.ref = "roomCommonJvm" }
ui-desktop = { module = "androidx.compose.ui:ui-desktop", version.ref = "uiDesktop" } ui-desktop = { module = "androidx.compose.ui:ui-desktop", version.ref = "uiDesktop" }
@@ -500,8 +496,8 @@ monitoring-complete = [
[plugins] [plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" } # androidApplication = { id = "com.android.application", version.ref = "agp" }
androidLibrary = { id = "com.android.library", version.ref = "agp" } # androidLibrary = { id = "com.android.library", version.ref = "agp" }
kotlinJvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlinJvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
@@ -524,4 +520,4 @@ foojayResolver = { id = "org.gradle.toolchains.foojay-resolver-convention", vers
# See: https://github.com/Kotlin/dokka # See: https://github.com/Kotlin/dokka
# Note: dokka 2.0.0+ matches Kotlin 2.0+; verify compatibility if bumping Kotlin # Note: dokka 2.0.0+ matches Kotlin 2.0+; verify compatibility if bumping Kotlin
# Using latest stable known compatible as of 2025-10 # Using latest stable known compatible as of 2025-10
dokka = { id = "org.jetbrains.dokka", version = "2.0.0" } dokka = { id = "org.jetbrains.dokka", version = "2.1.0" }
+1 -1
View File
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
+23 -24
View File
@@ -2,10 +2,10 @@
# yarn lockfile v1 # yarn lockfile v1
"@cashapp/sqldelight-sqljs-worker@2.1.0": "@cashapp/sqldelight-sqljs-worker@2.2.1":
version "2.1.0" version "2.2.1"
resolved "https://registry.yarnpkg.com/@cashapp/sqldelight-sqljs-worker/-/sqldelight-sqljs-worker-2.1.0.tgz#4ab898698aca9487f47fc9a42107c606c3ce81c5" resolved "https://registry.yarnpkg.com/@cashapp/sqldelight-sqljs-worker/-/sqldelight-sqljs-worker-2.2.1.tgz#c71776a9dddfc435d4f1e64317a7039d447ea024"
integrity sha512-odvBljb1rUOCk3UUZgjdiAChEohYI4Fy6Tj3NUy3l6u3WV/we+tjDTJ/kC25CJKD4pv0ZlH5AL1sKsZ5clKCew== integrity sha512-cj/llgS1T94t7rz63fI7pbi+jJx+vQofCT58KyMZb9XVRuoxb4taB5wbbBa4e/iljiuN5XIGGPFx+5PvtVh3LQ==
"@colors/colors@1.5.0": "@colors/colors@1.5.0":
version "1.5.0" version "1.5.0"
@@ -1041,10 +1041,10 @@ engine.io@~6.6.0:
engine.io-parser "~5.2.1" engine.io-parser "~5.2.1"
ws "~8.17.1" ws "~8.17.1"
enhanced-resolve@^5.17.2: enhanced-resolve@^5.17.3:
version "5.18.3" version "5.18.4"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz#9b5f4c5c076b8787c78fe540392ce76a88855b44" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz#c22d33055f3952035ce6a144ce092447c525f828"
integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== integrity sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==
dependencies: dependencies:
graceful-fs "^4.2.4" graceful-fs "^4.2.4"
tapable "^2.2.0" tapable "^2.2.0"
@@ -1740,10 +1740,9 @@ karma-webpack@5.0.1:
minimatch "^9.0.3" minimatch "^9.0.3"
webpack-merge "^4.1.5" webpack-merge "^4.1.5"
karma@6.4.4: "karma@github:Kotlin/karma#6.4.5":
version "6.4.4" version "6.4.4"
resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.4.tgz#dfa5a426cf5a8b53b43cd54ef0d0d09742351492" resolved "https://codeload.github.com/Kotlin/karma/tar.gz/239a8fc984584f0d96b1dd750e7a5e2c79da93a6"
integrity sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==
dependencies: dependencies:
"@colors/colors" "1.5.0" "@colors/colors" "1.5.0"
body-parser "^1.19.0" body-parser "^1.19.0"
@@ -1775,10 +1774,10 @@ kind-of@^6.0.2:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
kotlin-web-helpers@2.1.0: kotlin-web-helpers@3.0.0:
version "2.1.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/kotlin-web-helpers/-/kotlin-web-helpers-2.1.0.tgz#6cd4b0f0dc3baea163929c8638155b8d19c55a74" resolved "https://registry.yarnpkg.com/kotlin-web-helpers/-/kotlin-web-helpers-3.0.0.tgz#3ed6b48f694f74bb60a737a9d7e2c0e3b29abdb9"
integrity sha512-NAJhiNB84tnvJ5EQx7iER3GWw7rsTZkX9HVHZpe7E3dDBD/dhTzqgSwNU3MfQjniy2rB04bP24WM9Z32ntUWRg== integrity sha512-kdQO4AJQkUPvpLh9aglkXDRyN+CfXO7pKq+GESEnxooBFkQpytLrqZis3ABvmFN1cGw/ZQ/K38u5sRGW+NfBnw==
dependencies: dependencies:
format-util "^1.0.5" format-util "^1.0.5"
@@ -1953,10 +1952,10 @@ mkdirp@^0.5.5:
dependencies: dependencies:
minimist "^1.2.6" minimist "^1.2.6"
mocha@11.7.1: mocha@11.7.2:
version "11.7.1" version "11.7.2"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.1.tgz#91948fecd624fb4bd154ed260b7e1ad3910d7c7a" resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.2.tgz#3c0079fe5cc2f8ea86d99124debcc42bb1ab22b5"
integrity sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A== integrity sha512-lkqVJPmqqG/w5jmmFtiRvtA2jkDyNVUcefFJKb2uyX4dekk8Okgqop3cgbFiaIvj8uCRJVTP5x9dfxGyXm2jvQ==
dependencies: dependencies:
browser-stdout "^1.3.1" browser-stdout "^1.3.1"
chokidar "^4.0.1" chokidar "^4.0.1"
@@ -2977,10 +2976,10 @@ webpack-sources@^3.3.3:
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723"
integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==
webpack@5.100.2: webpack@5.101.3:
version "5.100.2" version "5.101.3"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.100.2.tgz#e2341facf9f7de1d702147c91bcb65b693adf9e8" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.101.3.tgz#3633b2375bb29ea4b06ffb1902734d977bc44346"
integrity sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw== integrity sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==
dependencies: dependencies:
"@types/eslint-scope" "^3.7.7" "@types/eslint-scope" "^3.7.7"
"@types/estree" "^1.0.8" "@types/estree" "^1.0.8"
@@ -2992,7 +2991,7 @@ webpack@5.100.2:
acorn-import-phases "^1.0.3" acorn-import-phases "^1.0.3"
browserslist "^4.24.0" browserslist "^4.24.0"
chrome-trace-event "^1.0.2" chrome-trace-event "^1.0.2"
enhanced-resolve "^5.17.2" enhanced-resolve "^5.17.3"
es-module-lexer "^1.2.1" es-module-lexer "^1.2.1"
eslint-scope "5.1.1" eslint-scope "5.1.1"
events "^3.2.0" events "^3.2.0"