メインコンテンツへスキップ

2026年版 Cordovaアプリ向けCI/CD:完全セットアップガイド

2026年にCordovaアプリのCI/CDをセットアップ:署名済みAndroid AABとiOS IPAビルド、ストアへのアップロード、live updateのオプション、Capacitorへ移行すべきタイミング。

Apache Cordova アプリが CI/CD パイプラインを経て App Store と Google Play に配信される様子

2026 年の Cordova アプリにおける CI/CD とは、Linux ランナー上で Android AAB をビルド・署名し、macOS ランナー上で iOS IPA をビルド・署名し、同じパイプラインから両ストアにアップロードすることを指します。Cordova チームがこれに使用していたマネージドサービスは廃止または閉鎖されたため、ほとんどのチームは汎用 CI で Cordova の CLI を実行しています。本ガイドでは、動作する GitHub Actions のセットアップ、他の CI での同様の手順、そしてライブアップデートと長期的な選択肢について率直に解説します。

Cordova チームにとって何が変化したか

Cordova の CI/CD を形作った 3 つの出来事:

  • PhoneGap Build 2020 年 10 月 1 日に終了しました。
  • Microsoft App Center 2025 年 3 月 31 日に廃止されました。ビルド、配布、ホスト型 CodePush サービスもこれに伴い終了しました。
  • Ionic Appflowの代替手段 2025 年 2 月に新規販売が停止されました。既存顧客は 2027 年 12 月 31 日までアクセス可能です。

Cordova 自体は引き続き動作します。Apache プロジェクトはリリースを継続しています cordova-android と cordova-ios リリース、そして多くの社内・エンタープライズアプリがその上で動いています。足りないのはマネージドレイヤーです。署名の保管、ストアへのアップロード、OTA更新。これらは現在、CIサービスといくつかのツールを組み合わせて構築しています。

Cordovaパイプラインの構造

ステージ Androidでは iOSと
ランナー Linux Xcode 26搭載のmacOS
リストア cordova prepare (platformsとpluginsは package.json) 同じ
Webビルド お使いのバンドラー(Vite、webpack、Angular CLI)を www/ 同じ
Native Build Gradle 経由で cordova build android --release xcodebuild 経由で cordova build ios --release --device
署名 keystore をアップロード(.jks) 配布証明書(.p12)とプロビジョニングプロファイル
アーティファクト .aab Google Play 用 .ipa TestFlight と App Store 用
アップロード Google Play Developer API (サービスアカウント) App Store Connect API キー

すべてのパイプラインに適用される2つのプラットフォームルール:

  • 2026年4月28日以降、App Store ConnectはXcode 26およびiOS 26 SDK 以降で作成されたビルドのみを受け入れます。あなたの cordova-ios バージョンが対応していることを確認してください。
  • Google Playでは新規アプリにAABのアップロードが必須であり、最低限のターゲット API レベルが毎年引き上げられます。 cordova-android を最新に保ち、デフォルトの targetSdkVersion follows.

ステップ1: プロジェクトを再現可能にする

CIはリポジトリにあるものしか再ビルドできません。ワークフローを書く前に:

  1. コミット package.json および lockfile。Cordova はプラットフォームとプラグインを cordova セクションに保存します。 package.jsonを使用しているため、 cordova prepare がそれらを復元します。
  2. をコミットしないでください。 platforms/ または plugins/これらは生成されるものです。
  3. すべてのマシンで同じバージョンを使用できるように、Cordova CLI を dev dependency としてインストールします:
bun add -d cordova
  1. 署名値を config.xml から build.json に移し、ビルド時にシークレットを読み込むようにします(次のステップ)。
  2. Node.js のバージョンを .nvmrc または package.json engines.

ステップ2: build.json での署名

Cordova は署名設定を build.json ファイルから読み取ります。プレースホルダーを含む build.template.json をコミットし、CI でシークレットから実際の build.json を生成し、生成されたファイルはコミットしないでください:

{
  "android": {
    "release": {
      "keystore": "release.jks",
      "storePassword": "${KEYSTORE_STORE_PASSWORD}",
      "alias": "upload",
      "password": "${KEYSTORE_KEY_PASSWORD}",
      "packageType": "bundle"
    }
  },
  "ios": {
    "release": {
      "codeSignIdentity": "Apple Distribution",
      "developmentTeam": "ABCDE12345",
      "packageType": "app-store",
      "provisioningProfile": "com.example.app AppStore",
      "automaticProvisioning": false
    }
  }
}

