好吧,这听起来可能有点奇怪,但就是这样。
我在本地大学教授数据结构和算法实验室,希望为我的学生提供流畅而有趣的体验。到目前为止,我使用的是一个简单的 git 存储库,每个学生都 fork,每当他们完成作业时,他们都会发出推送 + pull 请求,我会审查他们的代码,如果一切正常,我会将 pull 请求 merge 到主 repo 。这工作得很好,但我想做一些更有趣的事情。
该实验室正在使用 C(甚至不是 C++)进行教学(不,我不想就为什么另一种语言会更好进行任何争论)。我想要做的是在学生进行的每次推送时运行类似 Jenkins 构建的东西,以验证手头任务的一些预定义测试。
例如,在第 2 周,我会给他们布置带有列表的家庭作业。我想自己为这个作业编写测试,然后自动验证他们使用这些测试做了什么。
我有什么:
- 24/7 运行 CentOS 机器,我可以用它来放任何东西(我有 Jenkins 和 Tomcat 在它上面运行 atm)
- 有足够的时间和意志力让他们在这个实验室的经历变得物有所值
++ 所有这一切的一个非常好的“附加组件”将是使用 Sonar 之类的东西作为代码验证器并检查其分支内的重复代码(以查看是否有人复制了其他人的答案)
我选择 Jenkins 服务器、考虑 Sonar 等是否走在正确的轨道上?我走远了吗? 我不认为这是不可能的。是的,这可能很难,但这很有趣 ^^
我想要的“流程”是:
- 每个学生都是 git 组织的一部分 + repo
- 他们从本地 master 创建一个分支(我会施加一个限制,比如“只使用你名字的子文件夹”)
- 主分支将包含测试
- 他们将在他们的分支上完成他们的家庭作业,然后将其推送给 Jenkins/Gerrit/其他
- 分支将以某种方式进行测试,如果所有测试都通过,它将与主分支 merge 。
我代表我亲爱的同学们,谢谢你们。
最佳答案
TL;DR:是的,您想做的事情是可行的,并且您已经在寻找正确的工具。
你想要的似乎完全可行:安装 Git plugin对于 Jenkins,将其配置为跟踪 repo 的每个分支,并且已经可以在每次推送后启动构建。
由于您可以在 Jenkins 构建期间执行任意脚本,因此您可以向 Jenkins 用户授予推送权限,并在所有测试通过时 merge 并推送代码。
然后你也可以安装 Sonar 服务器,并通过Sonar plugin调用它。 ,您的学生将获得此额外反馈。
另一方面,Gerrit 对于您正在寻找的东西来说可能有点矫枉过正。或者更确切地说:它是一个有值(value)的工具,但我相信您在第一次迭代时不需要它。
我可以想到两种类型的困难:
- 脚本/边角案例
- 是否要防止学生玩弄系统
对于 (1),我的意思是您需要实现您的规则(例如“只构建属于最后一个提交者的子文件夹”;“不要在 master 上构建 merge 提交”;...) .您可能会遇到以下问题:
- 您不希望在 Jenkins 作业刚刚推送的 merge 提交上运行新的 Jenkins,因此您必须在构建脚本中考虑到这一点
- 如果你想允许多个 Jenkins 同时运行,并且两个运行尝试同时 merge 和推送怎么办
我想您只需要在发现这些故障时对其进行修复即可。想想创建 backups您的 Jenkins 配置(您也可以将它们存储在临时的 git 存储库中)。
对于 (2),我的意思是您可能想要考虑,例如,学生将从存储库中删除他的实现无法通过的测试的情况。或者直接push master的学生的情况。
我相信你可以添加很多检查来防止这种作弊,但是,与其陷入“技术冲突”,我想直接告诉他们你信任他们会更健康。
关于git - 学生作业的持续集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28390462/