Skip to content

Commit

Permalink
build: refactor build process
Browse files Browse the repository at this point in the history
- Allow developers to trigger run of application on emulator directly instead of setting target ABI first
  • Loading branch information
WhiredPlanck committed Dec 13, 2024
1 parent 3feacc5 commit 4001d78
Show file tree
Hide file tree
Showing 9 changed files with 145 additions and 159 deletions.
15 changes: 5 additions & 10 deletions .github/workflows/nightly-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ jobs:
build:
if: ${{ github.repository == 'osfans/trime' && github.ref == 'refs/heads/develop' }}
runs-on: ubuntu-24.04
env:
SIGN_KEY_BASE64: ${{ secrets.SIGNING_KEY }}
SIGN_KEY_STORE_PWD: ${{ secrets.KEY_STORE_PASSWORD }}
SIGN_KEY_ALIAS: ${{ secrets.ALIAS }}
SIGN_KEY_PWD: ${{ secrets.KEY_PASSWORD }}
steps:
- name: Checkout
uses: actions/checkout@v4
Expand Down Expand Up @@ -44,16 +49,6 @@ jobs:
- name: Setup Android SDK
uses: android-actions/setup-android@v3

- name: Setup keystore
run: |
echo ${{ secrets.SIGNING_KEY }} | base64 --decode | cat >> $(pwd)/signingkey.jks
cat << EOF > keystore.properties
storeFile=$(pwd)/signingkey.jks
storePassword=${{ secrets.KEY_STORE_PASSWORD }}
keyAlias=${{ secrets.ALIAS }}
keyPassword=${{ secrets.KEY_PASSWORD }}
EOF
- name: Build Trime
run: make release

Expand Down
15 changes: 5 additions & 10 deletions .github/workflows/release-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ env:
jobs:
build:
runs-on: ubuntu-24.04
env:
SIGN_KEY_BASE64: ${{ secrets.SIGNING_KEY }}
SIGN_KEY_STORE_PWD: ${{ secrets.KEY_STORE_PASSWORD }}
SIGN_KEY_ALIAS: ${{ secrets.ALIAS }}
SIGN_KEY_PWD: ${{ secrets.KEY_PASSWORD }}
steps:
- name: Checkout
uses: actions/checkout@v4
Expand Down Expand Up @@ -43,16 +48,6 @@ jobs:
- name: Setup Android SDK
uses: android-actions/setup-android@v3

- name: Setup keystore
run: |
echo ${{ secrets.SIGNING_KEY }} | base64 --decode | cat >> $(pwd)/signingkey.jks
cat << EOF > keystore.properties
storeFile=$(pwd)/signingkey.jks
storePassword=${{ secrets.KEY_STORE_PASSWORD }}
keyAlias=${{ secrets.ALIAS }}
keyPassword=${{ secrets.KEY_PASSWORD }}
EOF
- name: Build Trime
run: make release

