【Unity】3年目がゲーム会社でスマホゲームを開発して得た知識 Jenkins編


3年目のプログラマがUnityを使用したスマホゲームの開発に関わった時に得たことを書き残しておきます

## 使用したJenkinsのバージョン

- 1.632

## バージョン管理システム

- Subversion

## 作成したジョブ

- ROMを作成するジョブ
    - テストとステージングとリリース
    - AndroidとiOS
    - trunkとbranch
- アセットバンドルを作成するジョブ
    - AndroidとiOS
    - trunkとbranch
- サーバにアセットバンドルをデプロイするジョブ
    - テストとステージングとリリース
    - AndroidとiOS
- サーバにhtmlをデプロイするジョブ
    - テストとステージングとリリース
- サーバのプログラムを更新するジョブ
    - テストとステージングとリリース
- サーバのDBを再構築するジョブ
    - テストとステージングとリリース
- etc.

## 使用したプラグイン

- [Build Flow Extensions Plugin](http://wiki.jenkins-ci.org/display/JENKINS/Build+Flow+Extensions+Plugin)
    - 並列ビルドや直列ビルドを管理できるようになります
    - APKとIPAのジョブを同時に走らせたい時、複数のサーバに同時にリソースをデプロイしたい時にワンクリックでビルドを開始できるようなりました
    - 参考サイト様
        - http://qiita.com/oh_rusty_nail/items/a2addc8d0ca5a6531152
        - http://qiita.com/taktos/items/55357fc0ae0d574690d5

- [Build Trigger Badge Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Build+Trigger+Badge+Plugin)
    - ビルド履歴で自動で実行されたのか手動で実行されたのかといったがわかるようになります

- [Configuration Slicing Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Configuration+Slicing+Plugin)
    - 各ジョブの基本的な設定を一括で変更できるようになります
    - カスタムワークスペースの設定を一括で行えるため、ヒューマンエラーを防ぐことができました

- [Custom Job Icon Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Custom+Job+Icon+Plugin)
    - ジョブ一覧にアイコンを表示できるようになります
    - APKを作るジョブにはAndroidのアイコンを表示、IPAを作るジョブにはAppleのアイコンを表示することで、どのジョブが何用なのかがわかりやすくなりました

- [EnvInject Plugin](https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin)
    - 各ジョブで環境変数を設定できるようになります
    - Unityビルド時に使用するBundle Identifierや、出力するROMのファイル名の記述の重複を防ぐことができました
    - ver. 1.632ではJenkinsの環境変数`${BUILD_ID}`が`${BUILD_NUMBER}`に置き換わってしまう状態だったので下記のGroovyスクリプトを使用して`${BUILD_ID}`を設定するようにしました
    - 参考サイト様
        - http://d.hatena.ne.jp/rabbit2go/20150204/1423056678
        - http://d.hatena.ne.jp/rabbit2go/20150415/1429101240

```groovy
return [BUILD_ID:currentBuild.getTime().format("yyyy-MM-dd_HH-mm-ss")]
```
    
- [Extra Columns Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Extra+Columns+Plugin)
    - ジョブ一覧に表示できるカラムの種類が増えます
    - 最新のビルドのコンソールログをすぐに開けるようになるので、ビルドエラー調査時の手間を少しだけ省くことができました

- [IRC Plugin](https://wiki.jenkins-ci.org/display/JENKINS/IRC+Plugin)
    - ビルドの結果をIRCに通知できるようになります

- [JobConfigHistory Plugin](https://wiki.jenkins-ci.org/display/JENKINS/JobConfigHistory+Plugin)
    - 各ジョブの設定の変更履歴を残せるようになります
    - ビルドに失敗した時に、ジョブの設定を間違えていないかどうかがわかるようになりました

- [Next Executions](https://wiki.jenkins-ci.org/display/JENKINS/Next+Executions)
    - ビルドの実行予定日時を表示できるようになります

- [Sectioned View Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Sectioned+View+Plugin)
    - ビューの表示を拡張することができます
    - 1つのビューの中でリストビューを複数表示できるため、ジョブの管理がしやすくなりました

- [Slack Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Slack+Plugin)
    - ビルドの開始や終了をSlackに通知できるようになります

- [Sidebar-Link Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Sidebar-Link+Plugin)
    - 画面左のメニューに好きな項目を表示できるようになります
    - プラグインの管理画面に移動できる項目や、Jenkinsの再起動の項目を増やすことで操作性を向上させました

- [Simple Theme Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Simple+Theme+Plugin)
    - HTMLやCSSを記述してJenkinsのデザインを変更できるようになります
    - リンクの下線を消して見た目をスッキリさせたり、リンクテキストにカーソルが重なったら背景色を変えることで操作性を向上させたりすることができました
    - 参考サイト様
        - https://gist.github.com/CLCL/8473984

- [Throttle Concurrent Builds Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Throttle+Concurrent+Builds+Plugin)
    - ジョブ実行時の排他制御ができるようになります
    - 共通のカスタムワークスペースを使用してROMやアセットバンドルを作成する時に、ビルドがバッティングしないようにするために使用しています
    - 参考サイト様
        - http://qiita.com/tabbyz/items/90e901959d214167d8d1

- [Timestamper](https://wiki.jenkins-ci.org/display/JENKINS/Timestamper)
    - ビルドログでログが出力された日時や経過時間が表示できるようになります
    - ビルドに時間がかかっている時に、どの処理がボトルネックになっているのかがわかりやすくなりました

## 使用しなかったプラグイン

- [Build-timeout Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Build-timeout+Plugin)
    - ジョブにタイムアウトを設定できるようになります
    - 便利ですが今回は使用する機会がありませんでした

- [Copy Artifact Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Copy+Artifact+Plugin)
    - 他ジョブの成果物を使用できるようになります
    - 便利ですが今回は使用する機会がありませんでした

- [Copy project link plugin](https://wiki.jenkins-ci.org/display/JENKINS/Copy+project+link+plugin)
    - ジョブを複製できるようになります
    - 便利ですが今回は使用する機会がありませんでした

- [PegDown Formatter Plugin](https://wiki.jenkins-ci.org/display/JENKINS/PegDown+Formatter+Plugin)
    - ジョブの説明欄をMarkdownで記述できるようになります
    - ジョブ一覧で説明文の上下に空白ができてしまい、見辛くなってしまったので使用しないことになりました

## 細かい設定

- リストビューのビルドボタンはジョブ名の左側に移動
    - デフォルトだと右端に表示されており、別のジョブのビルドボタンを間違って押してしまう可能性があったため
- リストビューにジョブ名ではなく説明文を表示
    - 英数字表記のジョブ名よりも日本語表記の説明文の方がわかりやすいため
    - ジョブ名表示だと、branchが増えてきた時にジョブの把握が難しくなってしまった
    - 説明文はhtmlタグを使用できるため、色を変更して説明を強調することが可能
    （「グローバルセキュリティの設定」の「マークアップ記法」を「Raw HTML」に変更する必要があります）
- リリース用のROMを作成するジョブは、バージョンの上げ忘れを防ぐために「ビルドのパラメータ化」を使用して事前確認を行えるように設定
    - 参考サイト様
        - http://qiita.com/ykirishima/items/1ac49905577c76920076
- ROMビルド時に`${JOB_NAME}`、`${BUILD_ID}`、`${BUILD_NUMBER}`、`${SVN_REVISION}`を引数に渡してC#のスクリプトに埋め込み、デバッグメニューでそのROMを作成したジョブ、作成日時、番号、リビジョンを見れるように実装
    - 不具合報告が上がってきた時に適切なROMで動作確認しているかどうかがわかるようになります
- SVNコミット直後にビルドを走らせると、そのコミットが含まれずにROMやアセットバンドルの作成が開始してしまうことがあったため、SVNのリポジトリURLの末尾に「@HEAD」と記述して対応
    - 参考サイト様
        - http://qiita.com/tokumura11/items/a058cebdb2c9bc90442d
- Unityバッチビルドで失敗した場合は`EditorApplication.Exit( 1 );`を呼び出すように実装
    - この処理を忘れてしまうとビルドに失敗してもJenkinsの表示上は成功になってしまうため

```csharp
var result = BuildPipeline.BuildPlayer( 
	levels, 
	locationPathName, 
	BuildTarget.Android, 
	options 
);

if ( result == null || result == "" )
{
	return;
}

EditorApplication.Exit( 1 );
```

## よく使うURL

|URL|説明|
|:--|:--|
|[JenkinsのURL]/scm/SubversionSCM/enterCredential|SVNの認証|
|[JenkinsのURL]/restart|Jenkinsの再起動|
|[JenkinsのURL]/safeRestart|Jenkinsの再起動（ジョブの実行完了を待つ）|
|[JenkinsのURL]/threadDump|スレッドダンプ|
|[ジョブのURL]/build|ジョブのビルド|
|[ジョブのURL]/lastBuild/|ジョブの最新ビルド|
|[ジョブのURL]/lastStableBuild/|ジョブの最新の安定ビルド|
|[ジョブのURL]/lastSuccessfulBuild/|ジョブの最新の成功ビルド|
|[ジョブのURL]/lastFailedBuild/|ジョブの最新の失敗ビルド|
|[ジョブのURL]/lastUnsuccessfulBuild/|ジョブの最新の不成功ビルド|
|[ジョブのURL]/lastBuild/api/xml?xpath=//changeSet/item/msg&wrapper=changes|最新ビルドの変更履歴|
|[ビルド結果のURL]/console|コンソール出力|
|[ビルド結果のURL]/consoleFull|コンソール出力（すべてのログ）|

- http://baba-s.hatenablog.com/entry/2016/03/15/220000

## Mac miniとMac Pro

- 最初はJenkinsマシンとしてMac miniを使用していましたが、ビルド時間短縮のために途中からMac Proに移行しました

|ROM|Mac mini|Mac Pro|
|:--|:--|:--|
|Android|約6分|約3分|
|iOS|約25分|約12分|

## 参考サイト様

- http://blog.fenrir-inc.com/jp/2012/12/jenkins_plugins.html
- http://blog.fenrir-inc.com/jp/2013/03/jenkins-2.html
- http://blog.fenrir-inc.com/jp/2013/06/jenkins_plugins-2.html

## 参考資料

- CEDEC 2015 - 長期運営タイトルに後からパイプラインの自動化を導入した際の技術的Tips
    - https://cedil.cesa.or.jp/cedil_sessions/view/1306