メインコンテンツにジャンプ

ビルドの種類を解説:ローカルからプロダクションまで

Martin Donadieu

プロジェクトを開いてみると、

、そしていくつかのシェルスクリプトを触りたくない。すると誰かが言う «このクライアントのステージングビルドを今日中に作ってくれ» と言うのであれば、ミドルレベルのモバイル開発者にとっては、よくわからない要求だ。どの設定を使用するか?どの署名IDを使用するか?どのバックエンドを使用するか?どの配布パスを使用するか? build:ios:dev, build:android:qa, build:staging, build:release, build:prod, plus a few shell scripts nobody wants to touch. Then someone says, “Can you make a staging build for the client by end of day?” If you’re a mid-level mobile developer, that request often feels annoyingly vague. Which config? Which signing identity? Which backend? Which distribution path?

その混乱は、ビルドのタイプを平坦なリストとして扱うことから生じることが多い。そうではない。ワークフローである。

ビルドは単にコンパイルされたアプリではない。目的、対象者、環境に合わせてアプリを組み立てたバージョンである。デバッグを助けるビルドもある。QAが安全に壊すことができるビルドもある。リリースエンジニアが信頼できるアーティファクトを生成できるビルドもある。製品チームがリスクが少ない変更を配信できるビルドもある。

あなたのローカル環境がまだ不安定な感じがする場合は、まず適切なローカル環境設定をしてみてください。 Capacitor目次

ソフトウェアビルドの世界を解放する

ソフトウェアビルドの世界を紡ぎます。

最もよく見る間違いは、ビルド名が全ての物語を語ることを想定していることです。そうではありません。 staging 「リリースの味方」、「ステージングのAPI」、「デバッグ可能なQAアーティファクト」、「モックされた決済」、「プロダクション署名のビルド」、「プライベートに配布されたビルド」など、異なるリポジトリで異なる意味を持ちます。

そのため、チームは混乱してしまいます。ラベルは、ビルドが何を実行しているかを理解している場合にのみ有用です。

ビルドの種類について考える有効な方法は次のとおりです。

  • ローカルビルド 個人の開発者が迅速に動くのに役立ちます。
  • CIビルド チームの共有ソースとなるものを生成します。
  • デバッグとリリースのフラビア アプリのコンパイルとインストルメントの方法を定義します。
  • 配布用ビルド アプリを受け取る人とその方法を定義します。
  • 署名されたビルド プラットフォームがアーティファクトを信頼するかどうかを決定します。
  • チャネルベースのアップデート インストール後に変更がどのように動作するかを決定します。

それらは競合するカテゴリではありません。彼らは重ねて配置されます。

「ステージングビルド」というのはほとんどの場合、フラビア、環境、署名、配布の選択の組み合わせです。

したがって、2つのチームが「ベータビルドが必要」ということを言っても、まったく異なるアーティファクトを指すことがあります。

これは、モバイルでは特に重要です。各ステップごとに摩擦が生じます。ネイティブコンパイル、シークレット、プロビジョニング、アプリストアのトラッキング、テスターへのアクセス、環境設定、ロールバックなど、すべての要素が一致しないと、リリースプロセスはtribal knowledgeになります。すると、1人のエンジニアが休暇を取ってしまい、誰もきれいにリリースできないようになります。

このチームは、スクリプトを覚えるのではなく、ビルドタイプを品質ゲートとして定義します。各ゲートは、異なるリスクを下げます: ブロックされたcode、誤った構成、不正の署名、不正のロールアウト、または不正の復旧。

ビルドのスペクトル:ローカルビルドとCIビルド

ローカルビルドとCIビルドを混同することは、多くのビルドの痛みの始まりです。誰かが「私のマシンでは動作する」と証明した後、ブランチがCIで失敗することがあります。ローカル環境は、キャッシュされた依存関係、手動で編集されたファイル、署名アセットが自動化に含まれない場合に、暗黙的に依存関係を持つからです。

ローカルビルドとCI開発の違いを研究している男性が、モダンなオフィスでワークする姿。

ローカルビルド

ローカルビルドはプライベート、高速、廃棄可能です。即時の質問に答えるために使用します。

画面がレンダリングできるか?ネイティブプラグインが初期化できるか?GradleまたはXcodeの変更がコンパイルを破壊したか?ログを増やして再現できるか?

良いローカルビルドは、スピードを優先します。チェックは緩く、ログは詳細、開発者が操作できるスイッチ、そして一時的なインストルメンテーションを含みます。それは、迅速なフィードバックを提供することです。

