把Git上Web

想到Git Web,大家第一個想到的就是GitHub,但GitHub放公開的專案是好,無奈私有專案卻是要花錢的,所以肯定很多人會想要自建Git Web。

目前的OpenSource專案來看,GitBuck的界面是最接近GitHub的專案,但是恨不逢君未嫁時,那時候她還沒有出生,所以用了另一個Open Source: Gitblit

我覺得GitblitGitBuck較為封閉,因為Gitblit雖然可以fork,但沒有pull request,比較不利於不同團隊之間的交流。

Gitblit是建置在Java之上,所以要先安裝JVM (7+),Java環境裝好後,再來是建置WebC Container,最方便的是Tomcat,把下載War檔(1.7.1版)且接丟到 webapp/ 下(丟進去前可將檔名改為git.war),再把Tomcat上起來,下載的War檔就會自動在 webapp/ 下解開。

開啟瀏覽器,以admin/admin登錄,先改密碼後再把Tomcat停機,再來修改Gitblit設定gitblit1.png
Gitblit的檔案結構如下:
gitblit2.png
WEB-INF/data 儲存著包含Gitblit的設定與檔案庫(WEZB-INF/data/git),通常我們不會想把這麼重要的目錄直接放在WEB程式下,首先
  1. 把 data/對的所有資料拷貝到別處(其中兩個*.pem除外不拷貝):例如拷貝到 /gitrepo下(data目錄保留對刪除,若刪除則程式就跑不起來),
  2. 然後開啟web.xml,修改其中資料如下gitblit3.png
設定中的 /gitrepo 就是在Gitblit內${baseFolder}所指稱的路徑。
左圖後的 users.conf就是使用者的設定檔,在Web界面設定皆儲存於此檔案
project.conf 與 git/project.mkd 兩個檔是主要檔案庫的標題與說明,自行修改中文如下:

project.conf
[project "main"]
   title = 主要版本庫
   description = 文件庫的主群組
git/project.mkd
本專案乃是包含以*git.repositoriesFolder*為根目錄下所有建立的版本庫

