Grund: Compose-app med login mot gym-API:t, VS Code-task och CI-release
Some checks failed
release / build-release (push) Failing after 1m42s
Some checks failed
release / build-release (push) Failing after 1m42s
- Kotlin + Jetpack Compose + Material 3, minSdk 31 (Android 12) - GraphQL-klient (OkHttp) med login/refresh/validate/logout som webben - Tokenlagring i DataStore, auto-refresh av JWT - Signering via gitignorerad signing/ lokalt och Actions-secrets i CI - VS Code build-task -> build/FitnessDroid.apk - Gitea Actions: bygger APK på Pi5 (arm64, aapt2-override) och publicerar rullande latest-release Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Kf4MAbZ3c3B4Xy5XfuGsCP
This commit is contained in:
130
.gitea/workflows/release.yaml
Normal file
130
.gitea/workflows/release.yaml
Normal file
@@ -0,0 +1,130 @@
|
||||
name: release
|
||||
|
||||
# På varje push till main: bygg signerad release-APK och lägg den på en
|
||||
# rullande "latest"-release på släppsidan i Gitea.
|
||||
#
|
||||
# Runnern är Pi5 (arm64). Googles aapt2 finns bara för linux x86_64, därför
|
||||
# används en statiskt byggd arm64-aapt2 (lzhiyong/android-sdk-tools) via
|
||||
# gradle-flaggan android.aapt2FromMavenOverride. Resten av Android-bygget
|
||||
# (kotlinc, d8, apksigner) är JVM-baserat och kör fint på arm64.
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
workflow_dispatch: {}
|
||||
|
||||
env:
|
||||
CMDLINE_TOOLS_URL: https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
|
||||
AAPT2_ARM64_URL: https://github.com/lzhiyong/android-sdk-tools/releases/download/35.0.2/android-sdk-tools-static-aarch64.zip
|
||||
|
||||
jobs:
|
||||
build-release:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Skriv signeringsnyckel från secrets
|
||||
run: |
|
||||
set -e
|
||||
if [ -z "${{ secrets.KEYSTORE_B64 }}" ] || [ -z "${{ secrets.KEYSTORE_PASSWORD }}" ]; then
|
||||
echo "Secrets KEYSTORE_B64 och KEYSTORE_PASSWORD saknas."
|
||||
echo "Lägg till dem under repo-inställningar -> Actions -> Secrets:"
|
||||
echo " KEYSTORE_B64 = base64 -w0 signing/fitnessdroid.jks"
|
||||
echo " KEYSTORE_PASSWORD = storePassword ur signing/keystore.properties"
|
||||
exit 1
|
||||
fi
|
||||
mkdir -p signing
|
||||
echo "${{ secrets.KEYSTORE_B64 }}" | base64 -d > signing/fitnessdroid.jks
|
||||
{
|
||||
echo "storeFile=fitnessdroid.jks"
|
||||
echo "storePassword=${{ secrets.KEYSTORE_PASSWORD }}"
|
||||
echo "keyAlias=fitnessdroid"
|
||||
echo "keyPassword=${{ secrets.KEYSTORE_PASSWORD }}"
|
||||
} > signing/keystore.properties
|
||||
|
||||
- name: Cache gradle
|
||||
uses: actions/cache@v4
|
||||
continue-on-error: true
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
~/.gradle/wrapper
|
||||
key: gradle-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties', 'gradle/libs.versions.toml') }}
|
||||
restore-keys: gradle-
|
||||
|
||||
- name: Installera JDK 17 + Android SDK (arm64)
|
||||
run: |
|
||||
set -e
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -y -qq openjdk-17-jdk-headless wget unzip jq curl
|
||||
export ANDROID_HOME=$HOME/android-sdk
|
||||
mkdir -p "$ANDROID_HOME/cmdline-tools"
|
||||
wget -q "$CMDLINE_TOOLS_URL" -O /tmp/cmdline-tools.zip
|
||||
unzip -q /tmp/cmdline-tools.zip -d "$ANDROID_HOME/cmdline-tools"
|
||||
mv "$ANDROID_HOME/cmdline-tools/cmdline-tools" "$ANDROID_HOME/cmdline-tools/latest"
|
||||
yes | "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --licenses > /dev/null
|
||||
"$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" "platforms;android-35" "build-tools;34.0.0" > /dev/null
|
||||
# arm64-byggd aapt2 (Googles är x86_64-only)
|
||||
mkdir -p "$HOME/ci-tools"
|
||||
wget -q "$AAPT2_ARM64_URL" -O /tmp/sdk-tools-arm64.zip
|
||||
unzip -qo /tmp/sdk-tools-arm64.zip -d "$HOME/ci-tools"
|
||||
chmod +x "$HOME/ci-tools/build-tools/aapt2"
|
||||
echo "ANDROID_HOME=$ANDROID_HOME" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Bygg signerad release-APK
|
||||
run: |
|
||||
set -e
|
||||
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
|
||||
# Snäll mot Pi5:n — begränsa gradles parallellism
|
||||
nice -n 10 ./gradlew --no-daemon --console=plain \
|
||||
-Dorg.gradle.workers.max=2 \
|
||||
-Pandroid.aapt2FromMavenOverride="$HOME/ci-tools/build-tools/aapt2" \
|
||||
:app:assembleRelease
|
||||
mkdir -p build
|
||||
cp app/build/outputs/apk/release/app-release.apk build/FitnessDroid.apk
|
||||
(cd build && sha256sum FitnessDroid.apk > checksums.txt && ls -la)
|
||||
|
||||
- name: Skapa/uppdatera latest-release + ladda upp APK
|
||||
env:
|
||||
API: http://gitea-d:3000/api/v1
|
||||
REPO: ${{ github.repository }}
|
||||
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
set -e
|
||||
TAG="latest"
|
||||
BASE="https://gitea.brasse-pc.eu/$REPO/releases/download/$TAG"
|
||||
BODY=$(cat <<EOF
|
||||
Rullande bygge från senaste main. Commit: ${{ github.sha }}. Byggnummer: ${{ github.run_number }}.
|
||||
|
||||
## Installera på telefonen
|
||||
|
||||
1. Öppna denna sida i telefonens webbläsare och ladda ner **FitnessDroid.apk**
|
||||
(eller direktlänk: $BASE/FitnessDroid.apk)
|
||||
2. Öppna den nedladdade filen och tillåt installation från okänd källa om telefonen frågar.
|
||||
3. Appen uppdaterar befintlig installation — inget behöver avinstalleras (samma signeringsnyckel).
|
||||
|
||||
Kräver Android 12 eller nyare.
|
||||
EOF
|
||||
)
|
||||
rid=$(curl -s -X POST "$API/repos/$REPO/releases" \
|
||||
-H "Authorization: token $TOKEN" -H 'Content-Type: application/json' \
|
||||
-d "$(jq -n --arg tag "$TAG" --arg body "$BODY" '{tag_name:$tag,name:$tag,body:$body}')" | jq -r '.id // empty')
|
||||
if [ -z "$rid" ]; then
|
||||
rid=$(curl -s "$API/repos/$REPO/releases/tags/$TAG" \
|
||||
-H "Authorization: token $TOKEN" | jq -r '.id')
|
||||
curl -s -X PATCH "$API/repos/$REPO/releases/$rid" \
|
||||
-H "Authorization: token $TOKEN" -H 'Content-Type: application/json' \
|
||||
-d "$(jq -n --arg body "$BODY" '{body:$body}')" -o /dev/null
|
||||
fi
|
||||
echo "release id: $rid"
|
||||
for f in FitnessDroid.apk checksums.txt; do
|
||||
aid=$(curl -s "$API/repos/$REPO/releases/$rid/assets" \
|
||||
-H "Authorization: token $TOKEN" | jq -r ".[] | select(.name==\"$f\") | .id")
|
||||
if [ -n "$aid" ] && [ "$aid" != "null" ]; then
|
||||
curl -s -X DELETE "$API/repos/$REPO/releases/$rid/assets/$aid" \
|
||||
-H "Authorization: token $TOKEN" -o /dev/null
|
||||
fi
|
||||
curl -s -X POST "$API/repos/$REPO/releases/$rid/assets?name=$f" \
|
||||
-H "Authorization: token $TOKEN" \
|
||||
-F "attachment=@build/$f" -o /dev/null -w " $f -> HTTP %{http_code}\n"
|
||||
done
|
||||
Reference in New Issue
Block a user