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
とある会社のビルドデプロイ / A certain company's application...
Search
hayasshi
April 14, 2020
Programming
0
360
とある会社のビルドデプロイ / A certain company's application building
hayasshi
April 14, 2020
Tweet
Share
More Decks by hayasshi
See All by hayasshi
Chatwork で Akka をどうつかっているのか なぜつかっているのか / Why Akka, How Akka in Chatwork
hayasshi
1
570
Scala / refined で`型く`表明プログラミング / Programing with type level assertion
hayasshi
2
940
Akka Typed - 型安全にメッセージパッシングする! / Akka Typed - typesafe messaging
hayasshi
6
2.7k
AWS Dev Day Challenge (2018-11-02) - ChatWork Suita
hayasshi
2
660
Scala and Akka apps on Kubernetes in ChatWork
hayasshi
0
2.6k
Other Decks in Programming
See All in Programming
チームをチームにするEM
hitode909
0
410
ゆくKotlin くるRust
exoego
1
170
これならできる!個人開発のすゝめ
tinykitten
PRO
0
140
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
420
20251212 AI 時代的 Legacy Code 營救術 2025 WebConf
mouson
0
230
The Art of Re-Architecture - Droidcon India 2025
siddroid
0
140
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
230
JETLS.jl ─ A New Language Server for Julia
abap34
2
460
まだ間に合う!Claude Code元年をふりかえる
nogu66
5
910
re:Invent 2025 のイケてるサービスを紹介する
maroon1st
0
150
Patterns of Patterns
denyspoltorak
0
380
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
540
Featured
See All Featured
The browser strikes back
jonoalderson
0
240
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
140
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
280
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
400
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5k
The agentic SEO stack - context over prompts
schlessera
0
570
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
33
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
150
Navigating Team Friction
lara
191
16k
Docker and Python
trallard
47
3.7k
AI: The stuff that nobody shows you
jnunemaker
PRO
1
35
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
32
Transcript
Scala関西勉強会 2020年4月14日 hayasshi とある会社のビルド・デプロイ
自己紹介 • こんにちは。林です。 ◦ Twitter: @hayasshi_ ◦ GitHub: hayasshi •
Chatwork株式会社 • 最近は既存のScalaプロダクトのお手入れ 2
Scala関西勉強会 2020年4月14日 hayasshi とある会社のビルド・デプロイ
今日お話すること 1. とある会社のScalaアプリケーションのビルドについて ◦ パッケージング方式 ◦ ビルド実行 4
今日お話しないこと 1. とある会社のデプロイメントについて 2. とある会社のCI/CDの詳細 3. とある会社の開発フローの詳細 5
01 Scalaアプリケーションの パッケージングについて
前提 とある会社は、Scalaアプリケーションを、 Kubernetes上でDockerコンテナとして、動作させています なので本日は、 Scalaアプリケーションを どのようにDockerイメージにするか を話します 7
sbt-native-packager https://sbt-native-packager.readthedocs.io/en/stable/index.html https://github.com/sbt/sbt-native-packager 各プラットフォーム向けのパッケージングを行ってくれるsbtプラグイン Dockerイメージに加え、最近はGraalVMによるネイティブイメージ化にも対応 8
sbt-native-packager とある build.sbt (https://github.com/hayasshi/sbt-native-packager-sample ) 公式ドキュメント (https://sbt-native-packager.readthedocs.io/en/stable/formats/docker.html ) 9
sbt-native-packager `sbt docker:stage`をすると、`docker build`する前の状態が確認できます 10
sbt-native-packager `sbt docker:stage`をすると、`docker build`する前の状態が確認できます 11
sbt-native-packager `sbt docker:stage`をすると、`docker build`する前の状態が確認できます 12
sbt-native-packager `sbt docker:stage`をすると、`docker build`する前の状態が確認できます 13 起動スクリプト この例では AshScriptPlugin が使われているため ash
sbt-native-packager `sbt docker:stage`をすると、`docker build`する前の状態が確認できます 14 依存ライブラリjar
sbt-native-packager `sbt docker:stage`をすると、`docker build`する前の状態が確認できます 15 アプリケーション
sbt-native-packager `sbt docker:stage`をすると、`docker build`する前の状態が確認できます 16 起動スクリプトから読まれる設定ファイ ル
とある会社の工夫 アプリケーションの設定情報は全て環境変数から渡せるようにしている • なぜ? ◦ コンテナ実行時に注入することで設定変更による再ビルドを避ける • 良い点 ◦ 同じイメージをつかって環境ごとに異なる設定情報で動作できる
(ポータビリティの向上) ◦ コンテナランタイムは環境変数での値の受け渡しがよく使われる • 悪い点 ◦ 設定しないといけない環境変数が多くなりがち 17
とある会社の工夫 アプリケーションの設定情報は全て環境変数から渡せるようにしている Typesafe Config • 環境ごとに異なるアプリケーション設定はすべて環境変数からも渡せるように ◦ e.g. JDBC URL、ポート、各種タイムアウト値、固有のしきい値など
• ローカルで動作させるための設定をデフォルト値に置いている 18
とある会社の工夫 アプリケーションの設定情報は全て環境変数から渡せるようにしている JVMオプション • 起動スクリプト内関数の`addJava`を使うことで`java`コマンドのオプション引数を 追加できる • そこに環境変数を指定することで起動スクリプト実行時の環境変数が使われる つまり`docker run
-e`で指定した環境変数でJVMの設定値も調整できる • シェルのデフォルト値付き変数展開をつかってデフォルト値を設定 19
とある会社の工夫 アプリケーションの設定情報は全て環境変数から渡せるようにしている JVMオプション (起動スクリプト) 20
とある会社の注意点 • コンテナでjdk8を使っている場合、アップデートバージョンに注意 ◦ jdk8u191より前は、コンテナにかけられたCGroupのCPUやメモリを見ずに、 ホストマシンのものを見ていたため、スレッド数計算やヒープ計算が適切にな らない可能性がある ◦ https://bugs.openjdk.java.net/browse/JDK-8146115 ▪
jdk10からjdk8u191にバックポートされている ◦ jdk8u191以降を利用する 21
02 ビルドについて
とある会社のビルド • ビルド内容はいたって普通です ◦ CIサーバー上でシェルスクリプトを実行してScalaアプリケーションのパッキ ングをおこない、Dockerイメージを作成する ▪ ビルドに対してイメージタグを付与 ◦ Dockerイメージタグに対応したGitタグを作成し、
どの時点のコミットでビルドしたものかを追跡できるようにしている • 一点だけ工夫している点としては、CIサーバーの実行モデルに合わせた sbtのビルドキャッシュを作成管理している ◦ ~/.ivy2/cache (ivy cache) ◦ ~/.sbt (boot directory) ◦ ~/cache/.coursier (coursier cache, sbt 1.3.X) 23
とある会社のビルドの工夫 • とある会社のCIサーバーでのシェルスクリプトの実行はDockerコンテナ上でおこな われる • sbtビルドキャッシュのファイル・システムのみのDockerイメージを作成してお き、実行するDockerコンテナにマウントすることで、ビルドキャッシュを利用して いる • 問題点も...
◦ アプリケーションビルドのたびにキャッシュ更新しているとビルドが遅くなる ◦ 定期的な手動更新の必要性 • 対策(検証検討中) ◦ Docker レイヤーキャッシュ ◦ ビルドのみCI SaaS等に切り出す 24
03 まとめ
まとめ • sbt-native-packager ◦ Dockerfileのプラクティスがよくわからないアプリケーション開発者でも正し いDockerイメージをつくってくれる ◦ とある会社ではパッケージングされたアプリケーションを様々な場所で動かせ れるような工夫を行っている ◦
コンテナベースイメージには jdk8u191 以降を利用する • ビルド ◦ ビルドキャッシュの管理をいかに楽に正しくおこなえるかで 全体のビルド体験がよくなる ◦ ビルドはSaaSに乗れるのであればのるのが良さそう ▪ キャッシュの扱い等がやはり優れている 26
働くをもっと楽しく、創造的に