メインコンテンツへスキップ
CI/CD

GitHub actions による Capacitor Android ビルドの自動化

Android Capacitor アプリ向けのCI/CDパイプラインを、fastlaneとGitHub Actionsを使って5分でセットアップする方法

GitHub actions による Capacitor Android ビルドの自動化

Capacitor アプリの CI/CD セットアップは複雑で、時間もかかりがちです。押さえておきたいポイントは次のとおりです:

現在は以下を使用することを推奨しています: Capgo CLI を使用した Capgo Build ネイティブ Capacitor ビルド用。 このFastlaneガイドは、既存のGitHub Actionsパイプラインを運用しているチーム向けです。新規のAndroidビルドには、FastlaneやGradleランナー、キーストア、アップロードスクリプトの保守が不要になるCapgo CLIの使用を推奨します。

前提条件

始める前に、以下をセットアップする必要があります:

  • 管理者権限を持つGitHubアカウント
  • 適切な署名でGoogle Play Storeに公開済みのアプリ
  • Androidの署名キーおよびキーストアファイル
  • Play StoreのAPIが有効なGoogle Cloud Consoleプロジェクト
  • 適切な権限を持つサービスアカウント
  • GitHub Actionsワークフローの理解
  • Fastlaneの設定に関する知識
  • パイプラインを保守・デバッグする時間

Capgo によるCI/CD向けCapgo Build

Fastlane、Gradle runner、keystore、アップロードスクリプトの管理から解放されます。 Capgo のビルド 既存のCI/CDパイプラインから、署名済みのAndroid Native Buildを実行できます:

  • パイプラインと連携: Webビルド後に、GitHub Actions、GitLab CI、Jenkins、またはローカルスクリプトから Capgo Build をトリガーし、 npx cap sync.
  • CIシークレットで署名: Androidのkeystore、key alias、パスワード、Play ConsoleのサービスアカウントJSONは、そのまま自身のCI secretsで管理可能です。
  • ネイティブランナーの運用不要: Capgo Buildはメンテナンス済みのAndroidビルド環境を提供するため、SDK イメージやGradleのキャッシュ問題、Fastlaneの管理に悩まされることはありません。
  • アーティファクトと提出: QA用の署名済みアーティファクトをダウンロードするか、Capgo CLI からリリースビルドを提出できます。

料金プラン

  • Capgo プランは月額$12から
  • OTAアップデートと月間約15回のNative Buildを含む
  • 追加のビルド時間はクレジットで分単位課金されます

CI/CDでCapgo Buildをセットアップする

手動セットアップガイド

手順は以下の通りです:

GitHub Actions の料金プラン

GitHub Actionの料金

GitHub Actions では、リポジトリの種類に応じて無料の実行時間が提供されます:

  • 公開リポジトリ:2,000分/月
  • 非公開リポジトリ:2,000分/月 (Linux runner)

プライベートプロジェクトの場合、コストは約$0.008/分です。標準的なビルドには3〜5分かかります。

手動セットアップ手順

  1. Android Keystoreの作成
  2. Google Play サービスアカウントの設定
  3. Fastlaneの設定
  4. GitHub のシークレットを設定
  5. GitHub Actions ワークフローの作成

1. Android Keystoreの作成

Androidアプリの署名と公開を行うには、まずkeystoreファイルを作成する必要があります。これは初回のみの作業です。

keytoolでKeystoreを生成

ターミナルで以下のコマンドを実行してください:

keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

以下の情報の入力を求められます:

  • Keystore パスワード: 強力なパスワードを設定してください(後ほど KEYSTORE_STORE_PASSWORD)
  • Key パスワード: 強力なパスワードを設定してください(後ほど KEYSTORE_KEY_PASSWORD)
  • 氏名、組織名など: 詳細を入力してください

