The Pragmatic Ball boy

iOSを中心にやってる万年球拾いの老害エンジニアメモ

Xcode Cloud所感

Xcode CloudがXcode 13.4.1から使えるようになったので試してみました。

Xcodeの左のナビゲーションの一番右の Report navigator もcloudタブからワークフローを作ることができるようになっています。

ここからXcode上でポチポチしていくだけで、ワークフローの設定だけでなく、リポジトリとの認証、AppStoreConnectでアプリの追加までも行うことができます。

ただAppStoreConnectと密結合されているのでアプリではなくSwiftのライブラリの開発でXcode Cloudを利用することはできません。

Xcodeでできるワークフローの設定

Environment

Environmentではビルド環境の設定ができます。変更できる設定は以下です。

  • Xcodeバージョン
    • 利用するXcodeのバージョンが指定できます
    • beta版などもすぐに使えるようになっているようです
  • macOS Version
    • 利用するmacOSのバージョンが指定できます
  • Clean
    • cleanにチェックをいれるとderived dataなどのキャッシュが使われません
    • archiveする際にはこの設定は必須になります
  • Environment Variable

Start Conditions

Start Conditionsではワークフローを発火するトリガーを設定できます。 Start Conditionsは以下の4種類があります

  • Branch Changes
    • ブランチに変更があった場合に発火
    • 特定のブランチを指定することもできます
    • 特定の文字から始まるブランチも指定できます(branches beginning with "release-" など)
    • 発火する条件にフォルダやファイルを指定することができます
  • Pull Request Changes
    • Pull Requestが作成された場合に発火
    • 指定できる条件はBranch Changesと同じもの、プラス targetブランチが指定できます
  • Tag Changes
    • タグに変更があった場合に発火
    • 特定のタグを指定することもできます
    • 特定の文字から始まるタグも指定できます(tags beginning with "v" など)
    • 発火する条件にフォルダやファイルを指定することができます
  • On a Schedule for a Branch
    • 設定したスケジュールで特定のブランチで発火
    • cloneみたいな感じで設定できます。

Actions

Actionsはワークフローで実行されるものです。Actionsには以下の4種類があります。

  • Build
    • アプリをビルドします。Schemeを選んだり、ビルド対象をデバイスかシミュレーターか選んだりできます
  • Test
    • テストを実行します。
    • ビルドと大体同じなのですが、テストを実行するデバイスを選べます。複数選ぶと並行に複数環境でテストすることが可能です。
  • Analyze
    • メモリリークなどの問題を発見することができます。やっていることはxcodebuild analyzeと同じです。
  • Archive
    • アプリをアーカイブします。
    • アーカイブするだけでなく、TestFlightやAppStoreConnectにアップロードすることができます。

Post-Actions

Post-ActionsではActions実行後に行うActionを設定できます。Post-Actionsには以下の3種類があります

  • TestFlight Internal Testing
    • Internal TesterにTestFlightで配布
  • TestFlight External Testing
    • External TesterにTestFlightで配布
  • Notify
    • ワークフローが成功や失敗した場合にslackやemailで通知することができます

このようにワークフローのトリガー、Action、Post-Actionをポチポチするだけで簡単に設定することが可能となっています。 ただしこれらの設定は設定ファイルに残るわけではなくXcode Cloud側で保持されています(コードで管理できない)

ポチポチするだけではできないこと

ビルドの事前準備

2022/9時点ではXcode Cloud上で提供されているツールは、macOSやXcodeに含まれているものとHomebrewだけになります。

よって、例えば外部ライブラリを利用するのにCocoaPodsやCarthageが必要であったり、XcodeGenをつかってプロジェクトを生成したりする場合にはこれらをインストールする必要があります。

CocoaPodsやCathageなどのツールのインストール方法

  1. Xcode Projectやworkspaceと同じ階層に ci_scripts という名前のディレクトリを作成
  2. ci_scriptsの中に ci_post_clone.sh ファイルを作成し、このファイルにCocoaPodsやCathageのインストールスクリプトを記載します
## ci_post_clone.sh

#!/bin/sh

brew install cocoapods
pod install

ci_post_clone.sh以外にも、ci_pre_xcodebuild.sh, ci_post_xcodebuild.shも配置可能です。それぞれxcodebuildの実行前後にやりたいことがあればここにスクリプトを記載すれば実現可能です。

まとめ

これまではiOSアプリのCI/CD導入には証明書の取り扱い、xcodebuildやAppStoreConnect API, fastlaneなどといった知識が必要で導入にハードルがありましたが、Xcode CloudによってCI/CDの導入ハードルは非常に下がり誰でも導入しやすくなったことが大きいと思います。

逆に既にCI/CD導入済みの場合は現時点では不満に思えるところは少なからずあるように思います。個人的には、設定をコードで管理できない点とderived data以外のキャッシュがきかない(CocoaPodsなどのtool系のビルドが毎回必要)という点のデメリットが大きいなと思っています。

個人的には

  • 現時点でCI/CD環境が整っている場合
    • 現状維持でXcode Cloudに乗り換える必要はなく、上記問題が解消されたら移行を検討
    • SwiftPackageManagerでビルドするだけのシンプルなプロジェクトの場合は移行してもよさそう
    • 利用頻度の低いアーカイブ系だけ移行してみる
  • 現時点でCI/CD環境がなにもできていない場合
    • SwiftPackageManagerでビルドするだけのシンプルなプロジェクトの場合
    • SwiftPackageManagerでビルドするだけのシンプルなプロジェクトじゃない場合
      • CI/CDを導入するコストがあまりかけられない場合はXcode Cloud(ただしお金はかかりそう)
      • CI/CDを導入するコストがかけられる場合は他(GitHub ActionsやBitrise, CircleCIなど)

のような考え方が良いのではと思いました。

Xcode Cloudはまだできたばかりなのでこれからに期待ですね