現在展示的訊息儲存在 *git.repositoriesFolder*/**project.mkd**.

#### 其它專案

在每一個專案或是版本庫群組都可以有其專屬的訊息,只要在專案目錄下建立 **project.mkd**.
例如:
<pre>
<i>git.repositoriesFolder</i>/專案a/<b>project.mkd</b>
<i>git.repositoriesFolder</i>/專案b/<b>project.mkd</b>
</pre>
然後顯示如下:gitblit4.png
Gitblit主要的設定gitblit.properties檔案,因為其內容只有一行include = defaults.properties,所以真正的設定在defaults.properties,開始說明幾處設定:
#這裡就是Git檔案庫的存放所在地
git.repositoriesFolder = ${baseFolder}/git
#這裡就是Gitblit的用戶設定檔案
realm.userService = ${baseFolder}/users.conf
#這裡設定Gitblit的URL,若不設就會出現像http://localhost/git或是http://192.168.10.xxx/git
web.canonicalUrl=http://git.mydomain.com/git
#這裡必須為true,除非只用ssh://或git://方式存取Gitblit
git.enableGitServlet = true
#是否顯示串連(federation)的鍵值,後面再解釋,如果有多個Gitblit要串連,請設為true
web.showFederationRegistrations = true
#若為空值則不會有串連功能,其值是用來產生Gitblit的識別鍵值之用
federation.passphrase = 非空字串
好吧,啟動Tomcat,開啟瀏覽器,設定使用者,並建立新的版本庫,gitblit6.png
gitblit7.png

Let’s git it.
gitblit5.png

HOOK

Gitblit允許在特定的時間點,執行一些額外的動作,例如當使用者Submit專案後,通知Jenkins進行檔案抓取並進行建置。作法很簡單,只要設定Gitblit在接收專案(使用者Submit)後,執行一段額外的程式(在這個例子,我選擇了jenkins)。
Gitblit的Hook程式放在${baseFolder}/groovy/ 目錄下,開啟jenkins.groovy修改如下:
def jenkinsUrl = gitblit.getString('groovy.jenkinsServer', 'http://jenkins.yourdoman.com.tw')
def triggerUrl = jenkinsUrl + "/buildWithParameters?token=${repository.name}"
程式片段很簡單:就是使用者Sumit後,觸發知Jenkins Server的某個網址(在這例子中${repository.name}會被替代成sd4j.git),讓知Jenkins知道該去Pull 某些程式來進行建置,上面的修改完後存檔後重啟Web Server
gitblit1.png
再來看看Jenkins的工作設定jenkins.png
上面的Repository URL設為取得程式碼的網址,Credential則是設定登錄Gitblit主機的帳/密,下面勾選遠端觸發建置,也就是之前Hook設定:使用者Submit後通知Jenkins主機,這裡通知的網址可以有兩種型式,我選擇第2種,所以當我的專案Submit到Gitblit主機後,Jenkins主機便按的Repository URL網址把程式碼抓下來建置專案。

串連(Federation)

其實說穿了很簡單,就是把一台Gitblit主機的檔案庫同步到另一台Gitblit主機。我們首要是在設定檔中加入一些相關設定,從官方文件中,它把要被備分的主機稱為Origin,把備分的主機稱為Pulling,首先我們登錄Origin主機(登錄者要有admin的權限),然後選取串連。
origin1.png
然後可以看到有3種不同的備分方式:
origin2.png
第一種方式是把整機,包含所有版本庫、用戶與機器設定,一股腦全部備分到另一台機器,第二種方式則只是備分所有版本庫與用戶資料,第三種則只有備版本庫而以。當決定好備分方式後,我們按下提案(proposal),告知另一台主機(Pulling)我們的要求。
origin3.png
提案發出後再登錄到Pulling主機(登錄者一樣要有Admin的權限)後,開啟串連後會看到下面

pulling1.png

點進去後會看到
pulling2.png
把上述紅色的通知文字貼到Pulling主機的設定檔(defaults.properties), 當然貼上去前要做點小修改
#把originkentyehcomtw改成originServer
federation.originServer.url = http://origin.kentyeh.com.tw/git
federation.originServer.token = 0986286c18bd0ea741fe330389014850b04555ca
#10分鐘備分一次,可視需要修改
federation.originServer.frequency = 10 mins
#表示Origin的版本庫會備分到目錄${baseFolder}/git/originServer下,會用目錄區分是因為
#一台#Pulling備分主機可備分來自多台不同的Origin主機的版本庫,若是一對一的備分,
#直接把下面的oringServe移除,則直接備在${baseFolder}/git/目錄下
federation.originServer.folder = originServer
federation.originServer.bare = true
federation.originServer.mirror = true
federation.originServer.sendStatus = true
federation.originServer.notifyOnError = true
#設定只有那些Oring版本庫不會被備分
federation.originServer.exclude =
#設定只有那些Oring版本庫會被備分
federation.originServer.include =
Pulling主機的設定檔完成修改後重啟WEB,再回到串連後可以看到備分狀況(我剛剛還在想會不會有人想要做雙向備分,絕對不要,因為若是兩人在不同主機Sumit,倒底要誰蓋誰?)
pulling3.png

GIT-FLS

Gitblit網頁上有一個filestore,須安先安裝GIT-LFS,目的是在整合版本庫內的大型二進位文件(如影音檔、圖檔…),因為直接在Git內壓縮這些二進位檔並無效率。
GIT-LFS安裝完成後必須執行一次 $git lfs install(會更改一些全域設定),只要針對二進位檔作 $git lfs trace “*.jar”,然後再add 、commit即可
很可惜,不知道是不是版本的問題,在push時會發生錯誤(應該是golang寫的),而push時要登錄兩次(網路上有人反應會登錄多次),我的觀察是第一次是取回Gitblit端的設定然後寫入 .git/config ,然後再上傳資料。
#.git/config相關內容
[lfs "http://kent@origin.kentyeh.com.tw/git/r/sd4j.git/info/lfs"]
   access = basic
可惜,這個功能試不出來

後記

到此,對一般開發組識,應該是夠用了,我覺得Gitblit最重要的功能就是串連了,因為在位何組識,資料復原永遠是件大事,至於GitBuck沒有同等的功能了。所以Git on Web Gitblit仍是不錯的選擇。

留言

這個網誌中的熱門文章

企業人員的統一管理-FreeIPA學習筆記

證交所最佳五檔的程式解析

Postgresql HA