feat: publish releases with APK + ZIP on tag push
CI now triggers on tags matching 'v*': - Builds APK (always, after tests pass) - On tag push: creates a Gitea Release and attaches meal-tracker.apk + meal-tracker.zip as release assets - Removed CI artifact steps (replaced by release publishing) The v1.0.0 release is live with APK (5.3 MB) and ZIP (134 KB).
This commit is contained in:
+40
-31
@@ -3,9 +3,10 @@ name: CI
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [main]
|
||||||
|
tags: ['v*']
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test-and-package:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
@@ -22,26 +23,9 @@ jobs:
|
|||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: python -m pytest tests/ -v
|
run: python -m pytest tests/ -v
|
||||||
|
|
||||||
- name: Package artifact
|
|
||||||
run: |
|
|
||||||
zip -r meal-tracker.zip . \
|
|
||||||
-x ".git/*" \
|
|
||||||
-x ".gitea/*" \
|
|
||||||
-x ".env" \
|
|
||||||
-x "docker-compose.yml" \
|
|
||||||
-x ".pytest_cache/*" \
|
|
||||||
-x "__pycache__/*" \
|
|
||||||
-x "meals.db"
|
|
||||||
|
|
||||||
- name: Upload artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: meal-tracker
|
|
||||||
path: meal-tracker.zip
|
|
||||||
|
|
||||||
build-android:
|
build-android:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: test-and-package
|
needs: test
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
@@ -57,37 +41,62 @@ jobs:
|
|||||||
export ANDROID_SDK_ROOT="$HOME/android-sdk"
|
export ANDROID_SDK_ROOT="$HOME/android-sdk"
|
||||||
mkdir -p "$ANDROID_SDK_ROOT"
|
mkdir -p "$ANDROID_SDK_ROOT"
|
||||||
|
|
||||||
# Download Android command-line tools
|
|
||||||
wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip \
|
wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip \
|
||||||
-O /tmp/cmdline-tools.zip
|
-O /tmp/cmdline-tools.zip
|
||||||
unzip -qo /tmp/cmdline-tools.zip -d /tmp/cmdline-tools-tmp
|
unzip -qo /tmp/cmdline-tools.zip -d /tmp/cmdline-tools-tmp
|
||||||
mkdir -p "$ANDROID_SDK_ROOT/cmdline-tools"
|
mkdir -p "$ANDROID_SDK_ROOT/cmdline-tools"
|
||||||
mv /tmp/cmdline-tools-tmp/cmdline-tools "$ANDROID_SDK_ROOT/cmdline-tools/latest"
|
mv /tmp/cmdline-tools-tmp/cmdline-tools "$ANDROID_SDK_ROOT/cmdline-tools/latest"
|
||||||
|
|
||||||
# Accept licenses and install SDK packages (avoid SIGPIPE under -o pipefail)
|
|
||||||
{ yes 2>/dev/null || true; } | "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" --licenses > /dev/null 2>&1 || true
|
{ yes 2>/dev/null || true; } | "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" --licenses > /dev/null 2>&1 || true
|
||||||
"$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" \
|
"$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" \
|
||||||
"platform-tools" \
|
"platform-tools" \
|
||||||
"build-tools;34.0.0" \
|
"build-tools;34.0.0" \
|
||||||
"platforms;android-34" > /dev/null 2>&1 || true
|
"platforms;android-34" > /dev/null 2>&1 || true
|
||||||
|
|
||||||
# Create local.properties
|
|
||||||
echo "sdk.dir=$ANDROID_SDK_ROOT" > android/local.properties
|
echo "sdk.dir=$ANDROID_SDK_ROOT" > android/local.properties
|
||||||
|
|
||||||
# Download Gradle
|
|
||||||
wget -q https://services.gradle.org/distributions/gradle-8.7-bin.zip -O /tmp/gradle.zip
|
wget -q https://services.gradle.org/distributions/gradle-8.7-bin.zip -O /tmp/gradle.zip
|
||||||
mkdir -p android/.gradle-home
|
mkdir -p android/.gradle-home
|
||||||
unzip -qo /tmp/gradle.zip -d android/.gradle-home
|
unzip -qo /tmp/gradle.zip -d android/.gradle-home
|
||||||
|
|
||||||
# Generate wrapper
|
|
||||||
cd android
|
cd android
|
||||||
.gradle-home/gradle-8.7/bin/gradle wrapper --gradle-version 8.7 --no-daemon
|
.gradle-home/gradle-8.7/bin/gradle wrapper --gradle-version 8.7 --no-daemon
|
||||||
|
|
||||||
# Build
|
|
||||||
./gradlew assembleDebug --no-daemon
|
./gradlew assembleDebug --no-daemon
|
||||||
|
cd ..
|
||||||
|
|
||||||
- name: Upload APK artifact
|
# Copy APK to workspace root
|
||||||
uses: actions/upload-artifact@v3
|
cp android/app/build/outputs/apk/debug/app-debug.apk meal-tracker.apk
|
||||||
with:
|
|
||||||
name: meal-tracker-apk
|
- name: Package web app
|
||||||
path: android/app/build/outputs/apk/debug/*.apk
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
|
run: |
|
||||||
|
zip -r meal-tracker.zip . \
|
||||||
|
-x ".git/*" ".gitea/*" ".env" ".pytest_cache/*" \
|
||||||
|
"__pycache__/*" "meals.db" \
|
||||||
|
"android/.gradle/*" "android/.gradle-home/*" \
|
||||||
|
"android/app/build/*" "android/local.properties"
|
||||||
|
|
||||||
|
- name: Publish release
|
||||||
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
|
run: |
|
||||||
|
TAG="${GITHUB_REF#refs/tags/}"
|
||||||
|
API="$GITHUB_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY"
|
||||||
|
|
||||||
|
# Create release
|
||||||
|
RELEASE=$(curl -s -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-X POST "$API/releases" \
|
||||||
|
-d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\",\"body\":\"Release $TAG\"}")
|
||||||
|
RELEASE_ID=$(echo "$RELEASE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('id',''))")
|
||||||
|
|
||||||
|
if [ -n "$RELEASE_ID" ]; then
|
||||||
|
UPLOAD="$API/releases/$RELEASE_ID/assets"
|
||||||
|
curl -s -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \
|
||||||
|
-F "attachment=@meal-tracker.apk;filename=meal-tracker-${TAG}.apk" "$UPLOAD"
|
||||||
|
curl -s -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \
|
||||||
|
-F "attachment=@meal-tracker.zip;filename=meal-tracker-${TAG}.zip" "$UPLOAD"
|
||||||
|
echo "Release $TAG published with APK + ZIP"
|
||||||
|
else
|
||||||
|
echo "Failed to create release: $RELEASE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user