name: Build APK on: push: branches: [main] jobs: build-apk: if: contains(github.event.head_commit.message, '[apk]') runs-on: docker steps: - name: Notify Start uses: https://git.data-it-solution.de/data/ntfy-action@main with: status: start project: NetDiag APK ntfy_auth: ${{ secrets.NTFY_AUTH }} run_number: ${{ github.run_number }} message: ${{ github.event.head_commit.message }} - name: Repo klonen + Version festlegen run: | git clone https://data:${{ secrets.GIT_TOKEN }}@git.data-it-solution.de/data/netdiag-app.git . git checkout ${{ github.sha }} echo "$(date +%Y%m%d-%H%M)" > /tmp/BUILD_VERSION - name: Node.js Dependencies installieren run: npm install - name: Frontend bauen run: VITE_APP_VERSION="$(cat /tmp/BUILD_VERSION)" npx vite build - name: Android-Projekt anlegen run: | # cap add android nur wenn android/ noch nicht vorhanden [ -d android ] || npx cap add android - name: Natives Plugin kopieren run: | PLUGIN_DST=android/app/src/main/java/de/data_it_solution/netdiag mkdir -p "$PLUGIN_DST" cp native-plugin/NetDiagScannerPlugin.kt "$PLUGIN_DST/" cp native-plugin/Snmp.kt "$PLUGIN_DST/" - name: Kotlin im Gradle-Build aktivieren run: | # Das native Plugin ist Kotlin. Das von `cap add android` erzeugte # App-Modul hat aber KEIN Kotlin aktiviert. Ohne kotlin-android-Plugin # werden .kt-Dateien beim Build stillschweigend ignoriert (kein Fehler) # -> NetDiagScannerPlugin landet nie im APK -> "plugin not implemented". KOTLIN_VERSION=1.9.24 # 1. Kotlin-Gradle-Plugin auf Projektebene verfügbar machen if ! grep -q 'kotlin-gradle-plugin' android/build.gradle; then sed -i "/com.android.tools.build:gradle/a\\ classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:${KOTLIN_VERSION}\"" android/build.gradle fi # 2. Plugin im App-Modul anwenden + JVM-Target auf 17 (Java-Target von Capacitor 6) APP=android/app/build.gradle if ! grep -q 'kotlin-android' "$APP"; then sed -i "/apply plugin: 'com.android.application'/a apply plugin: 'kotlin-android'" "$APP" sed -i "/^android {/a\\ kotlinOptions { jvmTarget = '17' }" "$APP" fi # 3. Coroutines-Abhängigkeit (vom Plugin genutzt) if ! grep -q 'kotlinx-coroutines-android' "$APP"; then sed -i '/dependencies {/a \ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0"' "$APP" fi - name: MainActivity durch Kotlin-Variante ersetzen (Plugin registrieren) run: | PKG=android/app/src/main/java/de/data_it_solution/netdiag # `cap add android` erzeugt MainActivity.java — die registriert das # Plugin NICHT und würde mit unserer .kt-Klasse kollidieren (gleiche # Klasse, gleiches Package). Also Java-Datei löschen, Kotlin schreiben. rm -f "$PKG/MainActivity.java" cat > "$PKG/MainActivity.kt" <<'KT' package de.data_it_solution.netdiag import android.os.Bundle import com.getcapacitor.BridgeActivity class MainActivity : BridgeActivity() { override fun onCreate(savedInstanceState: Bundle?) { registerPlugin(NetDiagScannerPlugin::class.java) super.onCreate(savedInstanceState) } } KT - name: Capacitor sync run: npx cap sync android - name: Keystore vorbereiten run: | echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > /tmp/release.jks cat > android/gradle.properties < local.properties echo "org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m" >> gradle.properties chmod +x gradlew ./gradlew assembleRelease --no-daemon - name: APK in Package Registry hochladen run: | VERSION=$(cat /tmp/BUILD_VERSION) APK_FILE=$(find android/app/build -name "*.apk" -path "*/release/*" | head -1) echo "APK gefunden: $APK_FILE" curl --fail --user "data:${{ secrets.REGISTRY_TOKEN }}" \ --upload-file "$APK_FILE" \ "https://git.data-it-solution.de/api/packages/data-it/generic/netdiag-apk/${VERSION}/NetDiag-${VERSION}.apk" curl -s -X DELETE --user "data:${{ secrets.REGISTRY_TOKEN }}" \ "https://git.data-it-solution.de/api/v1/packages/data-it/generic/netdiag-apk/latest" || true curl --fail --user "data:${{ secrets.REGISTRY_TOKEN }}" \ --upload-file "$APK_FILE" \ "https://git.data-it-solution.de/api/packages/data-it/generic/netdiag-apk/latest/NetDiag.apk" echo "APK hochgeladen: ${VERSION} + latest" - name: Notify Success if: success() uses: https://git.data-it-solution.de/data/ntfy-action@main with: status: success project: NetDiag APK ntfy_auth: ${{ secrets.NTFY_AUTH }} run_number: ${{ github.run_number }} - name: Notify Failure if: failure() uses: https://git.data-it-solution.de/data/ntfy-action@main with: status: failure project: NetDiag APK ntfy_auth: ${{ secrets.NTFY_AUTH }} run_number: ${{ github.run_number }} click_url: https://git.data-it-solution.de/${{ github.repository }}/actions