Don't build Suwayomi-Server, just download it

This commit is contained in:
Syer10
2024-03-29 16:11:49 -04:00
parent 4e4d0bfa9d
commit 5aedfea67f
2 changed files with 41 additions and 70 deletions

View File

@@ -5,9 +5,8 @@ import Config.tachideskVersion
import de.undercouch.gradle.tasks.download.Download import de.undercouch.gradle.tasks.download.Download
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.Task import org.gradle.api.Task
import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.Delete import org.gradle.api.tasks.Delete
import org.gradle.api.tasks.Exec import org.gradle.internal.impldep.com.google.gson.Gson
import org.gradle.kotlin.dsl.TaskContainerScope import org.gradle.kotlin.dsl.TaskContainerScope
import org.gradle.kotlin.dsl.register import org.gradle.kotlin.dsl.register
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
@@ -22,11 +21,8 @@ import kotlin.streams.asSequence
private const val tachideskGroup = "tachidesk" private const val tachideskGroup = "tachidesk"
private const val deleteOldTachideskTask = "deleteOldTachidesk" private const val deleteOldTachideskTask = "deleteOldTachidesk"
private const val downloadTask = "downloadTar" private const val downloadApiTask = "downloadApiJson"
private const val extractTask = "extractTar" private const val downloadTachidesk = "downloadTachidesk"
private const val setupCITask = "setupServerCI"
private const val buildTachideskTask = "buildTachidesk"
private const val copyTachideskJarTask = "copyTachidesk"
private const val signTachideskJar = "signJar" private const val signTachideskJar = "signJar"
private const val modifyTachideskJarManifest = "modifyManifest" private const val modifyTachideskJarManifest = "modifyManifest"
private const val deleteTmpFolderTask = "deleteTmp" private const val deleteTmpFolderTask = "deleteTmp"
@@ -60,12 +56,12 @@ private fun Project.getSigningIdentity() = "${properties["compose.desktop.mac.si
private fun isSigning(properties: Map<String, Any?>) = properties["compose.desktop.mac.sign"].toString() == "true" private fun isSigning(properties: Map<String, Any?>) = properties["compose.desktop.mac.sign"].toString() == "true"
private const val tmpPath = "tmp" private const val tmpPath = "tmp"
private val tarUrl = if (preview) { private val apiUrl = if (preview) {
"https://github.com/Suwayomi/Suwayomi-Server/archive/$previewCommit.tar.gz" "https://api.github.com/repos/Suwayomi/Suwayomi-Server-preview/releases/tags/$previewCommit"
} else { } else {
"https://github.com/Suwayomi/Suwayomi-Server/archive/refs/tags/$tachideskVersion.tar.gz" "https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/tags/$tachideskVersion"
} }
private const val tmpTar = "$tmpPath/Suwayomi-Server.tar.gz" private const val tmpJson = "$tmpPath/Suwayomi-Server.json"
private val fileSuffix get() = if (preview) { private val fileSuffix get() = if (preview) {
previewCommit previewCommit
} else { } else {
@@ -77,6 +73,15 @@ private const val macosJarFolder = "$tmpPath/macos/jar/"
private const val destination = "src/main/resources/" private const val destination = "src/main/resources/"
private const val finalJar = "src/main/resources/Tachidesk.jar" private const val finalJar = "src/main/resources/Tachidesk.jar"
internal class Asset(
val name: String,
val browser_download_url: String,
)
internal class Release(
val assets: Array<Asset>
)
fun TaskContainerScope.registerTachideskTasks(project: Project) { fun TaskContainerScope.registerTachideskTasks(project: Project) {
with(project) { with(project) {
register<Delete>(deleteOldTachideskTask) { register<Delete>(deleteOldTachideskTask) {
@@ -84,73 +89,41 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) {
val tachideskJar = file(finalJar) val tachideskJar = file(finalJar)
onlyIf { onlyIf {
tachideskJar.exists() && JarFile(tachideskJar).use { jar -> tachideskJar.exists() && JarFile(tachideskJar).use { jar ->
jar.manifest?.mainAttributes?.getValue(Attributes.Name.IMPLEMENTATION_VERSION)?.toIntOrNull() != serverCode jar.manifest?.mainAttributes?.getValue("JUI-KEY")?.toIntOrNull() != serverCode
} }
} }
delete(tachideskJar) delete(tachideskJar)
} }
register<Download>(downloadTask) { register<Download>(downloadApiTask) {
group = tachideskGroup group = tachideskGroup
mustRunAfter(deleteOldTachideskTask) mustRunAfter(deleteOldTachideskTask)
onlyIf { !tachideskExists(projectDir) && !file(tmpTar).exists() } onlyIf { !tachideskExists(projectDir) && !file(finalJar).exists() }
onlyIfTachideskDoesntExist(projectDir) onlyIfTachideskDoesntExist(projectDir)
src(tarUrl) src(apiUrl)
dest(tmpTar) dest(tmpJson)
} }
register<Copy>(extractTask) { register<Download>(downloadTachidesk) {
group = tachideskGroup group = tachideskGroup
mustRunAfter(downloadTask) mustRunAfter(downloadApiTask)
onlyIf { !tachideskExists(projectDir) && !file(tmpServerFolder).exists() } onlyIf { !tachideskExists(projectDir) && !file(finalJar).exists() }
onlyIfTachideskDoesntExist(projectDir) onlyIfTachideskDoesntExist(projectDir)
from(tarTree(tmpTar))
into(tmpPath)
}
register<Copy>(setupCITask) {
group = tachideskGroup
mustRunAfter(extractTask)
onlyIfTachideskDoesntExist(projectDir)
from(file("$tmpServerFolder.github/runner-files/ci-gradle.properties"))
into(file("$tmpServerFolder.gradle/"))
rename {
it.replace("ci-", "")
}
}
register<Exec>(buildTachideskTask) {
group = tachideskGroup
mustRunAfter(setupCITask)
onlyIfTachideskDoesntExist(projectDir)
workingDir(tmpServerFolder)
val os = DefaultNativePlatform.getCurrentOperatingSystem()
when {
os.isWindows -> commandLine("cmd", "/c", "gradlew", ":server:shadowJar", "--no-daemon", "-x", "ktlintFormat")
os.isLinux || os.isMacOsX -> commandLine("./gradlew", ":server:shadowJar", "--no-daemon", "-x", "ktlintFormat")
}
}
register(copyTachideskJarTask) {
group = tachideskGroup
mustRunAfter(buildTachideskTask)
onlyIfTachideskDoesntExist(projectDir)
doFirst { doFirst {
file("${tmpServerFolder}server/build/").listFiles() val gson = Gson()
.orEmpty() val jar = gson.fromJson(file(tmpJson).reader(), Release::class.java)
.find { .assets
it.nameWithoutExtension.startsWith("Suwayomi-Server-$tachideskVersion-r") && .find { it.name.endsWith("jar") }
it.extension == "jar" src(jar?.browser_download_url)
} dest(finalJar)
?.copyTo(file("${destination}Tachidesk.jar"))
} }
} }
register(signTachideskJar) { register(signTachideskJar) {
group = tachideskGroup group = tachideskGroup
mustRunAfter(copyTachideskJarTask) mustRunAfter(downloadTachidesk)
onlyIfSigning(project) onlyIfSigning(project)
doFirst { doFirst {
@@ -175,7 +148,7 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) {
"--force", "--force",
"--prefix", "ca.gosyer.", "--prefix", "ca.gosyer.",
"--sign", "Developer ID Application: ${getSigningIdentity()}", "--sign", "Developer ID Application: ${getSigningIdentity()}",
tmpFile.toAbsolutePath().toString() tmpFile.toAbsolutePath().toString(),
) )
} }
@@ -193,7 +166,7 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) {
val tachideskJar = file(finalJar) val tachideskJar = file(finalJar)
onlyIf { onlyIf {
tachideskJar.exists() && JarFile(tachideskJar).use { jar -> tachideskJar.exists() && JarFile(tachideskJar).use { jar ->
jar.manifest?.mainAttributes?.getValue(Attributes.Name.IMPLEMENTATION_VERSION)?.toIntOrNull() != serverCode jar.manifest?.mainAttributes?.getValue("JUI-KEY")?.toIntOrNull() != serverCode
} }
} }
@@ -201,7 +174,7 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) {
val manifest = JarFile(tachideskJar).use { jar -> val manifest = JarFile(tachideskJar).use { jar ->
Manifest(jar.manifest) Manifest(jar.manifest)
} }
manifest.mainAttributes[Attributes.Name.IMPLEMENTATION_VERSION] = serverCode.toString() manifest.mainAttributes[Attributes.Name("JUI-KEY")] = serverCode.toString()
FileSystems.newFileSystem(tachideskJar.toPath()).use { fs -> FileSystems.newFileSystem(tachideskJar.toPath()).use { fs ->
val manifestFile = fs.getPath("META-INF/MANIFEST.MF") val manifestFile = fs.getPath("META-INF/MANIFEST.MF")
val manifestBak = fs.getPath("META-INF/MANIFEST.MF" + ".bak") val manifestBak = fs.getPath("META-INF/MANIFEST.MF" + ".bak")
@@ -227,14 +200,11 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) {
dependsOn( dependsOn(
deleteOldTachideskTask, deleteOldTachideskTask,
downloadTask, downloadApiTask,
extractTask, downloadTachidesk,
setupCITask,
buildTachideskTask,
copyTachideskJarTask,
signTachideskJar, signTachideskJar,
modifyTachideskJarManifest, modifyTachideskJarManifest,
deleteTmpFolderTask deleteTmpFolderTask,
) )
} }
} }

View File

@@ -31,7 +31,6 @@ import org.lighthousegames.logging.logging
import java.io.File.pathSeparatorChar import java.io.File.pathSeparatorChar
import java.io.IOException import java.io.IOException
import java.io.Reader import java.io.Reader
import java.util.jar.Attributes
import java.util.jar.JarInputStream import java.util.jar.JarInputStream
import kotlin.concurrent.thread import kotlin.concurrent.thread
import kotlin.io.path.absolutePathString import kotlin.io.path.absolutePathString
@@ -100,7 +99,9 @@ class ServerService
private suspend fun runService() { private suspend fun runService() {
process?.destroy() process?.destroy()
process?.waitFor() withIOContext {
process?.waitFor()
}
_initialized.value = if (host.value) { _initialized.value = if (host.value) {
ServerResult.STARTING ServerResult.STARTING
} else { } else {
@@ -116,7 +117,7 @@ class ServerService
try { try {
val jarVersion = withIOContext { val jarVersion = withIOContext {
JarInputStream(FileSystem.SYSTEM.source(jarFile).buffer().inputStream()).use { jar -> JarInputStream(FileSystem.SYSTEM.source(jarFile).buffer().inputStream()).use { jar ->
jar.manifest?.mainAttributes?.getValue(Attributes.Name.IMPLEMENTATION_VERSION)?.toIntOrNull() jar.manifest?.mainAttributes?.getValue("JUI-KEY")?.toIntOrNull()
} }
} }