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
Jenkins Day Japan 2022 - モンスターストライクとJenkins
Search
MIXI ENGINEERS
PRO
December 06, 2022
Technology
1
950
Jenkins Day Japan 2022 - モンスターストライクとJenkins
本資料は、2022年11月に開催された『
Jenkins Day Japan 2022
』における「モンスターストライクとJenkins」の講演資料です。
MIXI ENGINEERS
PRO
December 06, 2022
Tweet
Share
More Decks by MIXI ENGINEERS
See All by MIXI ENGINEERS
組織のデータリテラシー向上に向けて ~ MIXI データ活用ガイドラインができるまで 〜
mixi_engineers
PRO
5
58
MIXI配信取り組み
mixi_engineers
PRO
2
16
MIXIにおけるWebRTC技術の活用/Use of WebRTC Technology in MIXI
mixi_engineers
PRO
2
56
「人物ごとのアルバム」の精度改善の軌跡/Improving accuracy of albums by person
mixi_engineers
PRO
2
200
「モンスターストライク」の運営を支えるデータ分析基盤の歴史と進化 / History and evolution of the data analysis infrastructure supporting “Monster Strike” operations
mixi_engineers
PRO
3
260
【全貌公開】 MIXI の Atlassian Cloud 移行の裏側 / Behind MIXI's Migration to Atlassian Cloud
mixi_engineers
PRO
0
320
MIXI TECH NOTE #12
mixi_engineers
PRO
2
47
運営11年目タイトルを守る最強の盾の有効性と活用法
mixi_engineers
PRO
2
360
MIXI における技術広報とその役割
mixi_engineers
PRO
2
340
Other Decks in Technology
See All in Technology
レビューを増やしつつ 高評価維持するテクニック
tsuzuki817
1
730
スタートアップ1人目QAエンジニアが QAチームを立ち上げ、“個”からチーム、 そして“組織”に成長するまで / How to set up QA team at reiwatravel
mii3king
2
1.5k
「海外登壇」という 選択肢を与えるために 〜Gophers EX
logica0419
0
710
利用終了したドメイン名の最強終活〜観測環境を育てて、分析・供養している件〜 / The Ultimate End-of-Life Preparation for Discontinued Domain Names
nttcom
2
200
Data-centric AI入門第6章:Data-centric AIの実践例
x_ttyszk
1
410
Platform Engineeringは自由のめまい
nwiizo
4
2.1k
エンジニアのためのドキュメント力基礎講座〜構造化思考から始めよう〜(2025/02/15jbug広島#15発表資料)
yasuoyasuo
17
6.8k
ユーザーストーリーマッピングから始めるアジャイルチームと並走するQA / Starting QA with User Story Mapping
katawara
0
210
デスクトップだけじゃないUbuntu
mtyshibata
0
120
CZII - CryoET Object Identification 参加振り返り・解法共有
tattaka
0
380
個人開発から公式機能へ: PlaywrightとRailsをつなげた3年の軌跡
yusukeiwaki
11
3k
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
6
57k
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.5k
A Philosophy of Restraint
colly
203
16k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2k
Mobile First: as difficult as doing things right
swwweet
223
9.3k
It's Worth the Effort
3n
184
28k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Facilitating Awesome Meetings
lara
52
6.2k
How to train your dragon (web standard)
notwaldorf
91
5.8k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Typedesign – Prime Four
hannesfritz
40
2.5k
Transcript
モンスターストライク と Jenkins 2022/11/2 モンスト事業本部 モンストサーバチーム 松原 信忠
モンストサーバチーム 2
サーバーチームはモンストのバックエンドの「開発」と「運用」の両方を行う 開発環境や開発を支援するツールも開発・運用している(Jenkinsもその一つ) モンストの開発に関わるチーム 3
リポジトリに応じてジョブが何種類かある(以下に一部抜粋) 1. モンストのバックエンド本体のリポジトリ テストの実行(Ruby) ソースコードのデプロイ(開発環境のみ) マスターデータのインポート 2. 本体以外の周辺ツールをまとめたモノレポジトリ テストの実行(主にGo) Goの依存パッケージのVendoring
独自 apt パッケージのビルドとリリース 3. Google Cloud DNS や AWS Security Group などを IaC しているリポジトリ 設定の適用 サーバチームでの Jenkins 用途 4
リポジトリに応じてジョブが何種類かある(以下に一部抜粋) 1. モンストのバックエンド本体のリポジトリ テストの実行(Ruby) ソースコードのデプロイ(開発環境のみ) マスターデータのインポート 2. 本体以外の周辺ツールをまとめたモノレポジトリ テストの実行(主にGo) Goの依存パッケージのVendoring
独自 apt パッケージのビルドとリリース 3. Google Cloud DNS や AWS Security Group などを IaC しているリポジトリ 設定の適用 サーバチームでの Jenkins 用途 5
リポジトリに応じてジョブが何種類かある(以下に一部抜粋) 1. モンストのバックエンド本体のリポジトリ テストの実行(Ruby) ソースコードのデプロイ(開発環境のみ) マスターデータのインポート 2. 本体以外の周辺ツールをまとめたモノレポジトリ テストの実行(主にGo) Goの依存パッケージのVendoring
独自 apt パッケージのビルドとリリース 3. Google Cloud DNS や AWS Security Group などを IaC しているリポジトリ 設定の適用 サーバチームでの Jenkins 用途 6
リポジトリに応じてジョブが何種類かある(以下に一部抜粋) 1. モンストのバックエンド本体のリポジトリ テストの実行(Ruby) ソースコードのデプロイ(開発環境のみ) マスターデータのインポート 2. 本体以外の周辺ツールをまとめたモノレポジトリ テストの実行(主にGo) Goの依存パッケージのVendoring
独自 apt パッケージのビルドとリリース 3. Google Cloud DNS や AWS Security Group などを IaC しているリポジトリ 設定の適用 サーバチームでの Jenkins 用途 7
サーバチームでの Jenkins 構成 8
Jenkins コントローラーは GKE 上で動かしている Jenkins 公式の Helm Chart を利用している サーバチームでの
Jenkins 構成 https://github.com/jenkinsci/helm-charts 9
Jenkins へのアクセスは Webhook も含めて自作ゼロトラストプロキシを介す jwt-auth-plugin を使ってゼロトラストプロキシを介してきたかを確認 サーバチームでの Jenkins 構成 https://github.com/jenkinsci/jwt-auth-plugin
10
Jenkins エージェントは GCE で動かしている Packer でベースイメージを作り、Ansible でプロビジョニングする サーバチームでの Jenkins 構成
11
生じた課題と解決方法 12
モンストの機能開発では「QA期間」というのがある そのため、QA期間まで(締め日)に機能をある程度完成させる必要がある 締め日にコミットが集中して、テスト用のジョブが大量に発生して滞留する エージェントを一時的に足せば良いが、その都度行うのは大変 課題:ジョブが滞留する時期がある 13
Go製・GKE上で動作させている 当時、内定者アルバイトで来てた方にフルスクラッチしてもらった 解決:エージェントのオートスケーラーの開発 14
(1) 現在の Jenkins エージェントの状態を API から取得 エージェントのラベル毎にオートスケールのための設定を分けている 解決:エージェントのオートスケーラーの開発 15
(2) 閾値以上のエージェントがジョブを実行している場合はエージェントを追加 エージェントは GCE のインスタンステンプレートから生成 解決:エージェントのオートスケーラーの開発 16
(3) 追加したエージェントがジョブを実行していない場合はエージェントを削除 これらを数分おきに繰り返す 解決:エージェントのオートスケーラーの開発 17
Jenkins はサーバーチームのメンバー以外も使っている マスターデータのインポート(実行は Slack Bot から) マスターデータの静的解析(GitHub Webhook から) マスターデータの翻訳(海外版)
しかし Web UIからできる設定を、サーバーメンバー以外にはやってほしくない 課題:Jenkins の細かいアクセス制御をしたい 18
モンスト開発では自作のゼロトラストプロキシを運用していたので、これを利用する Go製・GKE上で動作させている 会社の Google アカウントで認証・ユーザーの識別を行う ユーザー毎にロールを与えて、ロール毎にアクセスできる Webサービスを制限 解決:自作ゼロトラストプロキシによる制御 19
Webサービスのパスや Read Only かどうかの制御も可能 GitHub や Slack からのアクセスを許可するかどうかも制御可能 社員以外はクライアント証明書を渡してアクセス制限をかけることも可能 サーバーチームのロールでは「Read/Write」にし、それ以外では
Read Only にした 解決:自作ゼロトラストプロキシによる制御 20
Jenkins では独自 apt パッケージのビルドとリリースをしており、これらのジョブは 別々になっている ビルド:PRがマージされた時点で差分に応じて自動実行 リリース:サーバーにプロビジョニングをかけてるときには避けたいので手動実行 しかし、欲を出すと ビルドの終わった時点で「リリースして良いか」を Slack
に投稿して手動 実行を促してほしい (いわゆる「Manual Approval」みたいなことがしたい) 課題:ジョブの後に別のジョブを手動実行したい 21
Go製・GKE上で動作する自作 Slack Bot に機能を追加した Slack Bot は GitHub Webhook も受け取れるようになっている
解決:Slack Bot でジョブの終了を待つ 22
1. 独自 apt パッケージのPRがマージされるのを Slack Bot が検知 2. ビルドのジョブが終わるのを Jenkins
の Web API を定期的に呼んで待つ 3. ビルドが終わったら Slack に通知し Add Reaction を待つ 4. Add Reaction されたらリリースのジョブを Jenkins の Web API から実行 解決:Slack Bot でジョブの終了を待つ 23
Jenkins でクラウドサービスの設定の適用しているため、秘匿情報の管理をしている Google Cloud のアクセスキー AWS のアクセスキー(用途やリージョン毎に分けている) しかし、Jenkins の秘匿情報管理で設定できるスコープが「グローバル」と「システ ム」しか基本的にはなく、リポジトリ毎に設定することができない
また、大量の秘匿情報を何個も登録するのが大変 課題:秘匿情報をリポジトリ毎に管理したい 24
Amber という OSS を利用する リポジトリには Amber で生成した公開鍵と暗号化した秘匿情報を保存 Jenkins には Amber
で生成した秘密鍵だけを保存 リポジトリと秘密鍵が揃う場合(ジョブ)でだけ、元の秘匿情報を利用できる 解決:Amber の導入 https://github.com/fpco/amber 25
モンストサーバーチームでは Jenkins を自前運用して利用している テストの実行やデータインポート、IaC の適用などで利用している コントローラーは GKE 上で動作させて、Helm を使って構成管理 エージェントは
GCE 上で動作させて、Packer と Ansible を使って構成管理 生じた課題は主に、自作ツールやOSSを利用して Jenkins の外から解決している ジョブが時期によって滞留するので、エージェントのオートスケーラーを自作 細かいアクセス制御をするために自作ゼロトラストプロキシを利用 Slack から Manual Approval をするために Slack Bot を自作 リポジトリ毎に秘匿情報を管理するために Amber という OSS を導入 まとめ 26
None