読者です 読者をやめる 読者になる 読者になる

UnityにFirebase入れたらJenkinsビルドが失敗を繰り返すようになった

発端

UnityにFirebaseを導入したは良いのだけどJenkinsビルドが通らなくなった。

以下エラーの記述を一部抜き出したもの

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_FIRGoogleAuthProvider", referenced from:
      objc-class-ref in libAuth.a(credential_ios_de0c3e1fa34e9a30835a63e195323a0f.o)
  "_OBJC_CLASS_$_FIRGitHubAuthProvider", referenced from:
      objc-class-ref in libAuth.a(credential_ios_de0c3e1fa34e9a30835a63e195323a0f.o)
  "_OBJC_CLASS_$_FIREmailPasswordAuthProvider", referenced from:
      objc-class-ref in libAuth.a(credential_ios_de0c3e1fa34e9a30835a63e195323a0f.o)
  "_OBJC_CLASS_$_FIRFacebookAuthProvider", referenced from:
      objc-class-ref in libAuth.a(credential_ios_de0c3e1fa34e9a30835a63e195323a0f.o)
  "_OBJC_CLASS_$_FIRApp", referenced from:
      objc-class-ref in libApp.a(app_ios_3c1f2f5540e3edfbae8c7bf918ae5900.o)
  "_OBJC_CLASS_$_FIRAuth", referenced from:
      objc-class-ref in libAuth.a(auth_ios_7d6b9e9ddb5f240ff95f510fddebba51.o)
  "_OBJC_CLASS_$_FIRTwitterAuthProvider", referenced from:
      objc-class-ref in libAuth.a(credential_ios_de0c3e1fa34e9a30835a63e195323a0f.o)

** BUILD FAILED **

どうやら原因はFirebaseのライブラリを参照できないことらしい・・・。

ローカルのビルドは通るのに何かおかしいと思いローカルビルドとJenkinsビルドの生成物の違いを見てみると Podfileが生成されていないことがわかった。

この PodfileがないとFirebaseのAuthやAnalyticsのライブラリがインストールされないのである。

これは困った。。。毎回ローカルビルドでは非常に効率が悪い.

原因

そもそもこのPodファイルはFirebaseをUnityに取り込んだ時に追加される Google.IOSResolverというファイルが Podfileの生成を担っているのだがどうもこの Google.IOSResolverがJenkinsビルドではうまく動作していないらしいということがわかった。

もう少し深く原因を探ってみると Google.IOSResolverを呼び出すのは FirebaseAuthDepsなどのスクリプトなのだが

#elif UNITY_IOS
        UnityEngine.Debug.Log("FirebaseDeps");
        Type iosResolver = Google.VersionHandler.FindClass(
                               "Google.IOSResolver", "Google.IOSResolver");
        if (iosResolver == null)
        {
            return;
        }
        Google.VersionHandler.InvokeStaticMethod(iosResolver, "AddPod", new object[] { "Firebase/Auth" }, new Dictionary<string, object>() { { "version", "3.10+" }, { "minTargetSdk", "7.0" } });
#endif

このように iOSビルドの時のみ呼び出されるものだった。

一応Jenkinsビルドが行われる時はUnity上のスクリプトから Switch Platformをしているのだが恐らく Switch Platformの前にPodfile生成のメソッドが呼ばれているようである。

解決

どうにかこうにか原因を探っているうちにJenkinsのジョブ設定のUnityの項目であらかじめ -buildTargetを設定していなかったことがわかった。

https://gyazo.com/e124b2263921421bae00f1ed6caecea7

//以前
-quit -batchmode -executeMethod "コマンドから呼び出すメソッド名"

//修正後(-targetBuild追加)
-quit -batchmode -buildTarget ios -executeMethod "コマンドから呼び出すメソッド名"

コマンドラインの部分を上記のように修正したらうまくいきました。

この問題で約5日間くらいJenkinsビルドに悩まされていたので解決して本当に良かった(;.:◉;.:◞౪◟;.◉;)

追記[Firebase 3.0.1]

FirebaseSDKのバージョンを3.0.1に上げたら再びビルドが通らなくなった、今回もiOSResolverがうまく動作してないことが原因のようだったのでプロジェクト内の Google.IOSResolverSelect Platform For Platformの項目を見てみると Editorにのみチェックが入っていた。これを iOSにもチェックを追加することできちんとCocoaPodが動作し、必要なライブラリが追加されるようになった。もし同じような問題でJenkinsビルドが通らなくなった人がいたら参考にしてほしい。

https://gyazo.com/3dcaad1af96c35816318e21cc99646ce