name: Build APKs (Release) on: workflow_dispatch: # Allow manual triggering jobs: build: name: Build Release APK runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Java and Android SDK uses: actions/setup-java@v4 with: java-version: '21' # Adjust the Java version as needed distribution: 'temurin' - name: Decode Keystore id: decode_keystore uses: timheuer/base64-to-file@v1 with: fileName: 'keystore/key.jks' encodedString: ${{ secrets.SIGN_KEY }} - name: Extract Version Name and Version Code run: | # Extract versionName and versionCode from build.gradle VERSION_NAME=$(cat app/build.gradle | grep -oP 'versionName "\K[^"]*') VERSION_CODE=$(cat app/build.gradle | grep -oP 'versionCode \K\d+') # Make the version name sentence case # VERSION_NAME=$(echo "$VERSION_NAME" | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) tolower(substr($i,2));}1') echo "Version Name: $VERSION_NAME" echo "Version Code: $VERSION_CODE" # Set these values as environment variables for later steps echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV echo "VERSION_CODE=$VERSION_CODE" >> $GITHUB_ENV - name: Set Tag run: | TAG=$(echo ${{ env.VERSION_NAME }} | tr '[:upper:]' '[:lower:]') echo "TAG=${TAG}" >> $GITHUB_ENV echo "Tag: ${TAG}" # Print tag to console - name: Check Fastlane Changelogs run: | if [ -f "fastlane/metadata/android/en-US/changelogs/${{ env.VERSION_CODE }}.txt" ]; then echo "Changelog exists for version code ${{ env.VERSION_CODE }}." else echo "Changelog does not exist for version code ${{ env.VERSION_CODE }}." exit 1 fi - name: Accept Android SDK licenses run: yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses - name: Build GitHub Release APK run: | chmod +x ./gradlew ./gradlew clean assembleGithubRelease --no-build-cache --rerun-tasks mv app/build/outputs/apk/github/release/app-github-release.apk ${{ runner.temp }}/app-github-release.apk env: SIGNING_KEY_ALIAS: ${{ secrets.ALIAS }} SIGNING_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} SIGNING_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }} - name: Build Play Release APK run: | chmod +x ./gradlew ./gradlew clean assemblePlayRelease --no-build-cache --rerun-tasks mv app/build/outputs/apk/play/release/app-play-release.apk ${{ runner.temp }}/app-play-release.apk env: SIGNING_KEY_ALIAS: ${{ secrets.ALIAS }} SIGNING_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} SIGNING_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }} - name: Build Play Release AAB run: | chmod +x ./gradlew ./gradlew clean bundlePlayRelease --no-build-cache --rerun-tasks mv app/build/outputs/bundle/playRelease/app-play-release.aab ${{ runner.temp }}/app-play-release.aab env: SIGNING_KEY_ALIAS: ${{ secrets.ALIAS }} SIGNING_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} SIGNING_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }} # If you want to build both APKs in parallel, uncomment the following lines # - name: Build GitHub Release and Play Release APKs # run: | # chmod +x ./gradlew # ./gradlew clean assembleGithubRelease assemblePlayRelease --parallel # env: # SIGNING_KEY_ALIAS: ${{ secrets.ALIAS }} # SIGNING_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} # SIGNING_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }} - name: Create GitHub Release uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 with: files: | ${{ runner.temp }}/app-github-release.apk ${{ runner.temp }}/app-play-release.apk ${{ runner.temp }}/app-play-release.aab name: ${{ env.VERSION_NAME }} # Use the original case for the release name tag_name: ${{ env.TAG }} # Use lowercase for the tag body: _to be updated_ env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Archive APKs uses: actions/upload-artifact@v4 with: name: ${{ env.VERSION_NAME }} APKs path: | ${{ runner.temp }}/app-github-release.apk ${{ runner.temp }}/app-play-release.apk ${{ runner.temp }}/app-play-release.aab