Fork me on GitHub

Mercurial 版本控制服务器(Web Server)的搭建

关于 Mercurial 的简介和基本操作,请参见小G的随笔《Mercurial(Hg)基本操作》。

我不再赘述 Mercurial 的各种让人振奋的特性,上一篇中我们提到了使用第三方版本库 bitbucket 来进行私有代码托管,但是小G在使用过程发现,由于天朝的网络问题,经常会使通信中断而导致同步操作失败。所以,这一篇,小G来和大家分享一下怎么搭建自己的 Mercurial 版本控制服务器。

1.环境和所需的工具

小G的服务器是 Windows Server 2008 R2 x64 版本, 对于软件小G一向是“喜新厌旧”的(^O^),所以下面所列出的这些工具,都是目前为止的最新版本:

2.操作步骤

1) 先安装 Python 2.7.3,接着安装 Mercurial 2.4.2 Python 2.7 package,再安装 TortoiseHg 2.6.2 with Mercurial ,最后安装 URL Rewrite 组件;也可以不按这个顺序安装,但是 Python 2.7.3 一定要在 Mercurial 2.4.2 Python 2.7 package 之前安装(推荐大家全部使用各工具软件的 x86 版本,因为 x64 位版本的 Python 小G在配置时报错了)。

2) 新建一个目录用于存放 Mercurial 站点,小G的目录是:E:\SkyDrive\Development\Mercurial\hgweb

3) 在 IIS 中新建一个网站,名称自定义,小G的网站名是 hgweb,物理路径指向上一步的 E:\SkyDrive\Development\Mercurial\hgweb

4) 在 IIS 中选择刚才新建的网站,右侧的功能视图中选择 “处理程序映射”,如下图:

image_thumb1

双击“处理程序映射”,在右侧的动作列表中选择“编辑脚本映射”,按下图配置:

01233520-65b0134f55a54d268dd98a98200ece37

其中“请求路径”指定要处理的文件类型,“可执行文件”指示处理 cgi 文件的应用及其参数。

cgi 是个“古老”但很NB的东东,IIS 5.1 下的配置,请参见《基于windows IIS的C语言CGI WEB服务器环境搭建》。

5) 创建 hgweb.cgi 默认文档

选择刚才新建的 hgweb 站点,在右侧的功能视图中选择默认文档,双击打开:

image_thumb3

在右侧的动作列表中选择“添加”,新增一个 hgweb.cgi 的文档项,并将此文档上移置顶:

image_thumb4

 

6) 创建 hgweb.cgi 文件

在 Mercurial 的站点目录(E:\SkyDrive\Development\Mercurial\hgweb)下,新建一个 hgweb.cgi 文件(文件名可自定义),填入以下内容:

#!C:/Python27/python.exe
#
# An example FastCGI script for use with flup, edit as necessary
# Path to repo or hgweb config to serve (see 'hg help hgweb')
config = "E:/SkyDrive/Development/Mercurial/hgweb/hgweb.config"

# Uncomment and adjust if Mercurial is not installed system-wide
# (consult "installed modules" path from 'hg debuginstall'):
import sys; sys.path.insert(0, "C:\\Program Files (x86)\\Mercurial")

# Uncomment to send python tracebacks to the browser if an error occurs:
import cgitb; cgitb.enable() from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb, wsgicgi
application = hgweb(config)
wsgicgi.launch(application)

说明:注意第一行,一定要用#!,否则会被当成注释,后面是 Python 2.7 的安装路径;上面第二个灰色区域是 Mercurial 的安装路径,大家请根据自己的具体情况做调整。

7) 创建 hgweb.config 文件

在 Mercurial 的站点目录(E:\SkyDrive\Development\Mercurial\hgweb)下新建一个 hgweb.config 文件,填入以下内容:

