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      │
                   └──────────────┘
  1. OTAForgeはDeviceAdminにデバイス状態(ファームウェアバージョン、タイプ、機能、登録ステータス)を定期的にポーリング

  2. OTAForgeは、現在のデバイスフリートと利用可能なディストリビューションセットに対してPolicy Serviceのロールアウトポリシーを評価

  3. ポリシーが一致した場合(例:「ファームウェア < v2.5のすべてのAMRにディストリビューションセットv2.5.0を配信する」)、OTAForgeはhawkBit内にロールアウトキャンペーンを自動作成

  4. ロールアウトはポリシーで定義された段階的デプロイルールに従って進行

ポリシー駆動のみとする理由

アプローチ

不採用の理由

手動ロールアウト作成

エラーが発生しやすく、スケールせず、安全ポリシーを迂回する

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のカスタムソフトウェアモジュールタイプを介して、あらゆるファイルタイプをサポートします:

タイプキー

内容

os

オペレーティングシステムイメージ

AMRコンピュートモジュール用Ubuntu 22.04

firmware

ファームウェアバイナリ

モーターコントローラ v3.2

application

アプリケーションパッケージ

WESエッジエージェント v1.5

mapdata

ナビゲーションマップ、フロアプラン

ビルA、1階、v3

mlmodel

ML/AIモデルの重み

障害物検出器 YOLO v1.2

config

設定ファイル

ネットワーク設定、ポリシーバンドル

certificate

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インターフェース

アーティファクト

操作

説明

POST /artifacts

アーティファクトをアップロード(AK/SKまたはトークン認証)

GET /artifacts?account=&type=

フィルター付きでアーティファクトを一覧表示

GET /artifacts/{id}

アーティファクトの詳細とメタデータを取得

DELETE /artifacts/{id}

アーティファクトを削除

ソフトウェアモジュール

操作

説明

POST /modules

ソフトウェアモジュールを作成

GET /modules?account=&type=

モジュールを一覧表示

POST /modules/{id}/artifacts

モジュールにアーティファクトを追加

ディストリビューションセット

操作

説明

POST /distribution-sets

ディストリビューションセットを作成

GET /distribution-sets?account=

ディストリビューションセットを一覧表示

GET /distribution-sets/{id}

ディストリビューションセットの詳細を取得

POST /distribution-sets/{id}/modules

ディストリビューションセットにモジュールを追加

ロールアウト(読み取り専用 — ポリシーエンジンにより作成)

操作

説明

GET /rollouts?account=&status=

ロールアウトを一覧表示

GET /rollouts/{id}

ロールアウトのステータスと進捗を取得

POST /rollouts/{id}/pause

ロールアウトを一時停止(緊急オーバーライド)

POST /rollouts/{id}/resume

一時停止中のロールアウトを再開

アクセスキー

操作

説明

POST /access-keys

アクセスキーペアを生成

GET /access-keys?account=

アクセスキーを一覧表示

DELETE /access-keys/{id}

アクセスキーを失効

POST /access-keys/{id}/rotate

アクセスキーをローテーション

DDIプロキシ

操作

説明

GET /ddi/v1/{tenant}/controller/{id}

プロキシDDI:デバイスが保留中のアクションをポーリング

GET /ddi/v1/{tenant}/controller/{id}/deploymentBase/{actionId}

プロキシDDI:デプロイ詳細を取得

POST /ddi/v1/{tenant}/controller/{id}/deploymentBase/{actionId}/feedback

プロキシ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

ロールアウトスコーピングのためのアカウントと組織階層

Policy Service

ロールアウトポリシー(ターゲット選択、メンテナンスウィンドウ、閾値)

DotID

API呼び出しの認証、アクセスキーの検証

利用元

利用者

用途

DeviceAdmin

デバイスフリートビューのOTAステータスを読み取り

CI/CDパイプライン

アクセスキーを介してアーティファクトとディストリビューションセットを公開

ディストリビューター

ポータル経由でアーティファクトを公開・管理

オペレーター

ロールアウトの進捗監視、ロールアウトポリシーの設定

エッジデバイス

保留中の更新についてDDIプロキシをポーリング

アプリケーション

アプリケーション固有のビュー向けに更新ステータスを照会