Skip to content

chore(release): bump version to 0.2.142+156 #102

chore(release): bump version to 0.2.142+156

chore(release): bump version to 0.2.142+156 #102

Workflow file for this run

name: Android Release
on:
push:
tags:
- "v*"
workflow_dispatch:
permissions:
contents: write
jobs:
build-release-apk:
name: Build signed arm64-v8a release APK
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Set up Java
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: "17"
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: "3.44.0"
channel: stable
cache: true
- name: Resolve dependencies
run: flutter pub get
- name: Run critical regression checks
run: |
flutter analyze lib/features/reader_v2 lib/features/source_manager test/features/reader_v2 test/features/source_manager
flutter test test/features/reader_v2 \
test/features/source_manager/source_manager_provider_test.dart \
test/features/source_manager/source_manager_page_smoke_test.dart \
test/features/source_manager/source_login_test.dart
- name: Decode Android release keystore
env:
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
run: |
test -n "$ANDROID_KEYSTORE_BASE64"
echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > "$RUNNER_TEMP/inkpage-release.jks"
- name: Build release APK
env:
ANDROID_KEYSTORE_PATH: ${{ runner.temp }}/inkpage-release.jks
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
run: >-
flutter build apk
--release
--split-per-abi
--target-platform android-arm64
--analyze-size
--code-size-directory build/size-analysis
- name: Upload code size analysis
uses: actions/upload-artifact@v4
with:
name: night-reader-code-size-${{ github.ref_name }}
path: build/size-analysis/
if-no-files-found: error
retention-days: 30
- name: Verify release APK manifest
run: |
set -euo pipefail
apk_path="build/app/outputs/flutter-apk/app-arm64-v8a-release.apk"
test -s "$apk_path"
manifest_path="$(find build/app/intermediates/merged_manifests/release -name AndroidManifest.xml | head -n 1)"
test -n "$manifest_path"
grep -q 'android.permission.INTERNET' "$manifest_path"
# 只有 v* tag 觸發才發布 release;手動 workflow_dispatch 只建置、
# 不發布(避免從 main 觸發時建立名為 "main" 的假 release)。
- name: Publish GitHub release
if: startsWith(github.ref, 'refs/tags/v')
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG_NAME: ${{ github.ref_name }}
run: |
set -euo pipefail
apk_path="build/app/outputs/flutter-apk/app-arm64-v8a-release.apk"
asset_name="night-reader-${TAG_NAME}-arm64-v8a.apk"
if gh release view "$TAG_NAME" >/dev/null 2>&1; then
gh release upload "$TAG_NAME" "$apk_path#$asset_name" --clobber
else
gh release create "$TAG_NAME" "$apk_path#$asset_name" \
--title "$TAG_NAME" \
--generate-notes
fi
# 手動觸發時把 APK 掛成 workflow artifact,供測試安裝下載。
- name: Upload test APK artifact
if: ${{ !startsWith(github.ref, 'refs/tags/v') }}
uses: actions/upload-artifact@v4
with:
name: night-reader-test-arm64-v8a
path: build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
retention-days: 7