最近我们遇到了一些问题,即开发人员将代码提交给SVN但没有通过单元测试,无法在所有平台上编译,甚至无法在自己的平台上编译.虽然这一切都被我们的CI服务器(巡航控制)所取代,并且我们已经制定了试图阻止它发生的流程,但我们真的希望能够阻止流氓提交首先发生.
基于此处的一些其他问题,在服务器端强制将其作为预提交挂钩似乎是一个坏主意,主要是由于构建+运行测试所需的时间长度.我做了一些谷歌搜索并发现了这个(所有开发者都使用TortoiseSVN):
http://cf-bill.blogspot.com/2010/03/pre-commit-force-unit-tests-without.html
哪个会解决至少两个问题(它不会在Unix上构建),但如果失败则不会拒绝提交.所以我的问题:
有没有办法在TortoiseSVN中进行预提交挂钩导致提交失败?
有没有更好的方法来做我一般要做的事情?
David W... 21
绝对没有理由为什么你的预提交钩子不能运行单元测试!你所有的预提交钩子必须做的是:
将代码签出到工作目录
编译一切
运行所有单元测试
如果单元测试失败,则失败.
这是完全可能的.而且,之后,开发商店的每个人都会讨厌你的胆量.
请记住,在预提交挂钩中,整个挂钩必须先完成,然后才能允许提交,并且可以将控制权返回给用户.
构建并运行单元测试需要多长时间?10分钟?想象一下做一个提交并坐在那里等待你的承诺发生10分钟.这就是为什么你被告知不要这样做的原因.
您的持续集成服务器是进行单元测试的好地方.我更喜欢Hudson或Jenkins而不是CruiseControl.它们更易于设置,并且其网页更加用户友好.更好的是他们有各种各样的插件可以提供帮助.
开发人员不喜欢知道他们打破了构建.想象一下,如果您组中的每个人都收到一封电子邮件,说明您提交了错误的代码.在你提交代码之前,你不确定你的代码是否良好?
Hudson/Jenkins有一些很好的图表,可以显示单元测试的结果,因此您可以从网页上看到测试通过和失败的情况,因此很清楚究竟发生了什么.(CruiseControl的网页对于普通的眼睛来说更难以解析,因此这些事情并不那么明显).
我最喜欢的Hudson/Jenkins插件之一是持续集成游戏.在这个插件中,用户可获得良好构建,修复单元测试以及创建更多传递单元测试的分数.他们因糟糕的构建和破坏单元测试而失去积分.有一个记分板,显示所有开发人员的积分.
我很惊讶开发人员如何认真对待它.一旦他们意识到他们的CI游戏分数是公开的,他们就变得非常有竞争力.当构建服务器本身因某些奇怪的原因而失败时,他们会抱怨,并且他们因为糟糕的构建而丢失了10分.但是,失败的单元测试数量逐渐下降,并且写入的单元测试数量猛增.
绝对没有理由为什么你的预提交钩子不能运行单元测试!你所有的预提交钩子必须做的是:
将代码签出到工作目录
编译一切
运行所有单元测试
如果单元测试失败,则失败.
这是完全可能的.而且,之后,开发商店的每个人都会讨厌你的胆量.
请记住,在预提交挂钩中,整个挂钩必须先完成,然后才能允许提交,并且可以将控制权返回给用户.
构建并运行单元测试需要多长时间?10分钟?想象一下做一个提交并坐在那里等待你的承诺发生10分钟.这就是为什么你被告知不要这样做的原因.
您的持续集成服务器是进行单元测试的好地方.我更喜欢Hudson或Jenkins而不是CruiseControl.它们更易于设置,并且其网页更加用户友好.更好的是他们有各种各样的插件可以提供帮助.
开发人员不喜欢知道他们打破了构建.想象一下,如果您组中的每个人都收到一封电子邮件,说明您提交了错误的代码.在你提交代码之前,你不确定你的代码是否良好?
Hudson/Jenkins有一些很好的图表,可以显示单元测试的结果,因此您可以从网页上看到测试通过和失败的情况,因此很清楚究竟发生了什么.(CruiseControl的网页对于普通的眼睛来说更难以解析,因此这些事情并不那么明显).
我最喜欢的Hudson/Jenkins插件之一是持续集成游戏.在这个插件中,用户可获得良好构建,修复单元测试以及创建更多传递单元测试的分数.他们因糟糕的构建和破坏单元测试而失去积分.有一个记分板,显示所有开发人员的积分.
我很惊讶开发人员如何认真对待它.一旦他们意识到他们的CI游戏分数是公开的,他们就变得非常有竞争力.当构建服务器本身因某些奇怪的原因而失败时,他们会抱怨,并且他们因为糟糕的构建而丢失了10分.但是,失败的单元测试数量逐渐下降,并且写入的单元测试数量猛增.