From 9fc26b1ccf1a87bf468673ac83377a2accadbae1 Mon Sep 17 00:00:00 2001 From: Myx Date: Fri, 5 Jun 2026 18:37:17 +0200 Subject: [PATCH] ci: fix apk build --- .gitea/workflows/build-android-apk.yml | 47 +++++++++---- .gitea/workflows/release-draft.yml | 81 +++++++++++++++++++++++ .gitignore | 1 + agents-docs/ENGINEERING.md | 3 +- agents-docs/features/mobile-capacitor.md | 6 +- server/data/metoyou.sqlite | Bin 315392 -> 0 bytes tools/gitea-release.js | 28 ++++++-- tools/gitea-release.spec.js | 29 ++++++++ 8 files changed, 172 insertions(+), 23 deletions(-) delete mode 100644 server/data/metoyou.sqlite create mode 100644 tools/gitea-release.spec.js diff --git a/.gitea/workflows/build-android-apk.yml b/.gitea/workflows/build-android-apk.yml index 5d76cd2..40460f4 100644 --- a/.gitea/workflows/build-android-apk.yml +++ b/.gitea/workflows/build-android-apk.yml @@ -1,14 +1,6 @@ name: Build Android APK on: - push: - branches: [main, master] - paths: - - 'toju-app/**' - - 'package.json' - - 'package-lock.json' - - 'tools/build-android-apk.sh' - - '.gitea/workflows/build-android-apk.yml' workflow_dispatch: jobs: @@ -69,12 +61,39 @@ jobs: NODE_ENV: development run: npm ci + - name: Resolve release version + id: version + run: node tools/resolve-release-version.js --write-output + + - name: Ensure draft release exists + id: release + env: + GITEA_RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }} + run: > + node tools/gitea-release.js ensure-draft + --server-url "${{ github.server_url }}" + --repository "${{ github.repository }}" + --tag "${{ steps.version.outputs.release_tag }}" + --target "${{ github.sha }}" + --name "${{ steps.version.outputs.release_name }}" + --body "Automated draft release from ${{ github.ref_name }} @ ${{ github.sha }}" + --write-output + - name: Build debug APK run: bash tools/build-android-apk.sh - - name: Upload APK artifact - uses: https://github.com/actions/upload-artifact@v4 - with: - name: metoyou-android-debug-apk - path: toju-app/android/app/build/outputs/apk/debug/app-debug.apk - if-no-files-found: error + - name: Stage Android APK + run: | + mkdir -p dist-android + cp toju-app/android/app/build/outputs/apk/debug/app-debug.apk \ + "dist-android/Toju-${{ steps.version.outputs.release_version }}-android-debug.apk" + + - name: Upload Android APK to draft release + env: + GITEA_RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }} + run: > + node tools/gitea-release.js upload-built-assets + --server-url "${{ github.server_url }}" + --repository "${{ github.repository }}" + --release-id "${{ steps.release.outputs.release_id }}" + --dist-android dist-android diff --git a/.gitea/workflows/release-draft.yml b/.gitea/workflows/release-draft.yml index 6954ba7..f81ad6b 100644 --- a/.gitea/workflows/release-draft.yml +++ b/.gitea/workflows/release-draft.yml @@ -110,6 +110,87 @@ jobs: --dist-electron dist-electron --dist-server dist-server + build-android: + needs: prepare + runs-on: ubuntu-latest + container: node:22 + + steps: + - name: Checkout + uses: https://github.com/actions/checkout@v4 + + - name: Restore npm cache + uses: https://github.com/actions/cache@v4 + with: + path: /root/.npm + key: npm-android-${{ hashFiles('package-lock.json') }} + restore-keys: npm-android- + + - name: Restore Gradle cache + uses: https://github.com/actions/cache@v4 + with: + path: | + /root/.gradle/caches + /root/.gradle/wrapper + key: gradle-android-${{ hashFiles('toju-app/android/**/*.gradle*', 'toju-app/android/gradle/wrapper/gradle-wrapper.properties') }} + restore-keys: gradle-android- + + - name: Install Android build toolchain + run: | + apt-get update + apt-get install -y --no-install-recommends wget unzip ca-certificates gnupg + + install -d /etc/apt/keyrings + wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor -o /etc/apt/keyrings/adoptium.gpg + echo "deb [signed-by=/etc/apt/keyrings/adoptium.gpg] https://packages.adoptium.net/artifactory/deb bookworm main" > /etc/apt/sources.list.d/adoptium.list + apt-get update + apt-get install -y --no-install-recommends temurin-21-jdk + + export ANDROID_SDK_ROOT=/opt/android-sdk + mkdir -p "$ANDROID_SDK_ROOT/cmdline-tools" + cd /tmp + wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip + unzip -q commandlinetools-linux-11076708_latest.zip + mv cmdline-tools "$ANDROID_SDK_ROOT/cmdline-tools/latest" + export PATH="$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools" + + yes | sdkmanager --licenses >/dev/null + sdkmanager "platform-tools" "platforms;android-36" "build-tools;35.0.0" + + echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" >> "$GITHUB_ENV" + echo "ANDROID_HOME=$ANDROID_SDK_ROOT" >> "$GITHUB_ENV" + echo "JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-amd64" >> "$GITHUB_ENV" + echo "PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools" >> "$GITHUB_ENV" + + - name: Install dependencies + env: + NODE_ENV: development + run: npm ci + + - name: Set CI release version + run: > + node tools/set-release-version.js + --version "${{ needs.prepare.outputs.release_version }}" + + - name: Build debug APK + run: bash tools/build-android-apk.sh + + - name: Stage Android APK + run: | + mkdir -p dist-android + cp toju-app/android/app/build/outputs/apk/debug/app-debug.apk \ + "dist-android/Toju-${{ needs.prepare.outputs.release_version }}-android-debug.apk" + + - name: Upload Android APK + env: + GITEA_RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }} + run: > + node tools/gitea-release.js upload-built-assets + --server-url "${{ github.server_url }}" + --repository "${{ github.repository }}" + --release-id "${{ needs.prepare.outputs.release_id }}" + --dist-android dist-android + build-windows: needs: prepare runs-on: windows diff --git a/.gitignore b/.gitignore index 677b615..e1962b3 100644 --- a/.gitignore +++ b/.gitignore @@ -59,6 +59,7 @@ Thumbs.db .env .certs/ /server/data/variables.json +/server/data/metoyou.sqlite dist-server/* doc/** diff --git a/agents-docs/ENGINEERING.md b/agents-docs/ENGINEERING.md index 3ff240d..0d884a6 100644 --- a/agents-docs/ENGINEERING.md +++ b/agents-docs/ENGINEERING.md @@ -124,7 +124,8 @@ Behavioral changes to any of these qualify as a feature-doc update under the rul - `release-draft.yml` — queues release builds on push to `main` / `master` - `publish-draft-release.yml` — publishes draft releases - `deploy-web-apps.yml` — deploys the marketing site and Docusaurus docs - - `build-android-apk.yml` — builds a debug Capacitor Android APK on push (mobile-related paths) or manual dispatch; uploads `app-debug.apk` as a workflow artifact + - `build-android-apk.yml` — manual **workflow_dispatch** debug Capacitor Android APK build; uploads `Toju--android-debug.apk` to the draft release (same path as desktop assets) + - `release-draft.yml` job `build-android` — builds and uploads the debug APK to each queued draft release alongside desktop/server archives - All checks must pass before merging a PR - Workflow status is visible in the Gitea PR view; use the web UI or `tea` CLI to inspect runs diff --git a/agents-docs/features/mobile-capacitor.md b/agents-docs/features/mobile-capacitor.md index 992cd05..c95b247 100644 --- a/agents-docs/features/mobile-capacitor.md +++ b/agents-docs/features/mobile-capacitor.md @@ -48,9 +48,11 @@ Config: `toju-app/capacitor.config.ts` (`webDir: ../dist/client/browser`). ### CI (Gitea) -Workflow `.gitea/workflows/build-android-apk.yml` runs automatically on push to `main` / `master` when mobile client paths change (`toju-app/**`, root lockfile, or the workflow itself). Use **workflow_dispatch** to build on demand from any branch. +Release workflow `.gitea/workflows/release-draft.yml` builds a debug Android APK on every push to `main` / `master` (job `build-android`), stages it as `Toju--android-debug.apk`, and uploads it to the same draft Gitea release as the desktop `.exe` / `.deb` assets via `tools/gitea-release.js`. -The job installs JDK 21 and Android SDK platform 36 inside the `node:22` container, runs `tools/build-android-apk.sh`, and uploads `metoyou-android-debug-apk` (`app-debug.apk`) as a workflow artifact. No signing keystore is configured — output is a **debug** APK suitable for sideloading and QA. +Manual-only workflow `.gitea/workflows/build-android-apk.yml` (**workflow_dispatch**) repeats the same build and release upload on demand from any branch. + +Both jobs install JDK 21 and Android SDK platform 36 inside the `node:22` container and run `tools/build-android-apk.sh`. No signing keystore is configured — output is a **debug** APK suitable for sideloading and QA. Optional `google-services.json` is not injected in CI; push registration in artifact builds follows the same optional-Firebase behavior as local unsigned debug builds. diff --git a/server/data/metoyou.sqlite b/server/data/metoyou.sqlite deleted file mode 100644 index 19bc27d72137f49c88918e1ea01789a231782ea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315392 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 diff --git a/tools/gitea-release.js b/tools/gitea-release.js index c6823da..1d1299d 100644 --- a/tools/gitea-release.js +++ b/tools/gitea-release.js @@ -424,12 +424,20 @@ function isDesktopReleaseAsset(filePath) { || lowerFileName.endsWith('.zip'); } +function isAndroidReleaseAsset(filePath) { + return path.basename(filePath).toLowerCase().endsWith('.apk'); +} + function collectBuiltAssets(args) { const distElectronDir = path.resolve(process.cwd(), args['dist-electron'] || 'dist-electron'); const distServerDir = path.resolve(process.cwd(), args['dist-server'] || 'dist-server'); + const distAndroidDir = typeof args['dist-android'] === 'string' && args['dist-android'].trim().length > 0 + ? path.resolve(process.cwd(), args['dist-android']) + : null; const files = [ ...collectTopLevelFiles(distElectronDir).filter(isDesktopReleaseAsset), - ...collectTopLevelFiles(distServerDir) + ...collectTopLevelFiles(distServerDir), + ...(distAndroidDir ? collectTopLevelFiles(distAndroidDir).filter(isAndroidReleaseAsset) : []) ]; return [...new Set(files)].sort((left, right) => left.localeCompare(right)); @@ -646,9 +654,17 @@ async function main() { } } -main().catch((error) => { - const message = error instanceof Error ? error.message : String(error); +if (require.main === module) { + main().catch((error) => { + const message = error instanceof Error ? error.message : String(error); - console.error(`[gitea-release] ${message}`); - process.exitCode = 1; -}); + console.error(`[gitea-release] ${message}`); + process.exitCode = 1; + }); +} + +module.exports = { + collectBuiltAssets, + isAndroidReleaseAsset, + isDesktopReleaseAsset +}; diff --git a/tools/gitea-release.spec.js b/tools/gitea-release.spec.js new file mode 100644 index 0000000..a0f34e8 --- /dev/null +++ b/tools/gitea-release.spec.js @@ -0,0 +1,29 @@ +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const os = require('node:os'); +const path = require('node:path'); +const { test } = require('node:test'); + +const { collectBuiltAssets, isAndroidReleaseAsset } = require('./gitea-release'); + +test('isAndroidReleaseAsset matches apk files only', () => { + assert.equal(isAndroidReleaseAsset('/tmp/Toju-1.0.5-android-debug.apk'), true); + assert.equal(isAndroidReleaseAsset('/tmp/notes.txt'), false); +}); + +test('collectBuiltAssets includes apk files from dist-android', () => { + const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gitea-release-')); + const distAndroid = path.join(tempDir, 'dist-android'); + + fs.mkdirSync(distAndroid); + const apkPath = path.join(distAndroid, 'Toju-1.0.5-android-debug.apk'); + fs.writeFileSync(apkPath, 'apk'); + + const files = collectBuiltAssets({ + 'dist-android': distAndroid, + 'dist-electron': path.join(tempDir, 'missing-electron'), + 'dist-server': path.join(tempDir, 'missing-server') + }); + + assert.deepEqual(files, [apkPath]); +});