休憩ジャッジ
競プロ問題公開したい!
コンパイルや実行部分はいったん外部アプリに任せる
サイト(WIP): QK Judge
サーバー(:koko:): qkjudge
クライアント: qkjudge-UI
問題: qkjudge-problems
ツールは mise で管理している (mise.toml)。Rust ツールチェイン
(cargo / clippy / rustfmt) は別途必要。
mise install # gitleaks / prek を入れる
prek install # git フック (pre-commit / pre-push) を有効化prek (pre-commit 互換) で .pre-commit-config.yaml のフックを走らせる。
prek install 後はコミット時に自動で実行される。
- commit 時: trailing-whitespace / end-of-file-fixer / check-added-large-files / check-yaml /
check-merge-conflict、
cargo fmt(差分は自動修正 → 再 add)、gitleaks (secret 誤コミット防止)。 - push 時:
cargo clippy -D warningsを回す予定。sqlx offline 化 (TASK-002) は完了しSQLX_OFFLINE=trueで DB 無しにコンパイルできるようになったが、-D warnings適用には既存の lint 警告 (約20件) の解消が要るため、当面は無効のまま (CI / TASK-004 で整理予定)。
全ファイルに手動で走らせる:
prek run --all-filessecret (DB creds / JDoodle / tunnel token / kubeconfig 等) はコミットしない。gitleaks が ステージ済み差分を走査して検知・ブロックする。ドキュメント用のサンプル値は
# gitleaks:allowコメントか.gitleaksignoreで個別に許可する。
旧本番と同等の主要フロー (signup / login / problems / submit→judge / submissions) を手元で再現する。
app (Rust, マルチステージビルド) + mariadb:11.4 (初期スキーマ migrations/v1.2.3.sql を投入)。
cp .env.example .env # 値を埋める (.env は gitignore。secret を含めるのでコミットしない)
docker compose up --build- アプリは
http://localhost:8080で待ち受ける (/pingが 200 を返す)。 mariadbは手元の別 DB との衝突を避けるため host3307に publish している (mysql -h127.0.0.1 -P3307)。- 起動時に
kisepichu/qkjudge-problemsのdistを/data/problemsへ clone (既存なら pull) する。 - 主な環境変数:
CORS_ALLOW_ORIGIN(1 環境 1 オリジン)、SESSION_KEY(64 hex。未設定だと再起動で ログアウト)、COMPILER_API_CLIENT_ID/COMPILER_API_CLIENT_SECRET(JDoodle。提出のジャッジに必須)。詳細は.env.example。
DB 無しでもイメージはビルドできる (sqlx offline)。
sqlx::query!の検証メタデータはsqlx-data.jsonにキャッシュ済みで、ビルドはSQLX_OFFLINE=trueで走る。スキーマやクエリを 変更したら、DB を起動してDATABASE_URL=mysql://qkjudge:...@127.0.0.1:3307/qkjudge cargo sqlx prepareで再生成しコミットする。