重要な注意事項

  • これらの値を安全に保存してください:

    • Keystore ファイルの場所(例: my-release-key.keystore)
    • Key エイリアス(例: my-key-alias) - 後ほど KEYSTORE_KEY_ALIAS
    • Keystore パスワード - 後ほど KEYSTORE_STORE_PASSWORD
    • キーパスワード - 以下で使用します: KEYSTORE_KEY_PASSWORD
  • keystoreファイルをバックアップする紛失すると、公開済みのアプリを更新できなくなります

  • 機密を保持するkeystoreファイルをgitにコミットしないでください

  • 安全に保管する安全な場所に複数のバックアップを作成してください

代替案:既存のKeystoreを使用する

既にアプリを公開している場合は、最初に使用したkeystoreを必ず使用する必要があります。場所は以下の通りです:

  • アプリを最初にビルドしたローカルマシン内
  • Play Console → 設定 → アプリの署名(Google Play アプリ署名を使用している場合)

2. Google Play サービスアカウントの設定

GitHub ActionsからGoogle Playへビルドをuploadするには、サービスアカウントが必要です。

ステップ 2.1: Google Cloud プロジェクトの作成

  1. 以下に移動します: Google Cloud Console
  2. 新規プロジェクトを作成するか、既存のプロジェクトを選択します
  3. プロジェクトIDをメモしてください

ステップ 2.2: Google Play Developer API の有効化

  1. Google Cloud Consoleで以下に移動します: APIとサービス → ライブラリ
  2. 「Google Play Android Developer API」を検索
  3. クリック 有効にする

ステップ 2.3: サービスアカウントの作成

  1. 以下に移動します: IAM と管理 → サービスアカウント
  2. クリック サービスアカウントを作成
  3. 詳細を入力してください:
    • 名前: github-actions-uploader
    • 説明: “GitHub のビルドを upload するためのサービスアカウント”
  4. クリック 作成して続行
  5. 今はロールの割り当てをスキップ(クリック 続行、次に 完了)

ステップ 2.4: サービスアカウントキーの作成

  1. 新しく作成したサービスアカウントをクリック
  2. 以下に移動します: キー タブ
  3. クリック キーを追加 → 新しいキーを作成
  4. 選択: JSON 形式
  5. クリック 作成します
  6. JSONファイルがダウンロードされます — 安全な場所に保存してください, 後ほど使用します

ステップ 2.5: Play Console でのアクセス権限付与

  1. 以下に移動します: Google Play Console
  2. 以下に移動します: セットアップ → API へのアクセス
  3. 未満 サービスアカウント、クリックして アクセス権を付与 サービスアカウントに
  4. 「 アプリの権限 」タブでアプリを追加
  5. 「 アカウントの権限 以下の権限を付与してください:
    • アプリ情報の閲覧および一括レポートのダウンロード(読み取り専用)
    • アプリの下書き作成、編集、削除
    • テストトラックへのアプリリリース
    • 本番環境、除外トラック、その他のトラックへのアプリリリース
  6. クリック ユーザーを招待
  7. クリック 招待を送信

ステップ 2.6: JSONキーの検証

ダウンロードしたJSONファイルは以下のようになります:

{
  "type": "service_account",
  "project_id": "your-project-id",
  "private_key_id": "...",
  "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
  "client_email": "github-actions-uploader@your-project-id.iam.gserviceaccount.com",
  "client_id": "...",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "..."
}

GitHub の secrets 設定ステップで、これを base64 に変換します。

3. Fastlane のセットアップ

から、 fastlane プロジェクトのルートにフォルダを作成し、 Fastfile 以下の内容で作成します:

default_platform(:android)

KEYSTORE_KEY_ALIAS = ENV["KEYSTORE_KEY_ALIAS"]
KEYSTORE_KEY_PASSWORD = ENV["KEYSTORE_KEY_PASSWORD"]
KEYSTORE_STORE_PASSWORD = ENV["KEYSTORE_STORE_PASSWORD"]

