Ninja Royale を作っているDeNAの中のひと
ゲームで使用されている技術と問題
- 技術
- サーバーサイド
- クライアントサイド
- JavaScript
- ngCore
- 課題
- 超高速リリース
- iOS特有の制限によるスケジュールの縛り
- レガシーコード
- 全サポート端末での安定性の確保
Jenkinsの導入
- 発端
- 手動テストの限界
- 各自の環境でサーバーサイドの自動テスト
- 各自の環境での自動テストの限界
サーバーサイドの移動に着手
他のひとの環境だと動かないテストとかもある。
- Jenkinsの導入
- とりあえず自動テストを常に流すところまでやってみた
- しかし活用がイマイチ。
自動テストの活用の改善
1. 複数ブランチでの並行開発への対処
- 10日間でリリースしないといけないタスク
- イベント==ブランチ
- マージされる開発ブランチ→Jenkinsのジョブ対象
- CIのベストプラクティスが通じない
- 一部のブランチしか通らなかった。
- git-flowによる解決策
- CIのベストプラクティス
6、7くらいのブランチで、全ブランチの自動テストをJenkinsで実施。
iPadをXFDにする(赤くなったブランチを全力で修正)
何がコケたのか分かりやすくする。
イケてないStatus Monitor Plugin
ブランチが他のブランチに依存してて並列でテストできないこともあった。
誰でも簡単に作れるジョブを作成する(ブランチ名を変更するだけでよいようにした)
複数ブランチのテストが並列に実行できない問題
普通のJenkinsのジョブっぽく作ったバージョン(本番環境への影響からお蔵入り)
前述の直列ジョブ詰まる問題(→Build-timeout Plugin)
- 対処
- ローカルでは動くのにJenkinsだと動かない
- 開発が進むと失敗するテストが増える
- 原因
- ある時点のデータベースのスキーマに依存
- 対策
- 落ちているテストは一旦無効に(基本これはやっちゃいけないけど、200くらいダメテストがあったらこれをやらざるをえない)
- テストごとにスキーマとフィクスチャを作成
しかし、まずグリーンにすることが重要。
というか、手作業でレッドからグリーンにできるテストは3つくらいが限度。
アーキテクトによる改善
- クラスとテストをテンプレート化し、自動生成(最低限のものをテンプレに)
- 自動テストにPerlcriticを組み込み
- 自動テストにPerl::Metrices::Liteを組み込み
- XFDによる即座の修正
- 必ずテストを書く(執事任せにしないことも大切)
- 自分でJenkinsのジョブを作る
- Jenkinsへの要望の追加
静的検証の活用と改善
- 最初の改善
- Perlcritic on Jenkins
- 見ない&直さない
-
- 既存のコードは直さないという割り切り
- 新規はテストに組み込む
いきなり全部のコードに適用するのは手間がかかる
(メンタリティの変化)
無理矢理直すのではなく、新しいものにのみ適用することで
精神的に導入しやすくする
直接コミットされるものが優先されるから。
今後やっていきたいこと
- 自動テストの並列実行(マシンは8コアあるのに1コアしか使っていなくて勿体ない)
- Catalyst + prove で実験
- クライアントの自動テスト(ゲームだからクライアントサイドでのテストはやらなくてよいということはない)
- jasmine-node (ロジックの部分だけ。描画とかはもうしゃあない)