Codemagic を使って iOS アプリの CI/CD を設定する際にハマったこと
はじめに
今携わっているプロジェクトでは CI/CD サービスとして codemagic を採用して試しています。
元々 codemagic は Flutter 用の CI/CD として登場したために Bitrise と比べると少し iOS ネイティブアプリだと採用事例が少ない印象ではありますが、カタログスペック上では必要な機能は揃っており、かつ Bitrise と比較して費用的にも安くすみそうだった、と言うのが採用の理由です。
で、実際に試してみていくつかハマったこととか意外なことがあったので共有します。
前提として、今回のプロジェクトでは Fastlane を使っていません。
証明書などの管理はローカル開発時は "Automatically manage signing" を On にして Xcode に任せ、CI 上では CI の提供してくれる証明書やプロビジョニングプロファイルの自動生成機能を使うことにします。
Workflow Editor は Flutter 専用だった
てっきりブラウザ上でポチポチやって設定できるのかと思ったのですが、それは Flutter の場合でした。
Flutter 以外の場合は https://docs.codemagic.io/yaml/yaml-getting-started/ この辺のガイドとか https://github.com/codemagic-ci-cd/codemagic-sample-projects この辺りのサンプルとかを見ながら yaml を書いていく必要があります。
あと、codemagic 内部で使われている xcodebuild コマンドとかをラップしてくれるコマンドラインツールである https://github.com/codemagic-ci-cd/cli-tools ですが、これの docs/ 以下のドキュメントも役に立ちました。 (各コマンドのオプションなどが載っている)
自動プロファイル設定でハマった
ipa をビルドするステップを実行した際に以下のようなエラーが出て止まってしまいました。
error: No profiles for 'com.example.Sample-staging' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'com.example.Sample-staging'. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to xcodebuild. (in target 'Sample' from project 'Sample')
ログを追ってみると、問題があったのは xcode-project use-profiles
のステップ (プロビジョニングプロファイルや証明書の設定をしてくれている) で、ここで本来は検出できるはずの Bundle Identifier が見つからなかったからのようです。
解決には以下の記事が参考になりました。
僕の場合は https://zenn.dev/satococoa/articles/b873b96b6dd81d にあるような設定をしていたために Product Bundle Identifier の記載を Project にも Target にも全くしておらず、*.xcodeproj の中身を見て Product Bundle Identifier を検出する codemagic の仕組みと相性が悪かったようです。
結局、Xcode 上で Target の Build Settings に環境ごとの Bundle Identifier を直接書き込む運用にして回避しました。
(蛇足ですが、これと同時に https://zenn.dev/satococoa/articles/b873b96b6dd81d の記事で書いたような Scheme と *.xcconfig を使うビルド設定を完全にやめ、API の設定などは BuildConfig.swift を使う運用に移行しました)
ローカルにおいた Swift Package のテストが実行できない
↑の方法を使って、ローカルに Swift Package を作る手法でモジュール分けをしています。
たとえば Sample と言うプロジェクトにローカルパッケージとして SampleCore と言う名前の Swift Package を置いたとします。
すると Xcode が自動的に SampleCore と言う Scheme を作ってくれるのでそれを指定してテストを実行すれば SampleCore のテストも実行できると思いました。
しかし以下のようなエラーが出て実行できませんでした。
Test run failed
Did not find any test results
ssh で codemagic のマシンにログインして、コマンドラインから xcodebuild test で実行してみたところ以下のようなエラーが出ていました。
Scheme SampleCore is not currently configured for the test action
切り分けがうまくできていないのですが、手元の環境でも最初は xcodebuild コマンドを使ってテストを実行したときにも同じエラーが出たのですが、何度か Xcode でもテストを回したりしているうちにいつの間にか手元の環境ではテストが実行できるようになってしまいました。(gitignore で無視している xcuserdata が怪しいとは思っている。)
結局回避方法としては SampleCore Scheme の Container を SampleCore ではなくてメインの Xcode プロジェクトである Sample に変えることでした。
これによって codemagic 上でも以下のコマンドで無事にローカルパッケージのテストが実行できるようになりました。
以上、遭遇したハマりどころでした。
Discussion