Skip to content

Build Android APK

Build Android APK #8

Workflow file for this run

name: Build Android APK
on:
workflow_dispatch:
push:
tags:
- "v*"
release:
types: [published]
jobs:
build-apk:
runs-on: ubuntu-22.04
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: stable
- name: Flutter pub get
run: flutter pub get
- name: Configure Android signing
shell: bash
env:
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
run: |
set -euo pipefail
for var in \
ANDROID_KEYSTORE_BASE64 \
ANDROID_KEYSTORE_PASSWORD \
ANDROID_KEY_ALIAS \
ANDROID_KEY_PASSWORD; do
if [[ -z "${!var:-}" ]]; then
echo "Missing required GitHub secret: $var" >&2
exit 1
fi
done
echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > android/upload-keystore.jks
cat > android/key.properties <<EOF
storePassword=${ANDROID_KEYSTORE_PASSWORD}
keyPassword=${ANDROID_KEY_PASSWORD}
keyAlias=${ANDROID_KEY_ALIAS}
storeFile=upload-keystore.jks
EOF
- name: Build signed release APK
run: flutter build apk --release
- name: Prepare APK artifact
shell: bash
run: |
set -euo pipefail
VERSION="$(sed -nE 's/^version:[[:space:]]*([0-9]+\.[0-9]+\.[0-9]+).*/\1/p' pubspec.yaml | head -n1)"
if [[ -z "$VERSION" ]]; then
VERSION="0.0.0"
fi
if [[ "${GITHUB_REF_TYPE:-}" == "tag" && "${GITHUB_REF_NAME:-}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
VERSION="${GITHUB_REF_NAME#v}"
fi
SRC_DIR="build/app/outputs/flutter-apk"
OUT_DIR="build/app/outputs/artifacts"
mkdir -p "$OUT_DIR"
APK_PATH="$SRC_DIR/app-release.apk"
if [[ ! -f "$APK_PATH" ]]; then
echo "Missing signed release APK at $APK_PATH" >&2
exit 1
fi
FINAL_APK="$OUT_DIR/multiscan-android-v${VERSION}-release-signed.apk"
cp -f "$APK_PATH" "$FINAL_APK"
sha256sum "$FINAL_APK" > "$FINAL_APK.sha256"
- name: Upload APK artifact
uses: actions/upload-artifact@v4
with:
name: multiscan-android-apk
path: |
build/app/outputs/artifacts/*.apk
build/app/outputs/artifacts/*.sha256
if-no-files-found: error