name: CI on: push: branches: [main] pull_request: jobs: test: name: Unit Tests & Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - uses: android-actions/setup-android@v3 with: packages: 'platforms;android-35 build-tools;35.0.0' - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Run unit tests run: ./gradlew testDebugUnitTest - name: Upload test results if: always() uses: actions/upload-artifact@v4 with: name: unit-test-results path: app/build/test-results/testDebugUnitTest/*.xml retention-days: 14 - name: Run lint run: ./gradlew lintDebug - name: Upload lint results if: always() uses: actions/upload-artifact@v4 with: name: lint-results path: app/build/reports/lint-results-debug.* retention-days: 14 build-debug: name: Debug APK runs-on: ubuntu-latest needs: test steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - uses: android-actions/setup-android@v3 with: packages: 'platforms;android-35 build-tools;35.0.0' - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Assemble Debug run: ./gradlew assembleDebug - name: Upload Debug APK uses: actions/upload-artifact@v4 with: name: debug-apk path: app/build/outputs/apk/debug/app-debug.apk retention-days: 14 build-release: name: Release APK (debug-signed) runs-on: ubuntu-latest needs: test steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - uses: android-actions/setup-android@v3 with: packages: 'platforms;android-35 build-tools;35.0.0' - name: Grant execute permission for gradlew run: chmod +x gradlew # 确保存在 debug keystore(某些 runner 镜像可能没有) - name: Ensure debug keystore run: | KS="$HOME/.android/debug.keystore" mkdir -p "$HOME/.android" if [ ! -f "$KS" ]; then keytool -genkeypair -v -keystore "$KS" -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 -dname "CN=Android Debug,O=Android,C=US" echo "Generated debug keystore" else echo "Debug keystore exists" fi # CI 无 release.jks;build.gradle.kts 自动 fallback 到 debug keystore # 只验证编译 + 资源完整性,签名由 Release workflow 用 secrets 完成 - name: Assemble Release run: ./gradlew assembleRelease - name: Verify Release APK run: | APK=app/build/outputs/apk/release/app-release.apk if [ ! -f "$APK" ]; then echo "❌ Release APK not found" exit 1 fi echo "✅ Release APK size: $(du -h "$APK" | cut -f1)" unzip -l "$APK" | grep -q "AndroidManifest.xml" || { echo "❌ AndroidManifest.xml missing"; exit 1; } unzip -l "$APK" | grep -q "resources.arsc" || { echo "❌ resources.arsc missing"; exit 1; } unzip -l "$APK" | grep -q "res/" || { echo "❌ res/ directory missing"; exit 1; } echo "✅ APK integrity verified: manifest + arsc + res/ all present" - name: Upload Release APK uses: actions/upload-artifact@v4 with: name: release-apk path: app/build/outputs/apk/release/app-release.apk retention-days: 14