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

Capacitor と Electron アプリ向けの継続的インテグレーション設定

CapacitorJS と Electron アプリの CI 設定をマスターしましょう。パイプライン設定、署名、アーティファクト管理、および Capgo のライブアップデートについて学びます。

Capacitor と Electron アプリ向けの継続的インテグレーション設定

ハイブリッドアプリチームがビルドプロセスの限界に達したことは、通常すぐにわかります。誰かがまだ Mac にログインして Xcode を操作し、Android アーティファクトをエクスポートし、Electron パッケージを手動で署名して、アップロードされたビルドがどのブランチに対応しているか思い出すのに必死になっているのです。リリースは機能しますが、それは数人のメンバーがすべての手順を暗記しているからこそで、彼らが忙しくなるとすぐにスケーリングが止まります。

適切な 継続的インテグレーション(CI)の設定 その脆い儀式を再現可能なパイプラインに置き換えます。Martin Fowler の CI の定義は今も核心を捉えています。チームメンバーが少なくとも毎日共有コードベースに変更をマージし、すべての統合が自動ビルドで検証されることで、エラーが素早く表面化します。 Fowler の継続的インテグレーションに関する原典エッセイ。その規律は Capacitor や Electron アプリではさらに重要です。1回のビルドで Web アセット、ネイティブラッパー、署名用のクレデンシャル、そして live update への公開まで同時に扱うからです。

目次

なぜ Capacitor と Electron アプリに本格的な CI パイプラインが必要なのか

よくある出発点には見覚えがある。開発者はローカルでWebビルドを実行し、Capacitorを同期し、XcodeまたはAndroid Studioを開いて署名済みバイナリをエクスポートし、共有ドライブやチャットスレッドにパッケージを置く。ビルドが1台のマシンでしか動かない、証明書が警告なしに期限切れになる、あるいは手動手順が書き留められていなかったせいで同僚が古いブランチからリリースしてしまう——そんな事態に初めて直面するまでは、効率的に感じられる。

課題は速度だけでなく、再現性です

Fowlerのベースラインルールは、このプロセスがなぜ破綻するのかを今も説明している。信頼できるCIセットアップは、すべてをバージョン管理下に置き、ビルドを自動化し、ビルドを自己テスト可能にし、メインラインへのプッシュごとにトリガーし、壊れたビルドを即座に修正し、ビルドを高速に保つ。 FowlerのCIガイドライン。それは「テストを実行する」ことではなく、リリース作業を可視化し、退屈で、ミスしにくいものにすることだ。

実践的なルール: リリースが、誰かがローカルコマンドを覚えていることに依存しているなら、それはまだパイプラインではない。

Capacitorチームは、3つの場面で破綻を実感する。ネイティブプロジェクトファイルがWebアプリから乖離し、署名資格情報が属人的な知識になり、どのバンドルバージョンがテスターに届いたか誰も信頼できないため更新パスが混乱する。Electronチームも、パッケージングがローカルOSの状態、ネイティブ依存関係、開発者のアドホックな署名設定に依存していると、同様の壁にぶつかる。

本物のパイプラインは、共有された唯一の信頼できる情報源(Single Source of Truth)を提供します。クリーンなランナー上で毎回同じチェックを実行し、何が変更されたかを教えてくれる成果物やログを残します。これは「ビルドした」ことと「何がビルドされたかを正確に証明できる」ことの違いです。

なぜ live update のワークフローがここで自然に機能するのか

パイプラインが再現可能になると、live update の公開は、別個のスクリプトとして「思い出した時に実行する」ものではなく、同じリリース規律の一部になります。ハイブリッドチームにとってこれは重要です。Webアセット、JavaScriptの修正、設定変更は、フルなアプリストアサイクルを待つ必要がないためです。構造化されたCIフローにより、一度ビルドし、一度検証し、同じ出力をトレーサビリティを保ちながら正しいチャネルにプッシュすることが可能になります。

また、そのようなツールが Capgo のCIメリット概要 がここに当てはまります。その価値は抽象的なものではなく、変更内容の可視性を失うことなく、手動のパッケージングから管理された再現可能なデリバリーに移行できる能力です。

