name: Android Release permissions: contents: write on: push: tags: - 'v*' workflow_dispatch: jobs: release-apk: runs-on: android-ci steps: - name: Check out repository run: | git clone "http://forgejo:3000/${GITHUB_REPOSITORY}.git" . git checkout "$GITHUB_SHA" - name: Install tools run: | apt-get update apt-get install -y --no-install-recommends ca-certificates curl unzip curl -fsSL https://deb.nodesource.com/setup_22.x | bash - apt-get install -y --no-install-recommends nodejs node --version npm --version - name: Build web app and sync Capacitor env: APP_SERVER_URL: ${{ secrets.APP_SERVER_URL }} run: | cd web npm ci npm run build npx cap sync android - name: Build APK run: | cd web/android chmod +x gradlew ./gradlew --no-daemon assembleDebug mkdir -p ../../dist cp app/build/outputs/apk/debug/*.apk "../../dist/calorie-ai-${GITHUB_REF_NAME}.apk" - name: Publish Forgejo release asset env: FORGEJO_API: http://forgejo:3000/api/v1 TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | set -euo pipefail apk="dist/calorie-ai-${GITHUB_REF_NAME}.apk" auth_header="Authorization: token ${TOKEN}" release_json="$(curl -fsS -H "$auth_header" "$FORGEJO_API/repos/${GITHUB_REPOSITORY}/releases/tags/${GITHUB_REF_NAME}" || true)" if [ -z "$release_json" ]; then release_json="$(node -e 'console.log(JSON.stringify({ tag_name: process.env.GITHUB_REF_NAME, name: `Calorie AI ${process.env.GITHUB_REF_NAME}`, body: "Capacitor Android APK for Calorie AI.", draft: false, prerelease: false }))' | curl -fsS -X POST -H "$auth_header" -H 'Content-Type: application/json' --data-binary @- "$FORGEJO_API/repos/${GITHUB_REPOSITORY}/releases")" fi release_id="$(printf '%s' "$release_json" | node -e 'let data=""; process.stdin.on("data", c => data += c); process.stdin.on("end", () => console.log(JSON.parse(data).id));')" asset_id="$(printf '%s' "$release_json" | node -e 'let data=""; process.stdin.on("data", c => data += c); process.stdin.on("end", () => { const release = JSON.parse(data); const expected = "calorie-ai-" + process.env.GITHUB_REF_NAME + ".apk"; const asset = (release.assets || []).find(item => item.name === expected); if (asset) console.log(asset.id); });')" if [ -n "$asset_id" ]; then curl -fsS -X DELETE -H "$auth_header" "$FORGEJO_API/repos/${GITHUB_REPOSITORY}/releases/${release_id}/assets/${asset_id}" fi curl -fsS -X POST -H "$auth_header" -F "attachment=@${apk}" "$FORGEJO_API/repos/${GITHUB_REPOSITORY}/releases/${release_id}/assets?name=calorie-ai-${GITHUB_REF_NAME}.apk" - name: Upload APK artifact uses: actions/upload-artifact@v3 with: name: calorie-ai-apk path: dist/*.apk