Files
edu/app/build.gradle
Sebastian Molenda e4db4bb31e
Deploy to FTP / deploy (push) Successful in 5s
pack and upload
2026-06-13 11:16:53 +02:00

118 lines
3.9 KiB
Groovy

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
android {
namespace 'com.example.app'
compileSdk 34
defaultConfig {
applicationId "com.example.app"
minSdk 21
targetSdk 34
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
// Signing configuration for release builds.
// Configure the following properties in either your
// - ~/.gradle/gradle.properties (recommended for secrets), or
// - <project root>/gradle.properties (do NOT commit passwords)
//
// Example properties:
// MYAPP_STORE_FILE=keystores/my-release-key.jks
// MYAPP_STORE_PASSWORD=your_store_password
// MYAPP_KEY_ALIAS=my_key_alias
// MYAPP_KEY_PASSWORD=your_key_password
signingConfigs {
release {
// Only configure signing when the properties are provided.
if (project.hasProperty('MYAPP_STORE_FILE')) {
storeFile file(MYAPP_STORE_FILE)
storePassword MYAPP_STORE_PASSWORD
keyAlias MYAPP_KEY_ALIAS
keyPassword MYAPP_KEY_PASSWORD
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
// Apply signing config if available. This keeps debug and CI builds
// working even when signing properties are absent locally.
if (project.hasProperty('MYAPP_STORE_FILE')) {
signingConfig signingConfigs.release
}
// Ensure release builds are not debuggable.
debuggable false
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.9.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.9.22"
implementation 'androidx.webkit:webkit:1.8.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
// JSONObject is provided by Android SDK (org.json)
}
// Task: package webapp assets into a zip for release and optionally upload
def webappSrc = file("src/main/assets")
def webappZip = file("${buildDir}/outputs/webapp/webapp.zip")
tasks.register("zipWebApp") {
group = "release"
description = "Create zip of web assets (app/src/main/assets -> webapp.zip)"
inputs.dir(webappSrc)
outputs.file(webappZip)
doLast {
webappZip.parentFile.mkdirs()
ant.zip(destfile: webappZip) {
fileset(dir: webappSrc)
}
println "Created webapp zip: ${webappZip.absolutePath}"
}
}
tasks.register("uploadWebApp") {
group = "release"
description = "Upload webapp zip to remote server if UPLOAD_WEBAPP_URL is set"
dependsOn "zipWebApp"
doLast {
def uploadUrl = System.getenv('UPLOAD_WEBAPP_URL')
def token = System.getenv('UPLOAD_WEBAPP_TOKEN')
if (!uploadUrl) {
println "UPLOAD_WEBAPP_URL not set, skipping upload"
return
}
if (!webappZip.exists()) {
throw new GradleException("webapp zip not found: ${webappZip}")
}
println "Uploading webapp to ${uploadUrl}"
def cmd = ["curl", "--fail", "-X", "PUT", "-H", "Content-Type: application/zip"]
if (token) {
cmd += ["-H", "Authorization: Bearer ${token}"]
}
cmd += ["--data-binary", "@${webappZip.absolutePath}", uploadUrl]
def process = cmd.execute()
process.in.eachLine { println it }
process.err.eachLine { System.err.println it }
def rc = process.waitFor()
if (rc != 0) throw new GradleException("Upload failed with exit code ${rc}")
println "Upload successful"
}
}