import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.dataformat.yaml.YAMLFactory import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import java.io.FileInputStream plugins { id("org.springframework.boot") version "3.2.2" id("io.spring.dependency-management") version "1.1.4" kotlin("jvm") version "1.9.22" kotlin("plugin.spring") version "1.9.22" kotlin("plugin.jpa") version "1.9.22" id("org.liquibase.gradle") version "2.2.1" } buildscript { dependencies { classpath("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.16.1") } } group = "com.example" version = "0.0.1-SNAPSHOT" java { sourceCompatibility = JavaVersion.VERSION_21 } repositories { mavenCentral() } dependencies { implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-validation") liquibaseRuntime("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.16.1") liquibaseRuntime("org.liquibase:liquibase-core") liquibaseRuntime("org.liquibase.ext:liquibase-hibernate6:4.25.1") liquibaseRuntime("info.picocli:picocli:4.6.3") liquibaseRuntime("com.h2database:h2") liquibaseRuntime("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") } tasks.withType { kotlinOptions { freeCompilerArgs += "-Xjsr305=strict" jvmTarget = "21" } } tasks.withType { useJUnitPlatform() } val profile: String by project val profileDbConf = getDbConf(profile) val referencedProfile: String? by project val referencedProfileDbConf = getDbConf(referencedProfile) val defaultChangeLogFile: String by project liquibase { activities.register(profile) { this.arguments = (profileDbConf?.toMap() ?: emptyMap()) + (referencedProfileDbConf?.toReferenceMap() ?: emptyMap()) + mapOf("changelogFile" to defaultChangeLogFile) } runList = profile } data class DbConf( val url: String? = null, val username: String? = null, val password: String? = null ) { fun toMap(): Map = mapOf( "url" to url, "username" to username, "password" to password ) fun toReferenceMap(): Map = mapOf( "reference-url" to url, "reference-username" to username, "reference-password" to password ) } fun getDbConf(profile: String?): DbConf? = profile?.let { ObjectMapper(YAMLFactory()) .readValue( FileInputStream(File(projectDir, "db.yaml")), object : TypeReference>() {} )[profile] } tasks.getByName("generateChangelog").doFirst { delete(defaultChangeLogFile) } tasks.getByName("diffChangelog").doFirst { delete(defaultChangeLogFile) }