ローカルビルドを、より重要なものに昇格させることは機能しません。ローカルビルドは、コンパイルが成功した1台のラップトップでしかありません。

CIビルド

ローカルビルドはプライベート、高速、廃棄可能です。即時の質問に答えるために使用します。

CI ビルドは、より速い理由がある。 それらは、個人のマシン状態を方程式から除去し、ビルドプロセスを繰り返し実行できるようにします。

CI が健康である場合、3 つのことをよく行います:

  • ゼロからビルドします: プロジェクトがコンパイルできることを証明し、隠れたローカル仮定を排除します。
  • チームレベルのチェックを実行します: ユニットテスト、linting、パッケージングルールは、毎回同じ場所で実行されます。
  • トレース可能なアーティファクトを生成します: チームは、ビルドをコミット、ブランチ、パイプライン実行と関連付けることができます。

そのため、ワークショップとファクトリーのアナロジーが好きです。 ご自身のラップトップは、イテレーションを行うベンチです。 CI は、プロセスが実際に機能していることを証明する組み立てラインです。

チームがまだ、どのスクリプトがどこで実行されるかを手動で決定している場合、ロジックを自動化に集中させてください。 実用的な参考は、__CAPGO_KEEP_0__ Actions を使用した開発とプロダクションビルドの管理に関するこのガイドです。 managing dev and prod builds with GitHub Actions.

__CAPGO_KEEP_0__ QA、製品、またはサポートがアーティファクトを必要とする場合、それはCIからではなく、開発者のマシンから来るべきです。

それを認識した後、ビルドライフサイクルの残りの部分が簡単になります。フラビアの選択、署名、環境のインジェクション、配布は、チームの誰もが検査できるPipelineに属するべきです。

Core Build Flavors Debug vs Release

ビルドには多くのラベルが使用されますが、そのラベルの下にある2つのフラビアが最も重要です。 debug そして release.

開発者とエンドユーザーは異なるものを必要とします。

デバッグビルド

デバッグビルドは、人間が動作を調べるのに役立ちます。通常、より多くのメタデータを保持し、トラブルシューティングを容易にし、問題を隠すことができる厳しい最適化を避けます。

建設規格の有用なアナロジーがあります。規格は一般的に

Debug builds 構築方法の種類, パフォーマンス, 独自の, そして 基準 種類、そしてデバッグビルドは、次のように簡単にマッピングされる。 構築方法の種類 アプローチ パフォーマンス アプローチ 結果.

この構築仕様の種類の分解の概要に記載されているように

  • 診断情報の可読性: エラーメッセージ、コンソール出力、シンボルがエラーの原因を特定するのに役立つ。
  • 開発者用の機能: モックのスイッチ、テストメニュー、機能スイッチがエンドユーザーにとって不適切なものです。
  • 低抵抗の開発: インストールと実行のサイクルが速くなれば、パッケージの美観よりも優先される。

デバッグ用ビルドは「悪い」ものではありません。目的を果たすためのものです。

リリース用ビルド

リリース用ビルドは、実際のデバイスに配布されるものです。そのため、優先事項は即座に変わります。

ここで、パッケージの完全性、起動時の動作、セキュリティポジションの厳密さ、小さいパッケージサイズ、予測可能な実行特性が重要になります。また、不正なアクセスや不正利用のための不必要なエントリポイントも減らしたいです。

取引のトレードオフは単純です。デバッグ用ビルドを簡単に検査できるものは、リリース用ビルドが実際の環境で適切ではないことを意味します。

ここでは、チームと一緒に使用する境界線を示します:

種類 適している 最適化する
デバッグ 開発、ローカルテスト、問題の再現 可視性と反復速度
リリース ベータ配布、ストアの提出、生産のロールアウト 安定性、パフォーマンス、信頼性

なぜチームがこれを間違うのか

混同されるのは「環境」と「種類」です。

ビルドは リリースの種類は、ステージングサービスの指向。それは、QAの一般的なことです。非生産的なデータで生産的な動作を実現したいからです。ビルドはまた デバッグの種類は、開発サービスの指向 。それは、日常の開発のためにデバッグの種類です。

それは、チームがパッケージ名にすべての可能な組み合わせをエンコードするのではなく、ドキュメントを記述するのを避けることによって、スクリプトのスプレッドが多くなることが多いです。

リリースの種類のビルドを、非開発者がユーザーフェイスの動作をテストするときに、出荷します。デバッグの種類は、エンジニアリングの作業と、意図的なトラブルシューティングのために、保管します。

