はじめてのXcode Cloud

# はじめに

Xcode Cloudに入門してみようと思い立ち、工程をざっくり記事にまとめながら進めました。

https://developer.apple.com/jp/xcode-cloud/get-started/

>Xcode Cloudは、Xcodeに組み込まれた継続的インテグレーションおよびデリバリーサービスで、Appleデベロッパのために設計されたものです。

ちなみにこれまでCI/CDはBitrise, fastlaneを使うことが多く、以前こんな記事も書きました。

https://qiita.com/yoshitaka/items/b33a45bd5d2ccf49da9c

>Xcode Cloudを使用するには、Xcode 13.4.1以降と、Apple Developer Programのメンバーシップが必要です。

このあたりが最低利用条件のようです。

>毎月25時間のコンピューティング時間を無料でご利用いただけます。

無料で使えるのはありがたいです。

料金表はこちら。25時間/月使えるなら課金しなくても十分おさまりそうです。

![スクリーンショット 2024-09-21 22.26.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/9842d1b5-cf84-4c1c-31ad-aed342014838.png)

>コンピューティング時間とは、アプリのビルドや自動テストの実行など、クラウドで特定のタスクの実行に費やす時間数（1時間単位）のことです。たとえば、12分間のテストを5回実行する場合は、1コンピューティング時間に相当します。

# 環境
Xcode 15.4

# 内容

https://developer.apple.com/documentation/xcode/configuring-your-first-xcode-cloud-workflow/

それでは設定をやっていきます。

まずは重要事項の確認。

## 重要事項

- 設定時の注意事項
- プロジェクトの依存関係

について、ドキュメントを確認するようにと書いてありました。

>最初のワークフローを設定する際の問題を避け、時間を節約するために、プロジェクトやワークスペースをXcode Cloudで使用するように設定する前に、「Xcode Cloudを使用するための要件」に詳述されている要件を確認してください。

https://developer.apple.com/documentation/xcode/requirements-for-using-xcode-cloud

ざっとみた感じ、`You use automatic code signing.`と書いてあったので自動コード署名を使ってない場合は要チェックだと思いました。

>プロジェクトに依存関係が必要な場合は、それらがXcode Cloudからアクセス可能であることを確認してください。詳細については、「依存関係をXcode Cloudで利用可能にする」を参照してください。

https://developer.apple.com/documentation/xcode/making-dependencies-available-to-xcode-cloud

<details><summary>生成AIの要約</summary>

- 概要

    - Xcode Cloudはプロジェクトのビルドに必要な追加の依存関係やサードパーティツールにアクセスできる必要があります。
    - ビルド失敗を避けるため、Xcode Cloud設定前に依存関係を確認し、アクセス可能にすることが重要です。


- Swift パッケージ依存関係とGitサブモジュールの使用

    - 公開リポジトリの場合は追加設定不要
    - プライベート依存関係の場合、Xcode Cloudがアクセスできるよう設定が必要
    - Package.resolvedファイルをGitリポジトリに含め、.gitignoreに含めないこと


- プライベート依存関係へのアクセス権付与

    - Xcodeが依存関係のSCMプロバイダを検出し、アクセス権付与をサポート
    - 新しいプライベート依存関係を追加した場合、ビルド失敗後に修正可能


- サードパーティ依存関係の確認

    - CocoaPodsやCarthageなどのサードパーティ依存関係マネージャーを使用する場合、追加の設定が必要
    - 可能な場合、Swift パッケージへの置き換えを検討


- カスタムビルドスクリプトの使用

    - ci_scriptsディレクトリにci_post_clone.shスクリプトを作成
    - Homebrewを使用してサードパーティツールをインストール可能


- CocoaPods依存関係の利用

    - PodfileとPodfile.lockファイルをコミットすること
    - Podsディレクトリをリポジトリに含めるか、.gitignoreに追加するかを選択
    - Podsディレクトリを除外する場合、カスタムスクリプトでCocoaPodsをインストール


- Carthage依存関係の利用

    - カスタムビルドスクリプトを使用してCarthageをインストール
    - スクリプトでCarthage依存関係をビルド



これらの方法を適切に選択し、実装することで、Xcode Cloudが依存関係にアクセスでき、プロジェクトを正常にビルドできるようになります。
</details>

依存関係については、SPMに移行済みであれば問題なさそうですが、例えばCocoaPodsを利用している等であると対応が必要です。

### WWDCの関連動画

- https://developer.apple.com/videos/play/wwdc2021/10267/
- https://developer.apple.com/videos/play/wwdc2021/10268/
- https://developer.apple.com/videos/play/wwdc2021/10269/
- https://developer.apple.com/videos/play/wwdc2022/110374/

