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
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
7
2.2k
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.2k
ALB ログから Trace を気合で繋げる技術
fohte
7
780
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
290
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
110
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
450
Press start. Python's next generation.
willingc
PRO
3
280
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
400
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
320
VibeCodingからAgenticWorkflowへ
starfish719
0
950
源内ハンズオン概要編
hideg
0
230
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
1.2k
Featured
See All Featured
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
450
Un-Boring Meetings
codingconduct
0
400
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.9k
How GitHub (no longer) Works
holman
316
150k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
590
Color Theory Basics | Prateek | Gurzu
gurzu
0
440
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.3k
Exploring anti-patterns in Rails
aemeredith
3
480
Why Our Code Smells
bkeepers
PRO
340
58k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
630
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 ライフを!