Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to deploy my spray API into production?

Tags:

scala

akka

spray

I'm thinking about how should be the process to deploy my already locally tested rest api to the cloud, lets say an infrastructure as a service (not a platform as a service such as Heroku) like amazon.

I have my local envorinment set up with sbt up and running but my question is How should I deploy this in a production environment?

Is it sane to define a process in which the devops pulls the most recent changes from the git repo and then simply executes sbt run?

I want to know how does the teams that uses scala+spray+sbt deploys their apis to a production environment.

like image 743
juanpavergara Avatar asked Jul 01 '13 02:07

juanpavergara


2 Answers

The heart of our services is scala + akka + spray + mongo. So we are using GitHub for version control. After merging checked PRs to the master branch, Jenkins automaticaly tests'n'builds project. If all tests were successful then Jenking runs a couple of scripts:

  1. Increment project version (currently written in shell, but will be changed to sbt)
  2. Run assembly task with sbt-assembly
  3. Run deploy script (written in Python with Fabric) wich deploys our jar to EC2

Basicaly on the thrid step you have a couple of choices:

Make a runnable jar using IO/Spray boot file:

object Boot extends App {
  implicit val system = ActorSystem("ServiceName")
  val log = system.log
  val service = system.actorOf(Props[Service], name="serviceActor")
  IO(Http) ! Http.Bind(service, interface = host, port = port)
}

Make a runnable jar as Akka's microkernel:

In this case you should extend Bootable trait and override startup and shutdown methods:

class Kernel extends Bootable {
  // many lines of code
  def startup() {
    scheduler.start()
    SomeActorSystem.startup()
  }

  def shutdown() {
    scheduler.shutdown()
    SomeActorSystem.shutdown()
    system.shutdown()
  }
}

Using a TypeSafe startscript:

Can't show an example, but it has a good intro on github =)

We are using all of this way in different cases.

like image 100
4lex1v Avatar answered Nov 10 '22 14:11

4lex1v


You should build a jar with the plugin sbt-assembly

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.9.0")

Then you can run the jar in production with java -jar

If you give version number to your project, this is a rather classic process.

Hope it helps.

like image 21
Arnaud Gourlay Avatar answered Nov 10 '22 16:11

Arnaud Gourlay