要点:代码跟队伍走不跟角色走,编译跟代码走不跟比赛走,比赛跟角色走不跟代码走
流程描述(分工)
- 代码提交
- 选手在代码管理页面点击上传/拖入文件上传
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 team
403
:403 Forbidden: User not in team
409
: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