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 中組織一個開源項目。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM