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