この記事は and factory.inc Advent Calendar 2021 13日目の記事です。
昨日は、@y-okuderaさんの『FlutterでアクティブなBottomNavigationBarItemがタップされたらトップまでスクロールさせてみる』でした。
はじめに
今回は WWDC2021 で発表された Xcode Cloud を個人開発しているアプリ 『クラロワガイド』 に導入した際の記事になります。
基本的な部分は 『Xcode Cloud でプロジェクトをビルドしてみる』の記事を参考にしています。
@koogawa さん大変ありがとうございましたmm
Xcode Cloud を利用できるまで
Xcode Cloud を利用するには AppleDeveloper に登録している必要があり、下記 URL から利用申請を行います。
https://developer.apple.com/xcode-cloud/beta/request/#!/request/status
自分は7月中旬に利用申請をして2,3回 Support 問い合わせを行いましたが、
結果、利用できるようになったのは11月末頃でした。気長に待ちましょう。
ビルドをしてみる
まずは Xcode Cloud でビルドをできるようにしていきます。
Xcode13以上で Product -> Xcode Cloud -> Create Workflow...
を選択します。
下記項目を適当に設定しつつ Workflow を作成していきます
- Start Condition
- ビルドトリガーの設定等
- Environment
- Xcode, MacOS の設定
- 環境変数の設定
- Actions
- Build, Test, Archive などの指定
- Post-Actions
- ビルド後に実行したいアクションの設定
- 例) Slackなどへビルド結果通知
- ビルド後に実行したいアクションの設定
流れに沿って設定ポチポチしていくと最後に Github リポジトリへのアクセス権限が問われるので承認をすれば作成完了です。
※ただしこれだけでビルドが完了するのは極稀だと思うため、
以降ではビルド成功までにハマったポイントを記します。
ハマったポイント
ビルドトリガーのターゲットブランチ指定について
リモートにブランチが存在しているのに "ブランチ名" may only exist locally. To use...
という Warning が発生
今は解決されていますが、環境構築時は何故か発生していました。(反映とかに時間かかっていた?)
暫定的な解決策としてはスクショにもあるように branches beginning with "ブランチ名"
で対応しました。
Configuring Your Xcode Cloud Workflow’s Start Condition
パッケージ類の依存解決
自分の開発環境に合わせて CocoaPods, Carthage, SwiftPM などのパッケージ管理ツールを、Xcode Cloud でも実行できるように設定する必要があります。
具体的には ci_scripts
ディレクトリを作成して以下3種類のシェルスクリプトをよしなに用意します。
シェルスクリプト名 | トリガー | 用途例 |
---|---|---|
ci_post_clone.sh | git clone後に実行 | パッケージ管理ツールのインストール等 |
ci_pre_xcodebuild.sh | XcodeBuild前に実行 | コンパイルオプションの指定等 |
ci_post_xcodebuild.sh | XcodeBuild後に実行 | ビルド成果物を他サービスにアップロード等 |
自分は今回 ci_post_clone.sh
を用意して Mint や Carthage, Xcodegen のセットアップを行うようにしました。
#!bin/sh
# Install Mint
brew install mint
mint bootstrap -m ../Mintfile --overwrite y
# Setup Carthage
mint run Carthage carthage bootstrap --platform iOS --cache-builds --use-xcframeworks --project-directory ../
# Generate xcodeproj
mint run xcodegen xcodegen generate -s ../project.yml
以下ハマったポイントを抜粋(主にパス指定周り)
- Mintfile のパス指定をちゃんとする。(
-m
オプション付ける) - Carthage プロジェクトのパス指定をちゃんとする。(
--project-directory
を付ける) - Xcodegen で
project.yml
のパス指定をちゃんとする。(-s
オプションを付ける)
※最初は元々用意していた Makefile を ci_post_clone.sh
から叩くようにしていたが、
上手く行かなかったので結局今の形になりました。
SwiftPM の依存解決
SwiftPMを使っている方だとこのようなビルドエラーに遭遇するかもしれません。
これは Xcodegen と SwiftPM を組み合わせていたため SwiftPM の依存関係ファイルである Package.resolved
が存在しない(正確には git 管理対象になっていなかった)事が原因でした。
そのため以下 Issue を参考に .gitignore を修正して
project.xcworkspace/xcshareddata/swiftpm/Package.resolved
を git 管理対象にするように修正。
Package.resolved isn't versioned; How are deterministic Package versions achieved?
Carthage の There is no XCFramework found at XXX
問題
これは Carthage copy-frameworks
のし忘れでした..
新たに ci_pre_xcodebuild.sh
を追加して解決しました。
#!bin/sh
# Carthage copy frameworks
mint run Carthage carthage copy-frameworks
おまけ
Slack通知
Workflow の設定画面にある Post-Actions -> Notify
を選択する。
Add a Slack channel
の箇所の 「+」 を押して Slack アプリとの連携を行います。
連携後はチャンネルが表示されるので通知先を指定する。
※自分へのDMとして通知する場合は上記設定は不要で AppStoreConnect の自分のアカウントページ画面(=右上のアカウント名からプロフィール編集タップ後の画面)で通知設定すれば良さそうです。
(デフォルトでは AppleID に紐づくメールアドレスに通知が届く設定になっていました)
ハマりポイント
Xcode 上で Workflow の設定が何故か反映されずに再度 Workflows の設定を見ると
Post-Actions の内容が消えていました。。。
仕方なく App Store Connect の Workflow で設定を行いました。
アーカイブしてみる
設定自体はすごく簡単です。
Workflow の Action に Archive
を選択するだけです。
ただ自分の環境では上記設定だけではビルドは通りませんでした...
ちゃんと原因が分かっていないのですが、 carthage bootstrap
の処理で Archive 時だけ Charts ライブラリで怪しそうなエラーが出ています。
その後の XcodeBuild の際に There is no XCFramework found at XX
が発生して失敗しました。
理由は分かりませんが、 ci_post_clone.sh
で carthage update
を追加したら何故か成功できましたが、Archive する度にライブラリのアプデを行うのは良くないので SPM に移行しようか考えています。。。(詳しい方居たら是非ご教授下さいmm)
#!bin/sh
# Install Mint
brew install mint
mint bootstrap -m ../Mintfile --overwrite y
# Setup Carthage
mint run Carthage carthage bootstrap --platform iOS --cache-builds --use-xcframeworks --project-directory ../
mint run Carthage carthage update --platform iOS --cache-builds --use-xcframeworks --project-directory ../ # 追加
# Generate xcodeproj
mint run xcodegen xcodegen generate -s ../project.yml
AppStore にアップロードしてみる
これは Action の Archive で TestFlight and AppStore
にチェックを入れれば OK です。
自分の環境ではアーカイブまで出来れば App Store へのアップロードも特に問題無く行えました。
これはすごくありがたいですね。
※ただアップロードされたアプリのビルド番号が Xcode Cloud での CI_BUILD_NUMBER
になっていました。
(なのでその辺りはちゃんと設定した方が良さそうではあります。)
ドキュメントを見る限り、 Xcode Cloud を利用する場合にはどうしようも無さそうです。
最後に
全体的に Xcode 上でポチポチ設定出来たので思ったよりは簡単でした。
ただ使用している SDK 周りの設定に少し手こずったので、開発環境によっては楽だったり大変だったりしそうです。
Chartsライブラリの謎エラー & Carthage Update しないとアーカイブ出来ない課題があるので、SwiftPM 化を今後は進めてアップデートして行けたらなと思っています。
【追記】
Chartsライブラリを Carthage から SwiftPM に移行したら謎の carthage update を行わなくてもアーカイブすることが出来ました。
この記事が今後 Xcode Cloud を使う方の一助になれば幸いです。
最後まで読んで頂きありがとうございました。
参考文献
Xcode Cloud でプロジェクトをビルドしてみる
Xcode Cloud | Apple Developer Documentation