name: Build APK (Pre-Release) on: push: branches: - master paths-ignore: - '**.md' - '**.yml' - '**.json' - '**.lock' - '**.properties' - '**.py' - '**.sh' workflow_dispatch: inputs: message: description: 'Message to be sent' required: true default: 'New pre-release APK available for testing!' jobs: validation: name: Commit Validation runs-on: ubuntu-latest outputs: CANCEL_WORKFLOW: ${{ steps.check_commit_message.outputs.CANCEL_WORKFLOW }} steps: - name: Checkout code uses: actions/checkout@v4 - name: Check commit message run: | if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then echo "Workflow was manually dispatched. Skipping commit message check." echo "CANCEL_WORKFLOW=false" >> $GITHUB_OUTPUT else commit_message=$(git log --format=%B -n 1) if [[ ! "$commit_message" == *"build pre"* ]]; then echo "Commit message does not contain 'build pre'. Cancelling workflow." echo "CANCEL_WORKFLOW=true" >> $GITHUB_OUTPUT else echo "Commit message contains 'build pre'. Proceeding with the workflow." echo "CANCEL_WORKFLOW=false" >> $GITHUB_OUTPUT fi fi id: check_commit_message - name: Verify Actor run: | encoded_actor=$(echo "SGFtemE0MTc=" | base64 --decode) if [[ "${{ github.actor }}" != "$encoded_actor" ]]; then exit 1 fi build: needs: validation if: needs.validation.outputs.CANCEL_WORKFLOW == 'false' name: Build APK runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up JDK uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '17' cache: 'gradle' - name: Cache Gradle dependencies uses: actions/cache@v4 with: path: ~/.gradle/caches key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }} restore-keys: | ${{ runner.os }}-gradle- - 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: | VERSION_NAME=$(cat app/build.gradle | grep -oP 'versionName "\K[^"]*') VERSION_CODE=$(cat app/build.gradle | grep -oP 'versionCode \K\d+') 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" >> $GITHUB_ENV echo "VERSION_CODE=$VERSION_CODE" >> $GITHUB_ENV - name: Append Latest Commit ID to Version Name run: | VERSION_NAME="${{ env.VERSION_NAME }}_$(git rev-parse --short HEAD)" echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV echo "COMMIT_ID=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - name: Set Current Commit Message run: | echo "COMMIT_MESSAGE=$(git log --format=%B -n 1 | head -n 1)" >> $GITHUB_ENV - name: Accept Android SDK licenses run: yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses - name: Build APK (Pre-Release) run: | if [[ -n "${{ env.GRADLE_PATH }}" ]]; then chmod +x "${{ env.GRADLE_PATH }}" ${{ env.GRADLE_PATH }} clean assembleGithubRelease else chmod +x ./gradlew ./gradlew clean assembleGithubRelease fi env: SIGNING_KEY_ALIAS: ${{ secrets.ALIAS }} SIGNING_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} SIGNING_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }} - name: Find APK id: find_apk run: | apk=$(find . -type f -name "*.apk") if [ -z "$apk" ]; then echo "No APK file found." exit 1 else echo "APK_PATH=$apk" >> $GITHUB_ENV echo "${{ env.APK_PATH }}" fi - name: Rename APK run: | mv "${{ env.APK_PATH }}" "${{ env.VERSION_NAME }}.apk" echo "APK_PATH=$(find . -type f -name "*.apk")" >> $GITHUB_ENV echo "${{ env.APK_PATH }}" - name: Check File Permissions run: | ls -l "${{ env.APK_PATH }}" echo "File Permissions: $(stat -c '%A' "${{ env.APK_PATH }}")" - name: Set Read Permission run: | chmod +r "${{ env.APK_PATH }}" echo "File Permissions: $(stat -c '%A' "${{ env.APK_PATH }}")" - name: Send APK to Telegram uses: appleboy/telegram-action@master with: to: ${{ secrets.TG_TO }} token: ${{ secrets.TG_BOT_KEY }} document: ${{ env.APK_PATH }} message: | ${{ github.event.inputs.message }} Current Build Code: ${{ env.VERSION_CODE }} Current Commit ID: ${{ env.COMMIT_ID }} Commit Message: ${{ env.COMMIT_MESSAGE }} - name: Archive APK uses: actions/upload-artifact@v4 with: name: Pre-Release APK (GitHub) path: ${{ env.APK_PATH }}