越來越多軟體開發人員使用 Git 作為版本控制器,可以像 Github 一樣開發協作的整合式版本控制平台的確迎合了許多企業的需求,因此有越來越多企業在內部架設 Gitlab 作為企業內的協作平台。企業內的應用整合 Active Directory 尤為重要,在人員離職的時帳號即被註銷,因此有較大的安全性。並且透過 LDAP 的機制,新進人員不用申請帳號即可設定使用 Guest 權限,讓每個企業員工都可以在 Gitlab 上報 Issue 並對 Issue 進行追蹤,加強了內部使用者與開發人員的溝通管道。
我的 Gitlab 版本選擇為 6.4-Stable,若是其他版本可能需要有其他額外或省略部分設定。 系統首選 Ubuntu 12.04 Server,這應該是大多數人的選擇。
Gitlab 的安裝可以參考官方文件:
https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md
另外有一份 Tsung 的中文版本可以參考:
整個安裝步驟看起來很複雜,其實在 Ubuntu 12.04 下照著說明一步步進行安裝,完全不會碰到什麼難解的特殊情況,我認為 Linux 新手也很容易能夠照說明安裝好一套 Gitlab。我第一次安裝因為網路慢的原因大概花了兩個多小時,後來安裝正式環境的時候大概因為比較熟練,一個多小時就完成安裝了。
針對安裝部分補充說明一下,「第一次啟動網頁要跑比較久」這個問題其實是可以透過 Precompile 解決的,網路上也有人說改 Timeout 值,但是有些比較慢的機器 Timeout 值改很大也沒什麼作用,這還是得從根本用 Precompile 解,直接用下列指令在第一次啟動後做 Precompile:
cd /home/git/gitlab; sudo bundle exec rake assets:precompile RAILS_ENV=production
好了,接下來回到正題。 整合 Active Directory 主要是參考網路上的這一篇:
https://raymii.org/s/tutorials/Gitlab_and_Active_Directory_LDAP_Authentication.html
一般來說如果你的 AD 環境不複雜直接照著做就可以成功了,但是我還是碰到了坑,主要是栽在這一段
bind_dn: 'CN=Gitlab LDAP,CN=Users,DC=Domain,DC=tld'
原作者的 AD 環境可能比較簡單,建立的帳號直接在 CN=Users 下就可以找到,我設定的服務帳號卻一直都不成功,提示 “Invalid credentials“,網路上查詢到的都是要 Patch omniauth-ldap 的方法,不過那是在 Gitlab 5.4 的 Workaround 了,現在都過了大半年了以 Gitlab 的開發速度應該早就 Patch 掉了,因此不做考慮。接下來發現一個日本的網頁在說明 Gitlab AD 整合,其作者在 bind_dn 這段沒有用 CN=Users,而是使用了:
OU=DEPT,CN=Users,DC=Domain,DC=tld
這樣的語法,原來在 bind_dn 中需要指定完整的 LDAP 路徑 (Full LDAP path)。
於是找到以前寫的程式查詢我所用的服務帳號到底是建在哪裡:
public string UserBelongOU (string s) { Impersonator im = new Impersonator(); im.Impersonate(); try { DirectoryEntry entry = new DirectoryEntry("LDAP://DC=fetag,DC=net", Account, Password); DirectorySearcher mySearcher = new DirectorySearcher(entry); mySearcher.Filter = "(samAccountName=" + s + ")"; SearchResultCollection result = mySearcher.FindAll(); foreach(System.DirectoryServices.SearchResult resent in result) { string Return = ""; Return = resEnt.Path; Return = "LDAP://" + Return.Substring(Return.IndexOf ("OU=")); return Return; } } catch {} im.Undo(); return ""; }
結果是在
OU=NewTech,OU=IT,OU=Site,DC=fetag,DC=net
這麼一串下,然後修改 bind_dn:
bind_dn: 'CN=Gitlab Service,OU=NewTech,OU=IT,OU=Site,DC=fetag,DC=net'
後重新啟動 Gitlab 就可以了。
加碼:如果有「LDAP 認證時使用 Filter」需求請參考底下這一篇:
http://blog.dimaj.net/content/howto-enable-ldap-filters-gitlab
原則上是需要 Patch omniauth-ldap,然後加上 filter 屬性,這樣可以在驗證時不是所有 Domain User 都能登入,而是在某個 Group 下的使用者才能夠登入使用 Gitlab。這一個做法只要是 LDAP 都可以,Active Directory 非必要。
[補充] Gitlab 的備份與恢復可以參考: https://github.com/gitlabhq/gitlabhq/blob/master/doc/raketasks/backup_restore.md