Skip to content

Commit b84bc72

Browse files
committed
Add Gradle tasks for start/stop AA server
1 parent 5faa563 commit b84bc72

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

jacodb-ets/build.gradle.kts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import com.github.gradle.node.npm.task.NpmTask
22
import java.io.FileNotFoundException
3+
import java.io.IOException
4+
import java.net.Socket
35

46
plugins {
57
kotlin("plugin.serialization")
@@ -40,6 +42,73 @@ tasks.register<NpmTask>("runArkAnalyzerServer") {
4042
args = listOf("run", "server")
4143
}
4244

45+
val port = 50051
46+
val serverPidFile = layout.buildDirectory.file("server.pid")
47+
val serverLogFile = layout.buildDirectory.file("server.log")
48+
49+
tasks.register("startArkAnalyzerServer") {
50+
group = "arkanalyzer"
51+
description = "Start the ArkAnalyzer server in background."
52+
doLast {
53+
val process = ProcessBuilder("npm", "run", "server")
54+
.directory(file("arkanalyzer"))
55+
.redirectOutput(serverLogFile.get().asFile)
56+
.redirectErrorStream(true)
57+
.apply {
58+
val env = environment()
59+
env["ARKANALYZER_PORT"] = port.toString()
60+
}
61+
.start()
62+
63+
val pid = process.pid()
64+
serverPidFile.get().asFile.writeText(pid.toString())
65+
println("ArkAnalyzer server started with PID $pid")
66+
println("Logs are being written to: ${serverLogFile.get().asFile.absolutePath}")
67+
68+
// Wait until the server is ready
69+
val maxRetries = 10
70+
val retryDelay = 100L // in milliseconds
71+
repeat(maxRetries) {
72+
try {
73+
Socket("localhost", port).use { socket ->
74+
if (socket.isConnected) {
75+
println("ArkAnalyzer server is ready on port $port")
76+
return@doLast
77+
}
78+
}
79+
} catch (_: IOException) {
80+
// Server not ready yet, retry
81+
}
82+
Thread.sleep(retryDelay)
83+
}
84+
throw RuntimeException(
85+
"ArkAnalyzer server did not start within the expected time. " +
86+
"Check the logs at ${serverLogFile.get().asFile.absolutePath} for more details."
87+
)
88+
}
89+
}
90+
91+
tasks.register("stopArkAnalyzerServer") {
92+
group = "arkanalyzer"
93+
description = "Stop the ArkAnalyzer server."
94+
doLast {
95+
if (!serverPidFile.get().asFile.exists()) {
96+
println("ArkAnalyzer server is not running (PID file not found).")
97+
return@doLast
98+
}
99+
val pid = serverPidFile.get().asFile.readText().trim().toLong()
100+
println("Stopping ArkAnalyzer server with PID $pid")
101+
try {
102+
ProcessBuilder("kill", pid.toString()).start().waitFor()
103+
println("ArkAnalyzer server with PID $pid stopped.")
104+
} catch (e: Exception) {
105+
println("Failed to stop ArkAnalyzer server with PID $pid: ${e.message}")
106+
} finally {
107+
serverPidFile.get().asFile.delete()
108+
}
109+
}
110+
}
111+
43112
// Example usage:
44113
// ```
45114
// export ARKANALYZER_DIR=~/dev/arkanalyzer

0 commit comments

Comments
 (0)