ハイブリッドアプリに最適な CI プロバイダーの選び方

ハイブリッドアプリの場合、純粋なWeb作業よりもプロバイダーの選択が重要になります。Linuxランナーだけで済むパイプラインは npm install ある程度の粗さを許容できます。一方、iOS署名にmacOS、ElectronのパッケージングにDocker、ログに漏洩してはならないシークレットを扱うパイプラインには、より厳密なランナー制御、明確な分離、より安全な権限モデルが必要です。

優れたプロバイダーは、ビルドステップだけでなく、リリースパス全体にも適合する必要があります。Capacitor や Electron チームは、ネイティブアプリの署名、成果物のプロモーション、live update の公開を同じパイプラインで扱うことが多いため、CI システムはこれらのステップを分離しつつ、ワークフローの監査が容易であるようにする必要があります。ランナーモデルが脆弱だと、署名情報が安易にコピーされてしまいます。成果物の処理が雑だと、何がリリースされたのか信頼できなくなります。一般的な CI ガイドでは、この部分が往々にして省略されます。

GitHub Actions は、すでに GitHub で開発しているチームに最適です

ソースがすでに GitHub にある場合、GitHub Actions は最も摩擦の少ない選択肢です。ワークフローはアプリの code の隣に配置されるため、レビューと所有権の管理が明確になります。また、CI ツールの比較で説明されているソース管理とランナーモデルにおいて、Linux、Windows、macOS のランナーをサポートしています。 GitHub Actions のランナーモデルと SCM 結合ハイブリッドチームにとってこれは重要です。iOS ビルドには macOS が必要ですが、Electron のパッケージングは、コンテナ化されたまま維持できる Linux または Windows のジョブの方が適していることが多いからです。また、署名シークレットを必要とするワークフローにスコープを限定して管理しやすくなります。

トレードオフは、すべてのジョブを同じように扱うと GitHub Actions がノイズになりやすいことです。すでに GitHub を code レビュー、ブランチ保護、リリースのオーナーシップに使っているチームには向いています。ビルド、レジストリ、デプロイの制御が別の場所にあり、CI システムにリリースプロセスの更多を任せたい場合は、魅力は薄れます。多くのモバイルチームでは、ワークフローファイルと code レビューが同じ場所で行われるため、利便性が勝ります。

リポジトリとデリバリーが一体で管理される場合、GitLab CI は強力です

GitLab CI は、リポジトリ、パイプライン、環境トラッキングを1か所にまとめたいチームに適しています。共有またはセルフマネージドランナーをサポートし、プラットフォームモデルにデプロイステージを含むため、同じチームがビルド、ステージング、リリースオーケストレーションを担う場合に実用的です。 GitLab CI のプラットフォームモデル。この構成は、署名、パッケージング、リリース承認の判断を別々のシステムに散らばらせずに分離したい場合に役立ちます。

トレードオフは組織的なものです。チームがすでにソース管理とレジストリストレージに GitLab を使っている場合、パイプラインは統合されていると感じられ、監査も容易です。そうでない場合、特に iOS 署名用の macOS ランナーを組み込んだり、live update の公開を同じリリースプロセスに揃えたりし始めると、セットアップコストが利便性を上回る可能性があります。具体的な GitLab のパターンを求めているチームには、 Capgo の GitLab ビルド・リリースガイド buildとreleaseのステップを、パイプラインを手動チェックリストにすることなく連携させ続ける方法を示す、有用な参考例です。

CircleCIは、ホスト型の柔軟性を求めるチームに適しています

CircleCIは、パッケージングやbuild自動化に関する強力なエコシステムを備えた、マネージドな実行環境を求めるチームに向いています。クラウド実行環境とセルフホストのオプションにより、GitHub、GitLab、Bitbucketのリポジトリ間で柔軟に利用でき、そのポータビリティは、ハイブリッドなチームが顧客やコードベースを行き来する際にも役立ちます。 CircleCIの実行モデル。CapacitorやElectronでの開発におけるメリットは、プロバイダーの機能を活用してexecutorの選択やジョブの分離を行いながら、buildロジックをコンパクトに保てることです。

