Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Gradleからsbtへの移行
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
270
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
1.8k
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
Webの地図
yosuke_furukawa
PRO
6
4.1k
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
150
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
120
Building an Out-of-Order CPU
latte72
1
750
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
新卒PdEのリアル
ryu1013
1
480
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
360
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
290
XHTMLが残したもの
yosuke_furukawa
PRO
2
680
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.9k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Speed Design
sergeychernyshev
33
2.1k
The SEO identity crisis: Don't let AI make you average
varn
0
550
Believing is Seeing
oripsolob
1
210
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
My Coaching Mixtape
mlcsv
0
310
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
440
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.7k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
420
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 ライフを!