原文: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 的主界面非常简洁,但功能非常强大,能够对项目整体情况一目了然。
演示用 Ant 项目主界面
左上角一个动态统计的代码行数趋势图,可以让你对每级目录(对应Java下的是包)中代码行数如何随时间变化一目了然,还可以比较不同的分支之间的差别;
左中是限制面板,可以通过 CVS 分支(brach)、作者、标记(tag)和日期限制当前浏览的代码范围;
左下是快速目录导航,可以方便在不同目录之间切换,并选择是否隐藏空文件夹和隐藏文件夹;
如果系统打开 tarball 功能,最左下还会出现当前目录指定限制下 tarball 下载的功能面板。
右上则是最近一段时间的 changelog,可以清楚了解最近有哪些更新,并可切换的完整日志模式;
右下则是当前目录下文件的版本、作者、最后更新时间、注释等等信息;
切换到 changelog 模式,则可以以时间为纬度,查看更新情况。
演示用 Ant 项目 changelog 界面
最后一个 search 模式,提供了灵活的组合查询方法,并可以支持其特有的高级 EQL 语言查询。
演示用 Ant 项目 search 界面
点击进入到某个文件的页面,则在左上显式文件本身的代码函数趋势图;右上显式类似 CvsGraph 的分支情况图;下方是详细的版本情况列表,可从中进一步了解同一 changeset 更新情况,或者此次更新与某一版本的 diff。
演示用 Ant 项目 build.xml 文件页面
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 服务,则可填充以下内容。
然后更新 5.40 上 apache 的配置文件 httpd.conf
如果是将采用独立模块方式,你需要确保上面两个 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 配置和使用方法请参考:
URL重写指南
Apache 重写规则的常见应用
配置完这些后重起 fisheye 和 apache 应该就能够通过 http://192.168.5.40/src 访问到 5.40 上的 127.0.0.1:8080/ 服务。
下一步则是使用 apache 的 location 命令,在 httpd.conf 中为 /src 虚拟目录加上访问授权限制。
这里使用 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 模式显式中文不正常,但总体上来说还是一个非常不错的解决方案。就实现上来说,也为我们展示了对开源项目集成的可行性和强大功能。
作为使用最为广泛的源代码版本控制系统,CVS 有使用简单、操作方便以及第三方工具支持完善等等优点。但与 ClearCase 等商业级产品相比,CVS 的直观性非常差。特别是在应用 TDD 和重构思想后,代码更新更为频繁和琐碎,已经很难通过 CVS 内建功能,或者 WinCVS 等简单的客户端工具,对系统的整体版本情况有一个直观的整体印象。
虽然也有类似 CVSweb、ViewCVS 和 CvsGraph 等 Web 浏览工具的支持,但其功能定位只是在处理简单的文件浏览与比较,并不能完全解决复杂环境下的问题。
相比之下大名鼎鼎的 Java 代码覆盖工具 Clover 提供商 www.cenqua.com 发布的 fisheye 较好地解决了这个问题。通过强大的代码分析和统计功能,以及灵活的搜索与比较,能够让使用者实时了解项目的整体进展情况。
1.界面
fisheye 的主界面非常简洁,但功能非常强大,能够对项目整体情况一目了然。
演示用 Ant 项目主界面
左上角一个动态统计的代码行数趋势图,可以让你对每级目录(对应Java下的是包)中代码行数如何随时间变化一目了然,还可以比较不同的分支之间的差别;
左中是限制面板,可以通过 CVS 分支(brach)、作者、标记(tag)和日期限制当前浏览的代码范围;
左下是快速目录导航,可以方便在不同目录之间切换,并选择是否隐藏空文件夹和隐藏文件夹;
如果系统打开 tarball 功能,最左下还会出现当前目录指定限制下 tarball 下载的功能面板。
右上则是最近一段时间的 changelog,可以清楚了解最近有哪些更新,并可切换的完整日志模式;
右下则是当前目录下文件的版本、作者、最后更新时间、注释等等信息;
切换到 changelog 模式,则可以以时间为纬度,查看更新情况。
演示用 Ant 项目 changelog 界面
最后一个 search 模式,提供了灵活的组合查询方法,并可以支持其特有的高级 EQL 语言查询。
演示用 Ant 项目 search 界面
点击进入到某个文件的页面,则在左上显式文件本身的代码函数趋势图;右上显式类似 CvsGraph 的分支情况图;下方是详细的版本情况列表,可从中进一步了解同一 changeset 更新情况,或者此次更新与某一版本的 diff。
演示用 Ant 项目 build.xml 文件页面
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 Settings
Bind: 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.so
RewriteEngine 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 配置和使用方法请参考:
URL重写指南
Apache 重写规则的常见应用
配置完这些后重起 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 则是一个简单的文本文件,内容包括组名后跟用户名
以下为引用:
src: flier
完成此设置后,就可以通过 apache 的用户认证服务,限制对 fisheye 的目录的访问。此外还可以通过 mod_rewrite 的 RewriteCond 限制诸如访问时间、访问地址等等约束条件。
至此,一个完整的 fisheye 环境就搭建完毕了。
目前 fisheye 还只是处于 0.5 beta 的阶段,但功能上已经非常完整了。虽然还存在一些细节上的问题,如 changelog 模式显式中文不正常,但总体上来说还是一个非常不错的解决方案。就实现上来说,也为我们展示了对开源项目集成的可行性和强大功能。