Build signed release APK #21
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 signed release APK | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| release_target: | |
| description: "What to do with the signed release APK" | |
| required: false | |
| default: "artifacts" | |
| type: choice | |
| options: | |
| - artifacts | |
| - release | |
| - all | |
| push: | |
| tags: | |
| - "v*-m*" | |
| permissions: | |
| contents: write | |
| jobs: | |
| release: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Checkout latest PipePipeExtractor source | |
| run: | | |
| set -euo pipefail | |
| mkdir -p external | |
| if [ ! -d external/NewPipeExtractor/.git ]; then | |
| rm -rf external/NewPipeExtractor | |
| git init external/NewPipeExtractor | |
| git -C external/NewPipeExtractor remote add origin https://github.com/wizdom13/PipePipeExtractor | |
| fi | |
| git -C external/NewPipeExtractor fetch --depth 1 origin main | |
| git -C external/NewPipeExtractor checkout --detach FETCH_HEAD | |
| - name: Verify PipePipeExtractor source | |
| run: | | |
| set -euo pipefail | |
| git -C external/NewPipeExtractor remote -v | |
| git -C external/NewPipeExtractor remote get-url origin | grep -q "github.com/wizdom13/PipePipeExtractor" | |
| git -C external/NewPipeExtractor rev-parse HEAD | |
| test -d external/NewPipeExtractor/extractor | |
| grep -n "JavaLanguageVersion.of(21)" external/NewPipeExtractor/build.gradle | |
| grep -n "options.release = 21" external/NewPipeExtractor/build.gradle | |
| - name: Clean PipePipeExtractor outputs | |
| run: | | |
| set -euo pipefail | |
| rm -rf external/NewPipeExtractor/build | |
| rm -rf external/NewPipeExtractor/extractor/build | |
| rm -rf external/NewPipeExtractor/timeago-parser/build | |
| - uses: gradle/actions/wrapper-validation@v6 | |
| - name: Set up JDK 21 | |
| uses: actions/setup-java@v5 | |
| with: | |
| java-version: 21 | |
| distribution: temurin | |
| cache: gradle | |
| - name: Verify PipePipeExtractor Java bytecode | |
| run: | | |
| set -euo pipefail | |
| ./gradlew -p external/NewPipeExtractor :extractor:clean :extractor:compileJava --stacktrace | |
| javap -verbose -classpath external/NewPipeExtractor/extractor/build/classes/java/main org.schabi.newpipe.extractor.NewPipe | grep "major version: 65" | |
| - name: Write release keystore | |
| env: | |
| RELEASE_KEYSTORE_BASE64: ${{ secrets.NEWPIPE_MATERIAL_RELEASE_KEYSTORE_BASE64 }} | |
| run: | | |
| set -euo pipefail | |
| if [ -z "${RELEASE_KEYSTORE_BASE64}" ]; then | |
| echo "Missing NEWPIPE_MATERIAL_RELEASE_KEYSTORE_BASE64 secret" >&2 | |
| exit 1 | |
| fi | |
| printf '%s' "${RELEASE_KEYSTORE_BASE64}" | base64 -d > "$RUNNER_TEMP/newpipe-material-release.keystore" | |
| - name: Build signed release APK | |
| env: | |
| NEWPIPE_MATERIAL_RELEASE_STORE_FILE: ${{ runner.temp }}/newpipe-material-release.keystore | |
| NEWPIPE_MATERIAL_RELEASE_STORE_PASSWORD: ${{ secrets.NEWPIPE_MATERIAL_RELEASE_STORE_PASSWORD }} | |
| NEWPIPE_MATERIAL_RELEASE_KEY_ALIAS: ${{ secrets.NEWPIPE_MATERIAL_RELEASE_KEY_ALIAS }} | |
| NEWPIPE_MATERIAL_RELEASE_KEY_PASSWORD: ${{ secrets.NEWPIPE_MATERIAL_RELEASE_KEY_PASSWORD }} | |
| run: | | |
| set -euo pipefail | |
| if [ -z "${NEWPIPE_MATERIAL_RELEASE_STORE_PASSWORD}" ] || \ | |
| [ -z "${NEWPIPE_MATERIAL_RELEASE_KEY_ALIAS}" ] || \ | |
| [ -z "${NEWPIPE_MATERIAL_RELEASE_KEY_PASSWORD}" ]; then | |
| echo "Missing one or more NewPipe Material release signing secrets" >&2 | |
| exit 1 | |
| fi | |
| ./gradlew clean assembleRelease --stacktrace | |
| - name: Verify release APK identity | |
| run: | | |
| set -euo pipefail | |
| APK_PATH="$(find app/build/outputs/apk/release -name '*.apk' | head -n 1)" | |
| test -n "$APK_PATH" | |
| AAPT="$ANDROID_HOME/build-tools/$(ls "$ANDROID_HOME/build-tools" | sort -V | tail -n 1)/aapt" | |
| "$AAPT" dump badging "$APK_PATH" | tee "$RUNNER_TEMP/release-apk-badging.txt" | |
| grep -q "package: name='org.wisso.newpipematerial'" "$RUNNER_TEMP/release-apk-badging.txt" | |
| grep -q "application-label:'NewPipe Material'" "$RUNNER_TEMP/release-apk-badging.txt" | |
| - name: "Rename APK" | |
| id: release_info | |
| run: | | |
| VERSION_NAME="$(jq -r ".elements[0].versionName" "app/build/outputs/apk/release/output-metadata.json")" | |
| VERSION_CODE="$(jq -r ".elements[0].versionCode" "app/build/outputs/apk/release/output-metadata.json")" | |
| RELEASE_TAG="v${VERSION_NAME}" | |
| if [ "$GITHUB_EVENT_NAME" = "push" ] && [ "$GITHUB_REF_NAME" != "$RELEASE_TAG" ]; then | |
| echo "Tag mismatch: pushed tag is '$GITHUB_REF_NAME' but Gradle versionName is '$VERSION_NAME' and expects tag '$RELEASE_TAG'" | |
| exit 1 | |
| fi | |
| APK_NAME="NewPipeMaterial_v${VERSION_NAME}.apk" | |
| APK_PATH="app/build/outputs/apk/release/${APK_NAME}" | |
| CHANGELOG_PATH="fastlane/metadata/android/en-US/changelogs/${VERSION_CODE}.txt" | |
| mv app/build/outputs/apk/release/*.apk "$APK_PATH" | |
| echo "version_name=$VERSION_NAME" >> "$GITHUB_OUTPUT" | |
| echo "version_code=$VERSION_CODE" >> "$GITHUB_OUTPUT" | |
| echo "release_tag=$RELEASE_TAG" >> "$GITHUB_OUTPUT" | |
| echo "apk_name=$APK_NAME" >> "$GITHUB_OUTPUT" | |
| echo "apk_path=$APK_PATH" >> "$GITHUB_OUTPUT" | |
| echo "changelog_path=$CHANGELOG_PATH" >> "$GITHUB_OUTPUT" | |
| echo "Version name: $VERSION_NAME" >> "$GITHUB_STEP_SUMMARY" | |
| echo "Version code: $VERSION_CODE" >> "$GITHUB_STEP_SUMMARY" | |
| echo "Release tag: $RELEASE_TAG" >> "$GITHUB_STEP_SUMMARY" | |
| echo "Changelog: $CHANGELOG_PATH" >> "$GITHUB_STEP_SUMMARY" | |
| - name: "Upload APK" | |
| if: ${{ github.event_name == 'workflow_dispatch' && (inputs.release_target == 'artifacts' || inputs.release_target == 'all') }} | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: newpipe-material-signed-release-apk | |
| path: ${{ steps.release_info.outputs.apk_path }} | |
| - name: "Validate changelog" | |
| if: ${{ github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && (inputs.release_target == 'release' || inputs.release_target == 'all')) }} | |
| run: | | |
| test -s "${{ steps.release_info.outputs.changelog_path }}" | |
| - name: "Create release" | |
| if: ${{ github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && (inputs.release_target == 'release' || inputs.release_target == 'all')) }} | |
| uses: softprops/action-gh-release@v3 | |
| with: | |
| tag_name: ${{ github.event_name == 'push' && github.ref_name || steps.release_info.outputs.release_tag }} | |
| target_commitish: pipe | |
| name: NewPipe Material ${{ steps.release_info.outputs.version_name }} | |
| body_path: ${{ steps.release_info.outputs.changelog_path }} | |
| files: ${{ steps.release_info.outputs.apk_path }} | |
| fail_on_unmatched_files: true | |
| make_latest: true |