简单的说就是 Hudson 的 Subversion 是根据时间戳来获取代码(只获取比Hudson 服务器当前时间早的代码)。如果Hudson 服务器和 Subversion 服务器上的时间不同步,尤其是Hudson 服务器慢于 Subversion 服务器就会产生问题(问题是某些在 Hudson 服务器上的时间之后的change 不能被同步下来)。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
hudson中subversion HEAD check out 的问题及疑惑
近期发现一个问题,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拒绝修复的理由是什么?
分享到:
相关推荐
2. **CI服务器创建项目工作区**,获取仓库最新代码。 3. **执行构建过程**,在工作区内完成编译。 4. **运行测试**,若失败,发送通知给相关人员。 5. **成功构建后,构件打包并部署或存储为新版本**。 6. **CI...
- **持续集成**:Hudson 可以监控版本控制系统(如 Git、SVN 等),一旦检测到代码变更就会自动触发构建。这种机制确保了代码库中的最新版本始终处于可部署状态。 - **插件扩展**:Hudson 拥有丰富的插件生态系统,...
- **版本控制集成**:Hudson可以与Git、SVN等版本控制系统集成,自动获取代码变更。 - **构建触发器**:支持多种触发方式,如定时触发、代码提交触发等,确保每次代码更新后都能快速进行构建。 - **构建与测试**...
10. **Source Code Management Repository URL**:填写代码仓库的URL,Hudson将据此获取和更新源代码。 11. **Local module directory (optional)**:可选地,你可以指定源码签出到工作区的特定目录。 12. **Build...
如果对M2的概念不熟悉,可以参考Maven官方网站获取更多信息。\n2. 安装Hudson组件,详情可参考Hudson官方网站。\n\n**主要组件**\n- `setting.xml`:这是Maven的全局配置文件,定义了全局变量、引用和资源位置。它...
2.1.1.zip"与"Hudson REST API"相关,而"jboss-jsf-api_spec.zip"和"javaserver(tm)面向基于规范jboss jsf api spec版本2.1的api类"则涉及到了JavaServer Faces 2.1规范的实现,这些都是在Java Web开发中不可或缺...
6. **持续集成集成**:JDepend可以与其他持续集成工具(如Jenkins、Hudson)结合,将代码质量检查纳入到自动化构建流程中,确保代码在提交时就满足预设的质量标准。 在提供的压缩包文件“jdepend”中,包含了...
它提供了与Dimensions SCM服务器通信的能力,获取最新的代码更改,跟踪版本,以及更新构建状态。这使得开发团队能够利用Jenkins的强大功能,同时保持与Dimensions SCM的无缝集成。 在Java开发环境中,使用Jenkins和...
同时,由于版本号较早,使用时需要关注是否与当前的开发工具和框架兼容,可能需要升级到更现代的版本以获取最新的特性和服务。 开源软件是Hudson Easy Bundle 的一个重要标签,这意味着该项目的源代码是公开的,...
Hudson-FairScheduler将其理念引入到Hudson中,使得资源分配更加公正,避免了单一作业独占资源的情况,提高了整体的并发性和系统效率。这个插件通过将任务队列划分为多个子队列,每个子队列对应一个项目或者项目组,...
通过分析Cobertura-1.9的源代码,我们可以学习到如何实现这样的代码覆盖率工具,以及如何与其他开发工具进行交互。如果你是Java开发者,尤其是负责测试或质量保证的人员,理解和使用Cobertura将对你的工作大有裨益。
通过访问<https://git.eclipse.org/r/hudson>,你可以获取到哈德逊的3.x版本,这个版本是在哈德逊2.x基础上的进一步发展,可能包含了更多的功能增强和性能优化。不过,从"标题"中提到的信息来看,这里我们主要关注的...
与传统持续集成工具(如Hudson/Jenkins)相比,Sonar不仅仅是在Web界面上直接展示各种代码检查工具的结果,而是通过插件对这些结果进行深加工,采用量化指标来衡量代码质量的变化,从而实现了更加精细化的代码质量...
完成上述配置后,Jenkins能够自动从SVN获取代码,执行构建任务,并触发测试。对于特定的工具,如静态代码检测工具cppcheck、单元测试框架gtest,还需要在Jenkins的项目配置中添加相应的构建步骤,指定执行脚本和解析...
5. **代码检入/检出**:在MyEclipse中,可以使用“Checkout”操作获取项目代码,将远程仓库中的项目导入本地工作空间。同样,通过“Commit”操作,可以将本地修改过的代码提交回仓库,实现版本控制。 6. **解决冲突...
版本号"0.9.14"表示这是该插件的一个具体版本,用户可以根据实际需求选择安装相应版本,或者升级到最新版本以获取更多改进和新功能。 总的来说,"eclipse的freemarker插件"是Eclipse开发环境中不可或缺的工具之一,...
2. **频繁提交与更新**:开发人员应定期提交代码到版本库,并及时从库中获取最新的代码。 3. **集成服务器**:设立专用的集成服务器负责执行构建任务,构建可以由代码变更触发,也可以定时执行。 4. **构建成功性**...
FindBugs是一款开源的静态代码分析工具...然而,需要注意的是,随着Eclipse和FindBugs的更新迭代,新版本可能包含更多的错误检测规则和性能提升,因此建议在条件允许的情况下,升级到最新版本以获取更好的支持和服务。
- 保持插件更新,以获取最新的功能和性能优化,同时解决可能出现的已知问题。 - 遵循Freemarker的最佳实践,如合理命名变量、避免复杂的逻辑嵌套,以提高模板的可读性和可维护性。 总之,Eclipse Freemarker插件是...
- **iTunes Connect的法律合规性:** iTunes Connect作为应用提交的官方平台,涉及大量的法律文件和条款,对于不熟悉这些法律细节的企业而言可能构成一定的障碍。 - **单一的分发渠道:** 目前,App Store是iOS应用...