この ${...} プレースホルダーは Cordova では展開されません。以下のワークフローでは、実際の値を書き込むために次を使用します: envsubst.

Android の keystore がまだない場合は、 keytool またはブラウザベースの Android keystore ジェネレーターで作成します。iOS の場合、 iOS証明書ジェネレーター 証明書署名要求(CSR)を作成し、 .p12 Mac なしで。

ステップ 3: GitHub Actions ワークフロー

このワークフローは、バージョンタグで両方のプラットフォームを並行してビルドし、内部テストトラックにアップロードします。

# .github/workflows/cordova-release.yml
name: Cordova release

on:
  push:
    tags: ['v*']

jobs:
  android:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: oven-sh/setup-bun@v2
      - uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: '17'
      - run: bun install --frozen-lockfile
      - run: bun run build            # outputs to www/
      - run: bunx cordova prepare android
      - name: Signing files
        env:
          KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
          KEYSTORE_STORE_PASSWORD: ${{ secrets.KEYSTORE_STORE_PASSWORD }}
          KEYSTORE_KEY_PASSWORD: ${{ secrets.KEYSTORE_KEY_PASSWORD }}
        run: |
          echo "$KEYSTORE_BASE64" | base64 --decode > release.jks
          envsubst < build.template.json > build.json
      - run: bunx cordova build android --release --buildConfig=build.json
      - uses: r0adkll/upload-google-play@v1
        with:
          serviceAccountJsonPlainText: ${{ secrets.PLAY_SERVICE_ACCOUNT_JSON }}
          packageName: com.example.app
          releaseFiles: platforms/android/app/build/outputs/bundle/release/app-release.aab
          track: internal
          status: completed

  ios:
    runs-on: macos-26
    steps:
      - uses: actions/checkout@v6
      - uses: oven-sh/setup-bun@v2
      - run: bun install --frozen-lockfile
      - run: bun run build
      - run: bunx cordova prepare ios
      - name: Install certificate and profile
        env:
          P12_BASE64: ${{ secrets.IOS_P12_BASE64 }}
          P12_PASSWORD: ${{ secrets.IOS_P12_PASSWORD }}
          PROFILE_BASE64: ${{ secrets.IOS_PROFILE_BASE64 }}
          KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
        run: |
          echo "$P12_BASE64" | base64 --decode > dist.p12
          security create-keychain -p "$KEYCHAIN_PASSWORD" build.keychain
          security set-keychain-settings -lut 21600 build.keychain
          security unlock-keychain -p "$KEYCHAIN_PASSWORD" build.keychain
          security import dist.p12 -k build.keychain -P "$P12_PASSWORD" -T /usr/bin/codesign
          security set-key-partition-list -S apple-tool:,apple: -s -k "$KEYCHAIN_PASSWORD" build.keychain
          security list-keychains -d user -s build.keychain login.keychain
          for dir in "$HOME/Library/MobileDevice/Provisioning Profiles" \
                     "$HOME/Library/Developer/Xcode/UserData/Provisioning Profiles"; do
            mkdir -p "$dir"
            echo "$PROFILE_BASE64" | base64 --decode > "$dir/app.mobileprovision"
          done
          cp build.template.json build.json   # iOS values hold no secrets
      - run: bunx cordova build ios --release --device --buildConfig=build.json
      - name: Upload to TestFlight
        env:
          API_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
          API_ISSUER: ${{ secrets.APPLE_ISSUER_ID }}
          API_KEY_BASE64: ${{ secrets.APPLE_KEY_CONTENT }}
        run: |
          mkdir -p ~/.appstoreconnect/private_keys
          echo "$API_KEY_BASE64" | base64 --decode > ~/.appstoreconnect/private_keys/AuthKey_${API_KEY_ID}.p8
          IPA=$(find platforms/ios/build -name '*.ipa' | head -n 1)
          xcrun altool --upload-app -f "$IPA" -t ios --apiKey "$API_KEY_ID" --apiIssuer "$API_ISSUER"
      - name: Clean up keychain
        if: always()
        run: security delete-keychain build.keychain || true

