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

CI/CD 継続的インテグレーション

CI/CD 継続的インテグレーション。JavaScript モバイルアプリにおける CI/CD の仕組みを、パイプラインの基礎から Live Update まで解説します

CI/CD 継続的インテグレーション

金曜日の午後 4 時 47 分、ある開発者が 1 行の CSS 修正をプッシュしました。変更自体は無害に見えますが、パイプラインのチェックは赤く表示されています。チームは、壊れたモバイルビルドの原因を夜通し追跡するか、変更がまだ新鮮なうちに失敗を特定する自動化に頼るかのどちらかです。

それが、 CI/CD 継続的インテグレーション。開発者は頻繁に小さな変更をマージし、自動化されたパイプラインがすべての変更をビルド・テストし、検証済みの成果物が手作業に頼らずユーザーへ届けられます。CapacitorJS アプリでは、このモデルが JavaScript、ネイティブの iOS/Android プロジェクト、署名資格情報、ストアのワークフロー、デバイス動作を考慮する必要があります。

目次

CI/CD継続的インテグレーションが実際何を意味するか

継続的インテグレーション これは、開発者が共有 Git リポジトリで作業を定期的に統合することを意味します。各 push や pull request が自動検証を開始し、通常は依存関係のインストール、linting、ユニットテスト、ビルドが含まれます。目的はアプリケーションにバグがないことを証明することではありません。変更内容がまだ理解しやすいうちに、前提の崩れを見つけることです。

CapacitorJS プロジェクトでは、その検証はまず以下から始まるかもしれません npm ci、続いて Web テストと本番ビルドが実行されます。その後、パイプラインは以下を実行できます npx cap sync Web アセットとネイティブプラグインの変更を iOS および Android プロジェクトにコピーします。グリーンという結果は、単に 1 人の開発者のラップトップでたまたま動いたというだけではなく、リポジトリが整合性の取れた候補を生成したことを意味します。

継続的デリバリー は、プロセスを検証の範囲を超えて拡張します。パイプラインはバージョン付きの成果物を生成し、ステージングまたは本番環境へリリースできる状態に保ちます。最終リリースは、特にチームがコンプライアンスレビュー、ストアとの調整、管理されたローンチウィンドウを必要とする場合、引き続き人間が承認することがあります。

継続的デプロイメント は、その承認ステップをなくします。定義されたチェックを通過したすべての変更は自動的にリリースできます。このモデルが機能するのは、テスト、認証情報、ロールアウト制御、監視、ロールバック手順がミスを吸収できる十分な信頼性を備えている場合だけです。

モバイル開発は、同じデリバリー問題をさらに複雑にします。Webデプロイには1つのランタイムターゲットしかありませんが、Capacitorアプリでは、iOSアーカイブ、Android App Bundle、証明書、プロビジョニングプロファイル、ストアメタデータ、そして物理デバイス間の互換性チェックが必要です。このワークフローの背後にあるエンジニアリング的価値に関する有用な概要は、 Capgoによる継続的インテグレーションの利点に関するガイド.

実践的なルール: CIは悪い変更を素早く可視化し、CDは良い変更を再現可能にするべきです。

パイプラインはエンジニアリングの判断を置き換えるものではありません。繰り返し作業を人間の手から引き離し、何が起きたかを記録し、コミットからリリースまでの一貫したパスをチームに提供します。

すべてのCI/CDパイプラインの5つの構成要素

パイプラインは、単一のYAMLファイルではなく、責任のシーケンスとして扱うことで設計しやすくなります。各ブロックは異なる質問に答えます。

1. トリガー

トリガーはドアベルです。 git push はフィーチャーブランチで高速なチェックを開始でき、プルリクエストはマージゲートを実行できます。タグやリリースイベントはパッケージングを開始し、スケジュールはメンテナンスやより広範なデバイスチェックを実行できます。

リスクに基づいてトリガーを選択してください。プルリクエストはマージ前に迅速なフィードバックが必要です。 main へのプッシュはデプロイ可能な成果物をビルドする場合があります。リリースタグは意図的な出荷イベントを表すべきであり、誤ったブランチ更新ではありません。

2. ビルド

ビルドは、ソースのcodeを他のシステムが消費できる形に変換するキッチンです。CapacitorJS アプリケーションでは、通常、ロックファイルで定義された依存関係をインストールし、Web ビルドを実行し、 npx cap syncを実行し、プラットフォームのツールを呼び出します。

