近期发现一个问题,hudson执行任务时,经常不能获取到最新的代码,从而导致出现各种问题。
日常开发中的典型例子:发现一个bug,修改代码,本地测试通过,提交代码到subversion,手工激活hudson构建,原本期望hudson获取到刚刚提交的代码并测试/打包/发布。结果事与愿违,测试的结果发现刚刚做出的修改似乎没有生效。正费解之时,再执行一次hudson构建,又成功了...
经历过几次上述蹊跷遭遇之后,发现这个问题不是偶然。之后检查hudson的日志,发现问题的发现在最开始update / check out subversion代码时,明明已经提交的代码,hudson做update / check out时,居然没有update / check out下来!显示的subversion版本号也和subversion上实际的最新版本不一致,hudson总是要小一些,换言之,hudson update / check out的代码要比当前最新代码老一些。
google一番,发现这个问题之前就有人遭遇过,hudson上甚至已经有了好几个关于这个问题的bug,比如 http://issues.hudson-ci.org/browse/HUDSON-1241 "force using HEAD SVN version for build"。问题的根源在于hudson 获取subversion代码的方式,hudson是通过时间戳的方式来获取代码,而不是我们一般认为的"最新代码"即"HEAD"。这种方式通常没有问题,因为获取当前时间戳,然后要求update / checkout这个时间戳前的代码,理论上也是可以拿到最新代码的。
但是,如果hudson所在的服务器和subversion服务器时间不一致,这个机制就会出现问题:
我们假设subversion服务器的时间是准确的,再假设当时时间是15:10分,开发人员A提交代码,subversion上当前这个最新提交的代码时间戳为15:10:00。然后开发人员A手工激活hudson进行构建。hudson在15:10:20时开始check out代码。如果hudson时间无误,则hudson会发出请求说要求获取时间戳在15:10:20之前的代码,这样这个实际提交时间为15:10:00的新代码就可以如期的被check out。但是如果hudson的时钟有误,由于某些原因导致时钟偏慢2分钟,即在hudson上,"当前时间"为"15:08:20",则hudson获取代码的请求为:获取时间戳为15:08:20之前的代码,此时时间戳为15:10:00的新代码就无法checkout。
几分钟之后,疑惑的开发人员A再次激活hudson再次构建,假设此时时间时间是15:15:00,hudson慢两分钟为15:13:00。此时hudson发出请求: 获取时间戳为15:13:00之前的代码, 因此实际提交时间为15:10:00的新代码可以正常checkout,问题又在不知不觉被回避了。
总结说,hudson 获取代码的机制不是我们直觉中的获取最新代码(即subversion中HEAD checkout),而是基于时间戳。由于这个方式通常如HEAD般工作,因此我们总是容易误解为是获取最新代码。当hudson的时钟晚于subversion时,悲剧就出现了。
对这个问题,有几点疑惑:
1. 不明白为什么hudson不采用最直接最简单最容易被人理解最不容易出误解的HEAD checkout,而要基于时间戳
2. 这个问题很早就发生了,上面提到的bug 08年就被人提出, "Created: 31/Jan/08 05:37 AM Updated: 01/Jul/10 11:06 AM",三年了类似的bug被多次提出,但是就是始终没有修复。
修复的方式很简单,就改一个类的一行代码
in Class: hudson.scm.SubversionSCM
line 377:
final SVNRevision revision = SVNRevision.create(timestamp);
replace to:
final SVNRevision revision = SVNRevision.HEAD;
hudson拒绝修复的理由是什么?
分享到:
相关推荐
Hudson+Visual Studio+SubVersion 远程编译环境搭建。 mht文档,用浏览器打开。
【Hudson平台搭建及使用详解】 Hudson是一个开源的持续集成(CI)服务器,它提供了一种自动化构建、测试和部署软件的解决方案。Hudson以其简单易用和丰富的插件功能而受到赞誉,使得项目管理和配置变得更加高效。...
【Hudson 学习教程】 Hudson 是一款强大的持续集成工具,主要负责自动化软件的构建、测试和部署任务。它的核心功能包括持续构建/测试、RSS/邮件/即时消息通知、Junit/TestNG 测试报告生成、分布式构建支持以及丰富...
【集成工具Hudson与Maven2的Hudson安装及配置】 持续集成(Continuous Integration, CI)是一种软件开发实践,强调开发人员频繁地将他们的代码更改集成到主分支,以尽早发现并解决潜在的问题。Hudson是一款开源的...
4. **Team Foundation Server Plugin**:集成Microsoft Team Foundation Server源码控制至Hudson中。 5. **CMVC Plugin**:集成CMVC,一个在IBM和其他跨国公司中流行的缺陷管理工具。 6. **FileSystem SCM**:允许...
【正文】 ...通过正确配置,Hudson能够帮助团队实现持续构建、测试,及时发现和修复问题,确保软件质量。同时,通过插件和分布式构建的支持,Hudson可以适应各种复杂的项目环境,满足不同团队的需求。
不知道怎么回事,hudson下载插件下载不下来,找了好久的checkStyle,在网上下载了都用不了。 后面偶然发现hudson又可以自动下载插件了。 checkStyle插件需要 analysis-core 支持,所以提供的下载包里面都放进去了, ...
【标题】"Hudson SVN Maven 自动构建"指的是在持续集成环境中使用Hudson(现在称为Jenkins)作为工具,结合Subversion(SVN)作为版本控制系统,Maven作为项目管理和构建工具,实现代码的自动构建过程。这个流程的...
在本教程中,我们将深入探讨如何配置和使用Hudson。 首先,为了运行Hudson,你需要准备以下组件: 1. **Apache Tomcat 7.0 以上版本**:Hudson作为一个Web应用程序,需要一个Servlet容器来运行,Apache Tomcat是一...
它的核心理念是通过频繁的构建来确保软件的质量,尤其在大型项目中,这种频繁的集成能有效避免代码冲突,及时发现并修复问题,从而提高开发效率。 持续集成(Continuous Integration,CI)是软件开发过程中的一个...
- **客户端配置**:安装Subversion客户端工具,以便在Hudson中配置源码管理模块。 3. **Hudson服务器启动**: - **下载Hudson**:访问官方网站下载最新版本的Hudson安装包。 - **启动Hudson**:通过命令行执行...
- 如果在访问Hudson时遇到权限问题,可能需要检查Tomcat用户的权限设置。 - 对于企业级应用,建议使用更高级别的安全措施,如SSL加密等。 - Hudson的插件市场非常丰富,可以根据实际需求安装相应的插件来扩展功能。 ...
Hudson,作为一个开源的持续集成工具,被广泛应用于软件开发过程中,以提升效率,减少错误,并确保代码质量。在本教程中,我们将深入探讨Hudson的各个方面,包括安装配置、构建触发、测试集成以及自动化部署。 首先...