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
310
とある会社のビルドデプロイ / 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
480
Scala / refined で`型く`表明プログラミング / Programing with type level assertion
hayasshi
2
810
Akka Typed - 型安全にメッセージパッシングする! / Akka Typed - typesafe messaging
hayasshi
6
2.4k
AWS Dev Day Challenge (2018-11-02) - ChatWork Suita
hayasshi
2
540
Scala and Akka apps on Kubernetes in ChatWork
hayasshi
0
2.4k
Other Decks in Programming
See All in Programming
offers_20241022_imakiire.pdf
imakurusu
2
360
LLM生成文章の精度評価自動化とプロンプトチューニングの効率化について
layerx
PRO
2
130
開発効率向上のためのリファクタリングの一歩目の選択肢 ~コード分割~ / JJUG CCC 2024 Fall
ryounasso
0
360
カスタムしながら理解するGraphQL Connection
yanagii
1
1.2k
JaSST 24 九州:ワークショップ(は除く)実践!マインドマップを活用したソフトウェアテスト+活用事例
satohiroyuki
0
260
Realtime API 入門
riofujimon
0
110
GCCのプラグインを作る / I Made a GCC Plugin
shouth
1
150
CSC305 Lecture 13
javiergs
PRO
0
130
AWS IaCの注目アップデート 2024年10月版
konokenj
3
3.1k
go.mod、DockerfileやCI設定に分散しがちなGoのバージョンをまとめて管理する / Go Connect #3
arthur1
10
2.4k
リリース8年目のサービスの1800個のERBファイルをViewComponentに移行した方法とその結果
katty0324
5
3.6k
【Kaigi on Rails 2024】YOUTRUST スポンサーLT
krpk1900
1
240
Featured
See All Featured
The Cult of Friendly URLs
andyhume
78
6k
It's Worth the Effort
3n
183
27k
Code Review Best Practice
trishagee
64
17k
Side Projects
sachag
452
42k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
We Have a Design System, Now What?
morganepeng
50
7.2k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Product Roadmaps are Hard
iamctodd
PRO
48
10k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
167
49k
Designing for humans not robots
tammielis
249
25k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
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
働くをもっと楽しく、創造的に