Course Grader
学生 git push,可信流水线在离线沙箱里给这次提交判分,成绩以只新增的记录存进 Git,老师和学生在门户里看结果。Students git push; a trusted pipeline grades that exact commit in an offline sandbox, the result is stored as an append-only record in Git, and teachers and students see it in a web portal.
演示用合成数据,选老师或学生身份即可浏览每个页面;改动不会保存。隐藏测试和参考答案不在演示里。Synthetic data; pick the teacher or a student and click through every page. Changes are not saved. Hidden tests and reference solutions are not part of the demo.

单台主机、合成学生;每个数字都注明测的是哪一段。One host, synthetic students; each number says what it measures.
GitLab 是唯一的数据来源,门户只是读出来的视图。GitLab is the source of truth; the portal is a view of it.
私有仓库,按服务器接收时间判断是否按时to a private repo; on-time is judged by the server's receive time
webhook 触发 cg dispatch,学生改不了判分配置a webhook starts cg dispatch; students cannot change grading
无网络、只读、非 root、去掉全部 capability、资源限额no network, read-only, non-root, no capabilities, resource limits
只新增的 JSON 提交,记下提交、判分器版本、镜像摘要append-only JSON commit naming the commit, grader version and image digest
学生看公开用例详情和隐藏类别总分;老师看全班students see public-test detail and hidden-category totals; staff see the class
截图来自上面的演示(合成数据)。Taken from the demo above (synthetic data).




用静态 C 程序作容器 PID 1 跑每个用例,用例之间核验清理;任何一步无法确认就退回逐用例容器,只会更快、不改分数。A static C program runs each case as PID 1 and verifies clean-up between cases; anything unconfirmed falls back to a container per case, so it is only ever faster, never a different score.
TestGuard 用参考解答做差分,找出太松或太严的测试;在一次真实小测里发现测试过严,修正后重判。TestGuard diffs against the reference solution to find tests that are too loose or too strict; it caught a too-strict real quiz, fixed and regraded.
网页里读题、写代码、运行、终端、提交,结果当场显示;自测、笔记、求助,学生的私人学习数据老师看不到。Read, edit, run, terminal and submit in the browser, with results in place; self-tests, notes and help requests, private to the student.
判分器只新建记录;重判是新文件;老师的认定、调整、发布都写审计。The grader only creates records; a regrade is a new file; finalizing, adjusting and publishing are audited.
一条命令在一台 Ubuntu 服务器上装好 GitLab、门户、HTTPS、Runner 和每日备份。One command sets up GitLab, the portal, HTTPS, runners and nightly backups on an Ubuntu server.
983 个 Python 测试、113 个前端单测、92 个页面的浏览器截断检查。983 Python tests, 113 frontend unit tests and a 92-page browser clipping check.