プロジェクト

全般

プロフィール

バグ #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 無しで起動)。
  • 既存テストが緑。

エージェント ちゃん さんが18日前に更新 操作 #1

  • ステータス未着手 から 実装中 に変更
  • 進捗率0 から 10 に変更

実装に着手しました。

  • ブランチ: feature/283
  • 対応方針: リリース(jpackage)の --input に izu-IR プラグインjarを固定名で同梱し、fatJar manifest の Class-Path で明示参照。jarは izu-ir の GitLab パッケージレジストリ(プロジェクト46)から fetchIzuIrPlugin タスクで自動取得(既定 latest)。runBeatoraja も同jarがあれば classpath に追加して開発時に izu-IR を確認可能にする。

いづ さん さんが18日前に更新 操作 #2

  • 対象バージョン1.1.2 にセット

エージェント ちゃん さんが18日前に更新 操作 #3

  • ステータス実装中 から 完了 に変更
  • 進捗率10 から 100 に変更

対応が完了しました。

概要

izu-IR の IRConnection 実装(IzuIRConnection, NAME="izu-IR")は別リポジトリ games/izu-ir の plugin が publish する外部jarで、それをクラスパスに載せる経路がリリース(exe)にも runBeatoraja にも無かったため IR一覧が常に空だった。リリース/開発実行の双方でプラグインjarをクラスパスへ載せ、IR設定で izu-IR を選択可能にした。

変更点

  • fetchIzuIrPlugin タスク追加: GitLab generic パッケージレジストリ(プロジェクト46)から izu-ir-plugin-<version>.jar を取得し固定名 build/izu-ir-plugin/izu-ir-plugin.jar に保存。バージョン既定 latest(packages API 解決)、-PizuIrPluginVersion=x.y.z で固定可。認証は CI_JOB_TOKEN/IZU_IR_REGISTRY_TOKEN/GITLAB_TOKEN(トークン値は非ログ)。構成キャッシュ互換。
  • prepareJpackageInput: fetchIzuIrPlugin に依存し jar を app/ に同梱(取得失敗時はリリースを loud fail)。
  • fatJar manifest: Class-Path: . izu-ir-plugin.jar(exe/zip/msi で app/ の jar を確実にロード)。
  • runBeatoraja: 取得jarまたは lib/izu-ir-plugin.jar が在れば classpath に追加(fetch 非依存)。
  • 変更ファイル: build.gradle, .gitignore, docs/izu-ir-plugin.md(新規) の 3 件。

テスト

  • xvfb-run -a ./gradlew test : 成功(緑・回帰なし)
  • ./gradlew compileJava : 成功
  • fatJar manifest を実jarから確認: Class-Path: . izu-ir-plugin.jar
  • fetchIzuIrPlugin ドライラン: 構成キャッシュ互換・明示エラー(トークン値は非表示)

関連 MR

  • !62 (feature/283 → develop) マージ済み

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