好吧,我承认我是来除草的。
近两年没写 blog 了,当然更没有写技术相关的文章。主要是这两年没有做太多的新技术尝试,基本处于维护以前做的线上网站和代码的状态。
自从八月份入职以后,开始学习一些新的东西。但是对于公司的开发团队的工作流程不太适应,很多时候很依赖QQ,个人认为作为一家较大的IT企业来说也不合适。(毕竟内心还是很鄙视 QQ 的,话说最近都被 QQ 逼良为娼地开始用 Windows 了)
从来的第一周就建议经理可以尝试一下 Trac + SVN 的方式来管理团队开发,因为之前工作过的两家公司都如此管理并且效果还不错(虽然可能许多国外公司都已经放弃这种途径而采取 Git + Redmine 了)。经理同意开始从小团队范围试用一下,于是准备着手在公司服务器上安装,结果…… 公司竟然是用 Windows 在跑 VisualSVN,作为未转正的新人更不可能让我去服务器上装东西。本来想让 QA 部门的同事直接装个 Trac for VisualSVN 了事,结果种种原因未能安装,反倒是给了我一台 CentOS 的虚拟机让我自己试着玩。
- 首先,这台机器没有外网,其次,它不能直连到公司的内网,必须通过机房另外一台机器中转。
- 连 yum 都用不了,这让用惯了 apt-get install 的我感觉寸步难行。
- Apache/SVN/MySQL/Trac 都要下源码 scp 上去自己编译安装。
- 配置文件和各种 module 放置的位置也都跟 debian 系的不一样。
自己下载编译配置 Apache 搞了半天,结果还只能本机访问,公司访问不过去。所以说用蛋疼菊紧已完全不足以形容了,简直可以说是蛋黄都快流出来了。于是乎就暂时放下了折腾这台 CentOS 的念头,一放就几周过去了……
上周部门开例会以后,感觉如果能把 Trac+SVN 搭建起来还是会对团队整体的工作流程有巨大改善的。目前的流程不仅冗余,而且容易出错。并且尝试一些新鲜的东西对团队活力来说也是有好处的。
于是下定决心,排除万难,一个字 —— 搞!
Trac 安装配置
1. 由于之前的 Apache 痛苦经历,决定直接放弃。Trac 我用它自带的 tracd server;SVN 也使用自己 svn 协议,不用 webdav;
2. 下载安装 Trac 所需的三个包 Trac 0.12.2, Babel 0.9.6, Genshi 0.6 并 scp 上传到服务器;
3. 服务器上直接解压 make install (此处注意 Babel 和 Genshi 先于 Trac 安装,以便让 Trac 支持多语言);
4. trac-admin 新建/初始化项目
trac-admin project_name initenv
因为现在 Trac 支持多项目的管理了,我将项目都统一放在 /var/trac 这个路径下面。另外现在 initenv 的时候不再需要输入 svn 相关信息了,可以稍后自己配置;
5. 配置 trac 用户
创立一个 password 文件,我是用 htdigest 生成的(用 htpasswd 也可以),方式如下:
htdigest [ -c ] passwdfile realm username
[ -c ] 参数是新建这个 passwdfile。可以直接将这个 password 文件放到具体某个项目文件夹里。也可以放到上一级的 /var/trac 下,针对多个项目使用这同一个 password 文件;
5. 启动 tracd 服务
tracd -p 8080 -d --auth="project_relative_path,pwd_file_relative_path,realm"
这里注意,我写的是 relative path(相对路径),用绝对路径好像行不通。
如果想针对所有的项目都使用同一个 password 文件,则将 project_relative_path 用 * 取代;
6. 浏览器输入 http://hostname:8080
这时应该可以看到这里列出你刚才 init 的项目了。点进去以后,用刚才创建的 password 文件里的用户登录,可以选择偏好并设置语言,由于我们先安装了 Babel,所以多语言支持应该没问题了。
至此基本的 Trac 安装完成。
配置 SVN 并整合到 Trac
1. 我没有新装 svn, 因为发现这台虚拟机上已经有了,版本是 1.6.11
于是直接用,创建一个 svn repository:
mkdir /var/svn/repo
cd /var/svn
svnadmin create repo
chown -R nobody:subversion repo
chmod -R g+rws repo
2. 测试刚才建立的库,既然抛弃了 Apache,就用 svn 自带的协议 svn:// (或者 svn+ssh://)。
接下来设置访问权限:
先编辑 /var/svn/repo/conf/svnserve.conf ,把下面这一行的注释去掉:
# password-db = passwd
接着编辑 /var/svn/repo/conf/passwd ,将用户名密码设置好,类似以下格式:
harry = harryssecret
sally = sallyssecret
另外在 svnserve.conf 里的这一行:
anon-access = none
表示的是 anonymous 用户的权限,需要自己设置一下,可选 none, read 和 write。一般的公司项目都会选择 none,即匿名用户没有任何权限。
启动 svnserve:
svnserve -d -r /var/svn/
然后 svn checkout 试一下,应该没什么问题了
svn co svn://localhost/repo
3. 修改 $project_name/conf/trac.ini,在这一行填上 svn 地址,注意是路径,即 /var/svn/repo
4. 访问 http://localhost:8080 会比刚才之前多了一个导航:browse source
至此 SVN 与 Trac 整合就算完成了。
5. 遇到的问题与解决:
在上述第4步的时候,我发现进入 trac 后有个报错:
python svn ImportError: No module named svn
我的 python 与 svn 的 binding 似乎有问题,看了 TracWiki 里的 TracSubversion trouble Shooting,直接在终端试了一下
$ python
Python ...
>>> from svn import core
果然报错。
文档上说是要安装 python-subversion,说明上面就写着如果是 debian 系统,直接 apt-get install python-subversion ,尼玛,哥用的是坑爹的 CentOS 啊,还不能用 yum 啊!!!上网找了一圈,愣是没找着这个包的源码。
在 这篇文章 里看到一个 quick fix。于是下了 subversion 的源码,试了一遍:
$ cd /usr/src/subversion-1.6.1/
$ make swig-py
$ make check-swig-py ### Perform checks
$ make install-swig-py
也是出错,无法 configure/make 通过,有 error。
这时我已经基本崩溃了,突然,发现这台 CentOS 里当前 python 版本是 2.5.x,另外还有一个 python2.6,于是用 python2.6 试了一下 xxxxx,没有问题。顿时菊花一松。
于是就想将 python2.6 作为 CentOS 的默认 python 命令调用。
在 debian 类系统里是更改系统默认调用是 update-alternatives –config xxxxx。CentOS 是 /usr/sbin/alternatives –config xxxx 。如果没有该项,则可以先 install,格式类似:
$ /usr/sbin/alternatives --install "/usr/bin/python" "python" "/usr/local/bin/python2.6" 2
但是我试了好几次都没法将默认的 python 设置成 2.6 的那个。于是放弃先,直接删掉 /usr/bin/python 做了一个 ln
$ rm -rf /usr/bin/python
$ ln -s /usr/bin/python2.6 /usr/bin/python
这时刚才那个 quick-fix 的几个命令也都可以顺利执行了,于是去访问 trac,按理来说应该没什么问题了,但是。。。无法启动 tracd 服务了,会报一堆关于 python 的错误。
我猜是因为当时编译 Trac 的 python 是2.5的,现在用 2.6?(这个以后需要确认),于是我解决这个问题的办法就是,很黄很暴力地,直接将 Trac/Babel/Genshi 三个包全部用新的 python2.6 重新 make install 了一遍。
问题解决。
SVN sync
来由:
- 因为公司的 SVN 需要放在前面提到过的那台 VisualSVN 机器上,以方便进行统一管理。但是我没有权限去动那台机器。
- Trac 必须跟 SVN 装在同一台物理机上,暂时不支持远程 SVN。
解决方案:
在虚拟机上建立 Trac 和 SVN,并将公司的 SVN repo 同步到这台虚拟机上来,通过修改 post-commit ,让每次提交代码后运行 svnsync 保持两个 svn repo 同步。
步骤:
(实在懒得写了,这篇已经是我有屎以来写得最长的一篇 blog 了,列为 TODO: 好了,下面随便摘要一下)
在 VM 上新建一个 repo,并设置好 password,(参考上面 svn 的配置)。
cp repo/hooks/pre-rexxx.tmpl repo/hooks/prexxx
删除掉下面的内容,替换为 exit 0
记得,要给这个文件可执行的权限
svnsync init svn://localhost/repo http://xx.xx.xx.xx/svn/repo
svnsync sync svn://localhost/repo
此时 VM 里的这个 repo 就可以视作是远程服务器的一个 svn 备份了,不要 checkout 并提交到 vm 的这个 repo,操作都在 http 那台上面进行。然后随时执行(不论在那台机器上)
svnsync sync svn://localhost/repo
都将会把 http 的代码同步到 vm 上,可以编辑 http 机器的 post-commit,每次提交都做一次 svnsync
这样曲线救国地解决成了 VM 上的 trac 只能访问本机的 svn 的问题
(more…)