iOS レーンでは、macOS ランナーを通じて xcodebuild を呼び出す場合があります。Android レーンでは、Gradle を使用して .aab または .apkを作成します。クリーンなチェックアウトからビルドを再現できない場合、パイプラインは誰かのローカルマシンへの依存関係を隠蔽しています。

3. テスト

テストは衛生検査員のようなものです。ユニットテストは、分離された JavaScript または TypeScript の動作を検証します。統合テストは、ストレージ、ナビゲーション、API クライアントなどの境界を確認します。デバイスまたはエミュレータのチェックは、ブラウザのテストでは完全に再現できないネイティブプラグイン、権限、ディープリンク、ライフサイクルの動作を実行します。

テスト影響度分析により、この段階を実用的に保つことができます。2021 年の実証研究では、日常的なコミットは通常、 3 から 28 ファイルしか変更しませんが、依存関係は依然として約 テストケースの50%以上。調査では、 20%の時間削減 が最も効果が低かったシステムで、約 50%の中央値削減 が影響を受けるテストを選択した際に確認され、 継続的テスト調査.

4. パッケージング

パッケージングは配送コンテナです。パイプラインはバージョンを割り当て、メタデータを収集、成果物に署名し、結果を保存します。iOSではIPAを、AndroidではPlay Console向けにAABを生成するのが一般的です。

5. デプロイ

デプロイは配送トラックです。iOSビルドをTestFlightにアップロードしたり、AndroidバンドルをPlayの内部トラックに送信したり、Webバンドルを管理されたLive Updateチャネルに公開したりできます。パッケージが信頼でき、デストネーションが明確な場合のみ、デプロイ自動化が有効です。 Capacitorプロジェクト向けのデプロイ自動化ガイド これらのステップを接続するための有用な参照を提供します。

ソース、ビルド、テスト、デプロイ、モニタリングを含むCI/CDパイプラインの5つの必須構成要素を示す図。

ブロックを1つ取り除くと、周囲のプロセスが弱まります。トリガーがなければ、変更は手動操作を待つことになります。テストがなければ、自動化はリグレッションをより速く提供してしまいます。パッケージングがなければ、プロモーションするための管理された成果物がありません。デプロイ制御がなければ、ビルドが成功しても、脆弱な手順を人が繰り返すことに依存することになります。

Continuous DeliveryとContinuous Deploymentの違い

違いは承認境界が1つあるかどうかですが、その境界は組織のリスクプロファイルを変えます。

を使用すると、 Continuous Deliveryでは、パイプラインがビルド、テスト、パッケージングを行い、リリースを準備します。人が本番環境での操作を承認します。規制の厳しいFinTechチームは、承認されたコミットをすべて自動的にステージングに送信し、その後、リリースマネージャーがApp StoreまたはPlay Storeへの提出を承認することを要求するかもしれません。

を使用すると、 Continuous Deploymentでは、パイプラインはポリシーを通過した後、最終的なリリースを自動的に実行します。強力な自動チェックを持つコンシューマーアプリは、合格したJavaScriptバンドルをまず限られたオーディエンスにリリースし、ヘルスシグナルが許容範囲内である場合、ロールアウトを拡大するかもしれません。

比較項目 Continuous Delivery(継続的デリバリー) Continuous Deployment(継続的デプロイ)
リリース判断 本番環境への適用前に人間の承認を維持 ポリシーに基づき自動化がリリースを判断
スピード 迅速で、明確な制御ポイントを持つ すべての前提条件が自動化された場合が最速
監査可能性 承認により明確なレビュー記録が得られる ログはポリシーの結果とリリース操作を記録する必要がある
影響範囲 レビュアーが疑わしいリリースを停止できます 段階的ロールアウトとロールバックの制御がより重要になります
最適 コンプライアンスが重要、またはリスクの高いモバイルリリース 強力なテスト、オブザーバビリティ、復旧手順を備えたチーム

コンプライアンス部門がネイティブストアへのすべてのリリースに承認を要求する CapacitorJS チームは、通常 delivery を好みます。パイプラインは IPA と AAB を生成し、適切なレビュー先へ送信して承認を待つことができます。組織のポリシーが許可する場合、承認済みの JavaScript および CSS の変更は、別の Live Update プロセスに従うことができます。

