bamboo’s blog

Bambooの気まぐれブログ

Online 3GX Builderの実装

はじめに

 Online 3GX Builderは、3gx(Nintendo 3DS向け拡張プラグイン)をオンラインでビルドできるツール。この記事ではどのように実装したかをざっくりと説明。

入力処理

 Online 3GX BuilderはHerokuでホスティングしている。普段Herokuで公開するサービスはGitHubからデプロイしていたが、某事件(詳しくはHeroku GitHub インシデントで検索)の影響でGitHubと連携できなくなったため、現在はHeroku単体でGit管理している。
 サーバー処理にはFlaskを使用している。特に理由はないが、以前にFlask+PyGithubでGitHub APIを使用したことがあったので、移植しやすいと考え採用。
 処理は以下のように行っている。

  1. ユーザーの入力からリポジトリのリンクを取得。
  2. リンクを解析し、有効なリポジトリのURLであるかどうか確認する。
  3. ビルド用のGitHub ActionsにPOSTリクエストを送信。パラメータとしてユーザー名/リポジトリ名を渡す。
  4. GitHub Actionsのページに遷移。

ビルド処理

 ビルドはGitHub Actionsで行う。作成当初、トリガー条件にはworkflow_dispatchを使用する予定だった。workflow_dispatchを使用すると、上記のようなHerokuのサイトを用意せずとも、GitHub Actionsのページで直接URLを入力してビルドを開始することができる。だがどうやらこの方法、リポジトリへの書き込み権限がある人でないと使えないらしい。つまり、一般の人がサービスとして利用することはできない。というわけで、外部からのPOSTリクエストで実行できるrepository_dispatchを使用。  次にぶち当たった問題が、どのように3gxファイルをビルドするか。3gxのビルドには多くの依存関係があるため、自分でスクリプトを書くことはできなくはないが面倒だ。実はありがたいことに、PabloMK7氏が3gxビルド用Dockerイメージを公開してくれている。これは使うしか無い!というわけで、内部ではこのイメージを使用することにした。
 ビルドが正常に終了すると、成果物としてzipファイルに格納された3gxがアップロードされる。成果物はビルド画面の下部からダウンロードできる。

最後に

 需要は限定的だけど、こういうことができるとちょっと面白いよね。

動画

youtu.be