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
390
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
とある会社のビルドデプロイ / A certain company's application building
hayasshi
April 14, 2020
More Decks by hayasshi
See All by hayasshi
Chatwork で Akka をどうつかっているのか なぜつかっているのか / Why Akka, How Akka in Chatwork
hayasshi
1
600
Scala / refined で`型く`表明プログラミング / Programing with type level assertion
hayasshi
2
980
Akka Typed - 型安全にメッセージパッシングする! / Akka Typed - typesafe messaging
hayasshi
6
3k
AWS Dev Day Challenge (2018-11-02) - ChatWork Suita
hayasshi
2
730
Scala and Akka apps on Kubernetes in ChatWork
hayasshi
0
2.7k
Other Decks in Programming
See All in Programming
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
250
Creating Composable Callables in Contemporary C++
rollbear
0
180
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
140
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
280
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
420
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
110
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.8k
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
240
Performance Engineering for Everyone
elenatanasoiu
0
250
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
820
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.9k
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
350
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
GitHub's CSS Performance
jonrohan
1033
470k
Fireside Chat
paigeccino
42
4k
WCS-LA-2024
lcolladotor
0
670
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.1k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
210
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
310
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
250
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
250
Measuring & Analyzing Core Web Vitals
bluesmoon
9
870
Marketing to machines
jonoalderson
1
5.5k
Optimizing for Happiness
mojombo
378
71k
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
働くをもっと楽しく、創造的に