实现一个基于Git的存储和自动构建服务

1 · Reverier Xu · April 10, 2023, 3:45 a.m.
在后端处理题目方面,我经过长时间思索,最后感觉整个模型就是一个 Git + CI/CD。出题人通过 Git 将题目部署上去,然后平台自动根据对应的 Checker 类型来执行构建操作,并根据构建结果来确认题目状态,在选手访问题目时,就可以直接提供服务。这样一来,整套题目服务系统就能够高度自动化运作,出题人只需要写好build脚本,设置一下题目相关的配置文件然后推送上去就可以了。 但是…… Rust下面没有能够直接提供远程Git服务的crate啊,有一个libgit2的绑定,libgit2本来就没有服务端功能;有一个gixoide,大部分功能还在alpha…… 于是我根据Git文档手撸了一份HTTP协议处理。好,接下来是另一个大问题,内部协议怎么办?我总不能从头开始实现一个git吧…… 遇事不决看看现有方案怎么做的。于是我打开了Gitea。Gitea告诉我,你可以 subprocess.popen(“git”) …… 传输协议 首先实现拉取与推送操作,这样出题人可以直接使用git和比赛平台上的仓库进行交互。根据Git内部传输协议,一次远程交互过程从数据文件协商开始。以git-fetch...