エンジニア向けEラーニングシステム。
wiki 内の画像処理ライブラリのインストールページを参照してください。
$ bin/setup
$ bin/dev
http://localhost:3000/ にアクセス。
提出物の初回提出・本文更新時にバックグラウンドでレビュー支援を生成し、提出物のHTML画面でメンター・管理者だけに表示します。コメント・承認・通知は作成しません。
ANTHROPIC_API_KEY を設定してください。モデルは claude-opus-5-5 が既定で、PRODUCT_REVIEW_LLM_MODEL で変更できます。他のAI機能のモデル設定には影響しません。提出本文とプラクティスのタイトル・本文・目標・提出要件・模範解答(存在する場合)をAnthropicへ送信します。
ProductReviewPracticeContext は、DBのプラクティスと関連Docからレビュー入力のコンテキストを組み立てるクラスです。
プラクティスの情報はDBのプラクティスと、Page.for_practice_including_source で関連付く現在・直近の複製元の公開済みDoc(WIPを除く)から組み立てます。URLの記載は不要で、他のプラクティスやさらに上の複製元までは集めません。DocはID順で最大20件、本文は各20,000文字・合計100,000文字までとし、切り詰め・省略をレビューに伝えます。タイトル・ID・Markdown本文を送り、根拠にはDocのタイトルとIDを使います。コメントやユーザー情報は含めず、受講生のメモを含む参考資料をすべて必須要件として扱わないよう指示します。
HTTP取得は提出本文に直接記載されたMarkdownリンク・自動リンク・画像の先頭10件だけです。相対URLはアプリのホスト・プロトコル設定で解決し、フラグメントを除いて重複をまとめます。教材のDB取得枠とは独立しており、プラクティス・Doc・模範解答内のURLや画像、取得した外部ページのリンクは辿りません。外部資料は既存の公開HTTP(S)取得処理を使い、Cookie・認証情報は送りません。AIには通信ツールを渡しません。
外部取得はURLごとに15秒(DNS・リダイレクトを含む)、レスポンスごとに10MB、リダイレクトは最大5回です。WebページはJavaScriptを実行せず、本文の先頭20,000文字を使います。画像はJPEG・PNG・GIF・WebPを実データで添付し、添付番号を付け、1枚7MB・合計20MB・縦横各8,000pxまでに制限します(MBは1,048,576バイト)。ログインが必要なページ、取得失敗、未対応・破損画像、上限超過は未確認としてレビューに伝えます。これらの制限やJavaScriptで表示される内容はメンターによる確認が必要です。既に保存されているレビューは、この取得機能の追加では自動再生成しません。
公開GitHubのHTTPS PRリンク(/pull/番号、/files、末尾スラッシュ、直接の.diff)は公開の.diffを取得します。blobリンクはraw.githubusercontent.comへ変換し、rawリンクもコードとして読みます。認証付きREST API・トークン・Cookieは使いません。コードの空白・改行・HTML記法を保ち、先頭50,000文字までを使い、切り詰めを明記します。提出元URLと取得先URLを根拠に含めます。PRでは変更箇所とハンク内の文脈のみが確認範囲で、未変更ファイル全体やバイナリの内容は確認できません。差分ではないログイン・エラーページは取得済み扱いにしません。diff内のファイルやリンクを追加取得せず、リポジトリ・tree・issuesのリンクは通常のWebページとして扱います。raw画像には上記の画像制限を適用します。この変更でも保存済みレビューは自動再生成しません。
本文や提出先の変更・WIPへの変更時に旧レビューを消します。レビュー本文が保存されたときだけカードを表示します。APIキー未設定・通信エラー・空の応答ではレビューを保存しません。提出物の保存は生成完了を待ちません。生成中に提出本文が変わった場合は、その結果を保存しません。
既存の未確認・非WIPでレビュー本文が空の提出物へのレビュー支援生成は、本番アプリのデプロイ後に自動実行されるデータマイグレーションで一度だけジョブキューへ追加します。既に保存されたレビュー本文は保持します。
AI入出力をHTTPデバッグログに残さないため、稼働環境で RUBYLLM_DEBUG・RUBYLLM_STREAM_DEBUG は設定しないでください。プロバイダーのエラー本文は画面やジョブログへ出力しません。
system test は Playwright で Chromium を起動します。初回セットアップ時、または Playwright のバージョン更新後にブラウザーをインストールしてください。
npx playwright install chromium$ rails test:all
$ HEADFUL=1 rails test:all
$ PARALLEL_WORKERS=1 rails test:all
これまでどおり push・PR の作成で開発を進められます。main 向け PR と main への push では、GitHub Actions の全チェックが引き続き自動実行されます。ローカル CI の利用は任意です。既存メンバーが作業を続けるために、bin/ci の実行や gh-signoff の導入は必要ありません。この PR では GitHub Actions のワークフロー、必須チェック、ruleset の設定を変更しません。
Local CI × GitHub Actions を参考に、bin/ci で GitHub Actions と同じ種類のチェックを手元で実行できます。リポジトリ内のどのディレクトリからでも実行でき、各ステップと全体の所要時間を表示します。
- GitHub Actions と同じ Ruby 3.4.3、Node.js 22.19.0 と Bundler を用意し、
bundle installを済ませてください。bin/ciはbundle checkで gem の不足を検出し、JavaScript の依存は毎回npm ciでインストールします。 - pgvector 拡張を使える PostgreSQL と、使い捨てにできるテスト用 DB を用意してください。画像処理ライブラリに加え、CI で使う ffmpeg、ImageMagick、libvips、libheif、libuv、PostgreSQL クライアント、日本語フォント(Noto CJK など)が必要です。OS ごとのパッケージ名は異なります。
npm ciの後にnpx playwright install chromiumを実行してください。Linux で Chromium の共有ライブラリが不足する場合はnpx playwright install --with-deps chromiumも使えます。
bin/ci は RAILS_ENV=test と TZ=Asia/Tokyo を設定します。例外として、Traceroute のルート検査だけは GitHub Actions と同じ RAILS_ENV=development で実行します。テスト DB の準備、アセットのプリコンパイル、全テストは RAILS_ENV=test で実行し、タイムゾーンは全ステップで Asia/Tokyo です。DATABASE_URL は変更せず引き継ぎます。DB 名より優先されるため、開発用・本番用の接続先を設定しないでください。テストではデータが消えます。worktree ごとに DB を分ける場合は、たとえば BRANCH_DB_SUFFIX=_local_ci bin/ci とすると bootcamp_test_local_ci を使います。DATABASE_URL を指定する場合は、その URL 自体をテスト専用 DB に向けてください。
bin/ciRuby・Slim・JavaScript・CSS・OpenAPI の lint、Traceroute、Node.js による性能収集テスト(node --test test/javascript/performance_test.mjs)、テスト DB の準備、アセットのプリコンパイル、system test を含む全テストを順に実行します。途中で失敗すると後続の処理を止め、終了コードを失敗にします。lint の自動修正や開発環境のセットアップ、seed の再投入は実行しません。通常の実行では GitHub にステータスを送信しません。
RuboCop は --ignore-parent-exclusion を指定し、入れ子の worktree でも親チェックアウトの除外設定を引き継がず、このチェックアウトの設定で検査します。
テストは既存の設定どおり既定では1 worker です。PARALLEL_WORKERS=4 bin/ci のように並列実行を指定できますが、Rails の DRb/fork によってハングする環境があるため、問題が出たら1に戻してください。
GitHub CLI の認証と gh-signoff 拡張が既に利用できる環境では、変更を commit・push した後に明示的に指定します。
bin/ci --signoff全チェックに成功し、開始時から HEAD と作業ツリーが変わっていない場合だけ gh signoff を実行します。未 commit の変更がある場合は開始前に終了します。signoff の失敗も終了コードに反映します。拡張のインストールや、リポジトリの必須チェック設定の変更は行いません。
signoff はローカルの成功結果を追加のステータスとして報告するだけです。既存の GitHub Actions のチェックを省略・代替せず、必須チェックを満たしたことにもなりません。
bin/cloud-ci は必要に応じてクラウドで手動再実行するための任意のコマンドです。通常の GitHub Actions の自動実行を起動するために使う必要はありません。GitHub CLI の認証と Actions を実行できる権限がある環境で、現在のブランチを origin に push してから実行します。
bin/cloud-ciorigin のリポジトリと現在のブランチを明示して、既存の ci.yml を手動実行します。作業ツリーが変更済み、detached HEAD、未 push、またはローカルとリモートの HEAD が異なる場合は実行しません。Git の確認や GitHub CLI が失敗した場合は失敗で終了します。このコマンドは workflow の起動までを行い、完了は待ちません。
次のコマンドでlintを実行します。
$ bin/lint
実行されるlint
- Ruby
- rubocop
- slim-lint
- JavaScript
- eslint
- prettier
- eslintの警告は以下のコマンドで修正されますが、修正されない場合は手動で修正してください。
$ npx eslint 'app/javascript/**/*.{js,vue,jsx}' --fix- prettierの警告が出ている場合には、以下のコマンドで修正できます。
$ npx prettier app/javascript/**/*.{js,vue,jsx} --writerack-mini-profilerによりプロファイリングはデフォルトではOFFになっています。ONにする場合は下記のようにサーバーと立ち上げます。
$ PROFILE=1 rails server