diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..f25578eb --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,144 @@ +name: Build and Release Android Apps + +on: + push: + branches: + - main + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + env: + KEYSTORE_FILE: release.keystore + KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} + KEY_ALIAS: ${{ secrets.KEY_ALIAS }} + KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up JDK + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 17 + + - name: Set up Gradle + uses: gradle/gradle-build-action@v3 + + - name: Set up CMake 4.0.2 + uses: jwlawson/actions-setup-cmake@v2 + with: + cmake-version: '4.0.2' + + - name: Set up Android SDK + uses: android-actions/setup-android@v3 + + - name: Install NDK 29.0.14206865 + run: sdkmanager "ndk;29.0.14206865" + + - name: Configure NDK environment + run: | + echo "ANDROID_NDK_HOME=$ANDROID_HOME/ndk/29.0.14206865" >> $GITHUB_ENV + echo "ANDROID_NDK_ROOT=$ANDROID_HOME/ndk/29.0.14206865" >> $GITHUB_ENV + echo "PATH=$ANDROID_HOME/ndk/29.0.14206865:$PATH" >> $GITHUB_ENV + + - name: Decode Keystore + run: | + echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 --decode > release.keystore + + # --- Build --- + - name: Build App + run: ./gradlew :app:assembleRelease :app:assembleDebug + + - name: Build Wear + run: ./gradlew :wear:assembleRelease :wear:assembleDebug + + # Upload Artifact + - name: Upload App Release Artifact + uses: actions/upload-artifact@v4 + with: + name: app-release + path: app/build/outputs/apk/release/*.apk + + - name: Upload Wear Release Artifact + uses: actions/upload-artifact@v4 + with: + name: wear-release + path: wear/build/outputs/apk/release/*.apk + + - name: Upload App Debug Artifact + uses: actions/upload-artifact@v4 + with: + name: app-debug + path: app/build/outputs/apk/debug/*.apk + + - name: Upload Wear Debug Artifact + uses: actions/upload-artifact@v4 + with: + name: wear-debug + path: wear/build/outputs/apk/debug/*.apk + + release: + runs-on: ubuntu-latest + needs: build + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Download App Release Artifact + uses: actions/download-artifact@v4 + with: + name: app-release + path: artifacts/app/release + + - name: Download Wear Release Artifact + uses: actions/download-artifact@v4 + with: + name: wear-release + path: artifacts/wear/release + + - name: Download App Debug Artifact + uses: actions/download-artifact@v4 + with: + name: app-debug + path: artifacts/app/debug + + - name: Download Wear Debug Artifact + uses: actions/download-artifact@v4 + with: + name: wear-debug + path: artifacts/wear/debug + + - name: Check if pre-release exists + id: check_prerelease + run: | + if gh release view pre-release >/dev/null 2>&1; then + echo "exists=true" >> $GITHUB_OUTPUT + else + echo "exists=false" >> $GITHUB_OUTPUT + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Delete old pre-release + if: steps.check_prerelease.outputs.exists == 'true' + run: gh release delete pre-release -y --cleanup-tag + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create pre-release + uses: softprops/action-gh-release@v2 + with: + tag_name: pre-release + prerelease: true + files: | + artifacts/app/release/*.apk + artifacts/wear/release/*.apk + artifacts/app/debug/*.apk + artifacts/wear/debug/*.apk + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/app/build.gradle b/app/build.gradle index 6580ff55..e2afac16 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -53,6 +53,15 @@ android { variant.resValue("string", "versionName", variant.versionName) } + signingConfigs { + release { + storeFile rootProject.ext.keystoreFile + storePassword rootProject.ext.keystorePassword + keyAlias rootProject.ext.keyAlias + keyPassword rootProject.ext.keyPassword + } + } + buildTypes { release { postprocessing { @@ -65,6 +74,7 @@ android { 'proguard-rules.pro' } } + signingConfig signingConfigs.release debuggable = false } } diff --git a/build.gradle b/build.gradle index 0b7f9c41..9ecf500a 100755 --- a/build.gradle +++ b/build.gradle @@ -23,4 +23,11 @@ plugins { alias(libs.plugins.navigation.safeargs) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.compose.compiler) apply false +} + +ext { + keystoreFile = file(System.getenv("KEYSTORE_FILE") ?: "release.keystore") + keystorePassword = System.getenv("KEYSTORE_PASSWORD") ?: "" + keyAlias = System.getenv("KEY_ALIAS") ?: "" + keyPassword = System.getenv("KEY_PASSWORD") ?: "" } \ No newline at end of file diff --git a/wear/build.gradle.kts b/wear/build.gradle.kts index b54dcb02..1790d6a0 100644 --- a/wear/build.gradle.kts +++ b/wear/build.gradle.kts @@ -49,6 +49,15 @@ android { )*/ } + signingConfigs { + create("release") { + storeFile = rootProject.extra["keystoreFile"] as File + storePassword = rootProject.extra["keystorePassword"] as String + keyAlias = rootProject.extra["keyAlias"] as String + keyPassword = rootProject.extra["keyPassword"] as String + } + } + buildTypes { release { isMinifyEnabled = true @@ -56,6 +65,7 @@ android { getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) + signingConfig = signingConfigs.getByName("release") } } compileOptions {