デメリットは、ポータビリティによって複雑さが隠れてしまう可能性があることです。macOSの署名、アーティファクトの昇格、アップデートの公開などを追加すると、厳格なシークレット管理と明確なジョブ境界が必要になります。CircleCIは、ホスト型のrunnerを求め、そのためにプロバイダー固有のワークフローモデルを多少学習することを厭わないチームに最適です。

評価基準 GitHub アクション GitLab CI CircleCI
Capacitor/Electron Buildサポート macOS、Linux、Windowsのrunnerを備え、GitHub優先のチームに適しています すでにGitLabを使い、共有RunnerまたはセルフマネージドRunnerを利用するチームに向いている 複数のSCMに対応する強力なホステッドサポート
設定のしやすさ すでに code が GitHub にあるなら導入はスムーズ プラットフォームとの統合は強力だが、スタック全体がGitLabにある場合に最適 柔軟だが、プロバイダー固有の設定を覚える必要がある
無料枠の制限 公開 GitHub リポジトリ、特に小規模プロジェクトに最適 GitLabがすでにSystem of Recordなら最もコスト効率が良い 設定コストの低さよりも、マネージド実行を理由に選ばれることが多い

ハイブリッドアプリ構築向けの GitHub Actions、GitLab CI、CircleCIの機能比較表。

最適な選択は通常、code がすでにどこにあるかと、どのRunnerタイプを最もよく必要とするかで決まります。iOSリリースに追われる Capacitor アプリには、macOSへのアクセスが容易な環境が有利です。パッケージングが予測しやすいElectron中心の製品なら、代わりにDockerフレンドリーなジョブとアーティファクト管理を優先できます。同じパイプラインからLive Updatesも配信する場合は、リリース権限と署名ステップを最も分離しやすいプロバイダーを選びましょう。

これらを比較するには、プラットフォームごとに1つ問いを立てるのが有効です。面倒な回避策なしで必要なネイティブジョブを実行できるか、シークレットを管理下に置けるか、チームが別のWikiページを開かずに設定を読めるか、です。

パイプライン設定の構築

低コストなチェックを先に実行して失敗を早め、高コストなランナーは必要になるまで待機させるのが、ハイブリッドパイプラインの最適な形です。Lint、ユニットテスト、Webビルドは、macOSがiOSのコンパイルを開始する前、またはElectronのパッケージングが署名済みアーティファクトを生成する前に完了しているべきです。この順序なら、壊れた変更でランナー時間を無駄にせず、早い段階で軽量なチェック、後で重いスイート、同じアーティファクトを後続ステージへ昇格させる前に一度だけビルドする、というCIのパターンに合致します。 JetBrains CI/CD ベストプラクティス.

実際に通用する GitHub Actions の構成

実用的なレイアウトはシンプルで予測可能です:

  1. チェックアウト
  2. 依存関係をインストール
  3. Lintとユニットテスト
  4. Webアセットをビルド
  5. ネイティブプロジェクトを同期
  6. プラットフォームのアーティファクトをパッケージ
  7. 成果物をアップロード

この順序により、壊れた code を高コストなネイティブジョブから遠ざけます。また、依存関係グラフがすでに有効な状態になった後にのみ npm、Gradle、パッケージマネージャーのキャッシュが重要になるため、キャッシュの挙動を推測しやすくなります。

プロジェクトの詳細が変わっても、コンパクトな GitHub Actions ジョブは通常、この構造に従います:

  • 一度だけインストール: 前に Node とパッケージのキャッシュを復元 npm ci.
  • 早期に検証: ネイティブビルドの前に lint とユニットテストを実行。
  • Web 出力をビルド: Capacitor と Electron の両方が消費するアセットバンドルを作成。
  • プラットフォームジョブに分岐: 共有ステップがパスした後にのみ、iOS、Android、Electron のパッケージングを実行。
  • 成果物を公開: 署名済みの成果物、ログ、メタデータを個別にアップロードします。

