- rlimit
- isolate
- 下载
- curl -L -o isolate.zip https://github.com/ioi/isolate/archive/refs/heads/master.zip
- git clone https://github.com/ioi/isolate.git
- 安装依赖
- yum install -y libcap-devel
- apt update && apt install -y libcap-dev
- make install
- 清理
- rm -rf /var/lib/apt/lists/*
- 多文件支持?
- 包安装
-
沙箱包装实现
-
文件管理
-
多个测试样例
-
编译支持
-
解压打包的代码
- zip
-
自定义 初始化和验证步骤
-
自动扩缩容
-
多语言
- JavaScript
- Python
- C++
docker run -it --rm --privileged registry.cn-shanghai.aliyuncs.com/codev/js-executor:0.0.1 bash
docker run -it --rm --privileged -v C:\Users\85761\repo\code-validator\configs:/app/configs registry.cn-shanghai.aliyuncs.com/codev/python-actuator:0.0.1 bash
docker run -it --rm --privileged -v C:\Users\85761\repo\code-validator\configs:/app/configs -p 8001:8001 registry.cn-shanghai.aliyuncs.com/codev/python-actuator:0.0.1 dispatcher概念
- sandbox:安全可控的执行用户操作
- pipeline:控制一系列sandbox中的操作,管理对外界文件的可见性
- performer:本质是对pipeline的封装,实现 初始化-运行-验证 流程,对语言进行抽象,循环处理测试用例
- manager:对众多performer进行管理,提供新建验证任务,查询验证任务等接口
- 编排了一个js语言的作业验证流程
- 自定义
- 使用提供的模板
- 上传必要的文件(后台会解压并解析文件,排除基础的格式错误,上传的文件被存储到oss)
- n个测试样例
- 输入
- 输出
- m个待评测的程序源码
- n个测试样例
- 点击运行,batch消息被存储到数据库
- 发送m条任务消息到消息队列
- worker接受到消息,开始运行任务
- 收集的任务结果会被存储到数据库
- 任务日志会被存储到oss
- 支持的查看操作
- 查看batch的统计图表
- 查看batch的验证任务列表,支持一些排序和筛选
- 查看batch的某个验证任务的结果,包括耗时、内存占用、测试样例通过情况,支持在线查看代码文件
- 重试机制,如果是内部错误,则尝试重新运行task
支持其他人将测试文件上传到这个batch吗?
一个缓存库,从minio到本地
使用rabbitmq路由模式,管理不同语言实例
多语言支持
模板支持,处于配置文件
传统校验*测试样例数量
- 可选init
- 可选解压
- 执行代码
- 验证结果
额外校验
- 可选init
- 可选解压
- 验证
测试用端口号
- dispatcher:8001
- user:8002
- result:8003
- actuator:8004
概念关系
- batch:验证任务,包括多个验证项
- verification:验证项
- task:对于一个验证任务创建的任务实例,包含一份用户输入的代码文件,并引用了batch
- subtask:对验证项的实例化,归属与task,引用了verification。是执行器执行的最小单元,保存了执行状态和执行结果
oss路径规则
- verification包含的文件
已完成内容
- 中间件对接(100%)mysql、minio、rabbitmq
- 各个微服务(40%)完成用户服务,正在编写核心的分发和执行服务,执行服务基本完成
- 前端(5%)完成框架选择和基本的代码执行demo UI
- 整体k8s部署(0%)
总体进度估计为(30%)
下一个阶段目标
- 完成执行和分发微服务(预计2月17开学前完成)
- UI(开学后开始)
当前问题:验证任务的执行结构需要优化一下,使得代码验证和自定义验证的结构统一
需要内部解压缩的逻辑
- 代码
- 测试样例
通过指定一个额外的oss路径实现
格式定义
- 测试样例(下列方式可并存)
- 压缩包
- Name.int
- Name.out
- 手动输入
- 压缩包
- 验证结果
- message文件
- result文件