fix schedulers not running, shuffle things around, again!

master
Josha von Gizycki 3 weeks ago
parent e7327b8c18
commit 19c6f25928

@ -11,7 +11,7 @@
<groupId>alfred</groupId>
<artifactId>web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>0.0.2-SNAPSHOT</version>
<name>web</name>
<description>Alfred CI</description>

@ -2,8 +2,10 @@ package alfred.web
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.scheduling.annotation.EnableScheduling
@SpringBootApplication
@EnableScheduling
open class WebApplication
fun main(args: Array<String>) {

@ -1,9 +1,22 @@
package alfred.web.core
import alfred.web.core.build.BuildId
import alfred.web.core.build.LogFile
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Value
import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Service
import java.nio.file.Files
import java.nio.file.Files.createFile
import java.nio.file.Paths
import java.time.Instant
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import java.time.temporal.ChronoUnit
import java.util.concurrent.TimeUnit
import kotlin.io.path.deleteIfExists
import kotlin.io.path.getLastModifiedTime
@Service
class AlfredHome(
@ -13,10 +26,33 @@ class AlfredHome(
val homePath = Paths.get(home)
fun logsDir() =
homePath.resolve("logs")
val logsDir = homePath.resolve("logs")
fun buildConfig(buildId: BuildId) =
homePath.resolve("builds/${buildId}.properties")
fun newLogFile(build: BuildId): LogFile {
val nowStr = LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME)
val fileName = "$build.$nowStr.log"
logsDir.toFile().mkdir()
val logFilePath = logsDir.resolve(fileName)
return LogFile(createFile(logFilePath).toFile())
}
@Scheduled(fixedRate = 1, initialDelay = 1, timeUnit = TimeUnit.HOURS)
fun cleanup() {
val maxAge = Instant.now().minus(7L, ChronoUnit.DAYS)
Files.list(logsDir)
.filter { it.getLastModifiedTime().toInstant().isBefore(maxAge) }
.forEach {
logger.info("log file $it gets old, deleting")
it.deleteIfExists()
}
}
val logger: Logger = LoggerFactory.getLogger(this::class.java)
}

@ -1,9 +1,12 @@
package alfred.web.core
import alfred.web.core.build.BuildId
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Service
import java.time.Instant
import java.util.concurrent.TimeUnit
@Service
class Handles {
@ -25,11 +28,18 @@ class Handles {
)
}
@Scheduled(fixedDelay = 60_000)
@Scheduled(fixedRate = 1, initialDelay = 1, timeUnit = TimeUnit.MINUTES)
fun cleanup() {
handles.removeIf { !it.handle.isAlive }
handles
.filter { !it.handle.isAlive }
.forEach {
logger.info("handle for command '${it.command}' is not alive and too old, removing")
}
handles
.removeIf { !it.handle.isAlive }
}
val logger: Logger = LoggerFactory.getLogger(this::class.java)
}
data class Handle(

@ -7,9 +7,6 @@ import org.slf4j.LoggerFactory
import org.springframework.http.HttpStatus
import org.springframework.stereotype.Service
import org.springframework.web.bind.annotation.ResponseStatus
import java.nio.file.Files.createFile
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import java.util.*
@Service
@ -41,17 +38,6 @@ class Builds(
return props.toBuildConfig(env)
}
fun createLogFile(build: BuildId): LogFile {
val nowStr = LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME)
val fileName = "$build.$nowStr.log"
val logsDir = alfredHome.logsDir()
logsDir.toFile().mkdir()
val logFilePath = logsDir.resolve(fileName)
return LogFile(createFile(logFilePath).toFile())
}
}
private fun Properties.toBuildConfig(env: Map<String, String>) =

