fix: CI Release 构建签名 fallback + debug keystore 保障
- build.gradle.kts: release.jks 不存在时自动 fallback 到 ~/.android/debug.keystore - ci.yml: build-release job 增加 Ensure debug keystore 步骤 - ci.yml: Release APK 完整性验证(manifest/arsc/res/) 上一轮 CI 失败原因: validateSigningRelease 找不到 release.jks
This commit is contained in:
parent
246f5dece3
commit
360dde342f
17
.github/workflows/ci.yml
vendored
17
.github/workflows/ci.yml
vendored
@ -72,7 +72,7 @@ jobs:
|
|||||||
retention-days: 14
|
retention-days: 14
|
||||||
|
|
||||||
build-release:
|
build-release:
|
||||||
name: Release APK (no signing)
|
name: Release APK (debug-signed)
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: test
|
needs: test
|
||||||
steps:
|
steps:
|
||||||
@ -88,6 +88,20 @@ jobs:
|
|||||||
- name: Grant execute permission for gradlew
|
- name: Grant execute permission for gradlew
|
||||||
run: chmod +x 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
|
- name: Assemble Release
|
||||||
run: ./gradlew assembleRelease
|
run: ./gradlew assembleRelease
|
||||||
|
|
||||||
@ -99,7 +113,6 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "✅ Release APK size: $(du -h "$APK" | cut -f1)"
|
echo "✅ Release APK size: $(du -h "$APK" | cut -f1)"
|
||||||
# Verify APK contains essential resources
|
|
||||||
unzip -l "$APK" | grep -q "AndroidManifest.xml" || { echo "❌ AndroidManifest.xml missing"; exit 1; }
|
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 "resources.arsc" || { echo "❌ resources.arsc missing"; exit 1; }
|
||||||
unzip -l "$APK" | grep -q "res/" || { echo "❌ res/ directory missing"; exit 1; }
|
unzip -l "$APK" | grep -q "res/" || { echo "❌ res/ directory missing"; exit 1; }
|
||||||
|
|||||||
@ -27,10 +27,22 @@ android {
|
|||||||
|
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
create("release") {
|
create("release") {
|
||||||
storeFile = rootProject.file("release.jks")
|
// CI 环境没有 release.jks,自动 fallback 到 debug keystore
|
||||||
storePassword = System.getenv("KEYSTORE_PASSWORD") ?: "RainyToken2026!"
|
// Release workflow 通过 Secret 注入 release.jks
|
||||||
keyAlias = System.getenv("KEYSTORE_ALIAS") ?: "rainy"
|
val keystoreFile = rootProject.file("release.jks")
|
||||||
keyPassword = System.getenv("KEY_PASSWORD") ?: "RainyToken2026!"
|
if (keystoreFile.exists()) {
|
||||||
|
storeFile = keystoreFile
|
||||||
|
storePassword = System.getenv("KEYSTORE_PASSWORD") ?: "RainyToken2026!"
|
||||||
|
keyAlias = System.getenv("KEYSTORE_ALIAS") ?: "rainy"
|
||||||
|
keyPassword = System.getenv("KEY_PASSWORD") ?: "RainyToken2026!"
|
||||||
|
} else {
|
||||||
|
// Fallback: 使用 SDK 默认 debug keystore(CI 构建验证用)
|
||||||
|
val debugKeystore = file("${System.getProperty("user.home")}/.android/debug.keystore")
|
||||||
|
storeFile = debugKeystore
|
||||||
|
storePassword = "android"
|
||||||
|
keyAlias = "androiddebugkey"
|
||||||
|
keyPassword = "android"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user