[paths]
/Repositories/ = E:/SkyDrive/Development/Mercurial/Repositories/*
[web]
descend = True
baseurl = /

其中阴影部分等号左侧类似于一个版本库分组,右侧是版本库的物理路径;

这时你其实已经可以使用匿名用户访问版本库,输入网址应该可以看到如下界面:

image_thumb11

小G在这里绑定了子域名,大家如果没有域名绑定时可直接输入IP地址进行测试;

8) 启用 Url Rewrite

包含 hgweb.cgi 的请求路径是不是有点复杂?下面小G告诉大家如何去除这个复杂的东东。

在新建 HgWeb 站点时,IIS 会自动创建一个 Web.config 配置文件,用编辑器(小G比较喜欢用 Notepad++)打开这个配置文件,并在 System.webServer 的 handlers 结点下添加一个 rewrite 配置节,最终的文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <defaultDocument>
            <files>
                <add value="hgweb.cgi" />
            </files>
        </defaultDocument>
        <handlers accessPolicy="Read, Script">
            <remove name="CGI-exe" />
            <add name="CGIHandler" path="*.cgi" verb="*" modules="CgiModule" scriptProcessor="c:\Python27\python.exe -u &quot;%s&quot; &quot;%s&quot;" resourceType="Unspecified" requireAccess="Script" />
            <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" scriptProcessor="C:\Python27\python.exe" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
        </handlers>
        <rewrite>
            <rules>
                <clear />
            <rule name="hgweb.cgi" enabled="true" patternSyntax="Wildcard">
                <match url="*" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                </conditions>
                <action type="Rewrite" url="hgweb.cgi/{R:1}" />
            </rule>
            </rules>
        </rewrite>
    </system.webServer>
    <appSettings>
        
    </appSettings>
</configuration>

现在你就可以像下图这样,直接使用域名或IP访问版本库列表了:

image_thumb2

9) 测试匿名用户

此时我们只能克隆(clone)版本库,推送版本库时会得错误提示:ssl required,因为我们还没有启用 SSL功能。但可以通过配置暂时禁用 SSL 检查。打开 hgweb.config,在 web 节点下新增 push_ssl=false 配置节,具体内容如下:

[web]

baseurl = /hg

push_ssl = false

这时再尝试推送(push),Mercurial 会返回另一个错误提示:abort: authorization failed。 因为现在连接的是匿名用户, 而默认情况下是禁止匿名用户推送的, 所以再在 hgweb.config 的 web 节下增加一个配置节: allow_push = *, 如下所示:

[web]

allow_push = *

baseurl = /hg

push_ssl = false

现在重新推送,就成功了。

10) 启用 SSL 推送功能

如果不考虑安全性和权限管理,现在我们的 HgWeb 站点其实已经可以正常使用了。但在实际应用中,我们不可能忽略安全性问题,所以我们接下来配置安全和权限相关的设置。

打开 IIS,点击最顶级的服务器结点,在右侧的功能视图中选择“服务器证书”:

image_thumb5

在右侧的动作列表中选择“创建自签名证书”,确定即可生成证书,如下图:

image_thumb6

在 hgweb 站点上右键,选择编辑绑定:

image_thumb7

点击“添加”,新增一个 https 的网站绑定,端口设置为443,SSL证书选择刚才创建的自签名证书,并删除原来的 HTTP 绑定信息,具体如下图:

image_thumb8

编辑 hgweb.config 文件,删除 push_ssl = false 配置节,表示推送动作必须启用 SSL。

先到客户端尝试执行一下 clone 命令, 会发现 Mercurial 返回了一个错误提示,原来 Mercurial 对我们刚才创建的自签名证书是非常不信任的,,它并不承认这个证书,但是有一个 –insecure 选项可以用来解决这个问题, 在控制台中执行以下命令:

01233547-8f20ef0f62eb4593b0742b28a923ee3a

注意:这里的克隆使用的 URL 地址是区分大小写的,书写错误会导致 404 错误提示,小G怀疑这是 hgweb 的 cgi 应用的一个 bug。

Clone 指令能够成功执行, 但是会返回一个警告,这个警告很重要,里面包含一个 fingerprint 的信息, 把上述警告中的 fingerprint 复制下来,(即上图中的标记部分),找到当前用户的根目录,(C:\Users\Tim), 里面应该有一个 mercurial.ini,用任意文本编辑器打开此ini文件, 参考如下内容修改:

# Generated by TortoiseHg settings dialog
[tortoisehg]
ui.language = zh_CN
vdiff = beyondcompare3
ciexclude = *.o,*.lo,*.la,*.al,.libs,*.so,*.so.[0-9]*,*.a,*.pyc,*.pyo,*.rej,*~,#*#,.#*,.*.swp,.DS_Store,_UpgradeReport_Files,bin,debug,release,obj,*.suo,UpgradeLog.XML,*.user,*.scc,*.vspscc,*.pdb,UpgradeLog*.XML,_ReSharper.*,Thumbs.db,logs,*.Publish.xml,*.postbuild,*.vssscc,*.vspscc
[ui]
merge = beyondcompare3
username = gb2013
[web]
push_ssl = True
[hostfingerprints]
code.domain_name.com = 7f:65:a7:ab:5d:d0:e9:05:80:1e:f4:cb:71:8c:59:42:4d:d2:3d:3c

其中阴影部分就是我们要新增的内容,左侧是 hgweb 绑定的域名,如果没有域名可直接填写服务器IP,右侧是刚才使用 clone 指令时得到的 fingerprint 。

注意: 修改mercurial.ini是在客户端执行的,也就是说,每一台客户端都需要执行本步骤以避免安全警告。

11) 设置身份认证方式

打开 IIS,选择 hgweb 站点,在功能视图中选择“身份认证”:

image_thumb10

禁用除“基本身份认证”以外的其他认证方式:

image_thumb11[1]

如果使用了本机帐户, 需要注意的是,一般为本机添加的新用户都是属于 User 组的, 而 User 组默认对许多文件夹只有读权限,而没有写权限,这时在服务端要在 Repo 的根目录上给 User 组写权限,否则会抛出如下错误:

HTTP Error: 500 (D:\Mercurial\Repos\EERP.Web\.hg/store\00changelog.i:)

[command returned code 255 Fri Mar 02 15:56:42 2012]

12) 自动验证

通过上述操作,已经可以使用 hgweb 来管理我们的代码了。但是每一次连接服务器都要输入一次用户名和密码,其实 Mercurial 也支持自动验证。打开用户根目录下的 Mercurial.ini,增加 [auth] 配置节:

[auth]

default.prefix = https://code.domain_name.com/

default.username = gb2013

default.password = ********

其中,default 并没有实质意义,仅仅为了分组,可以将default改为任何名字。

3. 使用 SkyDrive 云端服务来同步自己的版本库

这一步操作可有可无,但小G推荐大家还是这样做一下。

我们确实无法预料服务器会在什么时间由于硬件故障而导致宕机,当然最可怕的还是硬盘损坏,那时我们辛辛苦苦所得的劳动成果都将化为乌有,这对于我们开发人员来说是个不小的打击。因此,小G推荐大家把自己的版本库同步到云端。

我比较喜欢微软的 SkyDrive 云端存储服务,在此也推荐大家使用它。同样的服务还有 Dropbox、百度云盘、金山快盘和360云盘等,小G原本最喜欢的是 Dropbox,但是由于天朝威武的 GFW,我们无法使用它的 Web 端,最后只得忍痛割爱放弃它,至于国内的各个网盘,小G对于它们的稳定性有些怀疑,所以暂且不予考虑。

SkyDrive 经过前面几代的更新,现在功能已经比较成熟,尤其是它的 Web 端,做得非常完美,灵活的右键菜单、拖拽上传及文件分享的权限管理等,带给我们 RIA 一样的操作体验,并且上传和下载速度也不慢。下面 SkyDrive 的空间升级方案,小G觉得价位也很合理:

image_thumb12

好了,不给微软打广告了,小G只是觉得这个服务非常方便(^_^),小G会在以后的文章详细介绍它的使用方法。

下面说一下同步所需要的操作:

在安装 SkyDrive 客户端之后,不要直接将版本库目录设置为同步目录,因为 SkyDrive 是即时监控同步目录中文件变化并同步的,这样大家远程推送代码时会造成版本库损坏(小G和伙伴亲测得出的结果)。这一问题也很好解决,使用第三方同步软件(小G用的是 Allway Sync)来将版本库目录同步至 SkyDrive 的本地目录中,为避免版本库损坏,小G将设置修改为单向同步(Mercurial->SkyDrive)且在文件变动后10分钟才进行同步操作。

至此,我们自己的 Mercurial Web Server 就搭建完毕。hgweb 并没有提供 Web 端创建版本库以及用户管理的功能,所以,乡亲们如果有兴趣,我们可以在 github 中组织一个开源项目。

posted @ 2013-02-01 23:36  TimGong  阅读(7015)  评论(2编辑  收藏  举报