`
juvenshun
  • 浏览: 1594318 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Maven持续集成最佳实践

阅读更多

译自:http://blogs.sonatype.com/people/2009/01/maven-continuous-integration-best-practices/

 

持续集成是你在开发过程中经常会用到的一个最佳实践,它是高效软件开发生命周期(SLDC)至关重要的一部分。如果还没使用这一实践,那么应该立刻就开始使用。持续集成最大的好处是,它能帮你立刻找出引入到系统中的错误,而不是在很多天之后看到测试失败,或者在QA阶段再发现重大错误。本文并不是要介绍CI的优点,本文是介绍如何建立一个最佳的使用Maven的CI环境。这里是一些关于如何在一个CI系统(如Hudson)中运行Maven构建的贴士。

 

#1 自动化Snapshot部署

按照我的经验,最好让CI系统部署你的snapshot。这是保证仓库内容和源码控制系统保持同步的最可靠的方法。要在实践中使用这种方法,你需要结合CI和仓库管理器,如Nexus ,它能自动的清除snapshot。我管理过一个项目,它在不到一周的时间内生成了>300gb的snapshot。使用一个仓库管理器会让你保持稳健。

#2 隔离本地仓库

另一个CI设置至关重要的组成部分是本地仓库隔离。Maven中的本地仓库是放置所有Maven下载和生成的构件的地方,并且当前它不是多线程安全的。虽然产生冲突的可能性很小,但它还是会发生的。

让每个项目有一个本地仓库最主要的原因是,这是测试你的项目是否基于公司仓库可构建的唯一方法。如果你没有单独的本地仓库,那么一个构建的产品即使不在公司仓库中,也还会被CI上另一个构建看到。这里说的很重要,因为CI的一个功能是,它应该能够验证代码对于一个真实的开发者来说是可构建的。

提示:使用 -Dmaven.repo.local=xxx 来为每个构建定义唯一的本地仓库。

#3 周期性的清除本地仓库

为了进一步的验证仓库的内容,以及管理硬盘空间,我每晚都清除本地仓库。如果仓库有变化或者构件被移除了,CI系统会检测到。为了方便的清除所有本地仓库,我倾向于将所有本地仓库组织到同一个目录下,如 /opt/repos/*。

很显然拥有多个本地仓库比起一个仓库来说需要更多的硬盘空间,因为有很多依赖的重复,但即使在我们的大型grid 上,所有的仓库的总大小也不到10gb。当你不控制snapshot,也不每晚清除仓库,不保持对它的控制,本地仓库就会慢慢的变得巨大。

提示:使用你的CI系统本身来安排本地仓库清理。这样当Maven糊涂的时候,任何人都可以手动的从UI上清理仓库。

久而久之,我也发现了一些更简单的技巧:

#4 开启批处理模式

提示:在构建中开启 -B(batch,批处理)模式。这会让日志变短,因为这避免了依赖下载过程的日志。这也能确保构建不会因为等待用户输入而挂起。

#5 开启完全堆栈跟踪

提示:开启 -e 能让Maven在遇到构建异常的时候产生完全的堆栈跟踪信息。这让我们更容易根据构建失败结构的日志或者email中理解问题,而不用重新构建一次。

#6 打印测试失败至标准输出

提示:开启 -Dsurefire.useFile=false 。这是我最喜欢的选项之一,因为它能让surefire打印测试失败到标准输出,因此也就能被包含在构建失败日志或email中。这样就节省了你的时间,不用再为了一个简单的堆栈日志去机器上寻找surefire报告。

#7 总是检查Snapshot

提示:开启 -U 让Maven总是最检查新的snapshot。该选项同样也可以在CI系统的setting.xml中开启。(提示4和6同样也可以在settings.xml中声明)

小结

使用上述的设置和过程会让每次build都将构件推入仓库中。接下来下游的build会有其自己的干净的本地仓库,然后检测仓库管理器以获取最新的snapshot。然后每天至少一次,本地所有的东西都被清除,所有的依赖都从仓库管理器抓取。

自然的,所有这些更新的清除工作都会给CI和仓库管理器之间的网络带来一些负荷。如果它们共享一个高速的网络,那么没什么问题。但如果你的仓库管理器和CI系统并不靠近,那么你应该在CI系统旁放一个仓库管理器,它代理远处的仓库,并能消除网络对每日本地仓库清理的影响。

注意: 如果你想要遵循这些提示,那么很重要的一点是下载一个Nexus 。清除你本地仓库的内容,每天每个项目都从中央仓库下载所有依赖,会造成中央Maven仓库的网络拥堵。

 

注: 在settings.xml中开启4,6,7:

#4: <interactiveMode>false</interactiveMode>

#6: <properties><surefire.useFile>true</surefire.useFile></properties> —— 在actived profile中

#7: <updatePolicy>always</updatePolicy> —— 在repository定义中

8
1
分享到:
评论
4 楼 juvenshun 2009-07-21  
wmr365 写道
引用
#6: <properties><surefire.useFile>true</surefire.useFile></properties> —— 在actived profile中


这个到底要如何加入到下面配置中?
<activeProfiles>
  <activeProfile>
development
  </activeProfile>
</activeProfiles>

这里有个例子:http://juvenshun.iteye.com/blog/359256之“在settings.xml中配置远程仓库”
3 楼 wmr365 2009-07-21  
引用
#6: <properties><surefire.useFile>true</surefire.useFile></properties> —— 在actived profile中


这个到底要如何加入到下面配置中?
<activeProfiles>
  <activeProfile>
development
  </activeProfile>
</activeProfiles>
2 楼 juvenshun 2009-01-23  
photon 写道

引用这是保证仓库内容和源码控制系统保持同步的最可靠的方法谁能解释一下仓库和源码控制系统这两个概念?

这里的仓库是指Maven仓库,是管理所有maven artifact的地方,如jar文件,目前流行的仓库管理器有Nexus,Artifactory等,具体关于Maven仓库的信息,请参考我之前的博客。
而源码控制系统,是管理源码的地方,如java文件,sql文件,xml文件,流行的源码控制系统有svn, cvs, clearcase, git等等。
1 楼 photon 2009-01-23  
引用
这是保证仓库内容和源码控制系统保持同步的最可靠的方法

谁能解释一下仓库和源码控制系统这两个概念?

相关推荐

    4.Jenkins持续集成Maven讲解

    【Jenkins持续集成Maven讲解】 在现代软件开发过程中,持续集成(Continuous Integration,简称CI)扮演着至关重要的角色。Jenkins作为一款广泛使用的开源持续集成工具,它可以帮助开发团队快速、频繁地集成代码,...

    Jenkins+Maven+SVN+Tomcat 持续集成环境快捷部署

    在现代软件开发流程中,持续集成(Continuous Integration,简称CI)是一种实践,使得开发团队可以频繁地将代码集成到共享仓库中。每次代码提交后,通过自动化的构建(包括编译、测试和部署)来验证,从而尽快地发现...

    敏捷实践之持续集成

    **持续集成**是一种软件开发实践中,开发人员频繁地将代码更改合并到主分支的过程,以减少集成中的问题和冲突。...这些资源可能涵盖了最佳实践、常见挑战及解决策略,帮助团队提升开发效率和软件质量。

    关于windows下jenkins+svn+maven+tomcat持续集成

    【标题】:“Windows环境下Jenkins、SVN、Maven与Tomcat的持续集成实践” 【内容】: 在软件开发过程中,持续集成(Continuous Integration,简称CI)是一种重要的实践方法,它能够频繁地将代码合并到主分支,并...

    Jenkins + Maven + SVN + SSH持续集成实战手册

    6. **持续集成最佳实践**:除了基本配置外,还应考虑配置邮件通知,以便在构建失败时及时通知团队。同时,设置定期的清理任务,避免Jenkins工作区占用过多磁盘空间。此外,可以利用Jenkins的蓝绿部署或金丝雀发布...

    持续集成交付实践.docx

    DevOps是一种集成式的软件开发和运维管理理念,它强调开发团队与运维团队之间的紧密合作,旨在通过自动化工具和最佳实践来加快软件的交付周期。DevOps的整体架构涵盖了多个层面: - **权限控制体系**:确保开发、...

    Maven权威指南_maven_

    **Maven权威指南** 《Maven权威指南》是Java开发者...通过阅读《Maven权威指南》,开发者不仅能掌握Maven的基本使用,还能深入理解其背后的原理和最佳实践,从而在实际项目中发挥出Maven的最大价值,提升开发效率。

    使用Hudson持续集成 ppt

    - **Hudson最佳实践**: - **定期备份Hudson主目录**:确保数据安全。 - **确保版本仓库中取出干净的源代码**:避免因源代码问题导致的构建失败。 - **运行普通构建后持续运行自动化测试构建并生成报告**:确保...

    jenkins(持续集成)

    8. **Jenkins最佳实践**: - 采用短周期、频繁的集成,尽早发现并修复问题。 - 自动化测试是持续集成的关键,确保每次构建都伴随全面的测试。 - 实施持续部署策略,让合格的构建自动部署到生产环境。 通过以上...

    持续集成资料

    "Maven实战"这本书可能会提供更深入的Maven使用技巧和最佳实践,包括多模块项目管理、自定义构建生命周期、使用插件以及与其他工具(如Jenkins)的集成。Maven的强大在于其丰富的生态,开发者可以通过声明式的方式来...

    PDF文档 Maven权威指南_中文完整版清晰

    另外,指南还会涵盖Maven的持续集成实践,如与Jenkins、Git等工具的集成,以及如何在持续集成环境中使用Maven。最后,会讨论Maven的最佳实践,如如何编写可维护的POM文件,以及避免常见的Maven陷阱。 通过阅读《PDF...

    持续集成JAVA和C#

    3. 代码版本控制,如Git的使用方法和最佳实践。 4. 构建工具,如Maven和Gradle在Java中的应用,以及MSBuild和NuGet在C#中的作用。 5. 测试自动化,包括JUnit、NUnit等测试框架的使用。 6. CI服务器的配置和管理,如...

    持续集成实践之CruiseContorl

    持续集成作为一种现代软件开发的最佳实践,能够极大地提高团队的效率和代码质量。希望读者能够将所学到的知识运用到实际工作中,实现更高效、更稳定的软件开发流程。 #### 附录一HELLOWORLD!与VSS 除了使用CVS作为...

    maven3.0 maven3.0

    ### Maven 3.0 的最佳实践 - **遵循约定优于配置的原则**:使用Maven的标准目录结构,减少POM的配置。 - **合理管理依赖**:避免硬编码版本号,使用`&lt;dependencyManagement&gt;`元素统一管理版本。 - **使用父POM**:...

    最好用的maven3

    ** Maven 3:最佳实践与全面指南 ** Maven 是一个强大的项目管理和构建工具,尤其在Java开发领域中被广泛使用。"最好用的maven3"这一标题表明了Maven 3版本因其高效和易用性而备受推崇。本文将深入探讨Maven 3的...

    Maven原理与实践

    - **指导开发**:Maven提供了Java项目的最佳实践,通过预设的项目结构,帮助开发者快速创建新项目。 - **自动编译**:不仅能够进行编译,还能执行测试、打包、部署、生成文档和项目站点等。 - **依赖管理**:...

    Maven详解及实践应用.zip

    **三、Maven的最佳实践** 1. **合理的POM结构**:保持POM简洁明了,避免冗余和过度配置。 2. **使用Maven模块**:对于大型项目,可以使用Maven的多模块项目结构,将项目分解为独立的子模块。 3. **版本管理**:...

    Maven权威指南中文完整版清晰

    Maven有许多最佳实践,如保持POM简洁、合理使用依赖范围、遵循约定的目录结构等,这些都可提高项目的可维护性和协作效率。 9. Maven的环境设置: Maven的配置文件settings.xml用于设置全局配置,如本地仓库位置、...

    Maven 实战(中文pdf)

    《Maven实战》不仅覆盖了Maven的基础知识,还深入到高级特性和最佳实践,如使用 profiles 进行条件构建,或者处理复杂的多模块项目。对于初学者,书中提供的实例和实战经验可以帮助快速上手;对于经验丰富的开发者,...

Global site tag (gtag.js) - Google Analytics