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
340
とある会社のビルドデプロイ / 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
540
Scala / refined で`型く`表明プログラミング / Programing with type level assertion
hayasshi
2
880
Akka Typed - 型安全にメッセージパッシングする! / Akka Typed - typesafe messaging
hayasshi
6
2.6k
AWS Dev Day Challenge (2018-11-02) - ChatWork Suita
hayasshi
2
610
Scala and Akka apps on Kubernetes in ChatWork
hayasshi
0
2.5k
Other Decks in Programming
See All in Programming
deno-redisの紹介とJSRパッケージの運用について (toranoana.deno #21)
uki00a
0
150
設計やレビューに悩んでいるPHPerに贈る、クリーンなオブジェクト設計の指針たち
panda_program
6
1.6k
既存デザインを変更せずにタップ領域を広げる方法
tahia910
1
240
0626 Findy Product Manager LT Night_高田スライド_speaker deck用
mana_takada
0
110
PicoRuby on Rails
makicamel
2
110
AWS CDKの推しポイント 〜CloudFormationと比較してみた〜
akihisaikeda
3
320
明示と暗黙 ー PHPとGoの インターフェイスの違いを知る
shimabox
2
380
WebViewの現在地 - SwiftUI時代のWebKit - / The Current State Of WebView
marcy731
0
100
5つのアンチパターンから学ぶLT設計
narihara
1
120
Team operations that are not burdened by SRE
kazatohiei
1
260
Cline指示通りに動かない? AI小説エージェントで学ぶ指示書の書き方と自動アップデートの仕組み
kamomeashizawa
1
580
#kanrk08 / 公開版 PicoRubyとマイコンでの自作トレーニング計測装置を用いたワークアウトの理想と現実
bash0c7
1
570
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
17
940
Designing for Performance
lara
609
69k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Adopting Sorbet at Scale
ufuk
77
9.4k
The Straight Up "How To Draw Better" Workshop
denniskardys
234
140k
Optimizing for Happiness
mojombo
379
70k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
281
13k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3k
Practical Orchestrator
shlominoach
188
11k
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
働くをもっと楽しく、創造的に