このあたりはざっと見ておくと良さそうです。

## Xcode Cloudの設定

プロジェクトを開いて設定を進めていきます。

ドキュメント内には例外パターンの対処方が色々と記載ありましたが、今回Xcode Cloudを設定するプロジェクトはSPMを使ったiOSアプリのみのプロジェクトであり、特に例外パターンに当てはまらなかったので適当に飛ばしながら設定していきます。

### アーカイブアクションの選択
Xcode Cloudでビルドしたい各アプリやフレームワークについて、対応するスキームがアーカイブアクションを使用していることを確認します。

<img width="200" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/3b753a37-e543-5502-2599-c2eb5167bb52.png">

![スクリーンショット 2024-09-21 23.06.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/536fe369-7547-b07c-499f-dcb069ad7420.png)

### Get Startedをクリックする

<img width="200" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/15e8abd4-89e7-2424-6ba4-343257b040ed.png">

設定するまでは特に詰まらずにできたので工程をざっと貼っていきます。

- そのまま対象プロダクトを選択
<img width="500" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/b14948c9-b298-804c-772f-357eca3f6fd6.png">

- デフォルトの環境が入っていましたが、XcodeとOSのバージョンを合わせたかったのでEdit Workflowから変更しました

<img width="500" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/6e7f3399-cdd0-41b1-b99e-1a0838cbceb7.png">

<img width="500" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/75417990-0e70-0468-6898-437d6e2c5bae.png">

- 次にXcode Cloudが対象のリポジトリへアクセスできるようにします

<img width="500" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/5fc425e9-074a-2024-5e00-397f7d36a201.png">

- 丁寧にステップも表示されるのでサクッとできました

<img width="500" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/cbe6d657-9e2d-6484-011c-cbdf158cb24b.png">

<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/d772e1ea-9ca7-3c8d-4614-c6330e369e4f.png">

- 設定完了。Xcode上でもAppStoreConnect上でも動いているのが確認できました

![スクリーンショット 2024-09-21 23.25.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/5bdcddb0-69ea-6598-5a5e-8afc645fa33d.png)
![スクリーンショット 2024-09-21 23.25.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/c3c2b313-d7b4-de8f-faaa-0a3e0858b15c.png)

### エラーの確認

ビルドに失敗した場合、Xcode・AppStoreConnectどちらからでもログが確認できます。

<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/23e7e47d-7422-747d-f07c-1f9c72b98985.png">
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/5deb1dde-5e91-c0a5-aebf-77486cbfa54c.png">

今回のエラーはこちらの記事を参考にさせて頂き解消できました！（ありがとうございます🙏）

https://qiita.com/Takia/items/7af9c4e10a09f5366c99

その際、カスタムスクリプトを実行する必要があり、詳しく理解したい方は以下の公式ドキュメントが参考になりそうでした。

https://developer.apple.com/documentation/xcode/writing-custom-build-scripts

#### カスタムスクリプトをXcode Cloudで実行する場合

プロジェクトのルートディレクトリに`ci_scripts`ディレクトリを配置し、特定のファイル名（ci_post_clone.sh, ci_pre_xcodebuild.sh, ci_post_xcodebuild.sh）のファイルを作成することで、ワークフローの特定の場所でスクリプトが実行されます。
（スクリプトには`chmod +x ci_post_clone.sh`実行権限の付与をします）

- ファイルが存在しない場合でもワークフローのログに残るので明確にどの位置で実行されるかはログから確認できます

![スクリーンショット 2024-09-23 21.16.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/47f86317-0b06-b26c-b171-7eafa9ab5829.png)

- 今回対応したようにスクリプトが存在する場合はファイル名に該当する位置で実行されます

![スクリーンショット 2024-09-23 21.37.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/e1e2f394-48c1-5898-f187-37550acf881b.png)

### ビルド成功

AppStoreConnect上でログが見られるのは便利かもしれませんね。

<img width="500" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/19842547-486e-9c39-baa3-8a6e0167b731.png">

# おわりに

Xcode Cloudの導入がこんな簡単だとは思ってなく少しハードルを感じていましたが、サクッと設定できて無料で使えて最高ですね🎉これからどんどん活用していこうと思います！

# 参考

https://developer.apple.com/documentation/xcode/configuring-your-first-xcode-cloud-workflow/

https://qiita.com/Takia/items/7af9c4e10a09f5366c99

https://developer.apple.com/documentation/xcode/writing-custom-build-scripts