プロジェクト

全般

プロフィール

バグ #283

完了

リリース(exe)に izu-IR プラグインjarを同梱し IR設定で izu-IR を選択可能にする

バグ #283: リリース(exe)に izu-IR プラグインjarを同梱し IR設定で izu-IR を選択可能にする

エージェント ちゃん さんが18日前に追加. 18日前に更新.

ステータス:
完了
優先度:
通常
担当者:
対象バージョン:
開始日:
2026/06/18
期日:
進捗率:

100%

予定工数:

説明

症状

beatoraja develop を pull して gradlew.bat runBeatoraja で起動すると、IR設定画面で izu-IR が選択肢に出てこない(IR一覧が空)。リリース(jpackage の beatoraja.exe)でも同様に izu-IR を選択できない。

原因(調査済み)

  • IRConnectionManager.getAllAvailableIRConnectionName() は、実行時クラスパス上bms/player/beatoraja/ir パッケージを走査し、IRConnection を直接 implements して public static final String NAME を持つクラスを IR として検出する。
  • izu-IR の実装クラス IzuIRConnectionNAME="izu-IR")は、別リポジトリ games/izu-ir の plugin モジュールが生成する外部jarにあり、beatoraja リポジトリには存在しない。唯一存在した RoboRivalIRConnection#211 で削除済みで、現状 beatoraja には IRConnection 実装が1つも無い。
  • runBeatoraja のクラスパス(sourceSets.main.runtimeClasspath = main + lib/*.jar + 兄弟パーサ)にも、リリースの jpackage(--main-jar beatoraja.jar + fatJar manifest Class-Path: .)にも、プラグインjarを載せる経路が無いため、どの環境でもスキャン結果が空になる。
  • 前提の IRConnectionManager.isIRAvailable() は develop では true 固定(#210)なのでクリア済み。

つまり beatoraja 側のリリースパイプラインに izu-IR プラグインjarの同梱処理が未実装であることが本質。

対応方針(ユーザー確定済み)

  1. リリースにプラグインjarを同梱する。jpackage の --input固定名 izu-ir-plugin.jar で配置し(→ app/izu-ir-plugin.jar)、fatJar の manifest Class-Path に当該jarを明示追記してクラスパスに確実に載せる(jpackage cfg 挙動に依存しない)。プラグインは別GPL jar・別リリースのまま分離維持。
  2. リリースビルドはプラグインjarを izu-ir の GitLab パッケージレジストリ(プロジェクトID 46, generic package izu-ir-plugin)から自動取得
  3. 取得バージョンは既定 latest(packages API で最新解決)。-PizuIrPluginVersion=x.y.z で固定も可能。

実装スコープ(beatoraja リポジトリ)

  • build.gradle: 新規タスク fetchIzuIrPlugin
    • URL: https://gitlab.izu-san.com/api/v4/projects/46/packages/generic/izu-ir-plugin/<version>/izu-ir-plugin-<version>.jar
    • 認証: 環境変数から。CI は CI_JOB_TOKEN(ヘッダ JOB-TOKEN)、手元は IZU_IR_REGISTRY_TOKEN または GITLAB_TOKEN(ヘッダ PRIVATE-TOKEN
    • latest 解決: packages API(/projects/46/packages?package_name=izu-ir-plugin&order_by=created_at&sort=desc)で最新 version を取得。-PizuIrPluginVersion 指定時はそれを使用
    • 出力を固定名 build/izu-ir-plugin/izu-ir-plugin.jar にリネーム
    • HTTP ダウンロードは Gradle/Java(HttpURLConnection 等)でクロスプラットフォームに実装(Windowsランナーでも動く)
  • prepareJpackageInput: fetchIzuIrPlugin の成果物 izu-ir-plugin.jar--input ディレクトリへコピー
  • fatJar の manifest: Class-Path: .Class-Path: . izu-ir-plugin.jar(jar 不在ビルドでも欠落エントリは無害)
  • runBeatoraja: build/izu-ir-plugin/izu-ir-plugin.jar または lib/izu-ir-plugin.jar が存在すれば classpath に追加(無ければ従来どおり IR 無しで起動)。開発時は gradlew fetchIzuIrPluginlib/ 手動配置で izu-IR を確認可能に
  • 堅牢性: トークン無し/オフライン時に buildtest・MRパイプライン・runBeatoraja を壊さない(fetchIzuIrPlugin はリリース経路のみ必須依存)。リリース経路(jpackage)では取得失敗を明示エラーにして IR 無し exe を出さない
  • ドキュメント: README/docs に IR プラグイン同梱の仕組み・バージョン指定・トークンを追記
  • .gitignore: 取得jar(build/izu-ir-plugin/, lib/izu-ir-plugin.jar)を追加

実装と別に必要な GitLab 設定(運用作業)

  • izu-ir 側 Settings → CI/CD → Job token permissions に games/beatoraja を追加(beatoraja CI の CI_JOB_TOKEN で izu-ir のパッケージレジストリを読めるようにする。izu-ir が beatoraja を clone するための既存設定の逆向き)。未設定だと CI リリースでの取得が 401/404 になる。

受け入れ条件

  • gradlew fetchIzuIrPlugin(トークンあり)でプラグインjarが build/izu-ir-plugin/izu-ir-plugin.jar に取得される。
  • runBeatoraja で当該jarがあれば IR 設定に izu-IR が表示される。
  • リリース(releaseWindows)で生成した zip/msi/app-image の app/izu-ir-plugin.jar が含まれ、beatoraja.jar の manifest Class-Path から参照される。
  • トークン無し環境で build / test / runBeatoraja が従来どおり成功する(IR 無しで起動)。
  • 既存テストが緑。

他の形式にエクスポート: PDF Atom