Slide 1

Slide 1 text

Unity × Jenkins で 複数バージョン書き出しと 動的なインポート cluster.unity #2 by @nkjzm

Slide 2

Slide 2 text

Nakaji Kohki / リリカちゃん Mercari, Inc. R4D XR Engineer 名古屋出身のゲームエンジニア 日本バーチャルリアリティ学会認定VR 技術者 Books: 技術評論社『VR エンジニア養成読本』 Works: 『Crevasse 』『至近距離ガールVR 』 2

Slide 3

Slide 3 text

推しのVTuber 3

Slide 4

Slide 4 text

Jenkins を導入したきっかけ モーションキャスト VRM 対応のアダルトアプリ Windows / Mac に対応 VR 版・LookingGlass 版とかも出したい 有償版・体験版が存在 オープンソース(no license) → 更新のたびに書き出しが大変 4

Slide 5

Slide 5 text

出来るようになったこと 1. プロジェクトの変更をGitHub にpush 2. 勝手にJenkins のビルドが走る 3. 製品版と体験版のビルドが、Mac, Windows それぞ れ生成される And More... .unitypackage の動的インポート GoogleDrive 上のフォントをビルド時にインポート 5

Slide 6

Slide 6 text

今日の内容について 後日Qiita にまとめて公開します https://qiita.com/nkjzm 6

Slide 7

Slide 7 text

1. Jenkins の導入方法(Mac) Unity のビルドをするところまで 7

Slide 8

Slide 8 text

Jenkins のインストール 余ってたMacbook を利用 # jenkins のインストール $ brew install jenkins # jenkins の起動 $ jenkins localhost:8080 にアクセスして表示されればOK 8

Slide 9

Slide 9 text

Unity のインストール Unity Hub とかでインストール Jenkins にUnity3d plugin をインストール [Jenkins の管理]-[ プラグインの管理]-[ 利用可能] タブから[Unity3d plugin] 選択 パスを設定 [Jenkins の管理]-[Global Tool Con gration]- [Unity3d] より[ インストール済みUnity3d] 例: Hub 経由でインストールしている場合 /Applications/Unity/Hub/Editor/2018.2.20f1/Unity.app 9

Slide 10

Slide 10 text

メインPC からローカル接続 ローカルネットワークを利用 Jenkins が入ったMac で[ システム環境設定]-[ ネット ワーク] を開く 「IP アドレスhogehoge が設定されています。」の hogehoge がローカルIP 設定したポートをつけて別PC のブラウザからアク セスする ( この場合は192.168.11.7:8080 ) 多分VPS つか使うと出先からもアクセス出来る Chrome リモートデスクトップも入れておくと便利 10

Slide 11

Slide 11 text

SSH キーをGitHub に登録 設定済みなら大丈夫 # SSH キーの生成。パスワードなどは全てEnter でok $ ssh-keygen # 公開鍵をコピー $ pbcopy < ~/.ssh/id_rsa.pub https://github.com/settings/keys に登録 11

Slide 12

Slide 12 text

ビルド用メソッドの追加 コマンドラインからUnity を起動したりメソッドを 実行する仕組みを利用する。 Assets/Editor に以下のメソッドを追加 static void GenericBuild(string[] scenes, string target_dir) { EditorUserBuildSettings.SwitchActiveBuildTarget( BuildTargetGroup.Standalone, BuildTarget.StandaloneOSX); var report = BuildPipeline.BuildPlayer( scenes, target_dir, BuildTarget.StandaloneOSX, BuildOptions.None); } 12

Slide 13

Slide 13 text

ジョブの作成 (1/2) 1. Jenkins から[ 新規ジョブ作成] を選択 2. ジョブの名前を入力 3. [ フリースタイル・プロジェクトのビルド] を選択 4. OK 5. [GitHub project] にチェックを入れGit のURL を入力 6. ソースコード管理でGit を選択し、「リポジトリ URL 」「ブランチ指定子( 例: */master ) 」を入力 13

Slide 14

Slide 14 text

