


























原文:http://www.blogcn.com/User8/flier_lu/blog/4471578.html
作为使用最为广泛的源代码版本控制系统,CVS 有使用简单、操作方便以及第三方工具支持完善等等优点。但与 ClearCase 等商业级产品相比,CVS 的直观性非常差。特别是在应用 TDD 和重构思想后,代码更新更为频繁和琐碎,已经很难通过 CVS 内建功能,或者 WinCVS 等简单的客户端工具,对系统的整体版本情况有一个直观的整体印象。
虽然也有类似 CVSweb、ViewCVS 和 CvsGraph 等 Web 浏览工具的支持,但其功能定位只是在处理简单的文件浏览与比较,并不能完全解决复杂环境下的问题。
相比之下大名鼎鼎的 Java 代码覆盖工具 Clover 提供商 www.cenqua.com 发布的 fisheye 较好地解决了这个问题。通过强大的代码分析和统计功能,以及灵活的搜索与比较,能够让使用者实时了解项目的整体进展情况。
1.界面
fisheye 的主界面非常简洁,但功能非常强大,能够对项目整体情况一目了然。
左上角一个动态统计的代码行数趋势图,可以让你对每级目录(对应Java下的是包)中代码行数如何随时间变化一目了然,还可以比较不同的分支之间的差别;
左中是限制面板,可以通过 CVS 分支(brach)、作者、标记(tag)和日期限制当前浏览的代码范围;
左下是快速目录导航,可以方便在不同目录之间切换,并选择是否隐藏空文件夹和隐藏文件夹;
如果系统打开 tarball 功能,最左下还会出现当前目录指定限制下 tarball 下载的功能面板。
右上则是最近一段时间的 changelog,可以清楚了解最近有哪些更新,并可切换的完整日志模式;
右下则是当前目录下文件的版本、作者、最后更新时间、注释等等信息;
切换到 changelog 模式,则可以以时间为纬度,查看更新情况。
最后一个 search 模式,提供了灵活的组合查询方法,并可以支持其特有的高级 EQL 语言查询。
点击进入到某个文件的页面,则在左上显式文件本身的代码函数趋势图;右上显式类似 CvsGraph 的分支情况图;下方是详细的版本情况列表,可从中进一步了解同一 changeset 更新情况,或者此次更新与某一版本的 diff。
fisheye 自带的 Diff 功能也很强大,可以以精简、普通和完整三种模式,比较指定版本文件的区别。
演示用 Ant 项目 build.xml 文件 diff 页面
2.实现
实现上 fisheye 是一个独立的 java 程序,内嵌了一个 tomcat 提供 web 服务,界面框架是
http://www.opensymphony.com/ 那套 WebWork/XWork 等等。后台对 CVS 上文件进行分析时使用 antlr 库进行源代码解析,从其 syntax 目录下的语法文件来看,可以支持 C/C++/C#/Java/HTML/Python/Perl 等语言,理论上应该可以通过编写符合 antlr 规范的语法描述文件提供其他语言的支持。后台数据库则是使用的 Infinity Database Engine,并通过 lucene 提供全文搜索服务。
可以说这是一个非常成功的开源方案整合的范例,呵呵。
3.配置
因为系统已经进行了整合,因此安装非常简单。下载 fisheye 最新版本 后展开到 CVS 服务器的一个目录中,修改跟目录下的 config.xml 即可调用 run.bat/run.sh 启动。因为其 Web 界面提供了配置功能,第一次修改 config.xml 只需要指定 web-server 标签下 http 标签的 bind 为绑定的 IP 地址和端口即可,其他的可以通过界面方便地设置。
如果你需要分析的项目是开源的,这里可以直接绑定到网卡的 IP 和端口上;但如果你不想让所有人都能直接访问,则推荐将此绑定设置为 127.0.0.1:8080,然后通过下小节“安全”中的方式,由 apache 完成用户身份认证和重定向,因为 fisheye 此版本不支持权限控制。
在启动了 fisheye 服务器后,可以通过
http://127.0.0.1:8080 登陆到系统,第一次进入时会要求输入管理员口令,此口令将被 md5 后保存到 config.xml 中。此后都可以通过此口令,访问
http://127.0.0.1:8080 /admin 进行管理。
具体的配置分为服务器配置和 Repository 配置两部分。前者配置服务器的绑定地址和代理地址等等,下一节介绍安全性设置时再详细解释;后者则可以指定要提供哪些 CVS Repository 的浏览。
每个 Repository 通过唯一的名字和可修改的描述字符串来标识,CVS dir 则指定 CVS 服务器端目录所在。注意此版本的 fisheye 只支持安装在 CVS 服务器的模式,通过直接文件访问来分析 CVS Repository;而后续版本会在 1.0 之前,提供从远程下载分析的功能。最后选中 Enable immediately 允许 fisheye 自动开始后台文件分析工作。
对已经建立的 Repository 可以进一步设置其特性:如通过 Allow 配置,以 ant 类似语法限定要分析哪些文件,不分析哪些文件;或者通过 Hidden Dirs 配置隐藏某些目录,如定义 /CVSROOT/** 隐藏 CVSROOT 目录。
在 Repository Defaults 配置中,还可以打开前面所说的 tarball 模式,允许用户下载特定版本的 tarball 包。
最后在修改完配置后,需要手工对指定 Repository 或全局应用一下设置,或者干脆重起一下 fisheye 服务程序。
值得注意的是 fisheye 并非一个开源实现,而是与 Clover 一样使用一个古怪的商业协议,你可以免费多次向其申请 license,或者提供你维护的开源项目的信息,由其审阅后赠送 license。
4.安全
可能因为 fisheye 更多的是面向开源项目,此版本除了管理员帐号外就没有任何权限控制机制,因此要限制访问人员,必须另寻他径。
例如我选择通过 apache 的 mod_auth 和 mod_rewrite 来解决这个问题。将 fisheye 安装在 CVS 服务器的 127.0.0.1:8080 上,这样只有本机才能访问此服务;然后通过 CVS 服务器上安装的 apache 的 mod_auth 进行用户权限认证;在认证通过后,再使用 mod_rewrite 将请求重定向到 fisheye 的服务上。
fisheye 的服务器端 proxy 配置为此提供了很好的支持,
Integration with other web servers
要实现这一代理模式,首先应该设置 fisheye 的服务器代理模式。这里的 Web context 是在 apache 和 fisheye 中希望使用的虚拟目录名,如你希望通过
http://192.168.5.40/src 访问位于 5.40 机器上的 fisheye 服务,则可填充以下内容。
以下为引用:
Server SettingsBind: 127.0.0.1:8080
Web context: src
Proxy host: 192.168.5.40
Proxy port: 80
然后更新 5.40 上 apache 的配置文件 httpd.conf
以下为引用:
LoadModule auth_module modules/mod_auth.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule rewrite_module modules/mod_rewrite.soRewriteEngine on
RewriteRule ^/src/?(.*)$http://127.0.0.1:8080 /src/$1 【P,L】
如果是将采用独立模块方式,你需要确保上面两个 LoadModule 没有被注释掉;否则可能需要重新编译 apache 来增加模块。
这里的 RewriteEngine on 表示启用 mod_rewrite 模块;RewriteRule 则将所有匹配 ^/src/?(.*)$ 的 web 请求重定向到
http://127.0.0.1:8080 /src/$1 地址去。这里的 $1 表示正则表达式中 (.*) 匹配的部分。最末的 [P,L] 则是 mod_rewrite 的模式,表示启用 Proxy 模式,并且是 Last 最后一条规则。这样所有符合的请求都将通过 mod_proxy,从 127.0.0.1:8080 的服务上获得实际 web 页面,最终转发给客户端。

具体的 mod_rewite 配置和使用方法请参考:
配置完这些后重起 fisheye 和 apache 应该就能够通过
http://192.168.5.40/src 访问到 5.40 上的 127.0.0.1:8080/ 服务。
下一步则是使用 apache 的 location 命令,在 httpd.conf 中为 /src 虚拟目录加上访问授权限制。
以下为引用:
<Location /src/>
AuthName "ESP member only"
AuthType Basic
AuthUserFile "C:/Program Files/Apache/bin/src.password"
AuthGroupFile "C:/Program Files/Apache/bin/src.group"
require group src
</Location>
这里使用 mod_auth 模块的 Basic 认证模式,因为这种模式支持的浏览器最多。如果有进一步安全需求,可以考虑 apache 数量众多的 mod_auth_* 模块,使用其它认证模式。更多认证方式请参见 Mod_Auth_External、mod_ntlm 和 Apache Module Registry。
AuthUserFile 和 AuthGroupFile 分别指定能够访问此服务的用户密码文件与组文件;最后 require group src 限定,在 AuthUserFile 中的用户,只有属于 AuthGroupFile 中定义的 src 组的成员,才能访问此目录。
AuthUserFile 指向文件可以使用 apache 自带的 htpasswd 创建;AuthGroupFile 则是一个简单的文本文件,内容包括组名后跟用户名
完成此设置后,就可以通过 apache 的用户认证服务,限制对 fisheye 的目录的访问。此外还可以通过 mod_rewrite 的 RewriteCond 限制诸如访问时间、访问地址等等约束条件。
至此,一个完整的 fisheye 环境就搭建完毕了。
目前 fisheye 还只是处于 0.5 beta 的阶段,但功能上已经非常完整了。虽然还存在一些细节上的问题,如 changelog 模式显式中文不正常,但总体上来说还是一个非常不错的解决方案。就实现上来说,也为我们展示了对开源项目集成的可行性和强大功能。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。