共有チェックが通るまでネイティブ作業を後回しにするほど、失敗のコストは安くなります。

モバイルとデスクトップの両ターゲットをリリースするチームでは、この分割が管理しやすいパイプラインとノイズの多いパイプラインを分けることがよくあります。Xcodeの失敗はmacOSの時間と開発者の注意を消費するため高コストですが、lintジョブの失敗はほぼ無コストです。ビルドが実際の署名、アップデート公開、リリース権限を扱い始めると、すべてを1つの大きなジョブにまとめる構成はすぐに破綻しがちです。

GitLabやCircleCIでも同じロジックを再現できます

GitLab CIはステージ制のジョブにきれいに対応でき、CircleCIも構文は違いますが同様です。ポイントは、3つのツールすべてで同じパイプラインの形を保つことです。1つのソースビルドが下流のジョブに渡され、各ネイティブパッケージングステップはゼロから再ビルドするのではなく、同じcode状態を利用します。

ElectronのパッケージングにDockerを使う場合は、環境を再現可能に保つためコンテナイメージを固定してください。iOSをビルドする場合は、macOSジョブを分離し、証明書ステップとコンパイルステップを分けて、失敗の原因がわかりやすい状態を保ってください。Androidビルドを実行する場合は、Gradleキャッシュを安定させ、無関係なパッケージインストールを同じシェルステップに混ぜないでください。

そのセットアップのCapacitor向けバージョンについては、 Capgoのパイプラインセットアップガイド 心強い味方です。

GitHub Actionsを使い、CapacitorとElectronアプリをビルドする5ステップのCIパイプラインを示す図。

Code 署名と成果物管理

署名は、多くの優れたパイプラインが失敗する箇所です。ビルドは成功し、パッケージも存在するのに、証明書が欠落している、キーチェーンが解放されない、誤った成果物がアップロードされたなどの理由でリリースが失敗することがあります。対策として、パッケージングの副産物ではなく、署名を独立した制御可能なステージとして扱うことです。

iOS、Android、Electronでは異なる処理が必要です

iOSの署名は通常、証明書、プロビジョニングプロファイル、macOSランナーの状態を意味します。Androidにはキーストアの管理と、Playリリースパスに必要なものが必要です。Electronにはcode署名証明書が加わり、macOSでは配布可能なデスクトップビルドのためにノタリゼーションが必要です。これらはすべてパイプラインで処理すべきであり、人間がランナーにファイルをコピーするべきではありません。

iOSでは、チームはfastlane matchを使用したり、macOSランナーに証明書を手動でインストールしたりすることがよくあります。重要なのは特定のヘルパーではなく、一貫性です。ワークフローが開発者がキーチェーンにインタラクティブにアクセスする必要がある場合、最悪のタイミングで必ず壊れます。

Androidでは、キーストアをリポジトリの外に保持し、ビルド時にシークレットとして注入してください。Electronでは、古い成果物を誤って署名しないように、署名ステップをパッケージングステップに近づけてください。

実践的なルール: 配布予定の正確な成果物に署名し、署名後はその成果物を不変に保ってください。

成果物管理は追跡可能性を維持すべきです

Artifact managementは単なるストレージではない。どのバイナリがどのcommitから来て、どのchannelに送られたかを把握するための仕組みだ。だからこそ、バージョン情報を可視化するというFowlerの古い指針は、エンタープライズのCIシステムで今も有効だ。build ID、deployment metadata、release traceabilityがあれば、後からサポートの問い合わせにも答えられる。 Fowlerが説くバージョン情報の可視化.

署名済みの成果物は、rollback、auditing、サポート時の再現に必要な期間だけ保持し、contextのない古いreleaseを放置しない。わかりやすい命名規則、commit SHA、platform tagがあるだけで大きく変わる。pipelineがTestFlight、Google Play internal testing、Electron配布用bucketにuploadするなら、uploadステップを明示して、CIから何が出ていったかを確認できるようにしよう。

Capgo の 証明書管理のガイドライン はここで関係してくる。native署名とupdate公開のどちらにも同じ規律が当てはまるからだ。認証情報は安全に保管し、きれいにローテーションし、決してログに出力してはいけない。