platform :android do
    desc "Deploy a beta version to the Google Play"
    private_lane :verify_changelog_exists do |version_code: |
      changelog_path = "android/metadata/en-US/changelogs/#{version_code}.txt"
      UI.user_error!("Missing changelog file at #{changelog_path}") unless File.exist?(changelog_path)
      UI.message("Changelog exists for version code #{version_code}")
    end

    private_lane :verify_upload_to_staging do |version_name: |
      UI.message "Skipping staging verification step"
    end
    
    lane :beta do
        keystore_path = "#{Dir.tmpdir}/build_keystore.keystore"
        File.write(keystore_path, Base64.decode64(ENV['ANDROID_KEYSTORE_FILE']))
        json_key_data = Base64.decode64(ENV['PLAY_CONFIG_JSON'])
        
        # Get previous build number and increment
        previous_build_number = google_play_track_version_codes(
            package_name: ENV['DEVELOPER_PACKAGE_NAME'],
            track: "internal",
            json_key_data: json_key_data,
        )[0]
        current_build_number = previous_build_number + 1
        sh("export NEW_BUILD_NUMBER=#{current_build_number}")
        
        # Build the app
        gradle(
          task: "clean bundleRelease",
          project_dir: 'android/',
          print_command: false,
          properties: {
            "android.injected.signing.store.file" => "#{keystore_path}",
            "android.injected.signing.store.password" => "#{KEYSTORE_STORE_PASSWORD}",
            "android.injected.signing.key.alias" => "#{KEYSTORE_KEY_ALIAS}",
            "android.injected.signing.key.password" => "#{KEYSTORE_KEY_PASSWORD}",
            'versionCode' => current_build_number
          })
        
        # Upload to Play Store
        upload_to_play_store(
            package_name: ENV['DEVELOPER_PACKAGE_NAME'],
            json_key_data: json_key_data,
            track: 'internal',
            release_status: 'completed',
            skip_upload_metadata: true,
            skip_upload_changelogs: true,
            skip_upload_images: true,
            skip_upload_screenshots: true,
        )
    end
end

4. GitHub Secrets の設定

keystore とサービスアカウントの JSON が用意できたら、それらを GitHub に安全に保存する必要があります。

ステップ 4.1: GitHub Secrets へのアクセス

  1. GitHub のリポジトリに移動し、
  2. クリック 設定 → シークレットと変数 → アクション
  3. クリック 新しいリポジトリシークレット

ステップ 4.2: 必要なシークレットを追加する

以下のシークレットを一つずつ追加してください:

PLAY_CONFIG_JSON

  1. ステップ 2.4 でダウンロードしたサービスアカウントの JSON ファイルを用意し、
  2. これを base64 に変換します:

macOS/Linux の場合:

base64 service_account_key.json | pbcopy

Windows (PowerShell) の場合:

[Convert]::ToBase64String([IO.File]::ReadAllBytes("service_account_key.json")) | Set-Clipboard
  1. 以下の名前で新しいシークレットを作成し、 PLAY_CONFIG_JSON base64 文字列を貼り付けます

ANDROID_KEYSTORE_FILE

  1. keystoreをbase64に変換します:

macOS/Linuxの場合:

base64 my-release-key.keystore | pbcopy

Windows (PowerShell)の場合:

[Convert]::ToBase64String([IO.File]::ReadAllBytes("my-release-key.keystore")) | Set-Clipboard
  1. 以下の名前で新しいsecretを作成し、 ANDROID_KEYSTORE_FILE base64文字列を貼り付けてください:

KEYSTORE_KEY_ALIAS

keystore生成時に使用したkey aliasで新しいsecretを作成します(例: my-key-alias)

KEYSTORE_KEY_PASSWORD

keystore生成時に設定したkey passwordで新しいsecretを作成します

KEYSTORE_STORE_PASSWORD

keystore生成時に設定したkeystore passwordで新しいsecretを作成します

DEVELOPER_PACKAGE_NAME

