Kotlin Multiplatformアプリケーションの継続的インテグレーションに向けたGitHub Actionsの設定
このガイドでは、GitHub Actionsを使用して設定されたKotlin Multiplatformアプリケーションの継続的インテグレーション(CI)の例を紹介します。 main ブランチへのプッシュまたはプルリクエストのたびに、共通テストを実行し、Android、iOS、デスクトップ向けのアーティファクトをビルドするワークフローを設定します。
このガイドは、Jetcaster KMP サンプルに基づいています。 リポジトリ内のアクションとワークフローの設定を確認するか、以下の手順に従ってステップバイステップの説明を確認してください。
このガイドでは、CIを2つのパートに分けて設定することを提案しています。
- JavaとGradleをセットアップする再利用可能な複合アクション(Composite Action)
mainブランチへのプッシュまたはプルリクエストのたびにテストを実行し、プラットフォーム固有のビルドをトリガーするメインのGitHub Actionsワークフロー
Gradleセットアップ用の複合アクションを作成する
ジョブ間でJavaとGradleの設定を同期させるために、複合アクション(Composite Action)を作成します。 このアクションをワークフローのジョブで再利用することで、すべてのビルドで同じ設定が使用されるようになります。
この例では、アクションはJava 17をインストールし、デフォルトのGradleバージョンを構成します。 アクションをセットアップするには、.github/actions/gradle-setup/action.yml ファイルを作成します。
name: gradle-setup
description: Setup Java and Gradle
runs:
using: "composite"
steps:
- name: Setup Java
uses: actions/[email protected]
with:
java-version: "17"
distribution: "temurin"
- name: Setup Gradle
uses: gradle/actions/[email protected]ビルドワークフローを定義する
ワークフローがいつ実行されるかを定義し、Gradleのオプションを設定します。
- ワークフローは、
mainブランチへのプッシュまたはプルリクエストのたびに実行される必要があります。 - Gradleのオプションでは、Gradleデーモンを無効にし、キャッシュを利用した並列実行を有効にする必要があります。
基本設定を含む .github/workflows/build.yml ファイルを作成します。
name: Build
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
workflow_dispatch:
env:
GRADLE_OPTS: "-Dorg.gradle.jvmargs=-Xmx4096M -Dorg.gradle.daemon=false -Dorg.gradle.parallel=true -Dorg.gradle.caching=true"この設定により、workflow_dispatch を使用して手動でワークフローをトリガーすることもできます。
これで、テストを実行してアプリケーションのアーティファクトをビルドするジョブを追加できます。
共通テストを実行する
このジョブは、jvmTest Gradleタスクを使用してテストを実行し、全プラットフォーム向けのアプリをビルドする前に変更を検証します。
- テストを実行するリポジトリをチェックアウトします。
- 前に準備した複合アクション
gradle-setupを使用して、JavaとGradleをセットアップします。 ./gradlewコマンドでテストを実行します。- テストレポートをアーティファクトとして
**/build/reports/tests/ディレクトリにアップロードします。
このジョブをセットアップするには、以下の内容を .github/workflows/build.yml ファイルに追加します。
jobs:
test:
name: Run tests
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Gradle setup
uses: ./.github/actions/gradle-setup
- name: Run unit tests
run: ./gradlew jvmTest
- name: Upload test reports
uses: actions/upload-artifact@v4
with:
name: test-reports
path: "**/build/reports/tests/"テストが実行されたら、ワークフローはアプリケーションのアーティファクトをビルドする必要があります。
Androidデバッグパッケージをビルドする
このジョブは、:mobile:assembleDebug Gradleタスクを使用してAndroidデバッグAPKをビルドします。
- パッケージをビルドするリポジトリをチェックアウトします。
- 前に準備した複合アクション
gradle-setupを使用して、JavaとGradleをセットアップします。 ./gradlewコマンドでAPKをビルドします。mobile/build/outputs/apk/debug/ディレクトリからビルドされたパッケージをアップロードします。
jobs セクションに続けて、以下の内容を .github/workflows/build.yml ファイルに追加します。
jobs:
# ...
build-android:
name: Build Android
runs-on: ubuntu-latest
needs: test
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Gradle setup
uses: ./.github/actions/gradle-setup
- name: Build Android debug APK
run: ./gradlew :mobile:assembleDebug
- name: Upload Android debug APK
uses: actions/upload-artifact@v4
with:
name: android-apk
path: mobile/build/outputs/apk/debug/*.apkiOSシミュレーターアプリケーションをビルドする
このジョブは、アプリへの適切な署名を避けるために、iOSシミュレーターをターゲットにします。 アプリケーションは xcodebuild を使用してビルドされます。
- アプリケーションをビルドするリポジトリをチェックアウトします。
- 前に準備した複合アクション
gradle-setupを使用して、JavaとGradleをセットアップします。 xcodebuildを使用してiOSアプリケーションをビルドします。例では、Jetcaster KMPサンプルで使用されているオプションを示しています。- ビルドされたアプリケーションが含まれるフォルダ(
build/Build/Products/Debug-iphonesimulator/*内のすべて)をアーティファクトとしてアップロードします。
iOSアプリケーションは、xcodebuild を含むmacOSランナー(macos-latest)上でビルドされます。
.github/workflows/build.yml ファイルの編集を続けます。
jobs:
#...
build-ios:
name: Build iOS simulator app
runs-on: macos-latest
needs: test
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Gradle setup
uses: ./.github/actions/gradle-setup
- name: Build iOS simulator app
run: |
xcodebuild build \
-project JetcasterMigration/JetcasterMigration.xcodeproj \
-configuration Debug \
-scheme JetcasterMigration \
-sdk iphonesimulator \
-derivedDataPath ./build \
-verbose
- name: Upload app folder
uses: actions/upload-artifact@v4
with:
name: iphonesimulator-app
path: build/Build/Products/Debug-iphonesimulator/*CIをプッシュしてテストする
CIワークフローは、ワークフロー設定を main ブランチにプッシュするか、これらの設定ファイルを含むプルリクエストを作成したときに初めてトリガーされます。
リポジトリの Actions タブでワークフローの結果を確認し、すべてが正しく動作することを確認できます。
ワークフローを手動でトリガーすることもできることを覚えておいてください。左側のアクション一覧からワークフローを選択し、Run workflow をクリックします。
次のステップ
完全なCI設定の例については、Jetcaster サンプルを参照してください。これには、macOS、Windows、Linux向けのデスクトップJVMアプリケーションをビルドするジョブも含まれています。
GitHub Actionsを使用してアプリストアにアプリケーションを公開する手順については、Marco Gomiero氏によるこの件に関する一連の投稿を参照してください。
