長寿なゲーム事業におけるアプ
リビルドの効率化
グリー株式会社 ソフトウェアエンジニア
石川 一太
• 2015年 グリー株式会社 入社
• 2017年 ハコニワ チーム
• 2018年 釣り★スタ チーム
• 2020年 JapanGame4部ENグループ アプリチーム 所属
石川 一太 ソフトウェアエンジニア アプリチーム所属
自己紹介
2
アプリ側を主に担当
長寿なゲーム事業におけるアプリビルドの効率化
3
Webサービス主体のプラットフォーム ゲーム事業で
アプリビルドの効率化や横断的対応についての事例を
紹介します。
4
各サービスの説明
アプリチームが担当している
5
• サービス開始
2007年 5月〜
釣り★スタ
14周年
6
• アプリは2011
年〜
• WebViewApp +
Cocos2D-JS
GREE SDK
• サービス開始
2007年 7月〜
アバター
14周年
7
• アプリは2016
年〜
• WebViewApp
GREE SDK
• サービス開始
2007年 7月〜
踊り子クリノッペ
14周年
8
• アプリは2011
年〜
• WebViewApp
GREE SDK
• サービス
開始
2008年 8
月〜
探検ドリランド
13周年
9
• アプリは
2011年〜
• WebView
App GREE
SDK
• サービス開始
2008年 9月〜
ハコニワ
13周年
10
• アプリ(v2)は
2018年〜
• WebViewApp
GREE SDK
• サービス開始
2010年 6月〜
モンプラ
11周年
11
• アプリは2011
年〜
• WebViewApp
GREE SDK
• サービス開始
2010年 9月〜
海賊王国コロンブス
11周年
12
• アプリは2011
年〜
• WebViewApp
GREE SDK
長寿 サービス
いずれも
13
どれが好き?
ⓘ Start presenting to display the poll results on this slide.
各プロダクト説明まとめ
15
タイトル 周年 アプリ開始 搭載GREE SDK
釣り★スタ 14周年 2011年〜 WebViewApp +
Cocos2D-JS
踊り子クリノッペ 14周年 2011年〜
WebViewApp
探検ドリランド 13周年 2011年〜
海賊王国コロンブス 11周年 2011年〜
モンプラ 11周年 2011年〜
アバター 14周年 2016年〜
ハコニワ 13周年 2018年〜(v2)
横断対応に至るまでの経緯
アプリチームとして
16
横断的に対応していたわけではない
もともとは
17
釣り★スタ アプリのビルド効率化
横断対応へのきっかけ
18
• サービス開始
2007年 5月〜
釣り★スタ
14周年
19
• アプリは2011
年〜
• WebViewApp +
Cocos2D-JS
GREE SDK
開発環境は使用されてますか?
20
XcodeやAndroid Studioは使
用されていますか?
ⓘ Start presenting to display the poll results on this slide.
2018年 3月ごろ
ふりかえり
22
当時 ネイティブ化によりCocos2D-JSが搭載され ビ
ルドに時間が掛かっていた
釣り★スタのビルド問題
23
釣り★スタ アプリのビルド環境
24
当初は最小限のビルド環境しか無かった
• 作業用のPCでビルド
• ビルド専用PCもやってくるが効率面ではほとんど恩恵なしのイ
メージ
• ビルドPCと作業PCを兼ねていれば ビルド中は業務上の対応と
かほとんど何もできない
• うっかりビルド中ブランチ切り替えてしまったら問題
• アプリ配布のためのアップロードは手動
• 配布枠への手動アップロードに結構時間がかかる
• アプリ枠を間違えてアップロードしてしまうことも
• Androidのビルド時間は長め
当時の状況
25
釣り★スタ アプリのビルド環境
26
1環境あたりのビルド時間 x 環境数 = 何時間?
釣り★スタ アプリのビルド環境
27
30分 x 20枠= 10時間
ビルド中は
28
もちろんビルド中のアプリ自体にはさわれな
いが、高負荷のため軽めの作業しか並行でき
ない。
ビルド後も
29
● 対象環境への接続確認
● 配布のためのアップロードも手動
追加の手間も掛かっていた
確実にやってくる更新として
30
● GREE SDKの更新
● 広告系ライブラリの更新
● アイコンの差し替え・戻し
この辺りの更新が数ヶ月に一回発生す
るたびに丸一日近く何もできないに等
しい
Jenkins環境欲しいですよね
31
業務中にも早く効率化したい状況ではあったのだけど、
負の連鎖的な作業に追われてできなかった
32
Web系の部署なので状況的にCI化が後回しに?
33
ビルド以外何もできない状況・・・・
34
配属された当初
エンジニアの本来の仕事はビルドだけではないですよね
CI/CD化は、どこかでやらなければならなかったが
釣り★スタである案件が上がってそれが転機になった
35
あまりにも作業効率が悪かったので、Androidのビル
ドである効率化を図ります
その前に
36
とにかくAndroid Studioのビルドが遅いもっと早
くしたい!
37
ccacheの導入
38
39
ccache
ccacheとは、CまたはC++のコンパイラが出力す
るデータをキャッシュするソフトウェア開発ツール。
2回目以降のビルドにおいてはコンパイルを避け、
出力結果を再利用する。
40
釣り★スタアプリ ではAndroidのNDKビルドの高
速化を狙って導入。
キャッシュへのヒット率にもよるが、当時の記録に
よれば、導入時には12分かかってたビルドが2回目
以降に1分くらいに短縮。
ccacheの効果
41
ccache キャッシュヒット率の確認
$ ccache -s
cache directory /Users/kazuta.ishikawa/.ccache
primary config
/Users/kazuta.ishikawa/.ccache/ccache.conf
secondary config (readonly) /usr/local/etc/ccache.conf
stats zero time Thu Apr 2 15:49:07 2020
cache hit (direct) 15768
cache hit (preprocessed) 24
cache miss 9894
cache hit rate 61.48 %
compiler produced no output 1
ccache internal error 32
cache file missing 12
cleanups performed 0
files in cache 29802
cache size 4.9 GB
max cache size 15.0 GB
42
ccache キャッシュクリア
$ ccache -C
Cleared cache
• AndroidのNDKビルドの高速化が目的で導入
• インストールにはMacOSの場合 /system以下のread
only file systemにアクセスする必要があってPCの権限
変更が必要
ccache
43
まとめ
44
2019年 2月ごろ
ふりかえり
釣り★スタへの追加機能である案件の開発が始まり、
ビルド環境の整備が急務に
45
非効率な状況が続いていたのですが・・・
• 追加機能の開発は外部に依頼
• セキュリティ上の問題から外部へはプラットフォ
ーム側のコードは渡せない
• 受け取ったコードの取り込みは社内で対応
• マージ後のビルドも社内環境でやる必要
• 追加機能の実装はC++でもらう形
• コード反映したらただちに検証確認をできるよう
に
• アプリ配布枠の増加
46
状況
釣り★スタ 本体が最優先
追加機能によって釣り★スタ本体に影響がでてはならない
ただし
47
結局
48
CI/CD環境の導入
しかなさそう
1. Slackでビルドコマンドを送信
2. hubotでjenkinsと連携
3. jenkins
4. AppCenterへバイナリアップロード
5. 成果物アップロード完了をSlackへ通知
CI/CD化へ向けての構想
49
ビルド用PC (Mac Pro)の導入
導入
50
導入
51
Jenkins
外部ネットワークから社内環境でビルドした
い
要件
52
外部会社から社内のビルド環境で釣り★スタ アプリ
を更新する必要
53
理由
• セキュリティ上の問題から外部へはプラットフォー
ム側のコードは渡せない
• 開発会社にビルドに必要なだけのPCが存在しなかっ
た
Slackからコマンド打って、
もらったC++コードをマージ→ビルド
思いつくのは
55
Xcodeプロジェクトのマージの自動化
ここが問題に
56
Android.mkをshellから書き換えればプロジ
ェクトへファイルを追加できてビルド対象に
なるが
Android Studioの場合は
57
Xcodeのプロジェクト構成を変える時に
UIでファイルを追加するときは意識しないけど
Xcodeの場合は
58
Xcodeのプロジェクトファイルに追加設定しないと、
ビルド対象とはならないため、
なんかしらの方法でXcodeのプロジェクトファイルを
書き換えてあげる必要
方法は?
59
Xcodeのプロジェクト ファイルは直接ファイル内を
書き換える想定で作られていない
そもそも
60
ファイルの中身みてみるとハッシュ値があったりで
Rubyのgemであるxcodeprojを使ってプロジェクト
ファイルを書き換えることに
そこで
61
xcodeproj 書き換えの実際 1.
62
aTarget.resources_build_phase.remove_file_reference(file)
● targetにあるresources build phaseのfileの参照を外す
〜 中略 〜
resources = project['Resources']
resources['DebugFiles'].remove_from_project
● ’DebugFiles’をプロジェクトより削除
xcodeproj 書き換えの実際 2.
63
project_path = ENV['WORKSPACE'] + '/frameworks/runtime-
src/proj.ios_mac/tsurista.xcodeproj'
project = Xcodeproj::Project.open(project_path)
classes = project['Classes']
i = classes.new_file(file)
target.add_file_references(i)
● new_fileでメイングループに新しいファイル参照を作成して
targetにファイルを追加
Jenkinsからxcodeのプロジェクトファイルを書き換
えることが可能に
ビルド前の準備として荷物になりそうな不要なファイ
ル群などを削除できたりする
64
xcodeprojの導入
Slackとjenkinsの連携
65
hubotを使ってjenkinsのジョブを実行
Slackとjenkinsの連携は
66
@tsuri_app jenkins build TsuriApp-iOS,
BRANCH=release/3.2.7&BUILD_ENV=app01-
aws.env&ENABLE_UPLOAD=true
コマンド 例)
67
Slackに下のコマンドで書き込めばjenkinsジョブが
実行される
ビルド後 配布完了時には
68
AppCenterへアップロード完了したことをSlackへ通
知
配布完了時には
69
70
2020年 12月ごろ
ふりかえり
釣り★スタだけでなく他のプロダクトも対応する流れ
に
効率化が進めば
71
WebViewApp
CI/CDへの対応状況
72
● AvaMee(アバタ
ー)
● クリノッペ
● ハコニワ
● 釣り★スタ
WebViewApp
+Cocos2D-JS
GREE SDK
GREE platform SDKが共通で使用されるのでビルド環
境も共通化しやすい
共通化
73
環境を整えてしまえば共通の
SDKの上に乗っかっているので
jenkinsのジョブも共通で同じように対応できる
プラットフォームならでは
74
メンテ中の出来事
75
macOS Mojave から Catalina にアップデート後
ビルドPCのOSアップデートで
76
ビルドが通らなくなった
Catalinaへ更新
77
見てみれば、
釣り★スタで使用している
SDK フォルダが消失
Mac OSの権限周りの変更で
78
OSのファイルシステムのセキュリティに影響される
ような
ルートディレクトリ付近にSDKを置いていたのも問題
そもそも
79
80
2021年 6月
ごろ
ふりかえり
さらに横断対応の範囲が広がる
81
ここまでは アプリチームが楽することだけ
考えて対応していたが・・・
WebViewApp
横断的対応の状況
82
● モンプラ
● AvaMee(アバター)
● クリノッペ
● 探検ドリランド
● 海賊王国コロンブス
● ハコニワ
● 釣り★スタ
WebViewApp
+Cocos2D-JS
GREE SDK
釣り★スタでのCI/CD化の恩恵が大きかった
83
事業部的な恩恵度を考えれば必然的に横断対応へ
84
アバタ
ー
クリノ
ッペ
探検 海賊
ハコニ
ワ
釣りス
タ
• 各プロダクトで個々にアプリビルドを担当していた
横断対応以前の状況
85
モンプ
ラ
横断対応以前の状況
86
各プロダクト毎に最小限のビルド環境しか無かった
釣り★スタと違い
87
WebViewベースアプリのためビルド時間はそ
れほどかからないが
やはりビルド中は
88
もちろんビルド中のアプリ自体にはさわれな
いし、軽めの作業しか並行できない。
ビルド後も
89
● 対象環境への接続確認
● 配布のためのアップロードも手動
追加の手間も掛かっていた
確実にやってくる更新として
90
● GREE SDKの更新
● 広告系ライブラリの更新
● アイコンの差し替え・戻し
この辺りの更新が数ヶ月に一回発生す
るたびに丸一日近く何もできないに等
しい
• 主にサーバサイド エンジニアがアプリのリリースまで担当
• アプリ側は大抵慣れていない作業に
• 年に数回のアプリビルド
• 証明書とかOSとか開発環境の更新が必要になることも
• 作業用PCでのビルド作業
• ビルド中は他の作業が滞る
• たまの対応で慣れない作業でQA環境の追加にも三日ほどかかるこ
とも
• この間に事業面の施策対応とか対応できない状況に
横断対応以前の状況
91
釣り★スタのCI/CD対応 以前と同じ状況ですね
要は
92
アプリチームで横断的対応が決定
93
状況改善すべく
一気に各プロダクトから依頼が
アプリチームで横断的対応が決定
94
ビルドで楽できると思ってたら
95
各プロダクト × 各環境数 = で作業量が
一気に増大
96
ビルド時間で一日が埋まる状況だったのが
97
ビルド設定を追加するだけで1日が終わる
状況に
依頼が集中した結果
98
一度 設定してしまえば
だけど結果として・・・
99
ビルドの度に奪われる時間がなくなった
100
もうビルドのたびにマシンを奪わ
れなくて済む!
101
注意点
プロダクト毎に開発環境事情が異なるので接続先確認は
しっかりやる
メンテ中の出来事
103
あるプロダクトでXcode13にアップデートしたところ
次のようなメッセージでビルドが通らなかったことが
Xcode13でのビルド
104
Xcode13でのビルド
105
note: The Legacy Build System will be removed in a future
release. You can configure the selected build system and
this deprecation message in File > Project Settings.
Xcode13に対応していない古いプロジェクト設定だと下のメッセージ
が表示されてビルドが失敗する
暫定的な対応となりますが、
Xcode13でのビルド
106
/app.xcodeproj/project.xcworkspace/xcsharedd
ata/WorkspaceSettings.xcsettings
以下を追加でビルドが通るように
<key>DisableBuildSystemDeprecationDiagnostic</key>
<true/>
横断的対応への要点
107
横断的対応への要点
108
プラットフォーム SDKの
長所である共通性を活かす
● GREE SDK更新のたびに書き換える必要
がでてくるのでSDKを書き換えてのカス
タム実装などはやらない
● 新OSヘの対応はプラットフォームの利点
を生かしてGREE SDKの更新のみで対応
していく
横断対応していく上でメンテ性は大切
横断的対応への要点
109
CI/CD化により以前の非効率な状況は解消し
た!
110
7プロダクトCI/CD化完了
111
2021年9月ごろ
まとめ
112
ビルド効率化が遅れていた中で、単なる機械的な定
型作業であったアプリ配布までの自動化を進め、横
断的対応や施策開発に向けて、以上のようなことを
やって乗り切ることが出来ました。
113
ゲーム事業としての本質である施策面へ
注力できる環境を整えていきたい
さらに、アプリチームとして
115
楽したい
すべてに共通な
116

長寿なゲーム事業におけるアプリビルドの効率化