パイプラインでCapgo Live Updatesを自動化する

buildが安定したら、live updateの公開はスタックの中でも最も時間を節約できる部分になることが多い。ハイブリッドチームは、文言の修正、webのバグ修正、config flagの切り替えのためだけにストアレビューを待ちたくない。CI駆動のCapgo公開ステップなら、nativeリリースプロセスをボトルネックにせずにそうしたケースに対応でき、update経路をbuildと同じ制御下に保てる。

チャネルベースの公開でリリースを制御

最もクリーンなパターンは、 ステージング 開発ブランチへのマージ時に、 本番 タグ付きリリース時のみ公開することです。これにより、テスターは予測可能なチャネルで動作し、本番環境へのプッシュは意図的かつレビュー可能になります。パイプラインでは、Capgo API キーをシークレットとして保存し、CLI をインストールして最新のWebアセットをバンドルし、ジョブの一部として更新を公開する必要があります。

実際には、シンプルなポリシーが有効です:

  • Develop ブランチ: ステージングチャネルにプッシュ。
  • リリースタグ: 本番チャネルにプッシュ。
  • Hotfix ブランチ: オーナーがロールアウトの意向を確認するまで、分離したままにします。

CIとLive Updatesは互いを強め合います。パイプラインはビルド中のコミットをすでに把握しているので、そのメタデータをCapgoのpublishステップで使えば、更新履歴が読みやすくなります。特に、特定のネイティブビルドにどのWebペイロードが紐づいていたかを答える必要がある場合に有効です。

差分更新とロールバックの挙動が重要です

Capgoの更新モデルは、変更されたファイルだけを送り、問題が起きたら安全にロールバックする仕組みに基づいており、CI駆動のリリースフローに自然に合います。つまり、パイプラインはアセットを配信するだけでなく、アセットがオーディエンスやチャネル間をどう移動するかまで決めます。頻繁にリリースするチームにとって、このコントロールは単発の手動publishスクリプトより有用です。

https://capgo.app のスクリーンショット

よく見かける最大の誤りは、publishステップを単独のタスクとして扱うことです。たいてい誰かがラップトップから実行する形になり、パイプラインの意味がなくなるうえ、トレーサビリティも弱まります。CIに組み込み、ブランチやタグのルールでゲートし、リリースメタデータをビルド出力に残して、後からサポートが追跡できるようにしてください。

正確なGitHub Actionsパターンについては、 CapgoのGitHub Actions統合ガイド が適切な参照点です。

実際の脅威からCIパイプラインを守る

正常にビルドが完了したパイプラインでも、安全とは限りません。NSAとCISAの政府ガイドラインはCI/CDセキュリティを最重要課題として位置づけ、セキュリティスキャンの統合、監査ログの保持、CI/CD設定の署名、SBOMとSCAの利用、平文でのシークレット通過の防止、および災害復旧テストを伴う高可用性への構築を推奨しています。 NSAとCISAによるCI/CD強化ガイドライン。この枠組みは有用です。なぜなら、実際のチームで問題となるトークンの漏洩、設定の改ざん、広すぎるデプロイ権限といった状況と一致するからです。

パイプラインの強化とアプリの強化は別物です

多くのガイドは依存関係のスキャンについて言及しますが、CIシステム自体を無視しています。これは誤りです。侵害されたランナーがシークレットを出力し、署名ステップを変更し、またはアップロード前に成果物を差し替えることが可能であれば、アプリケーションcodeが完全にクリーンであっても、安全でないものをリリースすることになります。安全なパイプライン設計とは、ランナー、設定、認証情報を本番環境の資産として扱うことを意味します。

実用的な管理手段はシンプルです:

  • パイプライン設定に署名する: 不正なワークフロー編集を明確にします。
  • ログからシークレットを除外する: シェル出力を通じて認証情報を平文で渡さないでください。
  • デプロイ権限を制限する: 本番環境に到達するのは、適切なブランチまたはタグのみであるべきです。
  • 実行履歴の監査: 何が起きたかを再現できるだけの詳細なログを保持してください。
  • ビルドイメージと依存関係のスキャン: 特に、コンテナ化されたパッケージングを使用する Electron ジョブが対象です。

