Gitlab CIでgitにあるUnityプロジェクトからipa、アーカイブを取得する

はじめに

前回のUnity関連の記事から2年以上経過してしまいました。

Unityで作ったiOSアプリにObj-CでPush通知を載せてみた

2年たっても変わらないのは、ipa生成までの時間です。 世間的にもCI周りの知見は充実している中、Unityからipa作成までを一貫した記事がなかったため社内で実施した内容を書いていきます。

ここが良い

(1)artifactがコミット別で取得できる リリース版、開発版と環境を分けた状態で取得が用意になるのはもちろん、 事後に不具合が見つかった場合に実機ベースの検証が必要!となれば どこのコードのコミットが原因かを特定することを技術者じゃないメンバーにもアクションを起こしてもらうこと、 配信サーバへアップロードするといったこともStagesにアップロードするjobを追加することで Gitlab CIの画面上から必要なメンバーにアップロードが可能な環境を用意することができるようになります。

また、制限時間をつけている場合はgitlabのサーバのディスク容量を考えてするべくつけていますが、時間が経過してartifactが消えてしまってもStageからRetryすることで、、

(2)ipa、アーカイブファイルの再取得が可能になる アプリの配信サーバに置いてあるipaファイルがどのコードと結びついているのか確信が持てない Macの入れ替えなどでXcodeアーカイブファイル(これも結構な容量)を入れ替え前のMacから引き継ぐといったことから卒業できます。 前提には、runnerとして動作するMacの開発環境は前回ビルド時と同じ、という条件が必要です。

 

(3)実装者の作業MacのCPU負荷を下げて作業効率を上げる 人が使役するお道具にとってかなり重要な役割だと思っています。 実際Unityをビルドするにあたって今回のソースはとても簡易な作りにしているにも関わらず、 それでも4分〜10分待たされる自分の作業Macで、合間にやるタスクが限定される、他の作業をすることでビルドの時間も長引くなり滅入るといった気持ち的なところも作業を分離できるのは大きな改善に繋がります。

gitリポジトリの構成

今回の説明で使うのは赤枠で囲っているファイル、フォルダです。

Gitlab CIの設定

.gitlab-ci.yml中に記載したくないパラメータはCI/CD PipelinesのSecret Variablesへ追加します。

USER_NAMEはgitlabCIのrunnerが動いているMac OSX でログインしているユーザ名 PATH_PHRASE → ビルド時に確認されるユーザ確認のダイアログを通過(されてるのかな・・・) DEVELOPMENT_TEAMはipa出力時に必要。対応する値は次のUnityプロジェクトの中で書いています。

.gitlab-ci.ymlの一部

Unityプロジェクトでの設定・記述

Editorの下に入れている二つのファイルについて

Xcodeでのプロジェクトの出力設定はコマンドラインから直接コードで変更するのは BuildClass

Xcodeのプロジェクト生成後の設定変更はMyBuildPostprocessor の記述です。

CODE_SIGN_IDENTITYはXcodeのCode Signing Identityに当たる設定値を記載します。 下記例ではadhoc、release版を対象としているためiPhone Distribution:がPrefixとなる文字列を指定しています。

これを設定しない場合、プロビジョニングファイルと紐づいていない証明書が選ばれることがありました。次のようなエラーです。

❌ Provisioning profile “hogehoge_fujii” doesn’t include signing certificate “iPhone Developer: Taro Tanaka (XXXXXXXX)”.

DEVELOPMENT_TEAM にはApple Developer CenterのMemberShipで確認できる Team IDを使用します。 このサイトにログインした後のURLにもこのTeam IDが使われているのでそちらを利用することもできます。

MyBuildPostprocessor.cs での設定は、このDEVELOPMENT_TEAMの設定を削った状態でもビルドは完了しました。アーカイブ時には先の.gitlab-ci.ymlで記載したコマンドのパラメータから不要なのかもしれません。
PROVISIONING_PROFILE_SPECIFIER はXcode8系から登場した設定値です。UUIDを設定するのでなく、プロファイル名を指定するようになりました。

Certificates, Identifiers & Profiles ではprovisioning Fileの一覧に表示されているNameを使います。  

これを設定しない場合、プロビジョニングファイルがない、というエラーが表示されました。

❌ [BCEROR]Unity-iPhone requires a provisioning profile. Select a provisioning profile for the “ReleaseForRunning” build configuration in the project editor.

さいごに

全体を通して、runnerを動かしているMac を横に動作を監視してみて、GUIを使った場合のビルドに比べ、batchmodeでの実行なのでとても静かに実行されています。gitにコミットを行なっている作業マシンでの負担も減りました。

ipaだけでなくarchiveファイルの取得も行なっているのは、adhoc、申請とプロビジョニングファイルの差し替えが可能なように アップローダツールでなく、Xcode経由でアップロードする場合を想定しています。 全部をCIに置き換える作業は、毎年のAppleの仕様変更や、新しいgoogle Playのアプリ仕様対応なども含めると実際難しいところも多く、 まずは人の手が必要な部分での知見をためて、自動化可能なところを切り出すという、かなり地道な作業を元に行なっています。 いろんな企業のCI構成を取り入れられるように、様々な会社のCI活動をもっと見ていきたいなと。次はPG作業以外のCI化を書く予定です。

参考

UnityのiOSアプリをアーカイブまでJenkinsで自動化した話 OS X El Capitan: キーチェーンをロックする/ロック解除する UnityでXcodeの設定を自動化する方法まとめ https://docs.unity3d.com/ScriptReference/Callbacks.PostProcessBuildAttribute.html https://docs.unity3d.com/ScriptReference/iOS.Xcode.PBXProject.html https://docs.unity3d.com/ScriptReference/BuildPipeline.BuildPlayer.html

●この記事を書いた人