Backend (Fastify + TS): FluentForms webhook -> NocoDB row + QR + MailerSend email; PIN auth; scan/lookup/redeem with per-code serialization; reusable QR codes with count-based check-in; admin search. App (Expo, one codebase): Android APK + iPhone PWA. Login, camera scanner (native + web barcode-detector split), green/red overlay with sound + haptics, admin lookup/redeem. Session token persisted per device. Ops: multi-stage Dockerfile serving API + PWA same-origin, compose bound to 127.0.0.1; Forgejo Actions runner + tag-triggered signed APK build for Obtainium. Docs in README.md and INSTALL.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
87 lines
3.2 KiB
YAML
87 lines
3.2 KiB
YAML
name: Build Android APK
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- "v*"
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
build-apk:
|
|
runs-on: docker
|
|
container:
|
|
image: node:22-bookworm
|
|
env:
|
|
ANDROID_HOME: /opt/android-sdk
|
|
ANDROID_SDK_ROOT: /opt/android-sdk
|
|
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx4g -Dorg.gradle.daemon=false
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Resolve version from tag
|
|
id: ver
|
|
run: |
|
|
TAG="${GITHUB_REF_NAME:-v0.0.0}"
|
|
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
|
|
node ci/set-version.mjs "$TAG"
|
|
|
|
- name: Install JDK 17 and tools
|
|
run: |
|
|
apt-get update
|
|
apt-get install -y --no-install-recommends openjdk-17-jdk-headless unzip wget git
|
|
echo "JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" >> "$GITHUB_ENV"
|
|
|
|
- name: Install Android SDK
|
|
run: |
|
|
set -eux
|
|
mkdir -p "$ANDROID_HOME/cmdline-tools"
|
|
cd /tmp
|
|
wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O cmdtools.zip
|
|
unzip -q cmdtools.zip -d "$ANDROID_HOME/cmdline-tools"
|
|
mv "$ANDROID_HOME/cmdline-tools/cmdline-tools" "$ANDROID_HOME/cmdline-tools/latest"
|
|
export PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$PATH"
|
|
yes | sdkmanager --licenses >/dev/null || true
|
|
sdkmanager --install "platform-tools" \
|
|
"platforms;android-36" "platforms;android-35" \
|
|
"build-tools;36.0.0" "build-tools;35.0.0" >/dev/null
|
|
echo "$ANDROID_HOME/platform-tools" >> "$GITHUB_PATH"
|
|
echo "$ANDROID_HOME/cmdline-tools/latest/bin" >> "$GITHUB_PATH"
|
|
|
|
- name: Install app dependencies
|
|
working-directory: app
|
|
run: npm install --no-audit --no-fund
|
|
|
|
- name: Expo prebuild (android)
|
|
working-directory: app
|
|
run: npx expo prebuild -p android --no-install
|
|
|
|
- name: Decode release keystore
|
|
run: |
|
|
echo "${{ secrets.ANDROID_KEYSTORE_B64 }}" | base64 -d > "$RUNNER_TEMP/release.keystore"
|
|
|
|
- name: Build release APK
|
|
working-directory: app/android
|
|
env:
|
|
CAMPSCAN_STORE_FILE: ${{ runner.temp }}/release.keystore
|
|
CAMPSCAN_STORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
|
|
CAMPSCAN_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
|
CAMPSCAN_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
|
|
run: |
|
|
chmod +x ./gradlew
|
|
./gradlew assembleRelease --init-script ../../ci/signing.gradle --no-daemon
|
|
mkdir -p "$GITHUB_WORKSPACE/artifacts"
|
|
cp app/build/outputs/apk/release/app-release.apk \
|
|
"$GITHUB_WORKSPACE/artifacts/camp-scan-${{ steps.ver.outputs.tag }}.apk"
|
|
|
|
- name: Publish Forgejo release with APK
|
|
uses: actions/forgejo-release@v2
|
|
with:
|
|
direction: upload
|
|
url: https://git.mowden.top
|
|
repo: Beartaria/CampgroundTickets
|
|
tag: ${{ steps.ver.outputs.tag }}
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
release-dir: artifacts
|
|
release-notes: "Camp Scan ${{ steps.ver.outputs.tag }} — install/update via Obtainium."
|
|
override: true
|