Updated version #4
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build & attach signed APK to Release | |
| on: | |
| push: | |
| tags: | |
| - "v*.*.*" | |
| permissions: | |
| contents: write | |
| jobs: | |
| build_release_apk: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: "17" | |
| - name: Set up Android SDK | |
| uses: android-actions/setup-android@v3 | |
| - name: Set up Gradle | |
| uses: gradle/actions/setup-gradle@v4 | |
| with: | |
| cache-disabled: true | |
| - name: Build Release APK (clean, isolated Gradle home) | |
| env: | |
| GRADLE_USER_HOME: ${{ github.workspace }}/.gradle-user-home | |
| run: | | |
| chmod +x ./gradlew | |
| ./gradlew --no-daemon --stacktrace --no-build-cache clean assembleRelease | |
| - name: Ensure apksigner is available | |
| run: | | |
| set -e | |
| if [ -d "${ANDROID_SDK_ROOT}/build-tools" ] && [ "$(ls -A "${ANDROID_SDK_ROOT}/build-tools")" ]; then | |
| BT_DIR="$(ls -1 "${ANDROID_SDK_ROOT}/build-tools" | sort -V | tail -n 1)" | |
| else | |
| BT_DIR="" | |
| fi | |
| if [ -z "$BT_DIR" ]; then | |
| echo "No build-tools found; installing 36.1.0..." | |
| yes | sdkmanager "build-tools;36.1.0" | |
| BT_DIR="36.1.0" | |
| fi | |
| echo "Using build-tools: ${BT_DIR}" | |
| export PATH="${ANDROID_SDK_ROOT}/build-tools/${BT_DIR}:$PATH" | |
| echo "${ANDROID_SDK_ROOT}/build-tools/${BT_DIR}" >> "$GITHUB_PATH" | |
| command -v apksigner | |
| - name: Decode keystore from secrets | |
| run: | | |
| echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 -d > keystore.jks | |
| ls -la keystore.jks | |
| - name: Sign APK | |
| env: | |
| KS_PASS: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} | |
| KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} | |
| KEY_PASS: ${{ secrets.ANDROID_KEY_PASSWORD }} | |
| run: | | |
| set -e | |
| UNSIGNED_APK="app/build/outputs/apk/release/app-release-unsigned.apk" | |
| if [ ! -f "$UNSIGNED_APK" ]; then | |
| echo "Expected unsigned APK not found at: $UNSIGNED_APK" | |
| echo "Searching for an unsigned release APK..." | |
| UNSIGNED_APK="$(find app/build/outputs/apk -type f -name "*release-unsigned*.apk" | head -n 1)" | |
| fi | |
| if [ -z "$UNSIGNED_APK" ] || [ ! -f "$UNSIGNED_APK" ]; then | |
| echo "No unsigned release APK found." | |
| find app/build/outputs/apk -type f -maxdepth 5 || true | |
| exit 1 | |
| fi | |
| mkdir -p dist | |
| SIGNED_APK="dist/signed.apk" | |
| apksigner sign \ | |
| --ks keystore.jks \ | |
| --ks-pass env:KS_PASS \ | |
| --ks-key-alias "$KEY_ALIAS" \ | |
| --key-pass env:KEY_PASS \ | |
| --out "$SIGNED_APK" \ | |
| "$UNSIGNED_APK" | |
| apksigner verify --verbose "$SIGNED_APK" | |
| cp "$UNSIGNED_APK" dist/unsigned.apk | |
| - name: Rename APKs | |
| run: | | |
| TAG="${{ github.ref_name }}" | |
| mv dist/signed.apk "dist/TaskerHa.${TAG}.apk" | |
| mv dist/unsigned.apk "dist/TaskerHa.${TAG}.unsigned.apk" | |
| ls -la dist | |
| - name: Create/Update GitHub Release and upload APKs | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: ${{ github.ref_name }} | |
| files: | | |
| dist/TaskerHa.${{ github.ref_name }}.apk | |
| dist/TaskerHa.${{ github.ref_name }}.unsigned.apk | |
| generate_release_notes: true |