GitHub PR発生時にUnityビルドを自動実行し、Cloudflare R2にアップロードしてDiscordに通知するローカルbotです。
- GitHub Webhookを受信してPRイベントを検知
- PRブランチのコードを自動クローン
- Unityビルドを自動実行
- ビルド成果物をCloudflare R2にアップロード
- Discord webhookでビルド状況を通知
npm install
.env.example
を.env
にコピーして、必要な値を設定:
cp .env.example .env
- GITHUB_WEBHOOK_SECRET: GitHubのWebhook設定で指定するシークレット
- UNITY_PATH: Unityの実行パス
- Mac:
/Applications/Unity/Hub/Editor/[version]/Unity.app/Contents/MacOS/Unity
- Windows:
C:\Program Files\Unity\Hub\Editor\[version]\Editor\Unity.exe
- Mac:
- UNITY_BUILD_TARGET: ビルドターゲット(例: StandaloneWindows64, StandaloneOSX)
- UNITY_BUILD_METHOD: Unityプロジェクト内のビルドメソッド
- R2設定: Cloudflare R2のアクセス情報
- DISCORD_WEBHOOK_URL: Discord通知用のWebhook URL
UnityプロジェクトのAssets/Editor/BuildScript.cs
にビルドスクリプトを追加:
using UnityEditor;
using UnityEngine;
using System.Linq;
using System;
public class BuildScript
{
public static void PerformBuild()
{
string[] args = Environment.GetCommandLineArgs();
string buildPath = GetArg("-buildPath", args);
if (string.IsNullOrEmpty(buildPath))
{
Debug.LogError("Build path not specified");
EditorApplication.Exit(1);
return;
}
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
buildPlayerOptions.scenes = EditorBuildSettings.scenes
.Where(scene => scene.enabled)
.Select(scene => scene.path)
.ToArray();
buildPlayerOptions.locationPathName = buildPath;
buildPlayerOptions.target = EditorUserBuildSettings.activeBuildTarget;
buildPlayerOptions.options = BuildOptions.None;
var report = BuildPipeline.BuildPlayer(buildPlayerOptions);
if (report.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded)
{
Debug.Log("Build succeeded!");
EditorApplication.Exit(0);
}
else
{
Debug.LogError($"Build failed: {report.summary.result}");
EditorApplication.Exit(1);
}
}
static string GetArg(string name, string[] args)
{
for (int i = 0; i < args.Length; i++)
{
if (args[i] == name && args.Length > i + 1)
{
return args[i + 1];
}
}
return null;
}
}
詳細なビルドスクリプト設定方法は docs/unity-build-script.md
を参照してください。
- GitHubリポジトリの Settings > Webhooks > Add webhook
- Payload URL:
http://your-server:3000/webhook
- Content type:
application/json
- Secret:
.env
のGITHUB_WEBHOOK_SECRET
と同じ値 - Events: "Pull requests"を選択
- Cloudflare DashboardでR2バケットを作成
- API トークンを生成(R2の読み書き権限)
- パブリックアクセス用のカスタムドメインを設定(オプション)
- Discordチャンネルの設定 > 連携サービス > Webhook
- 新しいWebhookを作成
- Webhook URLを
.env
に設定
# 本番環境
npm start
# 開発環境(ファイル変更監視)
npm run dev
- botを起動
- 対象リポジトリでPRを作成または更新
- 自動的にビルドが開始され、Discordに通知
- ビルド完了後、ダウンロードリンクがDiscordに投稿
- Unityのライセンスが有効か確認
- ビルドメソッドが正しく実装されているか確認
builds/pr-*/build.log
でエラーログを確認
- ファイアウォールやルーターの設定を確認
- ngrokなどのトンネリングサービスを使用する場合:
ngrok http 3000
.env
ファイルは絶対にGitにコミットしない- Webhook secretは強力なランダム文字列を使用
- R2のアクセスキーは最小限の権限で設定