その1つのルールは、多くの無意識の複雑さを排除します。

ビルドの種類をマッピングする

ビルドの種類についての多くの議論は、早すぎます。ローカル、デバッグ、リリースを説明し、より難しい質問を無視します:ビルドが行く場所は何ですか。

その目的地は、ビルドが含めるべきもの、署名するべき方法、受け取るべき人と、変わります。

A practical build workflow usually moves through several environments, each with a different audience and tolerance for risk. If you’re working on Capacitor apps, it also helps to keep a clean mental separation between Capacitor、多くの「ビルドのバグ」は実際には環境マッピングミスであるため、

Nightlyとcanary

これらは、エンジニア、QA、または小規模な内部グループが粗いエッジを許容することを望む場合にのみ使用することを目的とした、早期警告ビルドです。

Nightlyビルドは通常、定期的なスケジュールまたは最新のメインブランチの状態から生成されます。Canaryビルドは、より広範なロールアウト前に、狭いアウディエンスに意図的に公開されます。私はこれらを安定性の約束ではなく、学習ツールとして扱います。

これらは、次のような質問に答えるために役立ちます。

  • モジュール間でブランチが綺麗に統合されるかどうか
  • 特定のデバイスファミリーのネイティブ依存性のアップグレードが、特定のデバイスファミリーを破壊するかどうか
  • 内部テスターが、より広範なベータ公開前に、リグレッションを発見できるかどうか

内部テスターが、より広範なベータ公開前に、リグレッションを発見できるかどうか

Canaryビルドを、正常な振る舞いを期待する人に与えることは、失敗します。ノイズフィードバックが発生し、正常な振る舞いをリリース問題として呼ぶのは間違った人たちです。

ステージングとベータ

この時点で、製品の品質がエンジニアリングの便利さよりも重要になります。

視聴者はここで変化します:

  • QAはバグの再発生、ワークフロー、受容基準を検証します。
  • 製品マネージャーは、現実的なシェル内で動作を確認します。
  • 外部テスターは、ユーザビリティ、デバイスカバー、エッジケースを検証します。
  • サポートまたは成功チームは、近日公開予定の変更をプレビューします。

ここでの間違いは、「ベータ版は ‘デバッグ用の別のビルド’ である」という考え方です。テスターが実際のユーザーフローを評価している場合、リリースに似た条件が必要です。

プライベート配布ビルド

あるアプリには、全くパブリックストアのユーザーに届かないビルドが必要な場合、またはより狭いグループに先に届く必要がある場合があります。

これには、クライアント固有のビルド、内部従業員用アプリ、規制されたワークフロー、フィールドオペレーションツール、企業専用の配布が含まれます。これらは、インストールできるアプリとバックエンドにアクセスできるユーザーを制御する必要があるため、厳格な制御が必要です。

ここでは、名前付けが危険です。チームは「企業ビルド」と言っている場合、実際には何らかの異なることを意味しています。

  • プライベート署名の内部アプリ
  • ストアで配布されたアプリに内部のみアクセス制御を設定したもの
  • 顧客固有のブランドアーティファクト
  • ステークホルダーへのレビュー用のプレリリース候補

それらは異なる運用モデルです。パイプラインと名前付けでそれらを分離してください。

リリース

リリースビルドは、ユーザーに公開されているコミットメントです。アプリストア、プレイストア、またはユーザーに承認されたチャネルに配信されます。

この時点でビルドは面白くないはずです。それは褒め言葉です。

プロダクションビルドには、再現性、正しい署名、リリース条件でのテスト、ロールバック計画への紐付けが必要です。最後の手段の手動編集、機械固有のハック、または「次のビルドで修正する」という妥協は避けます。

ここに簡単な概要があります。

ソフトウェアビルドの種類とその特徴

ビルドの種類 対象 コンテキスト: Enterprise製品/価格設定ページ。役割: UIラベル。メッセージキー `enterprise_audience_label` (Enterpriseアウディエンスラベル)。 Distribution Method
ローカル開発者 個人開発者 通常、デバッグ、高速反復、ローカル環境設定 ローカルマシンから直接インストール
CI検証 エンジニアリングチーム 繰り返し自動ビルド、共有チェック CIアーティファクトストレージ
毎晩またはカナリア 内部テスター、選択されたチームメンバー 早期統合状態、限定的なロールアウト 内部配布ツール
ステージングまたはベータ QA、製品、外部テスター 通常、非公開環境マッピング TestFlight、プレイテストトラック、プライベートリンク
アドホックまたはエンタープライズ 内部従業員、クライアント、制限グループ 制御された設定、目的地固有の署名 プライベート配布チャネル
本番 一般ユーザー 最終リリース設定、ストア用署名 App Store または Google Play

