GitHubが新しいランナー機能でiOSアプリのテスト時間を短縮

Image of tomokota

GitHubがGitHub Actions用のmacOSとAppleシリコンのランナーを使って、iOSアプリのビルド、テスト、デプロイを高速化した方法を紹介します。


GitHub Actions🤝 GitHub for iOS

GitHub iOSチームとGitHub Actions macOSランナーチームは、お互いの開発インナーループに欠かせない存在です。それぞれのチームは、新しいランナーイメージやハードウェアのテストにおいて、開発者の手にその機能が渡るずっと前からパートナーとなっています。GitHub Actionsは、最新のMacハードウェアをコミュニティに提供することに尽力してきました。Appleシリコン(M1) macOSランナーはパブリックリポジトリで無料で利用でき、より高いパフォーマンスを必要とするジョブにはより大きなオプションも用意されています。

GitHub iOSチームは、GitHub Copilot Chat、コード検索、ドイツ語と韓国語へのローカライズ、そしてIssueやプロジェクトでの作業のしやすさなど、アプリでのユーザー体験の改善に忙しく取り組んでいます。このブログでは、GitHub iOSチームがどのように世界中の開発者にアプリを提供しているか、Appleシリコンの利点、macOSランナーを使った GitHub Actions の構築について説明します。

GitHubが新しいランナー機能を使ってiOSアプリのテスト時間を短縮した方法

GitHub iOSチームは以前、GitHub Actions上でコードベース全体のビルドとテストを1つのジョブで行うワークフローを使っていましたが、旧世代のランナーでは完了までに38分かかっていました。GitHub iOSアプリは、動的フレームワーク、静的ライブラリ、アプリの拡張機能、GitHubアプリそのものなど、さまざまなターゲットからなる約60のファーストパーティモジュールで構成されています。これらのモジュールは、ネットワーク・レイヤーから設計システム・コンポーネント、機能や製品全体まで多岐にわたり、アプリの保守に役立っています。

モノリスの打破

私たちは、Appleのシリコンのパワーを活用して、テストプロセスをスピードアップすることにしました。私たちはGitHub ActionsのM1 macOSランナー(macos-14-xlarge YAMLラベル)に切り替え、テスト・スイートをモジュールごとに別々のジョブに分割しました。こうすることで、各モジュールを個別にビルドしてテストすることができ、より早くフィードバックを得ることができるようになりました。最小のモジュールの中には、M1 macOSランナー上で2-3分という短時間でテストを完了するものもあり、プルリクエストに関する開発者へのフィードバックが以前よりも早く得られるようになりました。また、モノリシックビルドの終了を待たずに、特定のモジュールの不具合を特定して修正することも容易になりました。
Appleシリコンを使用することで、テスト時間を38分から15分へと60%短縮し、生産性と効率を向上させました。下の図は、ビルド時間を改善するために、モノリスを小さなモジュールに分解したことを示しています。
Image demonstrates the monolith build on tip with the total CI time. The Image below it demonstrates how per-module builds are crafted and the reduction in CI time with the new approach.
各ビルドが開始されると、GitHub Actionsが舞台裏でワークフローを実行するために必要な台数のマシンを準備します。各リクエストはGitHub Actionsサービスに送られ、そこで必要な数のジョブを実行するためにリイメージされたばかりの仮想マシンをピックアップします。下図は、リクエストがリポジトリからAzureのActions Macサーバーまでどのように移動するかを示しています。
Image displays the relationship between the request for workflow to run and how a machine is assigned to a job. From left to right, the flow starts at GitHub.com, then the request is sent to Actions. Actions then finds the available macOS VM to execute the workflow.
ビルド時間が短縮され、CIフリートがスケーリングできるようになったことで、GitHub iOSチームは、GitHub ActionsがCIジョブの配布の複雑さを抽象化することで、ジョブをより短く、より速いステップでスケールアウトできるようになりました。

CI パフォーマンスの分析

私たちはさらにCIのパフォーマンスを調査し、xcodebuildのbuild-without-testingとtest-without-buildingを使って、各モジュールのCIをビルドとテストの2つの別々のステップに分けました。これにより、長時間実行されるユニットテストを特定したり、数秒で終了する高速なユニットテストを強調することができました。

ネイティブの開発環境とテスト環境

AppleシリコンをGitHub Actionsランナーと開発者のラップトップで使うことで、私たちのCIはローカルの開発マシンと同じアーキテクチャを持つようになりました。エンジニアは、コンパイルに時間がかかるパターンや、アーキテクチャが原因で失敗するテストをCIから特定し、自信を持ってローカルで修正できるようになりました。

Appleシリコンのメリット

Appleシリコンは、ビルドパフォーマンスを向上させ、信頼性を高め、iOSチームがソフトウェア開発ライフサイクルを通じてすべてのAppleプラットフォームに対してネイティブにテストできるようにします。クロスコンパイルやエミュレーションによる問題を回避し、GitHub Actionsランナーイメージで最新のシミュレータを使用できます。これにより、iOS、iPadOS、watchOS、tvOSの最新バージョンでアプリが確実に動作します。GitHub Actions M1 macOSランナーは、iOSチームがこれらの利点を活用し、高品質なアプリをより迅速かつ効率的にユーザーに提供するのに役立ちます。さらに、GitHub Actionsはエンタープライズアカウント向けに50個、GitHub FreeおよびTeamプラン向けに5個の同時実行ランナーを提供しています。GitHub iOSチームはこの同時実行ランナーをフルに活用し、プルリクエストごとに50のジョブを開始し、アプリのモジュールテストを並行して行っています。

GitHub ActionsでmacOSランナー利用を開始するには

GitHubホステッドmacOS ランナーは YAML ドリブンです。つまり、ワークフロー・ファイルのruns on: キーを更新することでアクセスできます。

The post How GitHub reduced testing time for iOS apps with new runner features appeared first on The GitHub Blog.