UnityPro+Github+Jenkins+DeployGateで自動ビルド&配布環境を作る その1

raharu(仮名)(プログラマー)
これがダイバージェンス1%の先の世界か。。。

必要環境

Mac
UnityPro(有料)
github(アカウント作成&SSH認証済み)
Jenkins(無料)
DeployGate(無料)
iOS Developper契約済みアカウント(有料)

となりますUnityProが必要な理由はバッチモードで
メソッドを直接実行できるオプションがProのみ対応しているとのことです。

0からこの環境を整えるのは結構面倒かとおもいますが、
一応必須条件は上記条件になります。

やる事

・Unityでプロジェクトの作成
・Githubで管理を行う
・コマンドラインからビルドする
・Jenkinsの設定についか
・xcodeプロジェクトからipaファイルを作成
・DeployGateアップロードして配布開始

という流れになります。

・Unityでプロジェクトの作成

どんなプロジェクトでもかまいません適当なプロジェクトを作成して保存しましょう。
一応文字でも真ん中に入れてビルドが成功した事が分かる程度の物で問題ありません
今回は前回作成した4.6のuGUIを試しているプロジェクトを使います。

Unity4.6 uGUI入門 Canvas編

・Githubで管理を行う(.gitignoreの設定)

Jenkinsで最新ソースをpullしてそれをビルドする事を目的としていますので
Githubにリポジトリを作成します。
ここら辺のやり方は色々親切に書いてくれている記事がありますので適当に探してください。

UnityプロジェクトをGithubに上げる際に不必要なフォルダやファイルを上げない為に
.gitignoreを設定します(※設定はあくまで一例です)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
##############
## unity
##############
[Ll]ibrary
[Tt]emp
[Oo]bj

##############
## Editor
##############
*.pidb
*.csproj
*.unityproj
*.booproj
*.svd
*.user
*.userprefs
*.suo
*.sln
LocalCache/

##############
## BuildResult
##############
Simulator/
iOSDevice/

##############
## Mac
##############
*.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
Icon?
ehthumbs.db
Thumbs.db

ignoreを設定したら自分のリポジトリにpushしましょう。

・コマンドラインからビルドする

さてここまで来たら早速Unityをコマンドライン上から実行してみます。
この時に使うのはまだgithub上のプロジェクトでは無く先ほど作成したプロジェクトをビルドします

1
$ /Applications/Unity/Unity.app/Contents/MacOS/Unity

私の環境だとこのパスにありますが個人の環境に合わせてください。
※MacはUnityを複数個立ち上げる事が出来ません、既にUnityを開いている場合は閉じてから再実行してください。

これで起動したらならビルドを自動で行う為にプロジェクトに以下のファイルを追加します 名前はBuildBatchにしました

f:id:raharu0425:20141211174756p:plain

1
2
3
4
5
6
7
8
9
10
11
12
13
using UnityEngine;
using UnityEditor;

using System.Collections;

public class BuildBatch : MonoBehaviour {

    // build iOS app
    [UnityEditor.MenuItem("Tools/Build Project AllScene iOS")]
    private static void BuildiOS(){
        Debug.Log("##########iOS Build Start#########");
    }
}

このcsファイルを保存して以下のコマンドを実行します

1
$ /Applications/Unity/Unity.app/Contents/MacOS/Unity -quit -batchmode -projectPath [自分のプロジェクトのパス] -executeMethod BuildBatch.BuildiOS -logFile ~/build.log; cat ~/build.log

~/build.logの中に

####iOS Build Start

とロギングされていれば問題ありません。

先ほどのBuildBatch.csを以下に編集します

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using UnityEngine;
using UnityEditor;

using System.Collections;

public class BuildBatch : MonoBehaviour {

    // build iOS app
    [UnityEditor.MenuItem("Tools/Build Project AllScene iOS")]
    private static void BuildiOS(){
        Debug.Log("##########iOS Build Start#########");

        // 全てのシーンを取得する
        EditorUserBuildSettings.SwitchActiveBuildTarget( BuildTarget.iPhone );
        string[] allScene = new string[EditorBuildSettings.scenes.Length];
        int i = 0;
        foreach( EditorBuildSettingsScene scene in EditorBuildSettings.scenes ){
            Debug.Log ("scenePath(" + i + ")" + scene.path);
            allScene[i] = scene.path;
            i++;
        }

        // オプションの設定
        BuildOptions opt = BuildOptions.SymlinkLibraries |
        BuildOptions.AllowDebugging |
        BuildOptions.ConnectWithProfiler |
        BuildOptions.Development;

        PlayerSettings.iOS.sdkVersion = iOSSdkVersion.DeviceSDK;
        // Identifierは個人の環境に合わせる
        PlayerSettings.bundleIdentifier = "jp.co.AnimeMiru";
        // バージョンも必要に合わせて変更する
        PlayerSettings.bundleVersion = "1.0.0";
        PlayerSettings.statusBarHidden = true;
        string errorMsg_Device = BuildPipeline.BuildPlayer(
            allScene,
            "iOSDevice",
            BuildTarget.iPhone,
            opt
        );

        if (string.IsNullOrEmpty(errorMsg_Device)){
            Debug.Log ("##########Success iOS Device Build#########");
        } else {
            Debug.Log ("##########Failed iOS Device Build#########");
            Debug.Log (errorMsg_Device);
        }

        //シュミレーター用
        PlayerSettings.iOS.sdkVersion = iOSSdkVersion.SimulatorSDK;
        string errorMsg_Simulator = BuildPipeline.BuildPlayer(
            allScene,
            "Simulator",
            BuildTarget.iPhone,
            opt
        );
        if (string.IsNullOrEmpty(errorMsg_Simulator)){
            Debug.Log ("##########Success Simulator Build#########");
        } else {
            Debug.Log ("##########Failed Simulator Build#########");
            Debug.Log (errorMsg_Device);
        }

    }
}

正常にビルドが行われるとプロジェクト内部に以下の様に出力されます。

f:id:raharu0425:20141211175226p:plain

以下のサイトを参考にさせていただきました有り難うございます。

UnityのビルドをJenkins氏に任せて楽したい。
Unityを自動的にビルドする設定にしたときのメモ

次回はJenkinsの設定とDeployGateの設定を行います