Flier's Sky

天空,蓝色的天空,眼睛看不到的东西,眼睛看得到的东西

导航

使用 FishEye 直观了解 CVS 情况

Posted on 2004-10-27 22:37  Flier Lu  阅读(9315)  评论(0编辑  收藏  举报
原文:http://www.blogcn.com/User8/flier_lu/blog/4471578.html

    作为使用最为广泛的源代码版本控制系统,CVS 有使用简单、操作方便以及第三方工具支持完善等等优点。但与 ClearCase 等商业级产品相比,CVS 的直观性非常差。特别是在应用 TDD 和重构思想后,代码更新更为频繁和琐碎,已经很难通过 CVS 内建功能,或者 WinCVS 等简单的客户端工具,对系统的整体版本情况有一个直观的整体印象。
    虽然也有类似 CVSwebViewCVS 和 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 服务,界面框架是 ::URL::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 服务器后,可以通过 ::URL::http://127.0.0.1:8080  登陆到系统,第一次进入时会要求输入管理员口令,此口令将被 md5 后保存到 config.xml 中。此后都可以通过此口令,访问 ::URL::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 中希望使用的虚拟目录名,如你希望通过 ::URL::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/?(.*)$  ::URL::http://127.0.0.1:8080 /src/$1 【P,L】


    如果是将采用独立模块方式,你需要确保上面两个 LoadModule 没有被注释掉;否则可能需要重新编译 apache 来增加模块。

    这里的 RewriteEngine on 表示启用 mod_rewrite 模块;RewriteRule 则将所有匹配 ^/src/?(.*)$ 的 web 请求重定向到 ::URL::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 应该就能够通过 ::URL::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_Externalmod_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 模式显式中文不正常,但总体上来说还是一个非常不错的解决方案。就实现上来说,也为我们展示了对开源项目集成的可行性和强大功能。