Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Unity × Jenkinsで複数バージョン書き出しと動的なインポート/ Unity × J...

Unity × Jenkinsで複数バージョン書き出しと動的なインポート/ Unity × Jenkins Multiple Build And Dynamic Import

cluster.unity #2 で発表した内容です
https://cluster-vr-meetup.connpass.com/event/128036/

詳細は後日Qiitaにアップします
https://qiita.com/nkjzm

Nakaji Kohki

May 09, 2019
Tweet

More Decks by Nakaji Kohki

Other Decks in Technology

Transcript

  1. Nakaji Kohki / リリカちゃん Mercari, Inc. R4D XR Engineer 名古屋出身のゲームエンジニア

    日本バーチャルリアリティ学会認定VR 技術者 Books: 技術評論社『VR エンジニア養成読本』 Works: 『Crevasse 』『至近距離ガールVR 』 2
  2. Jenkins を導入したきっかけ モーションキャスト VRM 対応のアダルトアプリ Windows / Mac に対応 VR

    版・LookingGlass 版とかも出したい 有償版・体験版が存在 オープンソース(no license) → 更新のたびに書き出しが大変 4
  3. 出来るようになったこと 1. プロジェクトの変更をGitHub にpush 2. 勝手にJenkins のビルドが走る 3. 製品版と体験版のビルドが、Mac, Windows

    それぞ れ生成される And More... .unitypackage の動的インポート GoogleDrive 上のフォントをビルド時にインポート 5
  4. Jenkins のインストール 余ってたMacbook を利用 # jenkins のインストール $ brew install

    jenkins # jenkins の起動 $ jenkins localhost:8080 にアクセスして表示されればOK 8
  5. 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
  6. メインPC からローカル接続 ローカルネットワークを利用 Jenkins が入ったMac で[ システム環境設定]-[ ネット ワーク] を開く

    「IP アドレスhogehoge が設定されています。」の hogehoge がローカルIP 設定したポートをつけて別PC のブラウザからアク セスする ( この場合は192.168.11.7:8080 ) 多分VPS つか使うと出先からもアクセス出来る Chrome リモートデスクトップも入れておくと便利 10
  7. SSH キーをGitHub に登録 設定済みなら大丈夫 # SSH キーの生成。パスワードなどは全てEnter でok $ ssh-keygen

    # 公開鍵をコピー $ pbcopy < ~/.ssh/id_rsa.pub https://github.com/settings/keys に登録 11
  8. ビルド用メソッドの追加 コマンドラインから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
  9. ジョブの作成 (1/2) 1. Jenkins から[ 新規ジョブ作成] を選択 2. ジョブの名前を入力 3.

    [ フリースタイル・プロジェクトのビルド] を選択 4. OK 5. [GitHub project] にチェックを入れGit のURL を入力 6. ソースコード管理でGit を選択し、「リポジトリ URL 」「ブランチ指定子( 例: */master ) 」を入力 13
  10. ジョブの作成 (2/2) 7. [ ビルド]-[ ビルド手順の追加]-[Invoke Unity3d Editor] を選択 8.

    [Editor command line arguments] に -quit -batchmode -executeMethod MyEditorScript.PerformMacOSXBuild 9. [ ビルド後の処理]-[ ビルド語の処理の追加]-[ 成果物 を保存] を選択 10. [ 保存するファイル] にBuilds/*.app/ を指定 11. [ 保存] 14
  11. ビルドの実行 Jenkins 上のボタンからビルドを実行 成功: おめでとう!!!!!! 失敗: がんばろう!!!!!! コンソール( 例: /job/MotionCast/75/console

    ) の中から error , fail などを検索して原因を特定し、対処して いこう( つらい) ローカルマシン上で普通にUnity を起動してビルド 出来るかとか試してみるとよさそう 15
  12. 複数バージョンをビルド 有償版+ 体験版 等 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
  13. GitHub のpush をトリガーに ビルドを実行 Jenkins はAPI 経由でジョブ実行可能 ユーザートークンと認証トークンが必要 curl -X

    POST -u "nkjzm:user-token" http://localhost:8080/job/Test/build?token=token GitHub はpush 時にWebhook が出来る ただしローカルのエンドポイントたたけない → UltraHook を経由 21
  14. -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
  15. 複数.unitypackage をインポー トするコード がんばって書いたので良かったら使ってください # Unity のパスを取得 UNITYPATH=$(grep -o "<home[^>]*>[^<]*</home>"

    $JENKINS_HOME/org.jenkinsci.plugins.unity3d.Unity3dBuilder.xml | sed -e "s/<home>\(.*\)<\/home>/\1/") # .unitypackage を見つけてループを回す for filename in *.unitypackage; do $UNITYPATH/Contents/MacOS/Unity -quit -batchmode -importPackage $filename; done 26
  16. 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
  17. 応用: 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
  18. まとめ 出来るようになったこと push トリガーで自動ビルド 製品版と体験版のビルドが、Mac, Windows それぞ れ生成 .unitypackage の動的インポート

    GoogleDrive 上のフォントをビルド時にインポート 今日の内容は後日Qiita にアップ https://qiita.com/nkjzm 31
  19. 33