diff --git a/Dockerfile b/Dockerfile index adb7530..d2de64c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,5 @@ -FROM gcr.io/distroless/java17-debian11 -COPY build/libs/tms-event-api-all.jar app/app.jar -ENV PORT=8080 -EXPOSE $PORT -WORKDIR app -CMD ["app.jar"] +FROM ghcr.io/navikt/baseimages/temurin:21 + +ENV JAVA_OPTS='-XX:MaxRAMPercentage=75' + +COPY build/libs/*.jar ./ diff --git a/build.gradle.kts b/build.gradle.kts index d3e6e0e..ac5c738 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,18 +1,17 @@ import org.gradle.api.tasks.testing.logging.TestExceptionFormat plugins { - // Apply the Kotlin JVM plugin to add support for Kotlin on the JVM. kotlin("jvm").version(Kotlin.version) kotlin("plugin.serialization").version(Kotlin.version) - id(Shadow.pluginId) version (Shadow.version) - // Apply the application plugin to add support for building a CLI application. + id(TmsJarBundling.plugin) + application } kotlin { jvmToolchain { - languageVersion.set(JavaLanguageVersion.of(17)) + languageVersion.set(JavaLanguageVersion.of(21)) } } @@ -52,8 +51,6 @@ dependencies { testImplementation(Kluent.kluent) testImplementation(Mockk.mockk) testImplementation(Junit.params) - testImplementation("io.ktor:ktor-server-test-host-jvm:2.3.5") - testImplementation("org.jetbrains.kotlin:kotlin-test-junit:1.9.10") testImplementation(TmsTestUtils.testUtils) testRuntimeOnly(Jjwt.impl) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index cbcc24a..3999176 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,5 +1,6 @@ plugins { `kotlin-dsl` + `maven-publish` } repositories { @@ -8,6 +9,21 @@ repositories { kotlin { jvmToolchain { - languageVersion.set(JavaLanguageVersion.of(17)) + languageVersion.set(JavaLanguageVersion.of(21)) + } +} + +gradlePlugin { + plugins { + create("jar-bundling") { + id = "no.nav.tms.jar-bundling" + implementationClass = "JarBundling" + } + } +} + +publishing { + repositories { + mavenLocal() } } diff --git a/buildSrc/src/main/kotlin/jarBundling.kt b/buildSrc/src/main/kotlin/jarBundling.kt new file mode 100644 index 0000000..0dc80e1 --- /dev/null +++ b/buildSrc/src/main/kotlin/jarBundling.kt @@ -0,0 +1,72 @@ +import org.gradle.api.DefaultTask +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.JavaApplication +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.TaskAction +import org.gradle.jvm.tasks.Jar +import java.io.File + +// Managed by tms-dependency-admin. + +abstract class JarBundling : Plugin { + + override fun apply(target: Project) { + + val configureTask = target.tasks.register("configureJar", ConfigureJarTask::class.java) { + this.application = target + + val classes = target.tasks.named("classes") + + dependsOn(classes) + } + + val packageTask = target.tasks.register("packageJar", BundleJarsTask::class.java) { + this.application = target + } + + target.tasks.withType(Jar::class.java) { + dependsOn(configureTask) + finalizedBy(packageTask) + } + } +} + +abstract class ConfigureJarTask : DefaultTask() { + @Input + lateinit var application: Project + + @TaskAction + fun action() { + application.tasks.withType(Jar::class.java) { + + val javaApplication = application.extensions.getByType(JavaApplication::class.java) + + val mainClassName = javaApplication.mainClass + + archiveBaseName.set("app") + manifest { + val classpath = application.configurations.getByName("runtimeClasspath") + attributes["Main-Class"] = mainClassName + attributes["Class-Path"] = classpath.joinToString(separator = " ") { + it.name + } + } + } + } +} + +abstract class BundleJarsTask : DefaultTask() { + @Input + lateinit var application: Project + + @TaskAction + fun action() { + val classpath = application.configurations.getByName("runtimeClasspath") + + classpath.forEach { + val file = File("${application.layout.buildDirectory.get()}/libs/${it.name}") + if (!file.exists()) it.copyTo(file) + } + } +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b82aa23..cea7a79 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-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/kotlin/no/nav/tms/event/api/App.kt b/src/main/kotlin/no/nav/tms/event/api/App.kt index 9a91a16..46cb84a 100644 --- a/src/main/kotlin/no/nav/tms/event/api/App.kt +++ b/src/main/kotlin/no/nav/tms/event/api/App.kt @@ -111,7 +111,7 @@ fun Application.api( } private fun Application.configureShutdownHook(httpClient: HttpClient) { - environment.monitor.subscribe(ApplicationStopping) { + monitor.subscribe(ApplicationStopping) { httpClient.close() } } diff --git a/src/main/kotlin/no/nav/tms/event/api/varsel/VarselReader.kt b/src/main/kotlin/no/nav/tms/event/api/varsel/VarselReader.kt index 5cb7575..502b5ae 100644 --- a/src/main/kotlin/no/nav/tms/event/api/varsel/VarselReader.kt +++ b/src/main/kotlin/no/nav/tms/event/api/varsel/VarselReader.kt @@ -10,6 +10,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import no.nav.tms.event.api.config.AzureTokenFetcher import no.nav.tms.token.support.azure.validation.AzureHeader +import java.net.URI import java.net.URL class VarselReader( @@ -21,7 +22,7 @@ class VarselReader( fnr: String, varselPath: String, ): List { - val completePathToEndpoint = URL("$varselAuthorityUrl/$varselPath") + val completePathToEndpoint = URI.create("$varselAuthorityUrl/$varselPath").toURL() val azureToken = azureTokenFetcher.fetchTokenForVarselAuthority() return client.getWithAzureAndFnr(completePathToEndpoint, azureToken, fnr) }