ジョブの作成 (2/2) 7. [ ビルド]-[ ビルド手順の追加]-[Invoke Unity3d Editor] を選択 8. [Editor command line arguments] に -quit -batchmode -executeMethod MyEditorScript.PerformMacOSXBuild 9. [ ビルド後の処理]-[ ビルド語の処理の追加]-[ 成果物 を保存] を選択 10. [ 保存するファイル] にBuilds/*.app/ を指定 11. [ 保存] 14

Slide 15

Slide 15 text

ビルドの実行 Jenkins 上のボタンからビルドを実行 成功: おめでとう!!!!!! 失敗: がんばろう!!!!!! コンソール( 例: /job/MotionCast/75/console ) の中から error , fail などを検索して原因を特定し、対処して いこう( つらい) ローカルマシン上で普通にUnity を起動してビルド 出来るかとか試してみるとよさそう 15

Slide 16

Slide 16 text

ここまでの感想 ビルドマシンがローカルで触れるの クソ便利!!!!!!!!!!!! クラウド環境だとデバッグ大変だよね・・・ 16

Slide 17

Slide 17 text

2. 複数バージョン書き出し 17

Slide 18

Slide 18 text

複数プラットフォーム向けに ビルド ビルドタスクを追加すればいい ジョブを分けても良い(pipeline 試したい) 18

Slide 19

Slide 19 text

複数バージョンをビルド 有償版+ 体験版 等 static void SetTrial() { if (EditorApplication.isUpdating != true) { ChangeBuildMode(); } EditorApplication.update += ChangeBuildMode; } static void ChangeBuildMode() { PlayerSettings.applicationIdentifier += "jp.nkjzm.MotionCast PlayerSettings.productName += "MotionCast(trial)"; var defineSymbols = PlayerSettings.GetScriptingDefineSymbols defineSymbols.Add("TRIAL"); 19

Slide 20

Slide 20 text

3. GitHub のpush をトリガー にビルドを実行 20

Slide 21

Slide 21 text

GitHub のpush をトリガーに ビルドを実行 Jenkins はAPI 経由でジョブ実行可能 ユーザートークンと認証トークンが必要 curl -X POST -u "nkjzm:user-token" http://localhost:8080/job/Test/build?token=token GitHub はpush 時にWebhook が出来る ただしローカルのエンドポイントたたけない → UltraHook を経由 21

Slide 22

Slide 22 text

4. .unitypackage の動的イン ポート 22

Slide 23

Slide 23 text

.unitypackage の動的インポー ト モーションキャストはオープンソースプロジェクト → 全てのアセットがリポジトリに含まれていない → CI 環境で動的にアセットのインポートをしたい そこでコマンドライン引数を試してみた -importPackage 23

Slide 24

Slide 24 text

-importPackage をためした結 果 1. GitHub のリリースから.unitypackage をDL 2. Unity Plugin 経由で-importPackage を呼び出す 3. 成功 curl -OL https://github.com/vrm-c/UniVRM/releases/download/v0.48 -quit batchmode -importPackage UniVRM-0.48_4840.unitypackage 24

Slide 25

Slide 25 text

-importPackage の課題 インポート後のコンパイルがコケるとAbort される モーションキャストの場合、複数のアセットをイ ンポートしないとコンパイルが通らない → 最後以外はインポート直後がコンパイルエラー 状態 考えられる対策 DefineSymbols を切り替えながら順次インポート → そこまでする?感がある 25

Slide 26

Slide 26 text

複数.unitypackage をインポー トするコード がんばって書いたので良かったら使ってください # Unity のパスを取得 UNITYPATH=$(grep -o "]*>[^<]*" $JENKINS_HOME/org.jenkinsci.plugins.unity3d.Unity3dBuilder.xml | sed -e "s/\(.*\)<\/home>/\1/") # .unitypackage を見つけてループを回す for filename in *.unitypackage; do $UNITYPATH/Contents/MacOS/Unity -quit -batchmode -importPackage $filename; done 26

Slide 27

Slide 27 text

5. GoogleDrive 上のフォント をビルド時にインポート 27

Slide 28

Slide 28 text

GoogleDrive 上のフォントを ビルド時にインポート(1/2) 有償フォントを使っていたので、公開プロジェク トに含められなかった プライベートのGoogleDrive 上のものを参照 .meta をコミットしておけちゃんとひも付きそう 28

Slide 29

Slide 29 text

GoogleDrive 上のフォントを ビルド時にインポート(2/2) gdrive.sh がすごい優秀だった # Drive のファイルを落とせるシェル( フォルダにも対応) curl gdrive.sh | bash -s https://drive.google.com/open?id=1vCFpTCTbDtZ0wJlTzhWdGoEGWS9Akm # フォントを見つけて移動させる cd Fonts for filename in *.ttf; do mv "$filename" "$WORKSPACE/Assets/VMotion/Fonts"; done cd ../ 29

Slide 30

Slide 30 text

応用: AssetStore のPackage に も対応 AssetStore の.unitypackage はローカル上に存在 /Users/nkjzm/Library/Unity/Asset\ Store-5.x/ 以下 Drive にアップしておいてひっぱってこれば動的に インポートできる 解答時に.gz になるので、リネームが必要だった for filename in *.unitypackage.gz; do mv $filename ${filename%.unitypackage.gz}.unitypackage; done 30

Slide 31

Slide 31 text

まとめ 出来るようになったこと push トリガーで自動ビルド 製品版と体験版のビルドが、Mac, Windows それぞ れ生成 .unitypackage の動的インポート GoogleDrive 上のフォントをビルド時にインポート 今日の内容は後日Qiita にアップ https://qiita.com/nkjzm 31

Slide 32

Slide 32 text

ありがとうございました 32

Slide 33

Slide 33 text

33