Slide 1

Slide 1 text

Xcode Cloudをチームに導入して 何がどうなったか 2024/04/26 potatotips #87 @hiragram

Slide 2

Slide 2 text

- @hiragram - iOSアプリエンジニア - 2024/02~ akippa株式会社 🆕 - 駐車場シェアリングサービスのアプリ開発 - 唯一の正社員iOS開発者 - あと1日で試用期間が終わる 自己紹介

Slide 3

Slide 3 text

社内向けビルドのTestFlightへの配信を自動化

Slide 4

Slide 4 text

社内向けビルドのTestFlightへの配信を自動化(1) - 従来は、開発者が手元でビルドしてDeployGateに配信していた。 - 事前にテスターの端末 IDを取得してプロファイルに追加しておく必要があり、新しいメンバーが入っ たときに作業が生じる - 手オペなので、ブランチ間違いとか未コミットの変更が混じるとか、そういうのを防ぎにくい /気づきに くい - Xcode CloudはTestFlightとの連携が素晴らしく、post actionとして追加するだけで 簡単にテスターにアプリを配布できる - 以下のタイミングでXcode Cloudから社内向けビルドをTestFlightに配信するように した。 - mainブランチが更新されたとき (Branch changesトリガー) - featureブランチで開発者が手動で社内配信ジョブを実行したとき

Slide 5

Slide 5 text

社内向けビルドのTestFlightへの配信を自動化(2) - Xcode CloudからTestFlightに配信すると、ブランチ 名やタグ名でビルドグループが作られる。 - 複数のプロジェクトが並行して進む状況で、テスト対象のビル ドを見つけるのが簡単になっている。 - mainブランチにマージされる前に関係者が動作確認をする手 間が格段に減った

Slide 6

Slide 6 text

ストア申請用ビルドの自動化

Slide 7

Slide 7 text

ストア申請用ビルドの自動化 - 従来は、開発者の手元でリリース版をアーカイブしてAppStoreConnectにアップ ロードしていた。 - 手オペで間違いが起こらないよう、別のエンジニアやマネージャーが集まって画面共有しながらヨシ していた。 - v1.2.3-RC というフォーマットでタグを打つと、リリース版のジョブが起動して AppStoreConnectのアップロードまで自動で済むようにした。 - RCはRelease Candidate。なんとなくXcodeに倣った。 - 審査落ちたら修正して v1.2.3-RC2, RC3, … と新しいタグが打たれていく。

Slide 8

Slide 8 text

これによってGitHub上でリリースを整理できる - タグ起点による申請フローを整備したことで、申請ごとに必ずタグが打たれることが 担保された。 - 従来はリリースしたあとに開発者が手でタグを打っていて、打ち間違えたり忘れたりすることが多 かった。 - リポジトリのRelease機能で、1つ前のバージョンのタグとの差分を自動で計算して リリースノートを生成する事ができる。

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

開発版を別アプリとしてインストールできるようにした

Slide 13

Slide 13 text

開発版を別アプリとしてインストールできるようにした(1) - 従来はすべてのビルドがストア版と同じバンドルIDで配信されており、常に上書きイ ンストールする形であった。 - 社内向けビルドのバンドルIDを変更し、ストア版とは別アプリという扱いにすること で、2つを同時にインストールして、動作を比べるような検証をしやすくした。

Slide 14

Slide 14 text

- ちなみに、従来は各環境(dev/stg/prod/…)ごとに configurationが分かれていて、アプリが変更されるたびにそ れぞれの環境向けのビルドをDeployGateに乗せていた。 - 接続先を切り替えられるデバッグ用メニューをアプリ内に設 け、社内向けビルドは全環境対応の1つで済むようにした。 開発版を別アプリとしてインストールできるようにした(2)

Slide 15

Slide 15 text

- ただし、バンドルIDがストア版と異なるため以下の制約がある - ストア版のバンドルIDしか想定していない現状の APIサーバーではプッシュ通知が届かない - アプリ内課金ができない - apple-app-site-associationに対応が必要 - 現状、これらに関わる開発要件はそこまで多くないため、必要に応じてストア版と同 じIDでデバッグメニューを持ったビルドの配信ジョブを手動でスタートする運用をし ている。 開発版を別アプリとしてインストールできるようにした(3)

Slide 16

Slide 16 text

おわり - akippaのiOS版のCIをXcode Cloud上に構築した。 - TestFlightとの組み合わせが素晴らしく、プロダクトに関わる多くの人の手間を削減 した。 - ついでに、CocoaPods/Carthageを廃止してSwiftPMに一本化できた。 - Xcode Cloud上でスナップショットテストも実行できたらいいなと思う。Apple Silicon インスタンスとか出ないかな。