アプリのパッケージ名を使用して、新しいSecretを作成します(例: com.example.app)

パッケージ名は、以下から確認できます: android/app/build.gradle 内の applicationId

ステップ 4.3: すべてのSecretを確認

以下の6つのSecretが設定されていることを確認してください:

  • ✅ PLAY_CONFIG_JSON
  • ✅ ANDROID_KEYSTORE_FILE
  • ✅ KEYSTORE_KEY_ALIAS
  • ✅ KEYSTORE_KEY_PASSWORD
  • ✅ KEYSTORE_STORE_PASSWORD
  • ✅ DEVELOPER_PACKAGE_NAME

5. GitHub Actions Workflowの作成

作成します .github/workflows/build-upload-android.yml:

name: Build and Deploy Android App

on:
  push:
    tags:
      - '*'

jobs:
  build_android:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      
      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: 24
          cache: npm
          
      - name: Install dependencies
        run: npm ci
        
      - name: Cache Gradle
        uses: actions/cache@v5
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
          restore-keys: |
            ${{ runner.os }}-gradle-
            
      - name: Build app
        run: npm run build
        
      - name: Sync Capacitor
        run: npx cap sync
        
      - name: Setup Java
        uses: actions/setup-node@v5
        with:
            distribution: 'zulu'
            java-version: '17'
            
      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.0'
          bundler-cache: true
          
      - name: Run Fastlane
        uses: maierj/fastlane-action@v3.1.0
        env:
          PLAY_CONFIG_JSON: ${{ secrets.PLAY_CONFIG_JSON }}
          ANDROID_KEYSTORE_FILE: ${{ secrets.ANDROID_KEYSTORE_FILE }}
          DEVELOPER_PACKAGE_NAME: ${{ secrets.DEVELOPER_PACKAGE_NAME }}
          KEYSTORE_KEY_ALIAS: ${{ secrets.KEYSTORE_KEY_ALIAS }}
          KEYSTORE_KEY_PASSWORD: ${{ secrets.KEYSTORE_KEY_PASSWORD }}
          KEYSTORE_STORE_PASSWORD: ${{ secrets.KEYSTORE_STORE_PASSWORD }}
        with:
          lane: android beta
          
      - name: Upload artifact
        uses: actions/upload-artifact@v2
        with:
          name: android-release
          path: ./android/app/build/outputs/bundle/release/app-release.aab
          retention-days: 10

仕組み

  1. Gitタグを作成してワークフローを起動
  2. GitHub Actionsがアプリをビルド
  3. FastlaneがGoogle Playのベータチャネルへアップロード
  4. アプリが自動的にアップデートされます

ビルド時間とコスト

  • ビルド時間: 3〜5分
  • プライベートリポジトリのコスト: 1ビルドあたり約$0.04
  • オープンソースプロジェクトは無料

CI/CDセットアップガイド

その他のCI/CDプラットフォーム

Live Updateとデプロイ

リソース

GitHub actions を使った Capacitor Android 自動ビルドの先へ

使用している場合 GitHub actions による Capacitor Android ビルドの自動化 CI/CD自動化を計画するには、次と連携してください Capgo での CI/CD 設定 Capgo CI/CDでのプロダクトワークフローについては、 Capgo Native Build Capgo Native Buildsでのプロダクトワークフローについては、 Capgo インテグレーション Capgo インテグレーションでのプロダクトワークフロー向けに、 CI/CD 連携 CI/CD Integrationの実装詳細については、 GitHub Actions 連携 GitHub Actions Integrationの実装詳細については。

Capacitor アプリ向けの Live Updates

Web レイヤーのバグが本番で発生したら、App Store の審査を何日も待たずに Capgo で修正を配信しましょう。ネイティブの変更は通常の審査フローに残したまま、ユーザーはバックグラウンドでアップデートを受け取れます。

最新のブログ記事

Capgoは、真にプロフェッショナルなモバイルアプリを作るために必要な最高のインサイトを提供します。