Expand Down
16 changes: 6 additions & 10 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,12 @@ android {
isMinifyEnabled = false
// proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-android.txt"
signingConfig =
with(ApkRelease) {
if (project.buildApkRelease) {
signingConfigs.create("release") {
storeFile = file(project.storeFile!!)
storePassword = project.storePassword
keyAlias = project.keyAlias
keyPassword = project.keyPassword
}
} else {
null
project.signKeyFile?.let {
signingConfigs.create("release") {
storeFile = it
storePassword = project.signKeyStorePwd
keyAlias = project.signKeyAlias
keyPassword = project.signKeyPwd
}
}

Expand Down
34 changes: 0 additions & 34 deletions build-logic/convention/src/main/kotlin/ApkRelease.kt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
//
// SPDX-License-Identifier: GPL-3.0-or-later

import Versions.cmakeVersion
import Versions.ndkVersion
import com.android.build.api.dsl.CommonExtension
import org.gradle.api.Plugin
import org.gradle.api.Project
Expand Down Expand Up @@ -31,16 +29,12 @@ open class NativeBaseConventionPlugin : Plugin<Project> {
}
}

splits {
abi {
isEnable = true
reset()
if (ApkRelease.run { target.buildApkRelease }) {
include("x86", "x86_64", "armeabi-v7a", "arm64-v8a")
} else {
include(*target.buildABI.split(',').toTypedArray())
}
isUniversalApk = false
splits.abi {
isEnable = true
isUniversalApk = false
reset()
(target.buildAbiOverride?.split(",") ?: Versions.supportedAbis).forEach {
include(it)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@
//
// SPDX-License-Identifier: GPL-3.0-or-later

import ApkRelease.buildApkRelease
import Versions.cmakeVersion
import Versions.ndkVersion
import org.gradle.api.DefaultTask
import org.gradle.api.Plugin
import org.gradle.api.Project
Expand Down Expand Up @@ -34,9 +31,7 @@ class NativeCacheHashPlugin : Plugin<Project> {
buildString {
appendLine(cmakeVersion)
appendLine(ndkVersion)
if (!buildApkRelease) {
appendLine(buildABI)
}
appendLine(buildAbiOverride)
appendLine(runCmd("git submodule status"))
fileTree("src/main/jni/cmake").forEach { module ->
appendLine(sha256(module))
Expand Down
112 changes: 112 additions & 0 deletions build-logic/convention/src/main/kotlin/ProjectExtensions.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
/*
* SPDX-FileCopyrightText: 2015 - 2024 Rime community
* SPDX-License-Identifier: GPL-3.0-or-later
*/

import org.gradle.api.Project
import org.gradle.api.Task
import java.io.ByteArrayOutputStream
import java.io.File
import kotlin.io.encoding.Base64
import kotlin.io.encoding.ExperimentalEncodingApi

fun Project.runCmd(cmd: String): String =
ByteArrayOutputStream().use {
project.exec {
commandLine = cmd.split(" ")
standardOutput = it
}
it.toString().trim()
}

val Project.assetsDir: File
get() = file("src/main/assets").also { it.mkdirs() }

val Project.cleanTask: Task
get() = tasks.getByName("clean")

val Project.cmakeVersion
get() = envOrProp("CMAKE_VERSION", "cmakeVersion") { Versions.DEFAULT_CMAKE }

val Project.ndkVersion
get() = envOrProp("NDK_VERSION", "ndkVersion") { Versions.DEFAULT_NDK }

val Project.buildAbiOverride
get() = envOrPropOrNull("BUILD_ABI", "buildABI")

val Project.builder
get() =
envOrProp("CI_NAME", "ciName") {
runCatching { runCmd("git config user.name").ifEmpty { "(Unknown)" } }.getOrElse { "(Unknown)" }
}

val Project.buildGitRepo
get() =
envOrProp("BUILD_GIT_REPO", "buildGitRepo") {
runCmd("git remote get-url origin")
.replaceFirst("^git@github\\.com:", "https://github.com/")
.replaceFirst("\\.git\$", "")
}

val Project.buildVersionName
get() =
envOrProp("BUILD_VERSION_NAME", "buildVersionName") {
// 构建正式版时过滤掉 nightly 标签
val cmd =
if (builder.contains("nightly", ignoreCase = true)) {
"git describe --tags --long --always --match nightly"
} else {
"git describe --tags --long --always --match v*"
}
runCmd(cmd)
}

val Project.buildCommitHash
get() =
envOrProp("BUILD_COMMIT_HASH", "buildCommitHash") {
runCmd("git rev-parse HEAD")
}

val Project.buildTimestamp
get() =
envOrProp("BUILD_TIMESTAMP", "buildTimestamp") {
System.currentTimeMillis().toString()
}

val Project.signKeyBase64: String?
get() = envOrPropOrNull("SIGN_KEY_BASE64", "signKeyBase64")

val Project.signKeyStore
get() = envOrPropOrNull("SIGN_KEY_STORE", "signKeyStore")

val Project.signKeyStorePwd
get() = envOrPropOrNull("SIGN_KEY_STORE_PWD", "signKeyStorePwd")

val Project.signKeyAlias
get() = envOrPropOrNull("SIGN_KEY_ALIAS", "signKeyAlias")

val Project.signKeyPwd
get() = envOrPropOrNull("SIGN_KEY_PWD", "signKeyPwd")

val Project.signKeyFile: File?
get() {
signKeyStore?.let {
val file = File(it)
if (file.exists()) return file
}

@OptIn(ExperimentalEncodingApi::class)
signKeyBase64?.let {
val buildDir = layout.buildDirectory.asFile.get()
buildDir.mkdirs()
val file = File.createTempFile("sign-", ".ks", buildDir)
try {
file.writeBytes(Base64.decode(it))
return file
} catch (e: Exception) {
println(e.localizedMessage ?: e.stackTraceToString())
file.delete()
}
}
return null
}
75 changes: 7 additions & 68 deletions build-logic/convention/src/main/kotlin/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@

import kotlinx.serialization.json.Json
import org.gradle.api.Project
import org.gradle.api.Task
import java.io.ByteArrayOutputStream
import java.io.File

val json = Json { prettyPrint = true }

inline fun envOrDefault(
env: String,
Expand All @@ -20,17 +19,6 @@ inline fun Project.propertyOrDefault(
default()
}

fun Project.runCmd(cmd: String): String =
ByteArrayOutputStream().use {
project.exec {
commandLine = cmd.split(" ")
standardOutput = it
}
it.toString().trim()
}

val json = Json { prettyPrint = true }

internal inline fun Project.envOrProp(
env: String,
prop: String,
Expand All @@ -41,57 +29,8 @@ internal inline fun Project.envOrProp(
}
}

val Project.assetsDir: File
get() = file("src/main/assets").also { it.mkdirs() }

val Project.cleanTask: Task
get() = tasks.getByName("clean")

// Change default ABI here
val Project.buildABI
get() =
envOrProp("BUILD_ABI", "buildABI") {
// "armeabi-v7a"
"arm64-v8a"
// "x86"
// "x86_64"
}

val Project.builder
get() =
envOrProp("CI_NAME", "ciName") {
runCatching { runCmd("git config user.name").ifEmpty { "(Unknown)" } }.getOrElse { "(Unknown)" }
}

val Project.buildGitRepo
get() =
envOrProp("BUILD_GIT_REPO", "buildGitRepo") {
runCmd("git remote get-url origin")
.replaceFirst("^git@github\\.com:", "https://github.com/")
.replaceFirst("\\.git\$", "")
}

val Project.buildVersionName
get() =
envOrProp("BUILD_VERSION_NAME", "buildVersionName") {
// 构建正式版时过滤掉 nightly 标签
val cmd =
if (builder.contains("nightly", ignoreCase = true)) {
"git describe --tags --long --always --match nightly"
} else {
"git describe --tags --long --always --match v*"
}
runCmd(cmd)
}

val Project.buildCommitHash
get() =
envOrProp("BUILD_COMMIT_HASH", "buildCommitHash") {
runCmd("git rev-parse HEAD")
}

val Project.buildTimestamp
get() =
envOrProp("BUILD_TIMESTAMP", "buildTimestamp") {
System.currentTimeMillis().toString()
}
fun Project.envOrPropOrNull(
env: String,
prop: String,
) = System.getenv(env)?.takeIf { it.isNotBlank() }
?: runCatching { property(prop)!!.toString() }.getOrNull()
12 changes: 3 additions & 9 deletions build-logic/convention/src/main/kotlin/Versions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,9 @@
//
// SPDX-License-Identifier: GPL-3.0-or-later

import org.gradle.api.Project

object Versions {
private const val DEFAULT_CMAKE = "3.22.1"
private const val DEFAULT_NDK = "25.2.9519653"

val Project.cmakeVersion
get() = envOrProp("CMAKE_VERSION", "cmakeVersion") { DEFAULT_CMAKE }
const val DEFAULT_CMAKE = "3.22.1"
const val DEFAULT_NDK = "25.2.9519653"

val Project.ndkVersion
get() = envOrProp("NDK_VERSION", "ndkVersion") { DEFAULT_NDK }
val supportedAbis = setOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
}

0 comments on commit 4001d78

Please sign in to comment.