sanitize env for processes, restructure log file

master
Josha von Gizycki 3 weeks ago
parent dbb10b6e13
commit a70ae91ce4

@ -40,7 +40,6 @@ class Builds(
.filter { it.key.toString() == it.key.toString().uppercase() } .filter { it.key.toString() == it.key.toString().uppercase() }
.associate { Pair(it.key.toString(), it.value.toString()) } .associate { Pair(it.key.toString(), it.value.toString()) }
// diverge into ScriptedBasedConfig and GitBasedConfig
return props.toBuildConfig(env) return props.toBuildConfig(env)
} }

@ -21,9 +21,11 @@ class LogFile(
append("At your service.") append("At your service.")
append("Build $buildId, rev [${rev ?: "-none-"}] started at ${ZonedDateTime.now()}") append("Build $buildId, rev [${rev ?: "-none-"}] started at ${ZonedDateTime.now()}")
append("Workspace directory is: ${workspace.toFile().absolutePath}") append("Workspace directory is: ${workspace.toFile().absolutePath}")
append("------------------------------------------------------------")
} }
fun footer() { fun footer() {
append("------------------------------------------------------------")
append("Build finished at ${ZonedDateTime.now()}") append("Build finished at ${ZonedDateTime.now()}")
} }

@ -0,0 +1,24 @@
package alfred.web.core.process
import alfred.web.core.build.BuildConfig
import alfred.web.core.build.LogFile
import org.springframework.stereotype.Service
@Service
class ProcessEnvironment {
fun forBuild(
config: BuildConfig,
logFile: LogFile,
rev: String?,
useEnv: MutableMap<String, String> = System.getenv()
) =
useEnv.let { env ->
env.filter { it.key.contains("ALFRED") }.forEach { env.remove(it.key) }
env.putAll(config.env)
env["ALFRED_LOG_FILE"] = logFile.backingFile.absolutePath
env["ALFRED_REV"] = rev ?: ""
env
}
}

