- 浏览: 119371 次
- 来自: ...
文章分类
最新评论
CruiseControl Enterprise 最佳实践 (2) : Keep your dependencies to yourself
I'm an Infrastructure Specialist at ThoughtWorks. In my role I make sure that we are building our software so it can successfully be deployed to production. In this series of blog posts I hope to pass on my top ten tips for using CruiseControl Enterprise effectively. I'm writing these with the developers or systems administrators in mind: the people who most often manage CruiseControl. However, I hope that anybody who is interested in Continuous Integration will get something from these articles.
# 2: Keep your dependencies to yourself : 让 CruiseControl 和你的 Project 各走各道, 互不相干
平均规模的Java项目会有很多依赖: 开源的工具和框架, 第三方的库, 你的项目或组织内部开发的库...等等等等. 我数了数我目前项目中依赖的(或者可能依赖的 :) ) jar 文件, 有 84 个. 更多的痛苦来自于你管理这些依赖的方式. 让你的软件能够编译或执行通常比你想象的要困难的多, 如果这些依赖不清楚的话. 加入一个新项目, 然后用一天的时间让你的代码从不清楚的代码或环境依赖中成功编译真是充满了痛苦.
让CruiseControl Enterprise和它的依赖 从 你自己的项目和项目依赖中清楚地分离出来, 是一个很好的主意. 最基本的例子, 可以让你的CruiseControl Enterprise安装像下面这样布局:|-- cruise
| |-- 2.7.0
| |-- 2.7.1
|-- logs
| |-- blowfish
| |-- scorpion
|-- projects
| |-- blowfish
| |-- scorpion
这样升级 CruiseControl Enterprise 应该只是几分钟的事. 如果你发现你需要往CCE本身加入额外的库, 通常这是一个警告信号, 意味着你的项目不能满足自我依赖. 仅有的例外是当你用自定义的 bootstrapper 或 publisher 等来扩展 CCE 自身的时候.
这里有两点尤其需要注意: 日志文件和 '.ser' 文件. 日志文件代表了你的项目的历史, 这就是我为什么一直努力把它们保存在与CruiseControl安装目录不同的目录层次中. 另外, 缺省情况下, CruiseControl 还把项目的状态信息持久化到后缀名为 '.ser' 的文件中. 确保升级的时候你保留了它们. 如果你这么做了, 你的项目又不依赖于CCE, 那么就能很容易的升级CCE.
接下来, 考虑一下那些熔入到你的构建工具中的依赖. 有一个常用的模式是把依赖都放到你的 Apache Ant 的 'lib' 目录中. 这样做对诸如 Junit 之类一般不会被你的产品代码依赖的库没问题. 但如果你的产品代码或构建脚本依赖的库实际上贮存于你的构建工具内部时, 你就有麻烦了. 它今天可能还工作, 但明天就不一定了. 如果你升级了构建工具中你的代码依赖的那些库, 有可能你就构建不了以前的代码了. 这让事情变得很"有趣", 尤其是当你正试图通过升级依赖库解决一个产品中的Bug时. (升级后能构建最新的代码, 但不能构建以前的代码)
好消息是, 这很容易解决: 让你的项目包含自己的依赖. (让你的构建脚本显式的引用包含在项目内部的依赖, 而不是隐式的让构建工具来包含那些依赖). 比如说, 如果你的Ant脚本依赖于Oracle, 而你的项目使用的Ant包含了Oracle的驱动, 那么你的脚本看起来像这样:
<target name="drop_all_tables">
<sql driver="oracle.jdbc.driver.OracleDriver" userid="user" password="donttell" url="jdbc:oracle:thin:@localhost:1521:orcl" delimiter=";">
<transaction src="${sql.dir}/drop_all_tables.sql" />
</sql>
</target>
在这个例子中, 对于Oracle驱动的依赖没有被明确的声明, Ant 只会从缺省classpath中寻找 "oracle.jdbc.driver.OracleDriver". 第一件要做的事就是把驱动所在的jar文件扔到project内部并设置一个classpath:
lib/
`-- ojdbc14.jar
<path id="buildtime">
<pathelement location="${lib.dir}/ojdbc14.jar"/>
</path>
<target name="drop_all_tables">
<sql driver="oracle.jdbc.driver.OracleDriver" userid="user" password="donttell" url="jdbc:oracle:thin:@localhost:1521:orcl" delimiter=";" classpathref="buildtime">
<transaction src="${sql.dir}/drop_all_tables.sql" />
</sql>
</target>
注意'sql'元素中这个额外的 'classpathref' 属性. 这个有用的属性允许你引用脚本中在别处定义的路径, 减少了重复代码. 当你把一个依赖移到项目内部时, 要在可以删除的时候正式的删除这个依赖. 在我最近采用这种过程的一个项目中, 我很幸运的能够以我喜欢的方式进行定期发布. 我修复了trunk中的依赖, 并且几周后进行了重新检查. 以前那种依赖于项目外部某些东西的 release branches 没有被使用.
因此概括的说, 考虑一下你项目的依赖项, 包括那些只是凑巧被满足的依赖项. 如果你让那些依赖都很清楚直观, 我保证你会更少的被你的同事追问为什么他们不能编译! 如果你有许多工程有相同的依赖, 我希望在后续的文章中会解决一些问题.
发表评论
-
The Object Primer
2004-12-11 11:21 5951,书名 被翻译成“ ... -
错误处理规范
2004-12-11 16:47 760错误处理规范 〇、概念澄清 概念 解释 错误 ... -
Java,误解为何如此之深
2005-08-24 13:50 596前几天被电话面试,问J ... -
Java:画蛇添足的编码规范
2005-09-02 13:13 624前几天公司培训编码规范: 第n条: ... -
synchronized : 规则, 推论与实践
2007-07-23 22:32 47314.3.Synchronization. Rule ... -
交互设计: 股市帮凶
2008-05-04 21:30 649同事 Y 在线操作股票时, 把"买入"点成 ... -
交互设计: 火车上的厕所
2008-05-26 17:17 614有人在动车组的厕所前等了很久, 直到乘务员路过说厕所是被锁住了 ... -
设计原则与模式: 案例介绍--CppUnit
2008-06-01 20:15 635设计原则与模式: 案例介绍--CppUnit CppUnit ... -
工作流:形参,实参,相关数据
2004-12-11 11:40 678关于形参,实参,相关数据 一、形参(FormalParame ... -
工作流:第一次发版,过程总结
2004-12-11 11:42 714交流 即时讨论:小组成员咫尺之遥,有问题立即提出并解决 ... -
工作流:第一次发版,设计总结
2004-12-11 11:43 614整体 面向接口:消息系统,持久系统等,其实现都是可替换 ... -
Beyond Workflow : An Introduction to Vitria BusinessWare
2005-09-26 10:13 807一、简介 Busines ... -
Vitria BusinessWare: 存储与访问安全
2006-03-26 15:45 755事实上,BusinessWare使用LDAP做为存储机制和 ... -
Vitria BusinessWare: 平台与软件总线
2006-04-01 12:59 853经过一段时间的使用 ... -
Vitria BusinessWare: Web Services
2006-04-01 14:30 744BusinessWare的Web Services ... -
Web Services:自洽,编码,交换模型
2006-04-01 16:02 6891, 自洽 以前曾经写过: 目前WebServi ... -
Web Services:WSDL 1.1 规范中的几个错误
2006-04-01 16:40 730读完了WSDL 1.1的规范,令人惊讶的是发现似乎例子中有几个 ... -
C++/CLI:被忽视的集成技术
2006-05-17 20:02 760十几行代码,就使一个重要的旧系统组件,完全融入了基于.Ne ... -
AJP/JK:异构Web平台的集成技术
2006-05-25 21:44 713Tomcat Connector 可以将Tomcat ... -
Vitria BusinessWare: 事件与端口
2006-05-27 17:24 677Event BusinessWare是一个事件驱动的系统 ...
相关推荐
- **CruiseControl.doc**:可能是一份CruiseControl的入门教程或者详细使用指南,涵盖安装配置、基本概念、常用命令和最佳实践等内容。 - **CruiseControl2.doc**:可能是关于CruiseControl的进阶使用,可能涉及...
标题与描述概述的知识点主要涉及了使用CruiseControl与Maven2进行持续集成的配置流程。这是一项在软件开发过程中非常关键的技术实践,它能够自动检测代码库中的更新,并自动执行构建、测试以及部署等任务,从而确保...
CruiseControl是一款持续集成工具,它能够自动化地构建、测试和部署软件项目,极大地提高了开发效率和产品质量。在本文中,我们将深入探讨如何配置CruiseControl以实现定时运行,确保项目始终保持最新状态。 首先,...
### [CruiseControl] Binary安装与启动指南 #### 一、CruiseControl简介 CruiseControl 是一个持续集成工具,用于自动化构建过程并提供实时反馈,帮助开发团队尽早发现问题。它支持多种构建工具如 Ant 和 Maven,...
2. **CruiseControl监视你的项目**:CruiseControl能够实时监控项目的源代码库,一旦检测到变更,它会自动触发构建。"CruiseControl step by step(4)"系列文章详细讲述了如何设置这种监视机制,帮助开发者及时发现和...
**持续集成实践之CruiseControl** 在软件开发领域,持续集成(Continuous Integration,简称CI)是一种重要的实践,它强调开发者频繁地将代码更改合并到主分支,以尽早发现并解决问题。CruiseControl是一款开源的...
2. **配置文件**:CruiseControl.rb的配置文件通常是`config/cruise_control.rb`,它定义了项目的构建流程,包括源码管理、构建触发器、构建任务、测试和报告等。 3. **构建生命周期**:CruiseControl.rb的构建过程...
CruiseControl是一款持续集成工具,它能够自动化地执行软件项目的构建、测试和部署流程,以确保代码的质量和项目的稳定性。本篇文章将详细介绍CruiseControl的基本概念、安装过程、配置方法以及一个简单的使用示例。...
CruiseControl 是一个开源的持续集成工具,用于自动化软件构建、测试和部署的过程。它通过监控版本控制系统中的变更,自动触发构建任务,及时发现并解决代码集成中的问题,从而提高开发团队的效率和软件质量。本...
2. **创建CruiseControl.xml**:根据项目特点,编写CruiseControl.xml配置文件,定义项目的所有参数。 3. **启动CruiseControl**:运行CruiseControl服务,它会根据配置文件定期检查源代码并触发构建。 4. **监控...
主题:持续集成及CruiseControl技术交流 在提升软件质量、降低研发风险、拒绝浪费方面,处于敏捷实践领域的持续集成(Continuous Integration,CI)起到重要作用。持续集成能够解决研发工作中的80%任务(日常),...
本教程将详细讲解CruiseControl的学习与实践。 **第一章 CruiseControl实践** 1.1 CruiseControl架构 CruiseControl的核心是一个服务器,它负责监听源代码仓库的变更,并在检测到变更时触发构建过程。这个过程包括...
2.CruiseControl的安装 CruiseControl的安装有多种方式,例如,如果使用Windows,可以下载二进制可执行文件,然后运行它。安装之后,CruiseControl预先配置了一个配置文件,轮询CVS(或其它版本控制系统)存储库并...
CruiseControl是CI服务器的老者,诞生已是多年,在许多方面,CruiseControl服务器已经成为持续集成实践的同义词。而现在,CruiseControl已发展成为一个家族式系统,包括CruiseControl.java、CruiseControl.net、...
cruisecontrol.war 文件,你可以直接将这个文件 COPY 到你的%TOMCAT_HOME%\webapps 目录下,不 过这种方式通常都会出错,前 面我们讲过CC的WEB组件要访问我们的项目build 的状态文件,而下载的 CC2.2 里面自带的 ...
CruiseControl.NET 是 .NET 平台下的持续集成工具,CruiseControl (Java) 的 .NET 移植版本。CruiseControl是一个针对持续构建程序(项目持续集成)的框架,它包括一个email通知的插件,Ant和各种各样的CVS工具。Cruise...
### CruiseControl.net 配置详解 #### 一、CruiseControl.net简介 CruiseControl.net是一种流行的持续集成(CI)工具,它可以帮助软件团队自动构建、测试和部署代码,从而提高开发效率和软件质量。本篇文章将围绕...
CruiseControl-2.8.4.exe