カジュアルゲームチームは、低リスクの Web レイヤー変更には deployment を、ネイティブリリースには delivery を選択する場合があります。すべての成果物に一つのポリシーを強制するよりも、この分割の方が現実的であることが多いです。

重要なトレードオフはスピードではありません。 Delivery は明示的な人間の責任を重視します。一方、 Deployment は、テスト済みのシステムが一貫した判断を下す能力を重視します。どちらのモデルも自動的に安全とは限りません。手動のクリックはテストが見逃す文脈を捕捉できますが、文書化されていないボトルネックになることもあります。自動 deployment は遅延を減らせますが、チームが不良リリースを特定し、即興対応なしに以前のバージョンに復元できる場合に限ります。

CapacitorJS モバイルアプリのための本格的な CI/CD パイプライン

実用的な GitHub Actions ワークフローにより、リポジトリのデリバリーマップを可視化できます。アクションのバージョンや署名設定は環境によって異なりますが、シーケンスは理解しやすいものにするべきです。

クリーンなリポジトリから始める

へのプッシュ main でワークフローをトリガーできます。最初のジョブはコミットをチェックアウトし、必要な Node.js バージョンを選択します。 npm ci lockfileに宣言されている内容を正確にインストールするため、ランナーが別の依存関係ツリーを解決するのを防ぎます。

その後、Webバリデーションステージで以下のようなコマンドを実行できます:

  • Lint: プロジェクトのESLintコマンドを実行し、マージをブロックすべき違反があれば失敗させます。
  • ユニットテスト: Jestを非対話モードで実行し、結果を収集して有用なログを保持します。
  • Webビルド: Capacitor がパッケージ化するプロダクション用のbundleを作成します。
  • Capacitor の同期: 実行 npx cap sync これにより、nativeプロジェクトにWebアセットやプラグインの変更が反映されます。
  • 設定の検証: Capacitor の設定に、期待されるアプリ識別子、プラットフォーム設定、環境値が含まれていることを確認します。

ワークフローファイルはオーケストレーションを制御し、 package.json がプロジェクトのコマンドを制御します。Capacitor の設定は同期動作を制御します。これらの責務を分離することで、障害の診断が容易になります。 Capgo の継続的インテグレーションセットアップガイド では、統合パターンについてより詳しく説明しています。

ネイティブターゲットを独立してビルドする

iOS は Xcode がツールチェーンの一部であるため、macOS ランナーが必要です。このジョブは依存関係を復元し、証明書とプロビジョニングプロファイルをインストールまたは取得し、 xcodebuild または Fastlane。以下のような設定で fastlane match は、署名素材とビルドプロセスの関係を管理できますが、リポジトリに秘密証明書やプロファイルを保存してはいけません。

Android は Linux または macOS のランナーで実行できます。ジョブは Gradle を呼び出し、通常は ./gradlew bundleReleaseなどのコマンドを通じて、暗号化された CI シークレットで参照される keystore を用いて生成された AAB に署名します。

CapacitorJS モバイルアプリの CI/CD パイプラインにおける、開発からデプロイまでの手順を示す包括的なフローチャート。

アーティファクトを意図的に保存する

ワークフローでは、IPAとAABをコミットまたはリリース識別子に紐付けた名前付きアーティファクトとしてアップロードすべきです。後続のジョブは、そのファイルをそのままTestFlightやPlay Consoleの内部トラックに提出できます。承認後の再ビルドでは、レビュアーがテストしたものとは異なるアーティファクトが生成され得るため、この分離が重要です。

マトリックス戦略を使えば、iOSとAndroidのレーンを並行実行できます。これにより、プラットフォーム固有の失敗を混ぜることなく待ち時間を短縮できます。最終ステータスも明確になります。Webビルドが成功しAndroidの署名が失敗した場合、ワークフローは一つの不透明な結果を返すのではなく、その違いを示すべきです。

シークレットはCIプロバイダーの暗号化されたシークレットストアに置くべきです。ジョブには必要な認証情報だけを、実用上最短の期間だけ渡します。特にビルド失敗時にコマンドラインツールが設定を出力する場合があるため、ログにシークレットが誤って出力されていないか確認する必要があります。

Capgo を使って CI/CD フローに Live Updates を追加する

金曜日の午後、デザイナーがonboardingのコピーを変更します。変更対象はJavaScriptとCSSで、ネイティブのSwiftやKotlin、Capacitor プラグインには触れません。開発者はそれをコミットしてプルリクエストを作成し、通常のチェックでweb bundleを検証させます。