@ -1,21 +1,23 @@
package alfred.web.core package alfred.web.core.process
import alfred.web.core.build.BuildConfig import alfred.web.core.build.BuildConfig
import alfred.web.core.build.BuildContext import alfred.web.core.build.BuildContext
import alfred.web.core.build.LogFile import alfred.web.core.build.LogFile
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
import kotlin.apply
@Service @Service
class Processes { class Processes(
val env: ProcessEnvironment
) {
fun builder(config: BuildConfig, logFile: LogFile, rev: String?): ProcessBuilder = fun builder(config: BuildConfig, logFile: LogFile, rev: String?): ProcessBuilder =
ProcessBuilder() ProcessBuilder()
.redirectOutput(ProcessBuilder.Redirect.appendTo(logFile.backingFile)) .redirectOutput(ProcessBuilder.Redirect.appendTo(logFile.backingFile))
.redirectError(ProcessBuilder.Redirect.appendTo(logFile.backingFile)) .redirectError(ProcessBuilder.Redirect.appendTo(logFile.backingFile))
.apply { .apply {
environment().putAll(config.env) environment().clear()
environment()["ALFRED_LOG_FILE"] = logFile.backingFile.absolutePath environment().putAll(env.forBuild(config, logFile, rev))
environment()["ALFRED_REV"] = rev
} }
fun builder(ctx: BuildContext) = fun builder(ctx: BuildContext) =

@ -2,7 +2,6 @@ package alfred.web.core.runner
import alfred.web.core.Handle import alfred.web.core.Handle
import alfred.web.core.Handles import alfred.web.core.Handles
import alfred.web.core.Processes
import alfred.web.core.build.BuildContext import alfred.web.core.build.BuildContext
import alfred.web.core.build.BuildId import alfred.web.core.build.BuildId
import alfred.web.core.build.Builds import alfred.web.core.build.Builds
@ -10,6 +9,7 @@ import alfred.web.core.build.ProcessInfo
import alfred.web.core.build.Workspace import alfred.web.core.build.Workspace
import alfred.web.core.build.Workspaces import alfred.web.core.build.Workspaces
import alfred.web.core.event.BuildFinished import alfred.web.core.event.BuildFinished
import alfred.web.core.process.Processes
import org.slf4j.Logger import org.slf4j.Logger
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.context.ApplicationEventPublisher import org.springframework.context.ApplicationEventPublisher
@ -63,7 +63,7 @@ class GitRunner(
} }
private fun clone(ctx: BuildContext, ws: Workspace) { private fun clone(ctx: BuildContext, ws: Workspace) {
ctx.log("build ${ctx.buildId}: cloning ${ctx.config.gitRepo} into $ws") ctx.log("cloning ${ctx.config.gitRepo} into $ws")
val proc = processes.builder(ctx.config, ctx.logFile, "") val proc = processes.builder(ctx.config, ctx.logFile, "")
.command("git", "clone", ctx.config.gitRepo, ".") .command("git", "clone", ctx.config.gitRepo, ".")
@ -78,7 +78,7 @@ class GitRunner(
} }
private fun checkout(ctx: BuildContext, ws: Workspace) { private fun checkout(ctx: BuildContext, ws: Workspace) {
ctx.log("build ${ctx.buildId}: checkout rev ${ctx.rev}") ctx.log("checkout rev ${ctx.rev}")
val proc = processes.builder(ctx.config, ctx.logFile, "") val proc = processes.builder(ctx.config, ctx.logFile, "")
.command("git", "checkout", ctx.rev) .command("git", "checkout", ctx.rev)
@ -93,12 +93,12 @@ class GitRunner(
} }
private fun execScripts(ctx: BuildContext, ws: Workspace) { private fun execScripts(ctx: BuildContext, ws: Workspace) {
ctx.log("build ${ctx.buildId}: looking for scripts $scriptFiles in $scriptsDir/") ctx.log("looking for scripts $scriptFiles in $scriptsDir/")
scriptFiles.forEach { script -> scriptFiles.forEach { script ->
val scriptFile = shFile(ws, script) val scriptFile = shFile(ws, script)
if (scriptFile.exists()) { if (scriptFile.exists()) {
ctx.log("build ${ctx.buildId}: found script $script, running it") ctx.log("found script $script, running it")
ctx.log("Running build file: $script") ctx.log("Running build file: $script")
@ -109,7 +109,7 @@ class GitRunner(
handles.add(Handle(scriptProcess.toHandle(), ctx.buildId)) handles.add(Handle(scriptProcess.toHandle(), ctx.buildId))
val ret = scriptProcess.waitFor() val ret = scriptProcess.waitFor()
ctx.log("build ${ctx.buildId}: script $script returned $ret") ctx.log("script $script returned $ret")
ctx.log("$script returned $ret") ctx.log("$script returned $ret")
} else { } else {
@ -130,7 +130,7 @@ class FailedToClone(
buildId: BuildId, buildId: BuildId,
gitRepo: String gitRepo: String
) : RuntimeException( ) : RuntimeException(
"${FailedToClone::class}: failed to clone $gitRepo for build id $buildId" "failed to clone $gitRepo for build id $buildId"
) )
class FailedToCheckout( class FailedToCheckout(

@ -2,9 +2,9 @@ package alfred.web.core.runner
import alfred.web.core.Handle import alfred.web.core.Handle
import alfred.web.core.Handles import alfred.web.core.Handles
import alfred.web.core.Processes
import alfred.web.core.build.* import alfred.web.core.build.*
import alfred.web.core.event.BuildFinished import alfred.web.core.event.BuildFinished
import alfred.web.core.process.Processes
import org.slf4j.Logger import org.slf4j.Logger
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.context.ApplicationEventPublisher import org.springframework.context.ApplicationEventPublisher
@ -47,6 +47,7 @@ class ScriptRunner(
val wsDir = workspaces.prepare(ctx) val wsDir = workspaces.prepare(ctx)
ctx.logFile.header(ctx.buildId, ctx.rev, wsDir) ctx.logFile.header(ctx.buildId, ctx.rev, wsDir)
ctx.log("running ${ctx.config.script} in ${wsDir.toAbsolutePath()}")
val process = processes.builder(ctx) val process = processes.builder(ctx)
.command(ctx.config.script) .command(ctx.config.script)
.directory(wsDir.toFile()) .directory(wsDir.toFile())

@ -0,0 +1,40 @@
package alfred.web.core.process
import alfred.web.core.build.BuildConfig
import alfred.web.core.build.LogFile
import org.junit.jupiter.api.Test
import java.nio.file.Files
import kotlin.test.assertEquals
class ProcessEnvironmentTest {
@Test
fun `removes all previous ALFRED vars`(){
val processEnvironment = ProcessEnvironment()
val cfg = BuildConfig(
user = "Gandalf",
apikey = "Mellon",
script = "",
gitRepo = "",
gitCloneTimeout = 0,
workspace = "",
mailReportTo = "",
env = mapOf(
"ENV1" to "ENV-VAL-1"
)
)
val logFile = LogFile(Files.createTempFile("alfred-test", "").toFile())
val env = processEnvironment.forBuild(
config = cfg,
logFile = logFile,
rev = "",
useEnv = mutableMapOf(
"ALFRED_TOP_SECRET" to "You-Don't-Know-Jack"
)
)
assertEquals(setOf("ENV1", "ALFRED_LOG_FILE", "ALFRED_REV"), env.keys)
}
}

@ -0,0 +1,18 @@
ALFRED_MAIL_HOST=testing.host
ALFRED_MAIL_PORT=1337
ALFRED_MAIL_USERNAME=testing.username
ALFRED_MAIL_PASSWORD=testing.password
ALFRED_HOME=/tmp/alfred
ALFRED_PORT=8080
server.port=${ALFRED_PORT}
spring.application.name=Alfred - RCE AAS
spring.mail.host=${ALFRED_MAIL_HOST}
spring.mail.port=${ALFRED_MAIL_PORT}
spring.mail.username=${ALFRED_MAIL_USERNAME}
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
Loading…
Cancel
Save