一部の行が必要な理由:

  • プロビジョニングプロファイル用フォルダが2つ。 Xcode 16 以降はプロファイルを以下から読み取ります: ~/Library/Developer/Xcode/UserData/Provisioning Profiles。それ以前の Xcode は以下を使用していました: ~/Library/MobileDevice/Provisioning Profiles。両方を書き込むことで「No profiles for ‘com.example.app’ were found」エラーを回避できます。
  • set-key-partition-list macOS がキーチェーンへのアクセスを求めるプロンプトを止め、CI ジョブがハングするのを防ぎます。
  • JDK のバージョン。 リリースドキュメントに記載されているJDKを使用してください。 cordova-android 最近のリリースはJDK 17でビルドされます。
  • ビルド番号。 バージョンアップ android-versionCode と ios-CFBundleVersion における config.xml ビルド前に、例えばCIの実行番号などを使って更新しないと、ストア側で重複としてアップロードが拒否されます。

以下を入れ替えられます: altool アップロードをfastlaneの upload_to_testflight およびPlayアクションをfastlaneの supply チームですでにfastlaneを使っている場合。

ステップ4:他のCIサービスで同じパイプライン

CI間でコマンドは変わりません。変わるのはRunnerの選択とSecretの構文だけです。

CI Androidランナー iOS ランナー 備考
GitHub アクション ubuntu-latest macos-26 / macos-latest プライベートリポジトリでは、macOS の分は Linux より高くなります
GitLab CI 任意の Linux ランナー ホスト型 macOS ランナー(ベータ、Premium、Ultimate)またはセルフホスト型 などのイメージ macos-26-xcode-26
Bitbucket Pipelines Linux Docker イメージ セルフホスト Mac のみ 参照 Bitbucket iOS ガイド
Gitea / Forgejo Linux ランナー ホストモードのセルフホスト Mac 参照 Gitea iOS ガイド
Bitrise Linux スタック macOS スタック Cordova のステップ (prepare, archive) を提供
Codemagic Linux Mac mini インスタンス Ionic Cordova のビルドを codemagic.yaml
Azure DevOps ubuntu-latest macOS-latest 証明書とプロファイルのインストールタスク

機能別の詳細は、 Cordova アプリ向け CI/CD プラットフォーム比較.

ステップ5: Cordovaのライブアップデート

Live Update を使えば、ストアのレビューなしで HTML、CSS、JavaScript の修正を配信できます。App Center CodePush は 2025 年 3 月に終了し、Appflow Live Updates は 2027 年 12 月 31 日に終了します。また、従来のコミュニティ製 code プラグインはメンテナンスされていません。メンテナンスされている選択肢としては Capgo Live Updates を使用して、 @capgo/cordova-updater 同じバックエンド、チャネル、および CLI を使用する Capacitor アプデーターと同じプラグインです。

要件

  • Cordova CLI 12+ 以上
  • cordova-android 13+ および/または cordova-ios 7+(プラグインはデフォルトの https://localhost/ と app://localhost/ スキームに依存します)
  • 併用しないでください cordova-plugin-ionic-webview Ionic WebView は Cordova のスキームハンドラーをバイパスするため、ダウンロードされたバンドルが読み込まれません。

プラグインをインストール

Capgo で Capacitor と同様にアプリを作成し、Capgo アプリ ID を指定してプラグインをインストールします:

cordova plugin add @capgo/cordova-updater \
  --variable APP_ID=com.example.app \
  --variable DEFAULT_CHANNEL=production
cordova prepare android ios

DEFAULT_CHANNEL, UPDATE_URLや AUTO_UPDATE は任意のインストール変数です。実行 cordova prepare してください。変更があるたびに再実行してください。

起動ごとに確認

完了後、 devicereadyプラグインは次のように利用できます: cordova.plugins.Updater。 notifyAppReady() 起動のたびに確認しないと、プラグインは新しいbundleを破損とみなし、ロールバックします:

document.addEventListener('deviceready', async () => {
  const { Updater } = cordova.plugins

  await Updater.notifyAppReady()

  const latest = await Updater.getLatest()
  if (latest.url && !latest.error) {
    const bundle = await Updater.download({
      url: latest.url,
      version: latest.version,
      checksum: latest.checksum,
    })
    await Updater.next({ id: bundle.id })
  }
})

CIからbundleをアップロード

Webレイヤーのみの変更では、Webレイヤーをビルドしてアップロードするジョブを追加してください:

  live-update:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: oven-sh/setup-bun@v2
      - run: bun install --frozen-lockfile
      - run: bun run build
      - run: bunx @capgo/cli@latest bundle upload --channel=production
        env:
          CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}

