OTAForge¶
プレーン: データプレーン
目的¶
OTAアーティファクトの管理、配信、およびポリシー駆動によるロールアウト自動化。OTAForgeは、ソフトウェアアーティファクトを公開し、ポリシーに基づいてデバイスに自動配信するためのプラットフォームサービスです。Eclipse hawkBitをマルチテナント管理レイヤー、アクセスキーによるCI/CD統合、およびプロキシ経由のデバイスポーリングでラップしています。
OTAForgeは2つの問いに答えます:
配信者(開発者、ビルドシステム)向け: 「どのようにアーティファクトをプラットフォームに公開するか?」
オペレーター向け: 「どのデバイスが、いつ、どの順序で更新されるかを制御するポリシーは何か?」
責務¶
ソフトウェアアーティファクト(ファームウェア、マップ、設定、MLモデル、証明書)の作成と管理
アーティファクトをディストリビューションセット(バンドルされたデプロイ可能単位)に整理
ポリシー評価に基づいてロールアウトキャンペーンを自動作成
DeviceAdminにデバイス状態(ファームウェアバージョン、タイプ、ステータス)をポーリング
CI/CD統合(Jenkins、GitHub Actions等)のためのアクセスキー(AK/SK)を提供
DDIエンドポイントをプロキシ — デバイスはhawkBitではなくOTAForgeにポーリング
アーティファクト公開とロールアウト監視のための管理UIを提供
外部関係者がアーティファクトを管理するためのディストリビューターポータルを公開
OTAForgeと他のサービスとの関係¶
Distributors OTAForge Devices
(developers, (via proxied DDI)
CI/CD)
┌──────────────────┐
Jenkins ──AK/SK─────────►│ │
│ Artifact Mgmt │
GitHub Actions ──AK/SK──►│ Policy Engine │◄──── Policy Service
│ DDI Proxy │ (rollout policies)
Web UI ─────────────────►│ Access Keys │
│ │◄──── DeviceAdmin
└───────┬──────────┘ (device state polling)
│
DDI proxy
│
▼
Edge Devices
(Hara client polls
OTAForge DDI endpoint)
ポリシー駆動のロールアウト¶
ロールアウトは手動で作成されたり、CI/CDパイプラインによってトリガーされたりすることはありません。OTAForgeはポリシーを継続的に評価し、条件が満たされたときにロールアウトを自動的に作成します。
仕組み¶
┌──────────────┐ poll device state ┌──────────────┐
│ DeviceAdmin │◄─────────────────────────│ OTAForge │
│ │ │ │
│ Device fleet │ firmware versions, │ Compare │
│ state │ device types, │ device state│
│ │ enrollment status │ vs policies │
└──────────────┘ └──────┬───────┘
│
┌──────────────┐ │ evaluate
│Policy Service│◄──────────────┘
│ │
│ Rollout │ "AMRs below v2.5 in
│ policies │ Zone B should be
│ │ updated during
│ │ maintenance windows"
└──────────────┘
│
│ match
▼
┌──────────────┐
│ Auto-create │
│ rollout in │
│ hawkBit │
└──────────────┘
OTAForgeはDeviceAdminにデバイス状態(ファームウェアバージョン、タイプ、機能、登録ステータス)を定期的にポーリング
OTAForgeは、現在のデバイスフリートと利用可能なディストリビューションセットに対してPolicy Serviceのロールアウトポリシーを評価
ポリシーが一致した場合(例:「ファームウェア < v2.5のすべてのAMRにディストリビューションセットv2.5.0を配信する」)、OTAForgeはhawkBit内にロールアウトキャンペーンを自動作成
ロールアウトはポリシーで定義された段階的デプロイルールに従って進行
ポリシー駆動のみとする理由¶
アプローチ |
不採用の理由 |
|---|---|
手動ロールアウト作成 |
エラーが発生しやすく、スケールせず、安全ポリシーを迂回する |
CI/CDトリガーのロールアウト |
デプロイパイプラインをデバイスフリート状態に結合する。CIはアーティファクトについては知っているが、どのデバイスがそれを必要としているかは知らない |
ポリシー駆動(採用) |
アーティファクトの公開とロールアウト実行を分離。ポリシーは組織の意図をエンコードし、OTAForgeが「いつ」「どのデバイスに」を自動的に処理する |
CI/CDパイプラインはアーティファクトを公開します。ポリシーがそれらのアーティファクトがいつ、どこにデプロイされるかを決定します。これらは別々の関心事です。
ロールアウトポリシー¶
Policy Serviceは、OTAForgeが評価するロールアウト制約を提供します:
ポリシー |
効果 |
|---|---|
ターゲット選択 |
どのデバイスが更新を受け取るべきか(タイプ、バージョン、ゾーン、OU別) |
メンテナンスウィンドウ |
オフピーク時間帯のみデプロイ |
バッテリー閾値 |
最低バッテリーレベル未満のデバイスをスキップ |
アクティブタスクチェック |
デバイスがコントラクトを実行中の場合、更新を延期 |
同時実行制限 |
ゾーンごとの最大同時更新数 |
段階的デプロイ |
カナリア → 割合段階的拡大 → フルデプロイ |
成功閾値 |
失敗率が閾値を超えた場合に自動一時停止 |
ロールアウトスコーピング¶
ロールアウトはアカウント階層とポリシー式に基づいてデバイスをターゲットにします:
スコープレベル |
ターゲット |
例 |
|---|---|---|
アカウント |
アカウント内のすべてのデバイス |
「アカウントAのすべてのロボットを更新」 |
組織 |
組織メンバーアカウント全体のすべてのデバイス |
「全社的にすべてのSyriusデバイスを更新」 |
OU |
特定の組織単位内のデバイス |
「ビルAのロボットを更新」 |
デバイスタイプ |
タイプフィルターに一致するデバイス |
「すべてのAMRを更新」 |
ポリシー式 |
複合フィルターに一致するデバイス |
「ゾーンBでファームウェア < v2.4のAMR」 |
段階的ロールアウト¶
OTAForgeはhawkBitの段階的ロールアウトをポリシー定義のフェーズでラップします:
Auto-created Rollout: "Firmware v2.5.0 to Building A AMRs"
├── Phase 1: 10% of targets (canary)
│ ├── Success threshold: 100%
│ └── Wait: 30 min observation
├── Phase 2: 50% of targets
│ ├── Success threshold: 90%
│ └── Wait: 1 hour observation
└── Phase 3: remaining targets
└── Auto-pause on > 5% failure rate
プロキシ経由のDDIエンドポイント¶
デバイスはOTAForgeのDDI(Device Domain Interface)エンドポイントにポーリングします。hawkBitのDDIに直接ポーリングするのではありません。OTAForgeはアカウントスコーピングと監査ログを追加した上で、DDIリクエストをhawkBitにプロキシします。
Edge Device OTAForge hawkBit
(Hara client) (DDI proxy)
│ │ │
│ GET /ddi/v1/{tenant}/ │ │
│ controller/{id} │ │
│─────────────────────────►│ │
│ │ Validate tenant │
│ │ + audit log │
│ │ │
│ │ GET /ddi/v1/... │
│ │───────────────────►│
│ │ │
│ │◄───────────────────│
│ 200 OK │ │
│ (deployment actions) │ │
│◄─────────────────────────│ │
プロキシ経由DDIの利点:
テナント検証 — OTAForgeは転送前にデバイスが主張するアカウントに属していることを確認
監査ログ — すべてのDDIインタラクションがコンプライアンスのためにログ記録
レート制限 — 誤設定されたポーリング間隔からhawkBitを保護
抽象化 — デバイスはhawkBitの存在を知らない。DDIエンドポイントURLはデバイス側の更新なしに変更可能
アクセスキーモデル¶
OTAForgeは、プログラムによるアーティファクト公開のためのアクセスキー(AK/SKペア)を提供します。これにより、CI/CDパイプラインがアーティファクトを自動的にプッシュできるようになります。
ユースケース:Jenkins統合¶
┌─────────────┐ ┌──────────────┐ ┌──────────────┐
│ Jenkins │ │ OTAForge │ │ hawkBit │
│ Pipeline │ │ │ │ │
│ │ │ │ │ │
│ Build ───────┤ │ │ │ │
│ Test ───────┤ │ │ │ │
│ Package ─────┤ │ │ │ │
│ │ │ │ │ │
│ Push artifact│ │ │ │ │
│ (AK/SK auth) │────►│ Validate key │ │ │
│ │ │ Store artifact├───►│ Software │
│ │ │ │ │ module │
│ │ │ │ │ │
│ Create dist │ │ │ │ │
│ set (AK/SK) │────►│ Create set ├───►│ Distribution │
│ │ │ │ │ set │
└─────────────┘ └──────────────┘ └──────────────┘
(rollout created
later by policy
evaluation)
CI/CDパイプラインはアーティファクトの公開とディストリビューションセットの作成を行います。ロールアウトの作成は行いません — それはポリシー評価によって自動的に処理されます。
アクセスキーのスコーピング¶
キータイプ |
スコープ |
権限 |
|---|---|---|
パブリッシャーキー |
アカウント |
アーティファクト、ソフトウェアモジュール、ディストリビューションセットの作成 |
読み取り専用キー |
アカウント |
アーティファクトとディストリビューションセットのステータス照会 |
アクセスキーは発行元アカウントにスコープされます。アカウントAのパブリッシャーキーは、アカウントAのデバイスに見えるアーティファクトのみを作成できます。
アーティファクト管理¶
アーティファクトタイプ¶
OTAForgeはhawkBitのカスタムソフトウェアモジュールタイプを介して、あらゆるファイルタイプをサポートします:
タイプキー |
内容 |
例 |
|---|---|---|
|
オペレーティングシステムイメージ |
AMRコンピュートモジュール用Ubuntu 22.04 |
|
ファームウェアバイナリ |
モーターコントローラ v3.2 |
|
アプリケーションパッケージ |
WESエッジエージェント v1.5 |
|
ナビゲーションマップ、フロアプラン |
ビルA、1階、v3 |
|
ML/AIモデルの重み |
障害物検出器 YOLO v1.2 |
|
設定ファイル |
ネットワーク設定、ポリシーバンドル |
|
TLS証明書、ID証明書 |
デバイスCA ローテーション |
ディストリビューションセット¶
ディストリビューションセットは、アトミックなデプロイのために複数のアーティファクトをバンドルします:
Distribution Set: "AMR v2.5.0 + Map Update Q1"
├── Software Module: firmware v2.5.0 (type: firmware)
│ └── artifact: amr-firmware-2.5.0.bin (sha256: a1b2c3...)
├── Software Module: nav-map-building-a-v3 (type: mapdata)
│ └── artifact: building-a-floor1.pbstream
│ └── artifact: building-a-floor2.pbstream
└── Software Module: obstacle-detector v1.2 (type: mlmodel)
└── artifact: yolo-obstacle-v1.2.onnx
管理UI¶
OTAForgeは2つのWebインターフェースを提供します:
オペレーターUI¶
プラットフォームオペレーターおよびアプリケーション管理者向け:
アーティファクトブラウザとバージョン履歴
ディストリビューションセットの構成
ロールアウト監視とステータスダッシュボード(ロールアウトはポリシーにより自動作成)
フリート更新ステータス概要
ロールアウト自動化のためのポリシー設定
ディストリビューターポータル¶
CI/CDではなくWeb UI経由でアーティファクトを公開する外部ディストリビューター(デバイスメーカー、ソフトウェアベンダー)向けの独立したWebアプリケーション:
アーティファクトのアップロードとメタデータ管理
アクセスキーの生成とローテーション
ディストリビューションセットの作成
公開ステータスとダウンロード分析
両方のUIはIBM Carbon Design Systemに準拠し、StarGateと同様にReact + TypeScriptで構築されています。
APIインターフェース¶
アーティファクト¶
操作 |
説明 |
|---|---|
|
アーティファクトをアップロード(AK/SKまたはトークン認証) |
|
フィルター付きでアーティファクトを一覧表示 |
|
アーティファクトの詳細とメタデータを取得 |
|
アーティファクトを削除 |
ソフトウェアモジュール¶
操作 |
説明 |
|---|---|
|
ソフトウェアモジュールを作成 |
|
モジュールを一覧表示 |
|
モジュールにアーティファクトを追加 |
ディストリビューションセット¶
操作 |
説明 |
|---|---|
|
ディストリビューションセットを作成 |
|
ディストリビューションセットを一覧表示 |
|
ディストリビューションセットの詳細を取得 |
|
ディストリビューションセットにモジュールを追加 |
ロールアウト(読み取り専用 — ポリシーエンジンにより作成)¶
操作 |
説明 |
|---|---|
|
ロールアウトを一覧表示 |
|
ロールアウトのステータスと進捗を取得 |
|
ロールアウトを一時停止(緊急オーバーライド) |
|
一時停止中のロールアウトを再開 |
アクセスキー¶
操作 |
説明 |
|---|---|
|
アクセスキーペアを生成 |
|
アクセスキーを一覧表示 |
|
アクセスキーを失効 |
|
アクセスキーをローテーション |
DDIプロキシ¶
操作 |
説明 |
|---|---|
|
プロキシDDI:デバイスが保留中のアクションをポーリング |
|
プロキシDDI:デプロイ詳細を取得 |
|
プロキシDDI:デバイスがインストール状況を報告 |
実装¶
項目 |
技術 |
|---|---|
フレームワーク |
Java 21 (Spring Boot) |
OTAエンジン |
Eclipse hawkBit (Management API + DDI) |
DDIプロキシ |
hawkBit DDIの前段にあるリバースプロキシレイヤー |
アーティファクトストレージ |
S3(hawkBitのアーティファクトリポジトリ経由) |
データベース |
PostgreSQL(アクセスキー、ポリシー評価状態、アカウントスコーピング) |
UI |
React + TypeScript + IBM Carbon Design System |
ビルドツール |
Vite |
依存関係¶
サービス |
関係 |
|---|---|
hawkBit |
基盤となるOTAエンジン(アーティファクトストレージ、DDI、ロールアウト実行) |
DeviceAdmin |
ポリシー評価のためのデバイスフリート状態(定期的にポーリング) |
Org Service |
ロールアウトスコーピングのためのアカウントと組織階層 |
ロールアウトポリシー(ターゲット選択、メンテナンスウィンドウ、閾値) |
|
DotID |
API呼び出しの認証、アクセスキーの検証 |
利用元¶
利用者 |
用途 |
|---|---|
DeviceAdmin |
デバイスフリートビューのOTAステータスを読み取り |
CI/CDパイプライン |
アクセスキーを介してアーティファクトとディストリビューションセットを公開 |
ディストリビューター |
ポータル経由でアーティファクトを公開・管理 |
オペレーター |
ロールアウトの進捗監視、ロールアウトポリシーの設定 |
エッジデバイス |
保留中の更新についてDDIプロキシをポーリング |
アプリケーション |
アプリケーション固有のビュー向けに更新ステータスを照会 |