前段时间被问及一个问题,版本管理是否包含了配置文件,有哪些配置文件。
当时对hudson还不熟悉,只有想到项目编译、运行时需要用到的配置文件,如项目的区域、关联系统地址配置等内容。
最近在Jenkins网站上阅读到一篇文章《Keeping your configuration and data in Subversion》,方才明白那位前辈指的用Hudson+SVN对jobs相关的配置文件和数据进行管理。
现在很多公司已经或正在做持续集成,简单的来说就是用CI服务器对项目进行管控,实现了从配置库进行自动的检出、更新代码,编译文件,部署到各个节点、检入到配置库等功能,这样用机器代替了手工,将人力从重复性劳动中解放出来,从而让配置管理员们能够去做一些创造性的事情。
那么持续集成服务器上对job的配置,可以被认为比较重要的配置项,是要纳入版本控制管理的。一般来说,SVN是将job下面的文件都纳入管理的,那有一些我们不关注的文件和jobs,我们可以设置忽略掉。build生成的文件我们也没有纳入管控,因为文件较大占用空间,而且hudson里面的cp和rsync已经实现了备份(可恢复性)。我们不需要进行管控。就我个人的理解,对于build生成的文件,我们可以使用源码进行重新build,纳入管控没有意义。
以下是我对这篇文章的翻译(已经是2年多以前的了,汗颜啊)。声明下,是自己简单翻译的,有一些错误欢迎大家指正。
在SVN中创建一个仓库是很简单的,但是$HUDSON_HOME中哪些部分是需要管理的,这不是显而易见的。你会想将新的项目自动加到仓库中去,也会想自动删除一些不需要的。这时候我们的工具Hudson就派上用场了。
Hudson的这个job是在每晚运行,执行一些SVN命令,并且提交相应的内容。这个job主要包含内容:
1、增加一些新jobs,users,plugin configurations等等:
svn add -q --parents *.xml jobs/*/config.xml users/*/config.xml userContent/*
2、将不存在的一些内容(如一个已删除的job),从SVN中移除:
svn status | grep '!' | awk '{print $2;}' | xargs -r svn rm
3、自动检入!svn ci --non-interactive --username=mrhudson -m "automated commit of Hudson configuration" ,如没有设置密码,需要加上密码的命令--password
--non-interactive意思是不要交互提示,这样一旦有问题直接会失败。"automated commit of Hudson configuration"为commit内容。
新建一个job,绑到主机上,设置它的build周期,并且增加一个“Execute shell”作为build步骤。下面是用到的完整的脚本,将它放到build的步骤里:
1、进入你的hudson目录
cd /opt/hudson
2、新建一些配置文件、jobs、用户、和目录
svn add -q --parents .xml jobs//config.xml users//config.xml userContent/
3、设置需要忽略的根目录下我们不关心的东西:将warnlog log tmp old bak jar json文件放到myignores目录下(这个我还没有确定,大概是这个意思,等确认后我会再来修改),然后删除myignores目录
echo -e "warnlogn.logn.tmpn.oldn.bakn.jarn.json" > myignores svn propset svn:ignore -F myignores . && rm myignores
4、设置jobs目录下面需要忽略的东西:
echo -e "buildsnlastnnextn.txtn.lognworkspacencoberturanjavadocnhtmlreportsnncoverndoclinks" > myignores svn propset svn:ignore -F myignores jobs/ && rm myignores
5、从SVN上移除Hudson上已经不存在的东西:
svn status | grep '!' | awk '{print $2;}' | xargs -r svn rm
6、最后,检入,登陆前和登陆后展示工作目录状态。
svn st && svn ci --non-interactive --username=mrhudson -m "automated commit of Hudson configuration" && svn st
你可能注意到了,我们还做了一些额外的事情,如设置svn:ignores的属性,如svn st展示工作目录状态。这个job唯一没有做的事情就是没有把build的结果加入版本控制。因为历史的build日志和artifacts不会改变而且可能会比较大,加入到版本控制会占用较大的空间。而周期性的cp
或者rsync这个job目录已经给jobs提供了可恢复性,而且能够节省你的仓库空间。