编写软件本质上就是人和人之间的协作,协作就最好有工具帮忙。我最早使用的就是邮件+bugzilla。这个简单的搭配就把QA和开发人员集成在一起,滚滚车轮就此转起来了。
但是那时候是在帮鬼子bug fix,所以也就够了。说起来挺不好意思,不帮鬼子bug fix了,自己也懒得弄新东西,团队一直就是bugzilla。
其实早就是知道项目管理工具,收费的据说jira比较好,免费的就是trac了,昨天终于痛下决心,搞了一天的trac和mylyn,通了。
我觉得做一个Java项目,只要有下面的一些工具帮忙:
svn + tortoiseSVN:源码管理
trac + mylyn:项目、任务、bug管理
maven + m2eclipse + nexus:jar包管理
好了,进入正题,trac。在网上搜到好多都是怎么和apache配合的,个人认为,不用apache这么复杂,直接起就可以了,就像我用svn一样,直接svnserve -d -r搞定。
1、在下载trac的windows installer,安装;(我也玩python,所以2.5的环境我有)
2、安装easyinstall :python ez_setup.py;也有人建议先安装easyinstall,这样连trac也可以用它直接安装了,其实都成,反正我在windows下面有trac installer,也不麻烦
3、安装genshi :这个东西比较有意思,很容易念成“真屎”,是生成html的,安装起来比较简单直接
easy_install Genshi
这三步完成后,如果你猴急,可以先启动一下:
首先,建立项目文件夹,在这里我多说一句:我弄svn的时候,建了一个目录叫svn,里面两个文件夹java、python,然后在这两个文件里面做了两个repository,操作java就svnserve -d -r ./java;所有的java项目都放在这个目录下分门管理了,本来我也想这样,建一个trac目录,里面放java和python两个目录,但是后来突然发现不是那么回事,trac是针对项目的,不能多个项目的ticket放在一起,就乱了。
所以各位,你还是老老实实的有100个项目,就建100个目录吧,别嫌麻烦。
第二步,创建repository,类似用tortoiseSVN create repository here一样,命令是:
c:\python2.5\Scripts\trac-admin 建的项目目录 initenv
然后会问你一些问题,在这些问题中,有难度的就是和svn挂接的,挂接了以后,就可以在trac中查看源代码了,但是我觉得局域网开发项目,没必要,还是各司其职比较好,所以按照他的提示,直接回车跳过,然后硬盘小转一下,你就发现目录里面有一堆东西了;在这一步骤中,如果发生问题,好象是找不到repository什么的,就是因为你没有安装genshi,装上就好了。
第三步,启动。c:\python2.5\Scripts\tracd -p 8000 建的项目目录
点儿正的话,你就看到东西了,但是什么什么都操作不了,并且你发现里面给你丑陋的建了component 1 milestone1什么的乱七八糟的。不用管,因为你还没有设权限。
新建一个文件,叫trac-digest.py:内容如下:
from optparse import OptionParser import md5 # build the options usage = "usage: %prog [options]" parser = OptionParser(usage=usage) parser.add_option("-u", "--username",action="store", dest="username", type = "string", help="the username for whom to generate a password") parser.add_option("-p", "--password",action="store", dest="password", type = "string", help="the password to use") (options, args) = parser.parse_args() # check options if (options.username is None) or (options.password is None): parser.error("You must supply both the username and password") # Generate the string to enter into the htdigest file realm = 'trac' kd = lambda x: md5.md5(':'.join(x)).hexdigest() print ':'.join((options.username, realm, kd([options.username, realm, options.password])))
然后运行这个文件:python trac-digest.py -u steve -p password d:\password.txt
其中-u就是起一个用户名,-p就是起一个密码,第三个参数是将授权文件放在什么地方,然后文件就生成了,文件内容如下:
steve:trac:563234c5a70ba77567cc9bac770d
如果需要多个用户,多执行几次,然后考到同一个文件里面应该就可以(没试过,瞎猜的,有兴趣你试试,然后给我回一个)。
然后用下面的命令再次启动:
tracd -p 8000 --auth=你项目的名字(在trac-admin ... initenv的时候,问过你),授权文件的地址,trac 项目路径
比如:
tracd -p 8000 --auth=trac_test,d:\trac\pwd.txt,trac d:\trac\java\trac_test
然后再次访问,你就可以惊喜的发现,你可以登录了。
但是,可但是,除了增加ticket之外,还是什么配置都不能改,最烦人的component1 milestone1什么的也不知道在什么地方设定。
没事,再运行一个命令:
trac-admin 项目的目录 permission add 你的用户名 TRAC_ADMIN
这句话的意思呢,就是让你这个用户有管理这个项目的权限,实际也没什么神秘的,就是在数据库里面增加了一行。
然后你再次登录,就发现菜单中多了一项admin,这回就舒服了,可以进去授权,修改component、milestone等等东西了,另外,给你的几个用户都增加ticket-admin的权限,表示他们可以操作ticket。
行了,现在你就可以想干什么就干什么了。
下面我说说怎么和mylyn继承了。
1、你在安装mylyn的时候,选择optional项目trac integeration;
2、打开eclipse,点儿正的话,能看到mylyn正常运行,增加一个task,会弹出一个窗口让你选择repository,选择trac的,在弹出的窗口中:
url: http://localhost:8000/trac_test
label:随便填
用户名、密码填好
这时候,不管你选择web方式还是xmlrpc方式,你按validate的时候,总是不通过,因为我还没说怎么给trac加上xmlrpc的plugin呢。
进入python的Scripts目录,运行:
easy_install http://trac -hacks.org/svn/xmlrpcplugin/trunk/
安装trac的xmlrpc支持。
注意:我有大约2个小时的时间都浪费在这里了,安装错误:总是提示:“global log”什么的找不到。而恰恰一些install guide里面没有这个东西,寻找了良久,最后发现这是由于setuptools的一个bug,重新下载一个dev版本,安装一下就好了,步骤如下:
用tortoiseSVN browse http://svn.python.org/projects/sandbox/branches/setuptools-0.6/setuptools
将全部的内容export到一个目录下(懒得弄的话,就下载我的附件,最好自己弄,万一有人家更新呢),然后执行
python setup.py install
安装一把,搞定,这时候再:
easy_install http://trac -hacks.org/svn/xmlrpcplugin/trunk/
没问题了。
完成后再次启动tracd:
tracd -p 8000 --auth=trac_test,d:\trac\pwd.txt,trac d:\trac\java\trac_test
进入admin,在plugin下面,你就能看到一个xmlrpc项目了,勾选全部的内容,然后确定。
再次回到eclipse中的mylyn,将连接方式设定为xmlrpc,validate,finish。
连上了。
怎么用也让我费了一下劲,一开始,自己新建的task也不能上传,刚才在web方式建的几个ticket也不能下载到mylyn。
解决步骤如下:
1、先将window - show view - others,将task repository的view显示出来,你应该能够看到你刚刚建立的trac的repository,右键new query,title你自己起一个,中间的筛选都可以不用,最后一行选上owner,你自己的登录名就行了,那意思就是“这个查询只筛选出属于我的ticket”;
然后你在task list view中就能看到你的这个query了,在时候,在这个query新建task, synchorize什么的,就可以了!
至此,全通了。
另外,作为一个完美主义者,我本来想将几个测试用的ticket删除,但是死活没找到删除ticket的地方,查了trac的文档以后,发现:不是没找到,而是压根人家就没做这个功能,因为人家认为ticket一旦建立,就不应该删除,所谓删除,就是设定这个ticket为invalid。无奈,就这么设吧
如果你比我更执着,非要删除呢,直接删表记录吧,参考:
$ sqlite trac.db delete from ticket_change where ticket = 1234; delete from ticket_custom where ticket = 1234; delete from ticket where id = 1234;