HelloJudge2-Judger
介绍
HelloJudge2评测机
部署指南
前置需求
一台装有任意Linux系统的机器(可以不是x86)
Python3.6+
Docker
g++
boost_python
过程
首先
使用git将本项目clone到本地。
把config_default.py复制一份,改名为config.py。
使用pip3 install -r requirements.txt安装依赖。
构建Docker镜像
在./docker目录下执行docker build .,就会开始自动构建评测所需要使用的Docker镜像。
这个过程需要保证网络畅通。
国内用户若网络不稳定或构建过程中速度较慢可修改./docker/DockerFile
将
# RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
改为
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
构建完成后请记录下镜像ID
构建watcher
评测端使用一个由C++编写的Python扩展来监控程序的运行时间。
编译此扩展需要boost_python的支持。
对于Ubuntu,可以使用apt install libboost1.65-all-dev进行安装。
然后在./watcher目录下运行compile.sh即可。
其他
如果不想在同一台评测机实例上同时进行本地评测和远程评测,那么请务必保证本地评测与远程评测不使用同一个消息队列。
运行
执行celery -A main worker即可。
如果在Windows下运行,则为celery -A main worker -P eventlet.
本地评测只支持在Linux下使用,远程评测可以在Windows下使用。
配置文件
REDIS_URI
Web端所连接的Redis的URI。
DATA_DIR
评测数据存放的目录。
相对于当前所在的目录
WEB_URL
Web端访问的URL
JUDGER_UUID
此评测机的UUID
DOCKER_IMAGE
构建的Docker镜像名
ENABLE_LOCAL_JUDGE
在本评测机实例上启用本地评测.
ENABLE_IDE_RUN
在本评测机实例上启用在线IDE评测.
其他
评测数据会在收到评测请求时通过校对时间戳的方式与Web端进行同步。
如果Web端的评测数据有更新则会自动拉取。
语言配置会在收到评测请求时从Web端拉取。
与Web端添加语言的配套
Web端语言配置文件中的命令行均在评测的容器中执行,故所有相关的修改请自行构建镜像。
Remote Judge 开发指南
如果您需要编写自己的Remote Judge实现,那么至少要做以下几点:
客户端实现
一个Python模块,其中包括一个继承自judgers.remote_runners.common.JudgeClient并至少实现了check_login_status,create_session,login,submit,get_submission_status,fetch_problem,as_session_data的对象。
同时该模块中必须有一个顶级函数get_judge_client,用于返回评测客户端的class
关于各个函数的意义见下文
在main.py中注册
在main.py中的JUDGE_CLIENTS中添加你所创建的评测客户端的实例。
在Web端添加
在Web端配置文件中REMOTE_JUDGE_OJS添加相应的OJ配置。
其中Key为该OJ的ID,display为该OJ在前端的显示名,availableLanguages为该OJ提交可用的语言,其中Key为传递给submit函数的语言ID,display为该语言的显示名,aceMode为ACE.js所使用的高亮配置。
JudgeClient中的各个函数
见代码中注释。
JudgeClient各个函数中的session参数
session会被存储到数据库中,作为用户登录远程OJ的凭证。
同时在调用JudgeClient的部分函数时也会传入session参数。
开发者需提供自己的session实现。
session实现必须提供as_dict方法,来将此session对象序列化为dict以便存储进数据库。
同时JudgeClient必须提供as_session_data函数,以便将dict反序列化为当前客户端所使用的session对象。