Refactor: Convert build configuration to Gradle plugin pattern

- Migrate ProjectConfig from static object to proper Gradle plugin
- Add version type support (beta/rc) to version.properties
- Clean up legacy fastlane changelogs
- Update release script to support version types
- Remove automatic fastlane changelog generation from release script
- Add BuildConfig field injection for version info
This commit is contained in:
darken
2025-10-07 13:54:24 +02:00
committed by Matthias Urhahn
parent 12f0662146
commit 221f3ccbed
52 changed files with 179 additions and 241 deletions
@@ -0,0 +1,75 @@
import com.android.build.api.dsl.SigningConfig
import org.gradle.api.Project
import org.gradle.api.tasks.testing.Test
import org.gradle.api.tasks.testing.TestDescriptor
import org.gradle.api.tasks.testing.TestListener
import org.gradle.api.tasks.testing.TestResult
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent
import java.io.File
import java.io.FileInputStream
import java.util.Properties
val Project.projectConfig: ProjectConfig
get() = extensions.findByType(ProjectConfig::class.java)!!
fun SigningConfig.setupCredentials(
signingPropsPath: File? = null
) {
val keyStoreFromEnv = System.getenv("STORE_PATH")?.let { File(it) }
if (keyStoreFromEnv?.exists() == true) {
println("Using signing data from environment variables.")
storeFile = keyStoreFromEnv
storePassword = System.getenv("STORE_PASSWORD")
keyAlias = System.getenv("KEY_ALIAS")
keyPassword = System.getenv("KEY_PASSWORD")
} else {
println("Using signing data from properties file.")
val props = Properties().apply {
signingPropsPath?.takeIf { it.canRead() }?.let { load(FileInputStream(it)) }
}
val keyStorePath = props.getProperty("release.storePath")?.let { File(it) }
if (keyStorePath?.exists() == true) {
storeFile = keyStorePath
storePassword = props.getProperty("release.storePassword")
keyAlias = props.getProperty("release.keyAlias")
keyPassword = props.getProperty("release.keyPassword")
}
}
}
fun Test.setupTestLogging() {
testLogging {
events(
TestLogEvent.FAILED,
TestLogEvent.PASSED,
TestLogEvent.SKIPPED,
// TestLogEvent.STANDARD_OUT,
)
exceptionFormat = TestExceptionFormat.FULL
showExceptions = true
showCauses = true
showStackTraces = true
addTestListener(object : TestListener {
override fun beforeSuite(suite: TestDescriptor) {}
override fun beforeTest(testDescriptor: TestDescriptor) {}
override fun afterTest(testDescriptor: TestDescriptor, result: TestResult) {}
override fun afterSuite(suite: TestDescriptor, result: TestResult) {
if (suite.parent != null) {
val messages = """
------------------------------------------------------------------------------------------------
| ${result.resultType} ${result.testCount} tests: ${result.successfulTestCount} passed, ${result.failedTestCount} failed, ${result.skippedTestCount} skipped)
------------------------------------------------------------------------------------------------
""".trimIndent()
println(messages)
}
}
})
}
}