リスク耐容度に合ったビルドの種類は、正解です。多くのリリースミスは、チームがその一致をスキップしたときに発生します。

Codeの重要性

モバイルでは、ビルドファイル単体では何も意味しません。プラットフォームは、信頼できるソースから来て、作成後誰もが変更していないことを証明する必要があります。その証明は codeの署名.

ビルドが完全にコンパイルできたものの、インストール、アップロード、または起動が正しく行われなかったことがありましたか? その場合は、署名が原因でしたかもしれません。

コンピュータ画面に表示されるPythonソースコード code とBlenderの Code署名オーバーレイテキストが表示されている。

署名が実際に証明すること

モバイルチームにとって、code署名は3つの役割を果たします。

  • 正当性: アプリを開発した開発者または組織とアプリを紐付けます。
  • 完全性: 署名は、ビルドが署名された後も改ざんされていないことを証明するのに役立ちます。
  • 認証: 特にAppleプラットフォームでは、署名はアプリが実行できる場所と方法を制御することもあります。

第三の点が多くの開発者を混乱させるのは、署名は単にアイデンティティだけではないことです。署名は許可も含まれます。

したがって、同じアプリcodeは、ローカルで実行したい場合、テスターに配布したい場合、内部に配布したい場合、またはストアに提出したい場合に異なる署名資材を必要とする可能性があります。

署名が目的地によってどのように変化するか

この考え方がプロセスを常に管理するには: 署名は配布に従う.

ローカル開発者インストールでは、1つのセットのアイデンティティと許可が使用されます。テストフライトを通じて送信されたベータビルドでは別のものが使用されます。内部配布パスでは別のプロファイルが必要になることもあります。パブリックストアのリリースには独自の署名の期待値とレビュー互換のパッケージングが必要になります。

したがって、「ビルドを再署名するだけ」はほとんどの場合、小さな要求ではありません。署名が変更されると、許可された目的地が変更される可能性があります。

規則正しいセットアップでは通常、CIで署名資産を保存します。

  • 署名資産はCIで保存されることが多いです。 個人のノートパソコンではありません。
  • 対象を明確に区切る: 開発、プライベートテスト、企業、ストアリリース。
  • ローテーションとアクセス制御: 特に、契約者や複数の製品チームがインフラを共有する場合に。
  • 監査可能性: チームがWebアップデートを__CAPGO_KEEP_0__アプリ内に配信する場合、署名の2層を考慮する必要があります。この__CAPGO_KEEP_0__アップデータ__CAPGO_KEEP_1__署名のエンドツーエンドセキュリティの概要は、ネイティブバイナリの信頼性とアップデートパッケージの信頼性を分離するため、役立ちます。

If your team ships web updates inside a Capacitor app, there’s a second signing layer to think about as well. This overview of end-to-end security for Capacitor updater code signing Clear separation by target:

development, private testing, enterprise, store release.

Rotation and access controls:

CI/CDとアップデートチャンネルを使用したリリースのオーケストレーション

チームが成熟するまでの時点で、ビルドの種類を知るという課題はありません。人間の推測なしでそれらを調整することです。

CI/CDで調整するのはその責任です。

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

パイプラインはビルド契約です。

信頼できるパイプラインは、毎回同じ質問に答えるべきです。

  • このビルドは何のために作られたか
  • どのバージョンを使用しているか
  • どの環境値を受け取っているか
  • どのテストを通過する必要があるか
  • どの署名情報が適用されるか
  • アーティファクトはどこに配布されるか

構造は、良い技術仕様の鏡です。 良く構成された仕様には、目的と範囲、機能要件、設計要件、技術基準、テスト要件、納品要件、サポートまたはメンテナンス要件が含まれます。、この技術仕様ガイドで説明されているように。 。同じ規範感覚はCI/CDを論理的に考えることを容易にし、パイプラインがスクリプトの袋から実行可能なリリースポリシーに変わります。実際には、パイプラインが決定するべきであり、エンジニアが手動で実行するのではなく、ブランチの規則、タグ、承認ステップ、署名コンテキスト、デプロイターゲットがすべてエンコードされるべきです。

実行可能なもの:

ブランチ駆動の意図:

  • main、リリースブランチ、タグは異なるワークフローをトリガーします。 明示的なアーティファクト名付け:
  • フラバー、環境、ターゲットは出力に表示されます。 昇格代わりに再構築する必要がなくなります:
  • Promotion instead of rebuild-by-hand: アーティファクトを検証し、再作成せずに進めるのではなく、

