ともち屋

リスの写真とか、技術メモとか。

UnityのビルドをJenkins氏に任せて楽したい。

Unityはじめました。

会社でUnityを触りはじめました。
マルチプラットフォーム開発で夢が広がりますね。

ただUnityさん、ビルドが超面倒臭い。

Android向け、iOS向けにそれぞれビルドはもちろん、
確認のために実機一台一台にインストール・・・。

日が暮れます。家に帰るとリス寝ちゃってます。
それは困る。

ビルドから端末へのインストールまで自動化してみたので
そのメモを書いておきます。

みんな大好きJenkins氏

Jenkinsさん全部やってくれないかなー。
とぐーぐる先生に聞いてみた結果、

Unity3D - Jenkinsさんでビルドしてスマホでの確認を楽ちんに - Qiita [キータ]
【研究課題レポート抜粋】Jenkins+Unityで構築するスマフォアプリビルドサーバー|サイバーエージェント 公式エンジニアブログ

なんかできそう。

とりあえずmacにJenkins環境を立ち上げました。

よさげなjenkins pluginがある

上記記事ではUnityをバッチモードで起動して
xcodeプロジェクトと.apkファイルを出力するところがシェルスクリプトになっていますが、下記プラグイン使えばちょっと楽できるっぽい。
Unity3dBuilder Plugin - Jenkins - Jenkins Wiki

早速ビルド手順を追加でUnity3dプラグインを選び、このように設定。
f:id:tomocha0911:20130722231215j:plain

ここで呼ばれるMyBuilderは、上記記事でのBatchBuild.csに該当します。

中身はこんな感じになってます。

[UnityEditor.MenuItem("Tools/Build Project AllScene Android")]
public static void BuildProjectAllSceneAndroid() {
    EditorUserBuildSettings.SwitchActiveBuildTarget( BuildTarget.Android );
    string[] allScene = new string[EditorBuildSettings.scenes.Length];
    int i = 0;
    foreach( EditorBuildSettingsScene scene in EditorBuildSettings.scenes ){
        allScene[i] = scene.path;
        i++;
    }	
    PlayerSettings.bundleIdentifier = "jp.co.hoge.hoge";
    PlayerSettings.statusBarHidden = true;
    BuildPipeline.BuildPlayer( allScene,
                              "hoge.apk",
                              BuildTarget.Android,
                              BuildOptions.None
                             );
}
[UnityEditor.MenuItem("Tools/Build Project AllScene iOS")]
public static void BuildProjectAllSceneiOS() {	
    EditorUserBuildSettings.SwitchActiveBuildTarget( BuildTarget.iPhone );
    string[] allScene = new string[EditorBuildSettings.scenes.Length];
    int i = 0;
    foreach( EditorBuildSettingsScene scene in EditorBuildSettings.scenes ){
        allScene[i] = scene.path;
	i++;
    }
	    
    BuildOptions opt = BuildOptions.SymlinkLibraries |
			BuildOptions.AllowDebugging |
			BuildOptions.ConnectWithProfiler |
			BuildOptions.Development;
		
    //BUILD for Device
    PlayerSettings.iOS.sdkVersion = iOSSdkVersion.DeviceSDK;
    PlayerSettings.bundleIdentifier = "jp.co.hoge.hoge";
    PlayerSettings.statusBarHidden = true;
    string errorMsg_Device = BuildPipeline.BuildPlayer( 
                                       allScene,
	                               "hoge4iOSDevice",
	                               BuildTarget.iPhone,
	                               opt
	                               );
		
    if (string.IsNullOrEmpty(errorMsg_Device)){
	
    } else {
	//エラー処理適当に		
    }
	
	
  //BUILD for Simulator
  PlayerSettings.iOS.sdkVersion = iOSSdkVersion.SimulatorSDK;
  //あとはDeviceビルドと同様に。

でビルド。

とりあえずapkとxcodeプロジェクトは出力された。

あとは【研究課題レポート抜粋】Jenkins+Unityで構築するスマフォアプリビルドサーバー|サイバーエージェント 公式エンジニアブログ

#----------------------------------------------------------------------
# コマンドラインでのipaと.dSYMファイルの作成
#----------------------------------------------------------------------

以降のシェルスクリプトを自分の環境に合わせ、ビルド手順に追加しませう。

apkとipaとdSYMファイルを手に入れた!

apkファイル

Androidはapkファイルを端末に入れさえすればインストールできるため、端末から見れる適当な場所へアップします。
社内からのみ見れる場所とか、Googleドライブとか。

jenkinsのビルド後の処理でURLはっつけたメールを送るようにすればきっと勝手にインストールしてもらえます。

ipa, dSYMファイル

iOSはどうやるの・・・
TestFlightを使います。

実はjenkinsのpluginにTestFlightのものがあります。
ただ、私の環境ではうまく動かなかったため、TestFlightのUploadAPIを呼んでいます。

Jenkinsのビルド手順にシェルスクリプトの実行を追加して、

  curl http://testflightapp.com/api/builds.json 
    -F file=@testflightapp.ipa
    -F dsym=@testflightapp.app.dSYM.zip
    -F api_token='your_api_token' 
    -F team_token='your_team_token' 
    -F notes='リリースノート' 
    -F notify=True 
    -F distribution_lists='test' #通知を送るdistribution_list

を書いておけばOK。

TestFlight送る時のリリースノートにSVNのコミットログとか取得して入れておけば良いのじゃないかなー。

あとはTestFlightにテストしてもらいたい人を招待して
その人のiOS端末のUDIDを貰って開発機登録して
プロビジョニングファイル作る。
それをipa作成の際に使うようにしてください。

あとはよろしくJenkinsさん

以上でUnityアプリの
1.SVNからチェックアウト
2.Android向けにビルド
3.xcodeプロジェクト出力
4.iOS向けにビルド
5.Android端末へインストール
6.iOS端末へインストール
という面倒な流れが自動化できました。


本当にありがとうございました。

リスの写真を主に。

たまーーーーーーーーに技術的な備忘録を書こうと思います。

 

まろんさん(♀)

ぐでーん。

f:id:tomocha0911:20130722195240j:plain