现在的位置: 首页 > 综合 > 正文

分布式版本控制系统Mercurial(二):web server的架设

2013年01月31日 ⁄ 综合 ⁄ 共 7359字 ⁄ 字号 评论关闭

关于Mercurial的基本功能请参阅 分布式版本控制系统Mercurial(一):Mercurial基本功能介绍

 

到目前为止,还没有一个比较成熟的Mercurial Web Server软件,所以如果需要通过web访问mercurial的数据仓库,就需要我们手动一步一步地配置,这个过程较为繁琐,应该说这是Mercurial与SVN相比,比较大的一个问题,不过相对于一款极为优秀的工具每天都能给自己提供服务来说,麻烦一次并不算什么。

 

注意: 以下描述的安装过程仅用于Web服务器端。各客户端只需要简单安装tortoisehg with mercirual即可。

 

1. 环境和版本

我使用的Mercurial版本是2.1, 配了tortoisehg2.3.0. 其中, Mercurial使用的python版本是2.6.6.
操作系统是windows server 2008.

2. 安装过程所需要用到的素材.

a) TortoiseHg 2.3.0 (http://mercurial.selenic.com/downloads/)

b) Mercurial 2.1 Python 2.6 package - x86 Windows
(http://mercurial.selenic.com/downloads/)

c) Python 2.6.6 (http://www.python.org/ftp/python/2.6.6/python-2.6.6.msi)

d) IIS的url rewrite组件(http://www.iis.net/download/URLRewrite) (这个组件只能用于IIS7)

3. 先安装Python2.6.6, 然后安装Mercurial的Python package, 然后安装TortoiseHg, 最后安装url rewrite组件. 当然, 其实也不见得按照这个顺序安装, 只不过如果你不知道应该按何种顺序安装的话,可以参考我这个安装顺序.

4. 在D盘建一个数据仓库总目录, 例如D:\Mercurial, 所有的repositories都将位于这个目录之下.

5. 在IIS中建立一个application, 命名为hg(当然, 你可以随便叫什么名字), 使其物理路径指向d:\Mercurial, 然后编辑其Handler Mappings, 如图所示:

image

双击Handlers Mappings, 右侧会出现一个actions列表, 点击Add Managed Handler, 会弹出一个新建窗口, 按如下图所示填写这个新建窗口:image

6. 在D:\Mercurial下新建一个文本文件, 重命名为test.cgi (注意连同扩展名一起修改) , 编辑其内容如下:

print 'Status: 200 OK'

print 'Content-Type: text/html'

print

print '<html><body><h1>It Works!</h1></body></html>'

保存, 然后在IIS中浏览test.cgi:

url: http://localhost/hg/test.cgi

界面:

image

如果能看到上述界面, 说明初期配置成功,继续.

如果提示HTTP 错误 404.2 - Not Found

由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面

打开IIS管理器, 定位到服务器级别, 在其功能列表中找到ISAPI and CGI restrictions, 如图:

image

双击打开, 里面必须存在如下图所示的行:

image

如果不存在则按点击右侧的”add”, 按下图填写:

image

 

如果已存在, 但是被禁用, 将其启用即可.

完成后重试打开test.cgi, 应该可以看到it works字样.

7. 在D:\Mercurial目录下新建一个文本文件, 重命名为hgweb.cgi, 编辑其内容为以下几句话:

#!/usr/bin/env python

#

# An example hgweb CGI script, edit as necessary

# See also http://mercurial.selenic.com/wiki/PublishingRepositories

# Path to repo or hgweb config to serve (see 'hg help hgweb')

config = "D:/Mercurial/hgweb.config"

# Uncomment and adjust if Mercurial is not installed system-wide:

#import sys; sys.path.insert(0, "/path/to/python/lib")

# 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)

然后再在D:\Mercurial下新建一个文本文件, 重命名为hgweb.config, 不需要写入任何内容, 即可尝试浏览http://localhost/hg/hgweb.cgi . 应该能看到如下界面:

image

如果提示unexpected indent, 打开此文件 ,删除每一行前面的空格即可。

8. 在url中包括一个hgweb.cgi是很不令人喜欢的一件事, 所以本步骤的目的就是消除hgweb.cgi字眼, 如果你觉得没必要, 可以跳过本步骤不看.

第5步在IIS中建立application的时候, IIS会自动在D:\Mercurial目录下创建一个web.config文件, 用任意文本编辑器打开此文件, 在System.webServer节下的handlers节下面增加一个rewrite节, 最终的文件内容如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="Python" path="*.cgi" verb="*" modules="CgiModule" scriptProcessor="C:\Python26\python.exe -u &quot;%s&quot;" resourceType="Unspecified" requireAccess="Script" />
    </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>
    <security>
      <authorization>
        <remove users="*" roles="" verbs="" />
        <add accessType="Allow" users="*" />
      </authorization>
    </security>
  </system.webServer>
</configuration>

然后打开hgweb.config, 写入如下内容:

[web]

baseurl = /hg

这时可以尝试浏览http://localhost/hg, 其结果应该和http://localhost/hg/hgweb.cgi完全相同.

9. 测试匿名帐户
现在在D:\Mercurial下建一个名为test的目录, 并在这个目录下执行命令hg init (或tortoisehg的create repository here命令)使得它成为一个hg的仓库. 然后浏览http://localhost/hg, 应该会看到test项目被列举了出来:

image

这时可以把这个test项目clone到另一个位置, 例如, 在控制台中执行如下命令:

Hg clone http://localhost/hg/test d:\test

就可以把这个测试仓库clone到D:\test, 在D:\test下新建一个文本文件, 然后add & commit, 最后在D:\test下执行hg push, Mercurial会返回一个错误提示: ssl required.

因为此时没有启用SSL, 虽然可以Clone, 但是Mercurial是不允许Push的, 有一个简单的办法可以暂时禁用SSL检查, 打开hgweb.config, 在web节下增加push_ssl=false配置, 如下所示:

[web]

baseurl = /hg

push_ssl = false

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

[web]

allow_push = *

baseurl = /hg

push_ssl = false

现在重新尝试push, 就会成功了.

10. 其实到现在为止, 如果不考虑安全性和权限管理, 应该说Mercurial的web服务端已经可以正式运行了, 但是在实际应用中, 不考虑安全性是不可能的, 所以我们下面来逐步配置安全性和权限相关的设置. 首先是启用SSL.

打开IIS, 点击选中最顶级的服务器节点, 它有一个Server certificates选项, 如图:

image

双击, 进入Server certificates选项, 点击右侧Actions列表的Create self-signed certificate, 接下来会弹出一个小窗口, 提示输入证书的名称, 随便起个名字, 例如hgTemp, 确定, 证书即可生成, 如下图所示:

image

然后, 右击网站节点, 在右键菜单中点击Edit bindings, 如图:

image

这里是编辑网站与哪个端口绑定的地方, 默认情况下, 这里应该有一个80端口的绑定, 我们先点击Add增加一个443端口, 点击Add后, 填表如下:

image

另外, 最好把原有的80端口删除, 这样以后这个网站就不允许使用80端口访问, 而必要使用更安全的https:// 前缀来访问了.

也可以在网站这个层级允许80端口, 而只把hg这个虚拟目录配置为要求SSL.

现在, 编辑hgweb.config, 把push_ssl = false 这句话删除, 表示网站对push动作要求必须使用SSL.

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

image

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

[ui]

username = Marvin Yan <MarvinYan@xxx.com>

[hostfingerprints]

localhost = 77:a4:29:03:bf:27:2b:bf:83:d1:7f:30:79:b7:09:f6:79:cf:23:96

[web]

name =

其中, ui节应该是在安装Mercurial以后就配置好的, 这是Mercurial用户名, 最重要的基本配置之一, 格式为: 用户姓名<邮件地址>.

还有一个web节, name的右侧不用写任何东西, 让Mercurial自动取工作目录为名字即可.

除此两节外, 增加一个hostfingerprints节, 按上述格式写上你自己的fingerprint.

现在再执行hg指令, 不需要增加—insecure参数, 也不再返回任何警告, 都可以成功执行了.

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

11. 身份验证.

打开IIS, 点击虚拟目录hg, 右侧会有相应的Authentication和Authorication rules选项, 如图:

image

首先双击Authentication, 进入Authentication编辑页面, 默认情况下, Anonymous authentication是被启用的, 先右击, 将它禁用, 这样用户就不能匿名访问这个网站了. 然后在Basic Authentication上右击, 点击Edit, 进入如下的Edit页面:

image

在Default domain和Realm上分别填入需要验证身份的域(计算机名), 这里需要说明的是: 如果这台Mercurial server处于某个域中, 可以填入域名,这样域中所有的用户都可以访问项目, 当然也可以authorication中进一步筛选, 但是后续的不少操作都受域服务器中策略的影响, 所以我个人不建议直接使用域帐户, 除非你同时也是域服务器的管理员, 那就无所谓了.

不填域名, 而是填上本机的计算机名, 这样进行身份验证的用户实际上就是本机的windwos用户, 进行各种控制相对来说都是比较自由的. 上图中, 我直接填上我的计算机名.

最后不要忘了检查是否已经把Basic authentication的状态改为enable, 并且其它验证都disable掉了.

Authorication rules中, 默认是allow all users的, 建议不必修改, 当然也可以改为specific user, 只允许一部分用户访问, 不过意义不大. 因为可以在windows的用户管理中删除多余的帐户, 保证只留下有效的帐户.

如果使用了本机帐户, 需要注意的是, 一般为本机添加的新用户都是属于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. 自动验证

每一次连接服务器都要输入一次用户名和密码显然是太麻烦了,Mercurial也支持自动验证。打开用户根目录下的Mercurial.ini, 增加[auth] 节如下:

[auth]

default.prefix = https://localhost/

default.username = Marvin

default.password = a

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

 

至此,整个Web Server和架设就全部完成。

抱歉!评论已关闭.