認証と環境の分離には規律が求められます

現代的な CI 構成の多くでは、OIDC ベースのクラウド認証が長期間有効な認証情報よりも適しています。トークンが盗まれた際の被害範囲(blast radius)を限定できるためです。環境アカウントの分離や本番環境へのアクセス制限も、意図しない昇格を減らします。モバイルのリリースパイプラインは意図せず権限が蓄積しやすいため、これらのパターンはハイブリッドチームに特に適しています。

依存関係のスキャンやシークレット管理など、CI パイプラインを保護するための4つのベストプラクティスをまとめたインフォグラフィック。

「動作するパイプライン」であっても、改ざんが容易であればリスクになり得ます。セキュアな CI には、配信するアプリと同様の設計作業が必要であり、規制の厳しい環境ではそれは必須事項です。

よくあるパイプラインの失敗とその解決策

Capacitor や Electron プロジェクトにおける CI の失敗の多くは、いくつかの共通した原因に集約されます。もし npm のインストールが不安定な場合は、通常ランナー環境がドリフトしています。Xcode がタイムアウトする場合は、Native Build が始まる前にジョブが多くの処理を抱え込みすぎていることが多いです。Gradle がメモリ不足になる場合は、パッケージング工程が単一の executor で過剰な処理を行おうとしている可能性があります。

ツール名ではなく、症状から診断する

依存関係インストールの断続的な失敗 通常、キャッシュの破損または不安定なロックファイルワークフローを意味します。クリーンなインストールコマンドに依存し、パッケージマネージャーのバージョンを固定し、キャッシュの復元と実際のインストール手順を分離することで修正します。

Xcode ビルド失敗 多くの場合、ランナーのセットアップ、シミュレーターランタイムの欠如、または証明書の状態に起因します。macOS ジョブは環境検証から開始させ、署名手順を分離することで、失敗がコンパイル時か認証時かを区別できるようにします。

Gradle メモリ問題 Android と Web タスクが同じジョブを共有する場合によく見られます。ジョブの重複を減らし、Android ビルドステージに集中させ、同じステップ内に無関係なシェルコマンドを埋め込まないでください。

Electron パッケージングの破損 通常、ネイティブモジュールの不一致や、パッケージング環境内のシステム依存関係の欠如が原因です。ビルドコンテナを固定し、パッケージング前にネイティブ依存関係のインストールを確認し、署名後に成果物を再構築しないでください。

素早い修正は、英雄的なデバッグに勝る

Capgo の公開エラーが発生した場合、最初に確認すべきは、バンドルバージョンとチャネルの状態が、パイプラインが送信すると考えているものと一致しているかどうかです。メタデータの不一致は、自動 live update フローにおける混乱の一般的な原因です。また、公開ステップはパイプラインの末尾近く、ビルドが最終アセットを生成した後に配置し、部分的な出力をアップロードしないようにしてください。

時間を節約する習慣がいくつかあります:

  • 早期に失敗させる: ネイティブパッケージングの前に、lint とユニットテストを実行します。
  • 安全な場合は並列化: 共有 web build の後は、iOS、Android、Electron のジョブが互いを待つ必要はありません。
  • 成果物を可視化: 出力を確認できなければ、リリースは信頼できません。
  • 各ジョブを最小限に: 1つのジョブは1つのことをうまくやるべきです。

ハイブリッドアプリのパイプラインが、手動署名、場当たり的なアップロード、そして文書化されていない手順を知る数人だけで成り立っているなら、build だけでなくプロセスを直すべき時です。 Capgo は Capacitor と Electron チームに、署名付き live update の自動化、チャネル経由のリリース配信、同じワークフロー内でのトレーサビリティ維持を可能にします。アクセスして、 Capgo build パイプラインを制御された OTA 配信につなぎ、次のリリースをはるかに壊れにくくしましょう。

Capacitor アプリ向けの Live Updates

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

最新のブログ記事

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