name: Android Release permissions: contents: write on: push: tags: - 'v*' workflow_dispatch: jobs: release-apk: runs-on: android-ci env: GRADLE_VERSION: 8.10.2 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 nodejs unzip curl -fsSL "https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip" -o /tmp/gradle.zip unzip -q /tmp/gradle.zip -d /opt ln -s "/opt/gradle-${GRADLE_VERSION}/bin/gradle" /usr/local/bin/gradle - name: Build installable APK run: | gradle --no-daemon :app:testDebugUnitTest :app: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: "Installable Android debug 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 asset = (release.assets || []).find(item => item.name === `calorie-ai-${process.env.GITHUB_REF_NAME}.apk`); 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