Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Gradleからsbtへの移行
Search
Naohiro Hasegawa
December 27, 2016
Programming
1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Gradleからsbtへの移行
Naohiro Hasegawa
December 27, 2016
Other Decks in Programming
See All in Programming
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
840
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
3.7k
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
820
スマートグラスで並列バイブコーディング
hyshu
0
280
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
200
OSINT for SRE: 学術論文とポストモーテムから探る システム障害の共通パターン / SRE NEXT 2026
tomoyk
1
3.2k
共通化で考えるべきは、実装より公開する型だった
codeegg
0
190
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
350
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
580
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
260
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
140
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.3k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
560
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
220
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
630
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Technical Leadership for Architectural Decision Making
baasie
3
440
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
210
Transcript
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 https://github.com/sbt/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 https://github.com/earldouglas/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 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 getDefaultWebXmlFra 情報: No global web.xml found 12 15, 2016 9:52:48 午後 org.apache.coyote.AbstractProtocol start 情報: Starting ProtocolHandler ["http-nio-8080"]
None
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 https://github.com/sbt/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 ライフを!