From 3f00b87a022e92e3bf341d40d05d81b5538e4974 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Sat, 11 Mar 2017 16:35:38 -0800 Subject: Add slick bindings --- .../src/main/scala/io/crashbox/ci/Main.scala | 3 ++ .../src/main/scala/io/crashbox/ci/Schedulers.scala | 15 +++++--- .../src/main/scala/io/crashbox/ci/Storage.scala | 45 ++++++++++++++++++---- 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/crashbox-server/src/main/scala/io/crashbox/ci/Main.scala b/crashbox-server/src/main/scala/io/crashbox/ci/Main.scala index 74a5527..55971b1 100644 --- a/crashbox-server/src/main/scala/io/crashbox/ci/Main.scala +++ b/crashbox-server/src/main/scala/io/crashbox/ci/Main.scala @@ -3,6 +3,8 @@ package io.crashbox.ci import scala.util.{Failure, Success} import akka.http.scaladsl.Http +import scala.concurrent._ +import scala.concurrent.duration._ object Main extends Core @@ -15,6 +17,7 @@ object Main def main(args: Array[String]): Unit = { reapDeadBuilds() + Await.result(setupDatabase(), 10.seconds) val host = config.getString("crashbox.host") val port = config.getInt("crashbox.port") diff --git a/crashbox-server/src/main/scala/io/crashbox/ci/Schedulers.scala b/crashbox-server/src/main/scala/io/crashbox/ci/Schedulers.scala index cb4e793..0beec31 100644 --- a/crashbox-server/src/main/scala/io/crashbox/ci/Schedulers.scala +++ b/crashbox-server/src/main/scala/io/crashbox/ci/Schedulers.scala @@ -122,12 +122,15 @@ trait Schedulers { override def receive = { case ScheduleBuild(url) => - val buildId = newBuildId() - val buildManager = - context.actorOf(BuildManager(buildId, url), s"build-${buildId}") - context watch buildManager - runningBuilds += buildId -> buildManager - sender ! buildId + val client = sender + //todo handle failure + nextBuild(url.toString).foreach{ build => + val buildManager = + context.actorOf(BuildManager(build.id, url), s"build-${build.id}") + context watch buildManager + runningBuilds += build.id -> buildManager + client ! build.id + } case CancelBuild(id) => runningBuilds.get(id).foreach { builder => diff --git a/crashbox-server/src/main/scala/io/crashbox/ci/Storage.scala b/crashbox-server/src/main/scala/io/crashbox/ci/Storage.scala index 1035940..0f095eb 100644 --- a/crashbox-server/src/main/scala/io/crashbox/ci/Storage.scala +++ b/crashbox-server/src/main/scala/io/crashbox/ci/Storage.scala @@ -8,18 +8,51 @@ import java.io.{ InputStream, OutputStream } +import scala.concurrent.Future import java.util.UUID - -import slick.driver.H2Driver.api._ +import slick.jdbc.H2Profile.api._ trait Storage { self: Core with Parsers with Schedulers => type BuildId = UUID + case class Build( + id: BuildId, + url: String, + rebuild: Int, + state: Int + ) + + class Builds(tag: Tag) extends Table[Build](tag, "builds") { + def id = column[BuildId]("id", O.PrimaryKey) + def url = column[String]("url") + def rebuild = column[Int]("rebuild") + def state = column[Int]("state") + def * = (id, url, rebuild, state) <> (Build.tupled, Build.unapply) + } + val builds = TableQuery[Builds] + + val database = Database.forConfig("crashbox.db") - - def newBuildId() = UUID.randomUUID() + def setupDatabase(): Future[Unit] = { + log.info("Preparing build database") + val setup = DBIO.seq( + builds.schema.create + ) + database.run(setup) + } + def newBuildId(): BuildId = UUID.randomUUID() + + def nextBuild(url: String): Future[Build] = database.run{ + builds.filter(_.url === url).map(_.rebuild).take(1).result.headOption + }.map{ no => + Build(newBuildId(), url, no.getOrElse(0), 0) + } + + def updateBuildState(buildId: BuildId, state: BuildState) = { + log.info(s"Build $buildId: state update $state") + } private val streamsDirectory: File = new File( @@ -55,8 +88,4 @@ trait Storage { self: Core with Parsers with Schedulers => new FileInputStream(logFile(buildId, task)) } - def updateBuildState(buildId: BuildId, state: BuildState) = { - log.info(s"Build $buildId: state update $state") - } - } -- cgit v1.2.3