summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jakob@odersky.com>2017-03-11 16:35:38 -0800
committerJakob Odersky <jakob@odersky.com>2017-03-11 16:35:38 -0800
commit3f00b87a022e92e3bf341d40d05d81b5538e4974 (patch)
tree7f1df3653c9555679c3c3d3c4632125ae2a3bec4
parent5b57a310aec9a6f8bf7d3b42786fe0d758d40083 (diff)
downloadcrashbox-ci-3f00b87a022e92e3bf341d40d05d81b5538e4974.tar.gz
crashbox-ci-3f00b87a022e92e3bf341d40d05d81b5538e4974.tar.bz2
crashbox-ci-3f00b87a022e92e3bf341d40d05d81b5538e4974.zip
Add slick bindings
-rw-r--r--crashbox-server/src/main/scala/io/crashbox/ci/Main.scala3
-rw-r--r--crashbox-server/src/main/scala/io/crashbox/ci/Schedulers.scala15
-rw-r--r--crashbox-server/src/main/scala/io/crashbox/ci/Storage.scala45
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")
- }
-
}