用 IIS 搭建 mercurial server

sparkdev發表於2017-02-24

mercurial server

對於程式碼管理工具,更多的人可能對 Git 更熟悉一些(Git太火了)。其實另外一款分散式程式碼管理工具也被廣泛的使用,它就是 mercurial。當多人協作時最好能夠通過建立一個 mercurial server 對使用者進行許可權認證,同時也方便持續整合。
關於建立 mercurial server 的步驟,mercurial 官方的 wiki 有說明,網上也有很多朋友分享了自己的建立過程。但筆者在建立的過程中還是頗費了一番周折才最終成功,所以也在此分享一下,希望對朋友們能有幫助。

環境及軟體安裝

筆者使用的作業系統為 Server2012R2 x64 Standard 中文版。在安裝其他工具前,先安裝 IIS。安裝 IIS 時需要注意,一定要把 CGI,ISAPI 這兩個選項都勾選上。

安裝 Python,使用預設設定安裝 python 2.7.x。

安裝 mercurial server,請從這裡在這裡下載 mercurial server 的安裝包並安裝。安裝完成後檢查 C:\Python27\Lib\site-packages\mercurial 目錄是否被正確安裝!

注意,python 和 sercurial server 必須保持相同的架構,不要一個安裝 x86 另一個安裝 x64。

設定 IIS 伺服器支援 python 模組

在 IIS 管理器中選擇 IIS server,雙擊”ISAPI 和 CGI 限制”,新增一項新的擴充套件:

喜歡使用命令列的同學也可以通過一行命令直接搞定:

C:\Windows\system32\inetsrv\appcmd set config /section:isapiCgiRestriction /+"[path='C:\Python27\python.exe -u %22%s%22',description='Python',allowed='True']"

建立網站

在 IIS 中建立一個新的網站,埠繫結 81(80埠已被預設網站佔用)。在網站的根目錄中新增 web.config 檔案。web.config 檔案的內容為:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="Python" path="*.cgi" verb="*" modules="CgiModule" scriptProcessor="C:\Python27\python.exe -u &quot;%s&quot;" resourceType="Unspecified" requireAccess="Script" />
    </handlers>
  </system.webServer>
</configuration>

需要注意檔案中 python.exe 的路徑,請根據自己機器上的安裝目錄進行配置。

網站的基本設定已經完成,下面寫個簡單的測試檔案檢查一下網站能否正常工作。
在網站的根目錄下建立 test.cgi 檔案,檔案內容如下:

print 'Status: 200 OK'
print 'Content-Type: text/html'
print
print '<html><body><h1>Hello world!</h1></body></html>'

在瀏覽器中訪問 http://localhost:81/test.cgi,如果看不到”Hello world!”,請檢查前面的步驟。

配置 mercurial server

在網站的根目錄下新增 hgweb.config 檔案,內容如下:

[collections]
C:\repos = C:\repos

[web]
push_ssl = false
allow_push = *

在網站的根目錄下新增 hgweb.cgi 檔案,內容如下:

#!/usr/bin/env python
# Path to repo or hgweb config to serve (see 'hg help hgweb')
config = "xxxxx\hgweb.config"

from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb, wsgicgi
application = hgweb(config)
wsgicgi.launch(application)

注意,請按實際情況配置 config 的路徑。
這就 OK 了,讓我們在 c:\repos 目錄下初始化一個庫然後訪問 http://localhost:81/hgweb.cgi 看看:

配置 URL 重定向

每次都要在 URL 中輸入 /hgweb.cgi,一來不方便,二來總感覺怪怪的。能不能輸入 http://localhost:81 就你可以正常訪問呢?當然可以,只要新增一個重定向的配置就可以了。
首先安裝 IIS 的外掛:http://www.iis.net/downloads/microsoft/url-rewrite
下載完直接安裝,然後在 web.config 檔案中新增 rewrite 元素,新的 web.config 檔案內容為:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="Python" path="*.cgi" verb="*" modules="CgiModule" scriptProcessor="C:\Python27\python.exe -u &quot;%s&quot;" resourceType="Unspecified" requireAccess="Script" />
    </handlers>
    <rewrite>
      <rules>
        <rule name="rewrite to hgwebdir" 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>
</configuration>

好了,現在訪問下 http://localhost:81 試試,和訪問 http://localhost:81/hgweb.cgi 是一樣的。

設定匿名訪問許可權

預設情況下我們已經可以使用匿名許可權從伺服器克隆庫並進行操作了。但當你執行 hg push 命令時會收到一個 HTTP Error 502: Bad Gateway 的錯誤。原因是匿名使用者沒有修改伺服器上檔案的許可權。我們需要給匿名身份驗證設定一個有修改檔案許可權的使用者。

現在就可以正常的執行 push 操作了。

總結

相比其他工具的一鍵式安裝與配置,mercurial server 的安裝和配置稍顯複雜。我們只是配置了最簡單的匿名訪問,並且不支援 ssl,不過這在區域網中基本也夠用了。

相關文章