GitHub's /releases/latest/download/<name> redirect needs a file name that stays put, and the release asset is named after its version. Each production release now carries the same build twice: the versioned copy, and a plain ProLibertateGames.apk, which makes this link permanent: .../releases/latest/download/ProLibertateGames.apk Only the production channel gets one. /releases/latest skips prereleases, which is exactly what stops a production install being handed a dev build, so there is no equivalent dev link to offer. The updater now picks its asset by name rather than taking the first .apk it sees. Both copies are byte-identical, so nothing would have broken either way, but relying on upload order for which file gets installed is not something to leave lying around.
89 lines
3.3 KiB
YAML
89 lines
3.3 KiB
YAML
name: Build and Release APK
|
|
|
|
# Build an APK and publish it as a GitHub Release whenever commits land on main
|
|
# (for example when a pull request is merged). Can also be run manually.
|
|
on:
|
|
push:
|
|
branches: [ main ]
|
|
workflow_dispatch:
|
|
|
|
# Allow the built-in token to create releases and upload the APK.
|
|
permissions:
|
|
contents: write
|
|
|
|
# Don't let two pushes to main race on the same release.
|
|
concurrency:
|
|
group: release-${{ github.ref }}
|
|
cancel-in-progress: false
|
|
|
|
jobs:
|
|
build:
|
|
name: Build APK and publish release
|
|
# workflow_dispatch can be aimed at any branch from the Actions UI. Releases
|
|
# are what the in-app updater installs, so only main may produce one —
|
|
# anything else is a no-op rather than shipping unreviewed code to everyone.
|
|
if: github.ref == 'refs/heads/main'
|
|
runs-on: ubuntu-latest
|
|
env:
|
|
# Stamps the APK as a production-channel build, versioned with the run
|
|
# number that matches the tag published below.
|
|
PLG_CHANNEL: production
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Set up JDK 17
|
|
uses: actions/setup-java@v4
|
|
with:
|
|
distribution: temurin
|
|
java-version: '17'
|
|
cache: gradle
|
|
|
|
- name: Set up Android SDK
|
|
uses: android-actions/setup-android@v3
|
|
|
|
- name: Build debug APK
|
|
run: ./gradlew assembleDebug --no-daemon --stacktrace
|
|
|
|
- name: Stage APK for release
|
|
id: stage
|
|
run: |
|
|
set -euo pipefail
|
|
version="v1.0.${{ github.run_number }}"
|
|
src="app/build/outputs/apk/debug/app-debug.apk"
|
|
dest="ProLibertateGames-${version}.apk"
|
|
cp "$src" "$dest"
|
|
# The same build again under a name that never changes. GitHub's
|
|
# /releases/latest/download/<name> redirect needs a constant file
|
|
# name, so this second copy is what makes a permanent download link
|
|
# possible — the versioned copy stays as the traceable one.
|
|
cp "$src" "ProLibertateGames.apk"
|
|
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
echo "apk=$dest" >> "$GITHUB_OUTPUT"
|
|
|
|
- name: Upload APK as workflow artifact
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ProLibertateGames-apk
|
|
path: ${{ steps.stage.outputs.apk }}
|
|
if-no-files-found: error
|
|
|
|
- name: Create GitHub release
|
|
env:
|
|
GH_TOKEN: ${{ github.token }}
|
|
run: |
|
|
set -euo pipefail
|
|
gh release create "${{ steps.stage.outputs.version }}" \
|
|
"${{ steps.stage.outputs.apk }}" \
|
|
"ProLibertateGames.apk" \
|
|
--repo "${{ github.repository }}" \
|
|
--target "${{ github.sha }}" \
|
|
--title "ProLibertateGames ${{ steps.stage.outputs.version }}" \
|
|
--notes "Automated release built from \`${{ github.sha }}\` on push to \`main\`.
|
|
|
|
Download **${{ steps.stage.outputs.apk }}** below and install it on an Android device (you may need to allow *Install unknown apps*). This is a debug-signed build.
|
|
|
|
Both files below are the same build. \`ProLibertateGames.apk\` is a copy under a fixed name, so this link always fetches the newest release and can be bookmarked or shared:
|
|
|
|
https://github.com/${{ github.repository }}/releases/latest/download/ProLibertateGames.apk"
|