@ -11,7 +11,7 @@ import kotlin.text.lines
import kotlin.text.trim
class LogFile(
val backingFile: File
val backingFile: File,
) {
val logger: Logger = LoggerFactory.getLogger(this::class.java)

@ -1,5 +1,6 @@
package alfred.web.core.runner
import alfred.web.core.AlfredHome
import alfred.web.core.build.BuildContext
import alfred.web.core.build.BuildId
import alfred.web.core.build.Builds
@ -23,7 +24,8 @@ class GitRunner(
val workspaces: Workspaces,
val eventPublisher: ApplicationEventPublisher,
val git: Git,
val script: Script
val script: Script,
val alfredHome: AlfredHome
) {
val scriptsDir = ".alfred"
@ -32,7 +34,7 @@ class GitRunner(
fun run(buildId: BuildId, rev: String): ProcessInfo {
val config = builds.buildConfig(buildId)
val logFile = builds.createLogFile(buildId)
val logFile = alfredHome.newLogFile(buildId)
logger.info("preparing process for build $buildId")
logger.info("log file: ${logFile.backingFile.absolutePath}")

@ -1,5 +1,6 @@
package alfred.web.core.runner
import alfred.web.core.AlfredHome
import alfred.web.core.build.*
import alfred.web.core.event.BuildFinished
import alfred.web.core.process.Script
@ -14,12 +15,13 @@ class ScriptRunner(
val builds: Builds,
val workspaces: Workspaces,
val eventPublisher: ApplicationEventPublisher,
val script: Script
val script: Script,
val alfredHome: AlfredHome
) {
fun run(buildId: BuildId, rev: String?): ProcessInfo {
val config = builds.buildConfig(buildId)
val logFile = builds.createLogFile(buildId)
val logFile = alfredHome.newLogFile(buildId)
logger.info("preparing process for build $buildId")
logger.info("log file: ${logFile.backingFile.absolutePath}")

@ -14,3 +14,5 @@ spring.mail.password=${ALFRED_MAIL_PASSWORD}
spring.mail.properties.mail.smtp.auth=${ALFRED_MAIL_SMTP_AUTH : true}
spring.mail.properties.mail.smtp.starttls.enable=${ALFRED_MAIL_STARTTLS : true}
ALFRED_MAIL_FROM=alfred@your.service
management.endpoints.web.exposure.include=scheduledtasks,health

@ -17,7 +17,6 @@ import io.mockk.verify
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.io.TempDir
import java.nio.file.Path
import java.nio.file.Paths
class GitRunnerTest {
@ -36,12 +35,10 @@ class GitRunnerTest {
val workspacesSpy = spyk(Workspaces())
val home = mockk<AlfredHome>()
every { home.buildConfig(any()) } returns homeDir.resolve("simple-git.properties")
every { home.logsDir() } returns homeDir.resolve("logs")
every { home.homePath } returns homeDir
val home = AlfredHome(homeDir.toString())
homeDir.resolve("builds").toFile().mkdir()
homeDir
.resolve("simple-git.properties")
.resolve("builds/simple-git.properties")
.toFile()
.writeText(buildProperties())
@ -51,7 +48,8 @@ class GitRunnerTest {
workspaces = workspacesSpy,
eventPublisher = eventPublisher,
git = git,
script = script
script = script,
alfredHome = home
)
// When

@ -17,12 +17,10 @@ class ScriptRunnerTest {
@Test
fun runs(@TempDir homeDir: Path) {
// Given
val home = mockk<AlfredHome>()
every { home.buildConfig(any()) } returns homeDir.resolve("simple-script.properties")
every { home.logsDir() } returns homeDir.resolve("logs")
every { home.homePath } returns homeDir
val home = AlfredHome(homeDir.toString())
homeDir.resolve("builds").toFile().mkdir()
homeDir
.resolve("simple-script.properties")
.resolve("builds/simple-script.properties")
.toFile()
.writeText(buildProperties())
@ -39,7 +37,8 @@ class ScriptRunnerTest {
builds = Builds(home),
workspaces = workspaces,
eventPublisher = eventPublisher,
script = script
script = script,
alfredHome = home
)
// When

Loading…
Cancel
Save