要点:代码跟队伍走不跟角色走,编译跟代码走不跟比赛走,比赛跟角色走不跟代码走
流程描述(分工)
- 代码提交
- 选手在代码管理页面点击上传/拖入文件上传
AI.cpp或AI.py - 前端识别编程语言,并在数据库
contest_team_code表插入新行,返回得code_id - 前端根据
${code_id}.${lang}重命名文件并上传至cos,上传路径见COS存储桶访问路径约定 - 若语言为解释型语言(
py),则前端更改数据库compile_status为No Need(可与第二步合并) - 若语言为编译型语言(
cpp),则前端向后端发请求/code/compile-start(见后),使后端开始编译代码 - 后端下载
cos上的代码文件,在服务器上启动编译docker,并在数据库中更新compile_status为Compiling- 选手代码文件在
cos中,后端需要从cos上临时下载队伍的代码到后端服务器上。后端服务器存储空间有限,需要定期清理下载的队伍代码和文件。 - 后端服务器和
docker服务器是分离的,docker服务器并不能直接获取队伍代码。因此,后端服务器与docker服务器之间通过NFS进行文件共享,docker服务器自动同步了队伍文件。(备注:建议提前服务器之间组内网减少流量费。)
- 选手代码文件在
docker完成编译后,请求后端/code/compile-finish路由(见后)。若编译成功无报错,后端在数据库中更新compile_status为Completed;若编译出错,后端在数据库中更新compile_status为Failed- 后端将
docker生成的可执行文件${code_id}与${code_id}.log上传至cos,同代码文件夹 - 前端通过
subscription实时更新compile_status
- 选手在代码管理页面点击上传/拖入文件上传
- 代码重命名
- 前端页面上和数据库中的
code_name是代码文件上传的原名,仅作展示和下载时的命名之用,与后端和cos没有关系。用户可以修改这个名字来做版本管理,仅需前端修改数据库contest_team_code表即可。
- 前端页面上和数据库中的
- 编译日志获取
- 前端直接下载
cos上对应${code_id}.log
- 前端直接下载
- 代码删除
- 用户在前端点击删除某份代码文件后,前端先删除
cos上的${code_id}.${lang}、${code_id}.log和${code_id}可执行文件 - 删除成功后,前端再修改数据库删除行,最后提示删除成功
- 用户在前端点击删除某份代码文件后,前端先删除
- 角色代码选择
- 选手可以选择当时当刻进行天梯和比赛使用的代码,选择好后更新数据库
contest_team_player表
- 选手可以选择当时当刻进行天梯和比赛使用的代码,选择好后更新数据库
后端路由路径
/code/compile-start:下载代码文件并启动编译镜像。- 请求方法:
POST - 请求:
body中有{code_id: uuid}(携带个人信息token) - 响应:
200:200 OK: Create container success - 错误:
422:422 Unprocessable Entity: Missing credentials(请求缺失参数)404:404 Not Found: Code unavailable(无法成功下载代码)400:400 Bad Request: Interpreted language do not require compilation.400:400 Bad Request: Unsupported language.400:400 Bad Request: Code already compiled.403:403 Forbidden: User not in team403:403 Forbidden: User not in team409:409 Confilct: Code already in compilation(代码正在或已编译)500:undefined(其他内部错误,返回报错信息)
- 请求方法:
/code/compile-finish:代码完成编译的hook,在docker结束前调用。更新编译状态并保存可执行文件和log。- 请求方法:
POST - 请求:
body中有{compile_status: string},且将启动docker时传入的token传回 - 响应:
200:200 OK: Update compile status success - 错误:
422:422 Unprocessable Entity: Missing credentials(请求缺失参数)400:400 Bad Request: Invalid compile status.401:401 Unauthorized: Missing token.401:401 Unauthorized: Token expired or invalid.500:undefined(返回报错信息)
- 请求方法:
与赛事组的约定
- 编译代码的
docker每次启动只编译一份代码,且只需考虑编译型语言(如cpp)的代码 docker启动时代码文件绑定在/usr/local/code文件夹下,编译产生的可执行文件和log请保存到/usr/local/output文件夹(命名与代码文件前缀相同)docker启动时会设置环境变量URL,TOKEN,LANG(目前默认是cpp),编译完成后需要请求URL(实际上是/code/compile-finish),请求时需要在header中加上TOKEN,请求的body中需包括代码编译的状态compile_status: string,取值为Completed或Failed