完了後、 npm ci、webビルド、テスト、および npx cap sync リリースジョブが成功すると、生成されたWebアセットを選択した Capgo チャンネルに公開できます。チャンネルはstaging、production、ベータ版のユーザー、その他の管理されたグループを表します。ユーザーは新しいストアバイナリを待たずに、アプリのアップデートの仕組みを通じてbundleを受け取ります。

スクリーンショット: https://capgo.app/docs/img/dashboard.webp

重要な境界はネイティブ code です。JavaScript、CSS、文言、互換性のある設定の変更はlive-update経由で行えます。一方、ネイティブプラグイン、権限、entitlements、プラットフォーム code の変更には、引き続き新しいiOSまたはAndroidバイナリと該当するストアの手続きが必要です。

チャンネルをリリース制御として扱う

stagingチャンネルを使えば、本番へ昇格する前に、限定したユーザー層でbundleを検証できます。バージョンピン留めを使えば、新しいネイティブバイナリが別のリリース経路を使う間も、既知のアプリバージョンを互換性のあるbundleに固定できます。この分離により、ネイティブランタイムが理解できないWeb code を送ってしまうのを防げます。

ロールバックは、開発者が以前のビルドを手動で再構築しなくても、正常動作が確認済みのbundleを復元できるべきです。公開、バージョン履歴、オーディエンスのターゲティング、配信ステータスを同じリリースプロセスにつなげることに運用上の価値があります。

公開は検証後に行う

Capgo CLI ステップは、通常の Web ビルドとチェックの後に配置します。認証には CI シークレットまたは保護された環境変数を使用し、本番環境への公開は、意図的なリリースを表すブランチ、タグ、または承認ポリシーに限定してください。

この Capgo GitHub Actions 連携ガイド この公開ステップが自動化されたワークフローにどのように組み込まれるかを示しています。プロバイダーを問わず、より広い原則が適用されます: 一度だけビルドし、その成果物を検証し、名前付き環境に公開し、ユーザーが正確に何を受け取ったかを特定するのに十分なメタデータを保持します。

チームにとって、これは2つの連携したレーンを作成します。ストアレーンはネイティブ機能を配布し、ライブアップデートレーンは承認済みの Web レイヤーの変更を配布します。これらのレーンを区別することで、すべての Capacitor 変更を完全なストアリリースまたは管理されないショートカットとして扱うという一般的なミスを防げます。

今日の CI/CD パイプラインにおけるセキュリティと AI

パイプラインの速度は、脆弱なリリース管理を補うものではありません。モバイルワークフローは、署名資格情報、サードパーティ依存関係、ネイティブビルドツール、およびユーザーのデバイスに到達しうる code を処理します。セキュリティは、リンティングやテストと同じ自動化パスの中に属します。

有用なコントロールには、 npm audit や Snyk による依存関係チェック、gitleaks によるシークレット検出、SBOM 生成、署名済みネイティブ成果物、制限付き CI 権限、保護された本番環境などが含まれます。Live Update バンドルも署名検証とチャネル制御が必要であり、有効なアプリケーションが改ざんや非互換コンテンツを拒否できるようにします。

2026 年の GitHub Actions に関する調査では、推奨される 5 つのセキュリティ対策の実装率は平均してわずか 約 34 万の公開リポジトリ全体で 17.5% にとどまりました。一方、 102 人の開発者 への調査では、認知度の低さと運用負荷の懸念が主要な障壁であることが判明しました(CircleCI のセキュリティ調査結果に基づく)。このギャップは、チームが別のセキュリティ製品よりも、よりシンプルな導入計画を必要としていることを示唆しています。

有用な AI とパイプラインの飾り付けを区別する

AI は、失敗ログの要約、繰り返し発生する不安定テストのグループ化、リリースノート作成、設定ミスの提案などに役立ちます。これらの用途は人間が意思決定の責任を負い、出力を検証しやすくします。

自己修復パイプラインに関する主張には、より慎重な姿勢が必要です。2026 年の業界調査では、 73% の組織がパイプラインで AI を使用していませんでした。一方、 60% 非ユーザーの多くが、明確な価値やユースケースの欠如を理由に挙げています 36% 生成結果への不信感を理由に挙げており、 33% プライバシーへの懸念を挙げています。これは TeamCityの調査レポート.

