step1 - init 
step2 - fatjar 
step3 - tomcat 
step4 - multi-project 
step5 - docker 
step6 - custom plugin 
 
 
 
name :=  " chiken"  
version :=  " 1.0"  
scalaVersion :=  " 2.11.8"  
  
 
package  chiken 
object  Chiken  extends  App  {
  println(" 知見です"  )
}
 
 
app/
 ├ src/main/scala/chiken/Chiken.scala
 └ build.sbt
 
 
$ sbt run
知見です
 
 
 
 
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3")
 
 
app/
 ├ project/plugins.sbt
 ├ src/main/scala/chiken/Chiken.scala
 └ build.sbt
 
 
$ sbt assembly
$ java -jar ./target/scala-2.11/chiken-assembly-1.0.jar
知見です
 
 
 
 
addSbtPlugin(" com.earldouglas"   %  " xsbt-web-plugin"   %  " 2.1.0"  )
  
 
name :=  " chiken"  
version :=  " 1.0"  
scalaVersion :=  " 2.11.8"  
libraryDependencies +=  " javax.servlet"   %  " javax.servlet-api"   %  " 3.0.1"   %  " provided"  
enablePlugins(TomcatPlugin )
  
 
package  chiken 
import  javax .servlet .http .{HttpServlet , HttpServletRequest , HttpServletResponse }
class  ChikenServlet  extends  HttpServlet  {
  override  def  doGet (request : HttpServletRequest , response : HttpServletResponse ) =  {
    val  s  =  response.getOutputStream
    s.print(" CHIKEN DESU"  )
    s.flush()
  }
}
 
 
<?xml  version =" 1.0"  encoding =" UTF-8"  ?>
<web-app  xmlns =" http://java.sun.com/xml/ns/javaee"  
         xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"  
         xsi : schemaLocation =" http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
         id =" serv"   version =" 3.0"  >
    <servlet >
        <servlet-name >ChikenServlet</servlet-name >
        <servlet-class >chiken.ChikenServlet</servlet-class >
    </servlet >
    <servlet-mapping >
        <servlet-name >ChikenServlet</servlet-name >
        <url-pattern >/*</url-pattern >
    </servlet-mapping >
</web-app >  
 
app/
 ├ project/plugins.sbt
 ├ src/main/
 │      ├ scala/chiken/ChikenServlet.scala
 │      └ webapp/WEB-INF/web.xml
 └ build.sbt
 
 
$ sbt ~tomcat:start
1. Waiting for source changes... (press enter to interrupt)
Adding Context  for /Users/a14344/dev/sbt-chiken/target/webapp
12 15, 2016 9:52:45 午後 org.apache.coyote.AbstractProtocol init
情報: Initializing ProtocolHandler ["http-nio-8080"]
12 15, 2016 9:52:46 午後 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
情報: Using a shared selector for servlet write/read
12 15, 2016 9:52:46 午後 org.apache.catalina.core.StandardService startInternal
情報: Starting service Tomcat
12 15, 2016 9:52:46 午後 org.apache.catalina.core.StandardEngine startInternal
情報: Starting Servlet Engine: Apache Tomcat/7.0.34
12 15, 2016 9:52:46 午後 org.apache.catalina.startup.ContextConfig getDefaultWebXmlFragment
情報: No global web.xml found
12 15, 2016 9:52:48 午後 org.apache.coyote.AbstractProtocol start
情報: Starting ProtocolHandler ["http-nio-8080"]
 
 
 
$ sbt package
$ ls ./target/scala-2.11/
chiken_2.11-1.0.jar
chiken_2.11-1.0.war
classes
 
 
 
app/
 ├ batch/
 │  └ src/main/scala/batch/ChikenBatch.scala
 ├ lib/
 │  └ src/main/scala/lib/Chilen.scala
 ├ project/plugins.sbt
 └ build.sbt
 
 
package  batch 
import  lib ._ 
object  ChikenBatch  extends  App  {
  println(Chiken .get)
} 
package  lib 
object  Chiken  {
  def  get  =  " 知見"  
} 
 
lazy  val  root  =  (project in file(" ."  ))
  .aggregate(batch, lib)
lazy  val  batch  =  (project in file(" batch"  ))
  .dependsOn(lib)
lazy  val  lib  =  (project in file(" lib"  ))
 
 
$ sbt batch/run
知見
 
 
 
 
addSbtPlugin(" com.typesafe.sbt"   %  " sbt-native-packager"   %  " 1.1.1"  )
  
 
lazy  val  root  =  (project in file(" ."  ))
  .aggregate(batch, lib)
lazy  val  batch  =  (project in file(" batch"  ))
  .dependsOn(lib)
  .enablePlugins(AshScriptPlugin , DockerPlugin )
  .settings(
    dockerRepository :=  Some (" smalgo-docker.cyberagent.io"  ),
    dockerBaseImage :=  " java:8-jdk-alpine"  
  )
lazy  val  lib  =  (project in file(" lib"  ))
 
 
$ sbt batch/docker:publishLocal # ローカルにdocker imageを作成
$ docker run smalgo-docker.cyberagent.io/chiken:1.0
知見
$ sbt batch/docker:publish # dockerリポジトリにpush
 
 
 
docker上で動くbatchの設定が 一発できるpluginをつくります  
 
import  com .typesafe .sbt .packager .archetypes ._ 
import  com .typesafe .sbt .packager .docker ._ 
import  com .typesafe .sbt .packager .docker .DockerPlugin .autoImport ._ 
import  sbt ._ 
object  BatchPlugin  extends  AutoPlugin  {
  //  build.sbtのenablePluginsと同じ 
  override  def  requires  =  AshScriptPlugin  &&  DockerPlugin 
  //  build.sbtのsettingsと同じ 
  override  val  projectSettings  =  Seq (
    dockerRepository :=  Some (" smalgo-docker.cyberagent.io"  ),
    dockerBaseImage :=  " java:8-jdk-alpine"  
  )
}
 
 
lazy  val  root  =  (project in file(" ."  ))
  .aggregate(batch, lib)
lazy  val  batch  =  (project in file(" batch"  ))
  .dependsOn(lib)
  .enablePlugins(BatchPlugin ) //  NEW! 
lazy  val  lib  =  (project in file(" lib"  ))
 
 
app/
 ├ batch/
 │  └ src/main/scala/batch/ChikenBatch.scala
 ├ lib/
 │  └ src/main/scala/lib/Chilen.scala
 ├ project/
 │  │ BatchPlugin.scala
 │  └ plugins.sbt
 └ build.sbt
 
 
 
ほぼブラックボックになっていた 
ひとつひとつ検証していくしかなかった 
 
groovyで書かれていた 
sbtでgroovyを動かすのは面倒 
groovyをscalaにすべて書き直した (ダーシャに感謝) 
 
 
 
リリース 
bidパラメーター変更 
LB 登録/登録解除