jjzjj

git - 学生作业的持续集成

coder 2023-06-25 原文

好吧,这听起来可能有点奇怪,但就是这样。

我在本地大学教授数据结构和算法实验室,希望为我的学生提供流畅而有趣的体验。到目前为止,我使用的是一个简单的 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. 脚本/边角案例
  2. 是否要防止学生玩弄系统

对于 (1),我的意思是您需要实现您的规则(例如“只构建属于最后一个提交者的子文件夹”;“不要在 master 上构建 merge 提交”;...) .您可能会遇到以下问题:

  • 您不希望在 Jenkins 作业刚刚推送的 merge 提交上运行新的 Jenkins,因此您必须在构建脚本中考虑到这一点
  • 如果你想允许多个 Jenkins 同时运行,并且两个运行尝试同时 merge 和推送怎么办

我想您只需要在发现这些故障时对其进行修复即可。想想创建 backups您的 Jenkins 配置(您也可以将它们存储在临时的 git 存储库中)。

对于 (2),我的意思是您可能想要考虑,例如,学生将从存储库中删除他的实现无法通过的测试的情况。或者直接push master的学生的情况。

我相信你可以添加很多检查来防止这种作弊,但是,与其陷入“技术冲突”,我想直接告诉他们你信任他们会更健康。

关于git - 学生作业的持续集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28390462/

有关git - 学生作业的持续集成的更多相关文章

  1. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  2. ruby-on-rails - 我如何将 Hoptoad 与 DelayedJob 和 DaemonSpawn 集成? - 2

    我一直很高兴地使用DelayedJob习惯用法:foo.send_later(:bar)这会调用DelayedJob进程中对象foo的方法bar。我一直在使用DaemonSpawn在我的服务器上启动DelayedJob进程。但是...如果foo抛出异常,Hoptoad不会捕获它。这是任何这些包中的错误...还是我需要更改某些配置...或者我是否需要在DS或DJ中插入一些异常处理来调用Hoptoad通知程序?回应下面的第一条评论。classDelayedJobWorker 最佳答案 尝试monkeypatchingDelayed::W

  3. jenkins部署1--jenkins+gitee持续集成 - 2

    前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon

  4. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  5. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  6. ruby-on-rails - 在所有延迟的作业之前 Hook - 2

    是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述

  7. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

    关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

  8. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

    我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

  9. ruby - 让 bundler 使用 http : instead of git:? - 2

    我正在安装gitlabhq,并且在Gemfile中有对某些资源的“git://...”的引用。但是,我在公司防火墙后面,所以我必须使用http://。我可以手动编辑Gemfile,但我想知道是否有另一种方法告诉bundler使用http://作为git存储库? 最佳答案 您可以通过运行gitconfig--globalurl."https://".insteadOfgit://或通过将以下内容添加到~/.gitconfig:[url"https://"]insteadOf=git://

  10. ruby - Sinatra session 未按预期持续 - 2

    我正在尝试使用Sinatra中的重定向和session在网站周围传递一些数据。这是一个简化的示例,使用PrettyPrint进行调试:require'pp'require'rubygems'require'sinatra'enable:sessionsget'/'dosession[:foo]='12345'puts'session1'ppsessionredirectto('/redir')endget'/redir'doputs'session2'ppsession'helloworld'end查看Thin的输出,我看到:>>Listeningon0.0.0.0:4567,CTRL

随机推荐