「一つの柔軟なスクリプト」アプローチが失敗するのは、常にカスタムフラグをパスし、ストアやテスターが必要とするものと一致することを期待するからです。

チャンネルはバイナリが配信された後、制御を追加します。

ネイティブビルドはまだ粗粒度です。リリースがストアに配置された後、Capacitor アプリ内でウェブコンテンツを変更する必要がある場合、常に新しいバイナリを生成する必要はありません。

アップデートチャンネルが役立ちます。インストール済みのプロダクションバイナリ内で、特定のユーザーにターゲットを設定して、ウェブアセットの更新を実行できます。Capacitor チームの場合、オプションの 1 つは Capgo、ターゲットされたチャンネルに署名されたウェブバンドルを公開することで、JavaScript、CSS、コピー、構成、資産の変更を推し、ネイティブシェルを毎回再構築する必要がなくなる。

実用的パターンは次のようになります。

  • CI/CDでバイナリビルド: ネイティブアプリを作成、署名、配信します。
  • チャンネル割り当て: ユーザーや環境をベータ、ステージング、プロダクション、またはカスタマースペシフィックストリームにマップします。
  • Selective rollout: 一部のユーザーに先にWebの変更を送信して、より広範な公開を待たずに。
  • Rollback path: 悪いアップデートを待たずに、またはアップデートを元に戻すことができる。

Capgoでアップデートチャンネルを作成して削除する方法については、まだ設定していない場合はこのチュートリアルを参照してください。 creating and deleting update channels in Capacitor Capgoでアップデートチャンネルを作成して削除する方法については、まだ設定していない場合はこのチュートリアルを参照してください。

Capgoでアップデートチャンネルを作成して削除する方法については、まだ設定していない場合はこのチュートリアルを参照してください。

この動画は、チャンネルが実際に動作する場合に役立ちます。

モバイルチームにとって、ビルドタイプは単なるアーティファクトではありません。制御ポイントです。CI/CDはバイナリの生成を制御し、チャンネルはインストール後に変更を公開する方法を制御します。

現代のビルドワークフローのベストプラクティス

ビルドシステムは、開発者がリリースの動作を自由に変更できるようにしない方がよい。そうしないと、混乱が生じます。

  • 分離軸を明確に: フラバー、環境、署名対象、配布対象を一つの曖昧なラベルに混ぜないでください。
  • CIがチーム向けのアーティファクトを生成するようにしましょう: ローカルビルドは開発用であり、株主の信頼を得るためのものではありません。
  • リリースのような条件でテストすることを早めましょう: QAとベータテスターは、実際のアプリとできる限り近い動作を確認する必要があります。
  • 署名アセットをラップトップから外すようにしましょう: シークレットは制御されたインフラストラクチャに狭いアクセスを持つようにしましょう。
  • アーティファクトの名前を人間が読めるようにしましょう: 誰かがファイルの目的を数秒以内に理解できない場合、名前付けは悪いです。
  • プロモーションを好み、再作成を避けましょう: アーティファクトが検証されたら、ワークフローを進めるのではなく、手動で再構築するのではなく、移動しましょう。
  • リリース前の設計のロールバック: ストアのロールバックは遅く、運用上重い。Web層のロールバックは、Capacitor の更新が速くなる可能性がありますが、チャンネルとポリシーを事前に計画する必要があります。

主な心の変化は、この質問を「どのビルドスクリプトを実行するか?」ではなく、「この段階でどのようなリスクを管理しているか?」と尋ねることです。この質問は、より良いビルドシステムを生み出します。

ワークフローがその質問に明確に答えれば、リリースプロセスは操作が容易になり、監査が容易になり、1人のシニアエンジニアが正しい呪文を思い出す必要がなくなるでしょう。


チームが Capacitor アプリをリリースし、リリースワークフローの制御をより強くしたい場合、 Capgo is worth evaluating as part of that stack. It handles targeted live updates for web assets inside Capacitor apps, supports signed bundles, channel-based rollouts, and rollback controls, which makes it useful when you need faster fixes without replacing your native build pipeline.

ウェブ層のバグが生じた場合、Capacitorを通して修正を配信し、App Storeの承認待ちの日数を待たずにユーザーにバックグラウンドで更新を提供する。

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

マーティンによる人間のサポート

始めましょう

最新のブログ

Capgo gives you the best insights you need to create a truly professional mobile app.