実践 推定導入率 成熟度
推奨されるGitHubアクション:セキュリティ対策 平均17.5% 認知度と運用のギャップ
CI/CDパイプラインにおけるAI 導入率27%、73%が使っていないと回答したことに基づく 選択的な実験
非ユーザーにおけるAIの価値の不明確さ 60%がユースケースや価値の不明確さを指摘 評価における課題
生成結果への信頼 36%が信頼の欠如を指摘 人間によるレビューは依然として重要

この数値を理由に基本的な安全策を先送りすべきではありません。まずはシークレット保護、依存関係の可視化、署名、最小権限アクセスから始めましょう。未検証のモデル出力に本番リリースの承認を許さず、調査の手間を減らせる箇所にAIを追加してください。 Capacitor アプリ向けパイプラインセキュリティガイド モバイル特有のリスクに合わせて、これらのコントロールを組み立てるのに役立ちます。

CI/CD セットアップの成熟度チェックリスト

成熟したパイプラインとは、ジョブの数が多いことではありません。各リリースの境界で、チームに信頼できるエビデンスを提供できるパイプラインのことです。

YAMLではなくワークフローを確認

運用しているシステムを評価するためのチェックポイントです。

  1. トリガー設定: すべてのプルリクエストと関連するプッシュで、期待されるワークフローが開始されます。シグナルはドキュメント化された意図ではなく、コミットに紐付いた可視的な実行です。
  2. 自動テストによるマージゲート: マージ前にLintとユニットテストがパスする必要があります。GitHubでは、ジョブが失敗した場合にマージを防止するために、必須のステータスチェックを設定すべきです。
  3. 署名済みアーティファクトの保存: ワークフローは署名済みのIPAとAABファイルを作成し、識別可能なビルドメタデータとともに保存します。後日のリリースでは、記憶から再ビルドするのではなく、保存されたアーティファクトを使用すべきです。
  4. 環境の分離: ステージングと本番環境は、異なる認証情報、チャネル、承認ルールを使用します。ステージングのデプロイが誤って本番環境に公開されるべきではありません。
  5. 自動デプロイパス: パイプラインは、人間がマシン間でファイルをコピーすることなく、承認された成果物を意図した先に送信できます。
  6. ロールバック対応: チームは、文書化されたアクションを通じて以前のネイティブまたはWebレイヤーのバージョンを復元できます。あるエンジニアのメモにしか存在しないロールバック手順は、運用準備ができていません。
  7. モニタリングとアラート: チームは、パイプラインの所要時間、失敗した実行、デプロイの結果、アプリケーションの健全性を追跡します。ジョブが成功しても、ユーザーが更新を受信し、許容したことを証明するものではありません。

CI/CDセットアップのための7ステップの成熟度チェックリスト。ソフトウェア開発と自動化のベストプラクティスを詳述しています。

まず最も痛いギャップを埋める

チェックリストを1年間のプラットフォームプロジェクトに変えないでください。最も頻繁な痛みの原因となる欠落機能を特定し、1スプリント以内に修正し、チェックリストを再実行してください。

開発者が手動ビルドを待っているなら、ビルドを自動化してください。テストが遅すぎてマージが壊れるなら、チェックを必須にしてください。不良なJavaScriptリリースがストアへの提出を強制するなら、製品とコンプライアンスポリシーが許可する範囲で、Live Updateパスを文書化し保護してください。どの成果物がユーザーに届いたか誰も知らないなら、ステージを追加する前にバージョン管理と配信記録を改善してください。

シニアエンジニアのルール: 別のエンジニアがインシデント中に安全に操作できる場合、パイプラインは成熟しています。

この標準は弱点を素早く露呈させます。チームが何を検証したか、成果物がどこに配置されたか、ユーザーがどのように受け取ったか、リリースに問題が生じた場合どのように復旧できるかを知っている場合のみ、緑のチェックマークは意味を持ちます。


Capgo は、CapacitorJS の CI/CD ワークフローを制御された Live Update 配信に接続します。署名付き Web バンドル、チャネル、バージョン履歴、および対象となる JavaScript およびアセット変更へのロールバック対応を提供します。詳細はこちら Capgo 既存の GitHub Actions、ストア、リリースプロセスとどのように組み合わせられるかをご覧ください。

Capacitor アプリ向けの Live Updates

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

最新のブログ記事

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