Live UpdateはWeb bundleのみを置き換えます。Cordovaプラグインの追加・削除・アップグレードには、引き続きストア向けの新しいビルドが必要です。Capgoは、live bundleに記録されたネイティブプラグインとプロジェクトを比較し、互換性のないアップロードを検出します。詳細は live updateの互換性についてご覧ください。完全なセットアップ手順は Cordova updater ドキュメント.

ビルド側では、 Capgo のビルド ドキュメントは Capacitor プロジェクトのみをカバーしています(ネイティブプロジェクトをアップロードします cap sync)。Cordova バイナリは上記のように CI で引き続きビルドされます。

任意: 後でCapacitorへ移行

Cordova から離れなくても、動作するパイプラインとライブアップデートを実現できます。移行は別の判断ですが、以下の場合には価値があります:

  • macOS ランナーのメンテナンスなしで iOS ビルドを行いたい場合。Capgo Build は Linux CI ジョブから Capacitor アプリをコンパイルします。
  • 依存しているプラグインが Cordova 向けに更新されなくなったが、Capacitor 対応版がある場合。
  • プラットフォームのパッチを当てずに Swift Package Manager サポートと最新の Android Gradle Plugin バージョンを利用したい場合。

移行はあなたの www code。Capacitorを追加し、プラグインを移行します(ほとんどのCordovaプラグインはそのまま動作します)。Capacitorネイティブ対応版があるものは数個置き換えます。CapgoのアプリIDとチャネルはそのまま維持され、変更されるのはアップデータプラグインのみです。 @capgo/cordova-updater まで @capgo/capacitor-updater。手順は CordovaからCapacitorへの移行、および CordovaからCapacitorへの移行ソリューションページ でサポート方法を紹介しています。移行後、上記のCIはWebビルドと cap sync、およびプラットフォームごとの build request 呼び出し1回に縮小されます(詳細は Capacitor アプリ向け CI/CD プラットフォームの比較.

CIでのCordovaビルドのトラブルシューティング

エラー 原因と修正方法
Current working directory is not a Cordova-based project config.xml または www/ がありません。Cordova コマンドの実行前に Web ビルドを実行するか、空の www/.
No platforms added to this project にプラットフォームがリストされていません package.json。を実行してください cordova platform add をローカルで一度実行し、コミットしてください package.json.
Could not find an installed version of Gradle 最近 cordova-android は Gradle wrapper を使用します。Gradle をグローバルにインストールするのではなく、プラットフォームを更新してください。
Unsupported class file major version ランナー上の JDK が cordova-android が期待するものと一致しません。で固定してください setup-java.
No signing certificate "iOS Distribution" found 使用する Apple Distribution を ID として使用し、 .p12 秘密鍵が含まれています。
errSecInternalComponent キーチェーンがロックされているか、パーティションリストが欠落しています。キーチェーン設定コマンドを再実行してください。
アップロードが拒否されました: SDK が古すぎます ランナーイメージがXcode 26より古いバージョンを使用しています。選択してください macos-26 または、でXcodeを設定してください xcode-select.
Play アップロード: Version code has already been used バージョンアップ android-versionCode すべてのアップロードに。

まとめ

2026年のCordovaパイプラインは、プラットフォームごとのCIジョブです。Android AAB用のLinuxランナー、IPA用のXcode 26搭載macOSランナー、生成された build.json、および両ストア用のAPIキー。主要なCIであればすべて実行可能です。追加: @capgo/cordova-updater と bundle upload Web 限定の修正用ジョブがあり、Appflow や App Center が以前提供していたビルド、ストア、OTA の仕組みも揃っています。Capacitor への移行は必須ではなく、後で選べる選択肢として残ります。

Capacitor アプリ向けの Live Updates

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

最新のブログ記事

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