build.gradle.kts (144 lines of code) (raw):
import org.gradle.kotlin.dsl.support.serviceOf
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin.Companion.kotlinNodeJsEnvSpec
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.springframework.boot.gradle.tasks.bundling.BootJar
val policy: String by System.getProperties()
group = "com.compiler.server"
version = "${libs.versions.kotlin.get()}-SNAPSHOT"
val propertyFile = "application.properties"
plugins {
alias(libs.plugins.spring.boot)
alias(libs.plugins.spring.dependency.management)
alias(libs.plugins.kotlin.plugin.spring)
id("base-kotlin-jvm-conventions")
}
apply<NodeJsRootPlugin>()
allprojects {
afterEvaluate {
dependencies {
dependencies {
implementation(libs.jackson.module.kotlin)
}
}
}
}
val resourceDependency: Configuration by configurations.creating {
isCanBeResolved = true
isCanBeConsumed = false
}
dependencies {
annotationProcessor(libs.spring.context.indexer)
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation(libs.aws.springboot.container)
implementation(libs.springdoc)
implementation(libs.gson)
implementation(libs.kotlinx.serialization.json)
implementation(libs.kotlin.compiler.arguments.description)
implementation(libs.junit)
implementation(libs.logback.logstash.encoder)
implementation(libs.kotlin.reflect)
implementation(libs.kotlin.stdlib)
implementation(libs.kotlin.script.runtime)
implementation(libs.kotlin.build.tools.api)
implementation(libs.kotlin.build.tools.impl)
implementation(libs.kotlin.compiler.embeddable)
implementation(libs.kotlin.tooling.core)
implementation(project(":executors", configuration = "default"))
implementation(project(":common", configuration = "default"))
implementation(project(":dependencies"))
testImplementation(libs.kotlin.test)
testImplementation("org.springframework.boot:spring-boot-starter-test") {
exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
}
testImplementation(libs.kotlinx.coroutines.test)
resourceDependency(libs.skiko.js.wasm.runtime)
}
fun buildPropertyFile() {
rootDir.resolve("src/main/resources/${propertyFile}").apply {
println("Generate properties into $absolutePath")
parentFile.mkdirs()
writeText(generateProperties())
}
}
fun generateProperties(prefix: String = "") = """
# this file is autogenerated by build.gradle.kts
server.error.include-message=always
server.error.include-binding-errors=always
kotlin.version=${kotlinVersion}
policy.file=${prefix + policy}
libraries.folder.jvm=${prefix + libJVM}
libraries.folder.js=${prefix + libJS}
libraries.folder.wasm=${prefix + libWasm}
libraries.folder.compose-wasm=${prefix + libComposeWasm}
libraries.folder.compose-wasm-compiler-plugins=${prefix + libComposeWasmCompilerPlugins}
libraries.folder.compiler-plugins=${prefix + compilerPluginsForJVM}
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
server.compression.enabled=true
server.compression.mime-types=application/json,text/javascript,application/wasm
springdoc.swagger-ui.path: /api-docs/swagger-ui.html
""".trimIndent()
tasks.withType<KotlinCompile> {
compilerOptions {
freeCompilerArgs.addAll(
"-Xjsr305=strict",
)
}
dependsOn(":executors:jar")
buildPropertyFile()
}
println("Using Kotlin compiler ${libs.versions.kotlin.get()}")
tasks.withType<BootJar> {
requiresUnpack("**/kotlin-*.jar")
requiresUnpack("**/kotlinx-*.jar")
}
val buildLambda by tasks.creating(Zip::class) {
val propertyFile = propertyFile
val propertyFileContent = generateProperties("/var/task/")
from(tasks.compileKotlin)
from(tasks.processResources) {
eachFile {
if (name == propertyFile) {
file.writeText(propertyFileContent)
}
}
}
from(policy)
from(libJSFolder) { into(libJS) }
from(libWasmFolder) { into(libWasm) }
from(libComposeWasmFolder) { into(libComposeWasm) }
from(libJVMFolder) { into(libJVM) }
from(compilerPluginsForJVMFolder) { into(compilerPluginsForJVM) }
from(libComposeWasmCompilerPluginsFolder) { into(libComposeWasmCompilerPlugins) }
into("lib") {
from(configurations.productionRuntimeClasspath) { exclude("tomcat-embed-*") }
}
}
tasks.named<Copy>("processResources") {
val archiveOperation = project.serviceOf<ArchiveOperations>()
from(resourceDependency.map {
archiveOperation.zipTree(it)
}) {
into("com/compiler/server")
}
}
tasks.withType<Test> {
with(rootProject.kotlinNodeJsEnvSpec) {
dependsOn(rootProject.nodeJsSetupTaskProvider)
}
useJUnitPlatform()
javaLauncher.set(javaToolchains.launcherFor {
languageVersion.set(JavaLanguageVersion.of(17))
vendor.set(JvmVendorSpec.AMAZON)
})
val executablePath = rootProject.kotlinNodeJsEnvSpec.executable.get()
doFirst {
this@withType.environment("kotlin.wasm.node.path", executablePath)
}
// We disable this on TeamCity, because we don't want to fail this test,
// when compiler server's test run as a K2 user project.
// But for our pull requests we still need to run this test, so we add it to our GitHub action.
if (System.getenv("TEAMCITY_VERSION") != null) {
filter {
excludeTestsMatching("com.compiler.server.CompilerArguments*")
}
}
}