Release-Skript mit automatischer Versionierung und Docker-Builds

- scripts/release.py: Version (patch/minor/major) automatisch hochzaehlen, CHANGELOG
  abschliessen, committen, taggen; --build baut alle Pakete in Docker
- docker-build/: Build-Container fuer Windows (Wine + PyInstaller + Inno Setup),
  Linux und Android; Server-Image als docker-save-Archiv
- Versionsanzeige im Desktop-Client und in der Android-App
- Feste Android-Release-Signatur aus secrets/ (nicht im Git)
- Windows-Icon im Repo, damit der Wine-Build ohne Qt-Fenster auskommt

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-10-17 12:45:17 +02:00
co-authored by Claude Opus 5.5
parent 5cbe6376f0
commit af51ef5701
20 changed files with 362 additions and 12 deletions
+18 -2
View File
@@ -3,10 +3,27 @@ plugins {
id 'org.jetbrains.kotlin.android'
}
// Release-Signatur: secrets/android-keystore.properties (wird von scripts/release.py beim ersten
// Build erzeugt, nicht im Git). Fehlt die Datei, wird mit dem Debug-Schluessel signiert.
def keystoreProps = new Properties()
def keystoreFile = rootProject.file('../secrets/android-keystore.properties')
if (keystoreFile.exists()) keystoreFile.withInputStream { keystoreProps.load(it) }
android {
namespace 'de.netclip.app'
compileSdk 35
signingConfigs {
release {
if (keystoreFile.exists()) {
storeFile rootProject.file('../secrets/' + keystoreProps['storeFile'])
storePassword keystoreProps['storePassword']
keyAlias keystoreProps['keyAlias']
keyPassword keystoreProps['keyPassword']
}
}
}
defaultConfig {
applicationId "de.netclip.app"
minSdk 26
@@ -19,8 +36,7 @@ android {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
// Zum Testen mit dem Debug-Schluessel signieren; fuer echte Verteilung eigenen Keystore eintragen
signingConfig signingConfigs.debug
signingConfig keystoreFile.exists() ? signingConfigs.release : signingConfigs.debug
}
}
compileOptions {
@@ -153,7 +153,7 @@ class SettingsActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
b = ActivitySettingsBinding.inflate(layoutInflater)
setContentView(b.root)
title = "Einstellungen"
title = "Einstellungen · v" + packageManager.getPackageInfo(packageName, 0).versionName
load()
b.scan.setOnClickListener {
scan.launch(ScanOptions().setDesiredBarcodeFormats(ScanOptions.QR_CODE).setBeepEnabled(false)