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を最新に保ち、デフォルトのtargetSdkVersionfollows.
ステップ1: プロジェクトを再現可能にする
CIはリポジトリにあるものしか再ビルドできません。ワークフローを書く前に:
- コミット
package.jsonおよび lockfile。Cordova はプラットフォームとプラグインをcordovaセクションに保存します。package.jsonを使用しているため、cordova prepareがそれらを復元します。 - をコミットしないでください。
platforms/またはplugins/これらは生成されるものです。 - すべてのマシンで同じバージョンを使用できるように、Cordova CLI を dev dependency としてインストールします:
bun add -d cordova
- 署名値を
config.xmlからbuild.jsonに移し、ビルド時にシークレットを読み込むようにします(次のステップ)。 - Node.js のバージョンを
.nvmrcまたはpackage.jsonengines.
ステップ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-listmacOS がキーチェーンへのアクセスを求めるプロンプトを止め、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-android13+ および/またはcordova-ios7+(プラグインはデフォルトのhttps://localhost/とapp://localhost/スキームに依存します)- 併用しないでください
cordova-plugin-ionic-webviewIonic 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 への移行は必須ではなく、後で選べる選択肢として残ります。