mirror of
https://github.com/JustinZeus/Wholphin.git
synced 2026-07-08 15:50:16 +02:00
Dev: add CI to build app store releases (#468)
Adding GHA workflows to build the app store releases Also cleans up gradle build script a bit
This commit is contained in:
parent
3e2a1869ab
commit
7424f812d8
4 changed files with 123 additions and 77 deletions
27
.github/workflows/pr.yml
vendored
27
.github/workflows/pr.yml
vendored
|
|
@ -44,19 +44,18 @@ jobs:
|
||||||
id: buildapp
|
id: buildapp
|
||||||
run: |
|
run: |
|
||||||
./gradlew clean assembleDebug testDebugUnitTest --no-daemon
|
./gradlew clean assembleDebug testDebugUnitTest --no-daemon
|
||||||
apks=$(find app/build/outputs/apk -name '*.apk' -print0 | tr '\0' ',' | sed 's/,$//')
|
apks=$(find app/build/outputs \( -name '*.apk' -or -name '*.aab' \) -print0 | tr '\0' ',' | sed 's/,$//')
|
||||||
echo "apks=$apks" >> "$GITHUB_OUTPUT"
|
echo "apks=$apks" >> "$GITHUB_OUTPUT"
|
||||||
- name: Tar build dirs
|
|
||||||
|
test-patch:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: pre-commit
|
||||||
|
steps:
|
||||||
|
- name: Checkout the code
|
||||||
|
uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
fetch-depth: 1
|
||||||
|
- name: Test applying patch
|
||||||
run: |
|
run: |
|
||||||
tar -czf build.tgz ./app/.
|
git apply app/src/patches/play_store.patch
|
||||||
- uses: actions/upload-artifact@v6
|
git diff
|
||||||
id: upload-build-dirs
|
|
||||||
with:
|
|
||||||
name: "${{ env.BUILD_DIRS_ARTIFACT }}"
|
|
||||||
path: build.tgz
|
|
||||||
if-no-files-found: error
|
|
||||||
- uses: actions/upload-artifact@v6
|
|
||||||
with:
|
|
||||||
name: APKs
|
|
||||||
path: "${{ steps.buildapp.outputs.apks }}"
|
|
||||||
compression-level: 0
|
|
||||||
|
|
|
||||||
30
.github/workflows/release.yml
vendored
30
.github/workflows/release.yml
vendored
|
|
@ -39,11 +39,24 @@ jobs:
|
||||||
SIGNING_KEY: "${{ secrets.SIGNING_KEY }}"
|
SIGNING_KEY: "${{ secrets.SIGNING_KEY }}"
|
||||||
run: |
|
run: |
|
||||||
./gradlew clean assembleRelease --no-daemon
|
./gradlew clean assembleRelease --no-daemon
|
||||||
|
|
||||||
|
- name: Build app
|
||||||
|
id: buildaab
|
||||||
|
env:
|
||||||
|
KEY_ALIAS: "${{ secrets.KEY_ALIAS }}"
|
||||||
|
KEY_PASSWORD: "${{ secrets.KEY_PASSWORD }}"
|
||||||
|
KEY_STORE_PASSWORD: "${{ secrets.KEY_STORE_PASSWORD }}"
|
||||||
|
SIGNING_KEY: "${{ secrets.SIGNING_KEY }}"
|
||||||
|
run: |
|
||||||
|
git apply app/src/patches/play_store.patch
|
||||||
|
./gradlew bundleRelease --no-daemon
|
||||||
|
aab=$(find app/build/outputs -name '*.aab')
|
||||||
|
echo "aab=$aab" >> "$GITHUB_OUTPUT"
|
||||||
- name: Verify signatures
|
- name: Verify signatures
|
||||||
run: |
|
run: |
|
||||||
echo "Verify APK signatures"
|
echo "Verify APK/AAB signatures"
|
||||||
find app/build/outputs/apk -name '*.apk'
|
find app/build/outputs \( -name '*.apk' -or -name '*.aab' \)
|
||||||
find app/build/outputs/apk -name '*.apk' -print0 | xargs -0 -n1 ${{env.ANDROID_SDK_ROOT}}/build-tools/${{ env.BUILD_TOOLS_VERSION }}/apksigner verify --verbose --print-certs
|
find app/build/outputs \( -name '*.apk' -or -name '*.aab' \) -print0 | xargs -0 -n1 ${{env.ANDROID_SDK_ROOT}}/build-tools/${{ env.BUILD_TOOLS_VERSION }}/apksigner verify --verbose --print-certs
|
||||||
- name: Copy APK to shorter names
|
- name: Copy APK to shorter names
|
||||||
id: apks
|
id: apks
|
||||||
run: |
|
run: |
|
||||||
|
|
@ -59,11 +72,18 @@ jobs:
|
||||||
- name: Checksums
|
- name: Checksums
|
||||||
run: |
|
run: |
|
||||||
echo "SHA256 checksums:"
|
echo "SHA256 checksums:"
|
||||||
find app/build/outputs/apk -name '*.apk' -print0 | xargs -0 sha256sum
|
find app/build/outputs \( -name '*.apk' -or -name '*.aab' \) -print0 | xargs -0 sha256sum
|
||||||
|
- name: Upload AAB
|
||||||
|
uses: actions/upload-artifact@v6
|
||||||
|
with:
|
||||||
|
name: AAB
|
||||||
|
path: |
|
||||||
|
app/build/outputs/bundle/**/*.aab
|
||||||
|
compression-level: 0
|
||||||
- name: Create GitHub release
|
- name: Create GitHub release
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
gh release create "${{ env.TAG_NAME }}" \
|
gh release create "${{ env.TAG_NAME }}" \
|
||||||
--latest --title "${{ env.TAG_NAME }}" --verify-tag -n "Placeholder" --draft \
|
--latest --title "${{ env.TAG_NAME }}" --verify-tag -n "" --draft \
|
||||||
"app/build/outputs/apk/**/*.apk"
|
"app/build/outputs/apk/**/*.apk"
|
||||||
|
|
|
||||||
|
|
@ -47,20 +47,64 @@ android {
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
signingConfigs {
|
||||||
|
if (shouldSign) {
|
||||||
|
create("ci") {
|
||||||
|
file("ci.keystore").writeBytes(
|
||||||
|
Base64.getDecoder().decode(System.getenv("SIGNING_KEY")),
|
||||||
|
)
|
||||||
|
keyAlias = System.getenv("KEY_ALIAS")
|
||||||
|
keyPassword = System.getenv("KEY_PASSWORD")
|
||||||
|
storePassword = System.getenv("KEY_STORE_PASSWORD")
|
||||||
|
storeFile = file("ci.keystore")
|
||||||
|
enableV1Signing = true
|
||||||
|
enableV2Signing = true
|
||||||
|
enableV3Signing = true
|
||||||
|
enableV4Signing = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
isMinifyEnabled = true
|
isMinifyEnabled = false
|
||||||
proguardFiles(
|
proguardFiles(
|
||||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||||
"proguard-rules.pro",
|
"proguard-rules.pro",
|
||||||
)
|
)
|
||||||
isDebuggable = false
|
isDebuggable = false
|
||||||
|
if (shouldSign) {
|
||||||
|
signingConfig = signingConfigs.getByName("ci")
|
||||||
|
} else {
|
||||||
|
val localPropertiesFile = project.rootProject.file("local.properties")
|
||||||
|
if (localPropertiesFile.exists()) {
|
||||||
|
val properties = Properties()
|
||||||
|
properties.load(localPropertiesFile.inputStream())
|
||||||
|
val signingConfigName = properties["release.signing.config"]?.toString()
|
||||||
|
if (signingConfigName != null) {
|
||||||
|
signingConfig = signingConfigs.getByName(signingConfigName)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
debug {
|
debug {
|
||||||
isMinifyEnabled = false
|
isMinifyEnabled = false
|
||||||
isDebuggable = true
|
isDebuggable = true
|
||||||
applicationIdSuffix = ".debug"
|
applicationIdSuffix = ".debug"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
applicationVariants.all {
|
||||||
|
val variant = this
|
||||||
|
variant.outputs
|
||||||
|
.map { it as com.android.build.gradle.internal.api.BaseVariantOutputImpl }
|
||||||
|
.forEach { output ->
|
||||||
|
val abi = output.getFilter("ABI").let { if (it != null) "-$it" else "" }
|
||||||
|
val outputFileName =
|
||||||
|
"Wholphin-${variant.baseName}-${variant.versionName}-${variant.versionCode}$abi.apk"
|
||||||
|
output.outputFileName = outputFileName
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility = JavaVersion.VERSION_11
|
sourceCompatibility = JavaVersion.VERSION_11
|
||||||
|
|
@ -81,63 +125,6 @@ android {
|
||||||
room {
|
room {
|
||||||
schemaDirectory("$projectDir/schemas")
|
schemaDirectory("$projectDir/schemas")
|
||||||
}
|
}
|
||||||
signingConfigs {
|
|
||||||
if (shouldSign) {
|
|
||||||
create("ci") {
|
|
||||||
file("ci.keystore").writeBytes(
|
|
||||||
Base64.getDecoder().decode(System.getenv("SIGNING_KEY")),
|
|
||||||
)
|
|
||||||
keyAlias = System.getenv("KEY_ALIAS")
|
|
||||||
keyPassword = System.getenv("KEY_PASSWORD")
|
|
||||||
storePassword = System.getenv("KEY_STORE_PASSWORD")
|
|
||||||
storeFile = file("ci.keystore")
|
|
||||||
enableV1Signing = true
|
|
||||||
enableV2Signing = true
|
|
||||||
enableV3Signing = true
|
|
||||||
enableV4Signing = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buildTypes {
|
|
||||||
release {
|
|
||||||
isMinifyEnabled = false
|
|
||||||
|
|
||||||
proguardFiles(
|
|
||||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
|
||||||
"proguard-rules.pro",
|
|
||||||
)
|
|
||||||
if (shouldSign) {
|
|
||||||
signingConfig = signingConfigs.getByName("ci")
|
|
||||||
} else {
|
|
||||||
val localPropertiesFile = project.rootProject.file("local.properties")
|
|
||||||
if (localPropertiesFile.exists()) {
|
|
||||||
val properties = Properties()
|
|
||||||
properties.load(localPropertiesFile.inputStream())
|
|
||||||
val signingConfigName = properties["release.signing.config"]?.toString()
|
|
||||||
if (signingConfigName != null) {
|
|
||||||
signingConfig = signingConfigs.getByName(signingConfigName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
debug {
|
|
||||||
if (shouldSign) {
|
|
||||||
signingConfig = signingConfigs.getByName("ci")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
applicationVariants.all {
|
|
||||||
val variant = this
|
|
||||||
variant.outputs
|
|
||||||
.map { it as com.android.build.gradle.internal.api.BaseVariantOutputImpl }
|
|
||||||
.forEach { output ->
|
|
||||||
val abi = output.getFilter("ABI").let { if (it != null) "-$it" else "" }
|
|
||||||
val outputFileName =
|
|
||||||
"Wholphin-${variant.baseName}-${variant.versionName}-${variant.versionCode}$abi.apk"
|
|
||||||
output.outputFileName = outputFileName
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
splits {
|
splits {
|
||||||
abi {
|
abi {
|
||||||
|
|
|
||||||
40
app/src/patches/play_store.patch
Normal file
40
app/src/patches/play_store.patch
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
commit f82fb1a2d8ff9917a7bdb0bc7101a0474359ccdc
|
||||||
|
Author: Damontecres <damontecres@gmail.com>
|
||||||
|
Date: Sat Nov 22 13:00:55 2025 -0500
|
||||||
|
|
||||||
|
Setup for play store
|
||||||
|
|
||||||
|
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
|
||||||
|
index 6d84299..12576af 100644
|
||||||
|
--- a/app/src/main/AndroidManifest.xml
|
||||||
|
+++ b/app/src/main/AndroidManifest.xml
|
||||||
|
@@ -4,7 +4,6 @@
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
- <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
||||||
|
<uses-permission
|
||||||
|
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="28" />
|
||||||
|
@@ -17,7 +16,7 @@
|
||||||
|
android:required="false" />
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.software.leanback"
|
||||||
|
- android:required="false" />
|
||||||
|
+ android:required="true" />
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.microphone"
|
||||||
|
android:required="false" />
|
||||||
|
diff --git a/app/src/main/java/com/github/damontecres/wholphin/services/UpdateChecker.kt b/app/src/main/java/com/github/damontecres/wholphin/services/UpdateChecker.kt
|
||||||
|
index c7ac435..fa42fe1 100644
|
||||||
|
--- a/app/src/main/java/com/github/damontecres/wholphin/services/UpdateChecker.kt
|
||||||
|
+++ b/app/src/main/java/com/github/damontecres/wholphin/services/UpdateChecker.kt
|
||||||
|
@@ -62,7 +62,7 @@ class UpdateChecker
|
||||||
|
|
||||||
|
private val NOTE_REGEX = Regex("<!-- app-note:(.+) -->")
|
||||||
|
|
||||||
|
- val ACTIVE = true
|
||||||
|
+ val ACTIVE = false
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun maybeShowUpdateToast(
|
||||||
Loading…
Add table
Add a link
Reference in a new issue