Skip to content

Instantly share code, notes, and snippets.

@hnaohiro
Last active February 14, 2019 01:42
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hnaohiro/5c19c0c404e0848147300183f929b2b0 to your computer and use it in GitHub Desktop.
Save hnaohiro/5c19c0c404e0848147300183f929b2b0 to your computer and use it in GitHub Desktop.
Gradleからsbtへの移行

Gradle から sbt への移行

Smalgo 長谷川直広


移行するにあたって検証したことを
紹介していきます


目次

  • step1 - init
  • step2 - fatjar
  • step3 - tomcat
  • step4 - multi-project
  • step5 - docker
  • step6 - custom plugin

step1 - init


build.sbt

name := "chiken"

version := "1.0"

scalaVersion := "2.11.8"

Chiken.scala

package chiken

object Chiken extends App {
  println("知見です")
}

ディレクトリ構成


app/
 ├ src/main/scala/chiken/Chiken.scala
 └ build.sbt


実行


$ sbt run
知見です


step2 - fatjar


sbt-assembly


plugins.sbt


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
知見です


step3 - tomcat


xsbt-web-plugin


plugins.sbt

addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "2.1.0")

build.sbt

name := "chiken"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies += "javax.servlet" % "javax.servlet-api" % "3.0.1" % "provided"

enablePlugins(TomcatPlugin)

ChikenServlet.scala

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()
  }
}

web.xml

<?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"]



warファイル


$ sbt package

$ ls ./target/scala-2.11/
chiken_2.11-1.0.jar
chiken_2.11-1.0.war
classes


step4 - multi-project


ディレクトリ構成


app/
 ├ batch/
 │  └ src/main/scala/batch/ChikenBatch.scala
 ├ lib/
 │  └ src/main/scala/lib/Chilen.scala
 ├ project/plugins.sbt
 └ build.sbt


ChikenBatch.scala

package batch

import lib._

object ChikenBatch extends App {
  println(Chiken.get)
}

Chilen.scala

package lib

object Chiken {
  def get = "知見"
}

build.sbt

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
知見


step5 - docker


sbt-native-packager


plugins.sbt

addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.1.1")

build.sbt

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


step6 - custom plugin


docker上で動くbatchの設定が
一発できるpluginをつくります


BatchPlugin.scala

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"
  )
}

build.sbt

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


苦労したこと


現在のgradleの構成とビルド設定の把握

  • ほぼブラックボックになっていた
  • ひとつひとつ検証していくしかなかった

integration test移行

  • groovyで書かれていた
  • sbtでgroovyを動かすのは面倒
  • groovyをscalaにすべて書き直した (ダーシャに感謝)

その他、Smalgoで移行したもの


開発環境移行

  • docker compose

CircleCI移行

  • CD高速化

chatops移行

  • リリース
  • bidパラメーター変更
  • LB 登録/登録解除

よいsbtライフを!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment