All checks were successful
Build & Deploy APK / build (push) Successful in 1m53s
The release build had no signing config, producing an unsigned APK that Android refuses to install. Added debug keystore signing for release builds and a CI step to ensure the keystore exists. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
98 lines
3.8 KiB
YAML
98 lines
3.8 KiB
YAML
name: Build & Deploy APK
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
run: |
|
|
git clone --depth 1 --branch "${GITHUB_REF_NAME}" \
|
|
"http://admin:${{ secrets.GITHUB_TOKEN }}@192.168.5.10:3000/${GITHUB_REPOSITORY}.git" .
|
|
|
|
- name: Validate environment
|
|
run: |
|
|
echo "Java: $(java --version 2>&1 | head -1)"
|
|
echo "ANDROID_HOME: $ANDROID_HOME"
|
|
echo "sdk.dir=$ANDROID_HOME" > local.properties
|
|
cat local.properties
|
|
|
|
- name: Ensure signing keystore
|
|
run: |
|
|
KEYSTORE="$HOME/.android/debug.keystore"
|
|
if [ ! -f "$KEYSTORE" ]; then
|
|
mkdir -p "$HOME/.android"
|
|
keytool -genkeypair -v \
|
|
-keystore "$KEYSTORE" \
|
|
-alias androiddebugkey \
|
|
-keyalg RSA -keysize 2048 -validity 10000 \
|
|
-storepass android -keypass android \
|
|
-dname "CN=Android Debug,O=Android,C=US"
|
|
echo "Generated debug keystore"
|
|
else
|
|
echo "Keystore already exists"
|
|
fi
|
|
|
|
- name: Build Release APK
|
|
shell: bash
|
|
run: |
|
|
GRADLE_PROPS="gradle/wrapper/gradle-wrapper.properties"
|
|
DIST_URL=$(grep distributionUrl "$GRADLE_PROPS" | cut -d'=' -f2 | sed 's/\\//g')
|
|
GRADLE_DIR="$HOME/.gradle/wrapper/dists/gradle-8.11.1-bin"
|
|
|
|
if [ ! -d "$GRADLE_DIR" ]; then
|
|
mkdir -p /tmp/gradle-download
|
|
wget -q "$DIST_URL" -O /tmp/gradle-download/gradle.zip
|
|
mkdir -p "$GRADLE_DIR"
|
|
unzip -qo /tmp/gradle-download/gradle.zip -d "$GRADLE_DIR"
|
|
rm /tmp/gradle-download/gradle.zip
|
|
fi
|
|
|
|
GRADLE_BIN=$(find "$GRADLE_DIR" -name "gradle" -path "*/bin/gradle" | head -1)
|
|
echo "Using Gradle: $GRADLE_BIN"
|
|
"$GRADLE_BIN" assembleRelease --no-daemon
|
|
|
|
- name: Deploy APK to Gitea release
|
|
shell: bash
|
|
run: |
|
|
GITEA="http://192.168.5.10:3000"
|
|
REPO="admin/itstransport-android"
|
|
TOKEN="${{ secrets.GITHUB_TOKEN }}"
|
|
|
|
VERSION_NAME=$(grep 'versionName' app/build.gradle.kts | head -1 | sed 's/.*"\(.*\)".*/\1/')
|
|
VERSION_CODE=$(grep 'versionCode' app/build.gradle.kts | head -1 | sed 's/[^0-9]*//g')
|
|
COMMIT_MSG=$(git log -1 --pretty=%s)
|
|
|
|
APK=$(find app/build/outputs/apk/release -name "*.apk" | head -1)
|
|
test -n "$APK" || { echo "ERROR: No APK found"; exit 1; }
|
|
|
|
TAG="v${VERSION_NAME}-${VERSION_CODE}"
|
|
echo "Deploying $TAG — $(du -h "$APK" | cut -f1)"
|
|
|
|
# Delete existing release with same tag (if re-building same version)
|
|
EXISTING=$(curl -s -H "Authorization: token $TOKEN" "$GITEA/api/v1/repos/$REPO/releases/tags/$TAG" | python3 -c "import sys,json; print(json.load(sys.stdin).get('id',''))" 2>/dev/null)
|
|
if [ -n "$EXISTING" ]; then
|
|
curl -s -X DELETE -H "Authorization: token $TOKEN" "$GITEA/api/v1/repos/$REPO/releases/$EXISTING"
|
|
echo "Deleted existing release $EXISTING"
|
|
fi
|
|
|
|
# Create release
|
|
RELEASE_ID=$(curl -s -X POST -H "Authorization: token $TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
"$GITEA/api/v1/repos/$REPO/releases" \
|
|
-d "{\"tag_name\":\"$TAG\",\"name\":\"v$VERSION_NAME\",\"body\":\"$COMMIT_MSG\",\"draft\":false,\"prerelease\":false}" \
|
|
| python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
|
|
|
|
echo "Created release ID: $RELEASE_ID"
|
|
|
|
# Upload APK as release asset
|
|
curl -s -X POST -H "Authorization: token $TOKEN" \
|
|
-H "Content-Type: application/octet-stream" \
|
|
"$GITEA/api/v1/repos/$REPO/releases/$RELEASE_ID/assets?name=itstransport.apk" \
|
|
--data-binary @"$APK"
|
|
|
|
echo "APK uploaded to release $TAG"
|