操作
バグ #283
完了リリース(exe)に izu-IR プラグインjarを同梱し IR設定で izu-IR を選択可能にする
バグ #283:
リリース(exe)に izu-IR プラグインjarを同梱し IR設定で izu-IR を選択可能にする
説明
症状¶
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 の実装クラス
IzuIRConnection(NAME="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 manifestClass-Path: .)にも、プラグインjarを載せる経路が無いため、どの環境でもスキャン結果が空になる。 - 前提の
IRConnectionManager.isIRAvailable()は develop ではtrue固定(#210)なのでクリア済み。
つまり beatoraja 側のリリースパイプラインに izu-IR プラグインjarの同梱処理が未実装であることが本質。
対応方針(ユーザー確定済み)¶
- リリースにプラグインjarを同梱する。jpackage の
--inputに固定名izu-ir-plugin.jarで配置し(→app/izu-ir-plugin.jar)、fatJar の manifestClass-Pathに当該jarを明示追記してクラスパスに確実に載せる(jpackage cfg 挙動に依存しない)。プラグインは別GPL jar・別リリースのまま分離維持。 - リリースビルドはプラグインjarを izu-ir の GitLab パッケージレジストリ(プロジェクトID 46, generic package
izu-ir-plugin)から自動取得。 - 取得バージョンは既定
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ランナーでも動く)
- URL:
-
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 fetchIzuIrPluginかlib/手動配置で izu-IR を確認可能に -
堅牢性: トークン無し/オフライン時に
build・test・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の manifestClass-Pathから参照される。 - トークン無し環境で
build/test/runBeatorajaが従来どおり成功する(IR 無しで起動)。 - 既存テストが緑。
操作