2012年6月21日 星期四

Gitolite 設定與管理

首先,要使用跟管理 gitolite 一定得先會使用 git。下面就不贅述。

初次設定

對使用者而言,只要設定好 ssh host alias 即可。如果是 gitolite 管理者,還必須將 gitolite-admin 給 clone 下來,才能繼續後面設定的動作。
  1. 設定 ssh host alias
    $ vim ~/.ssh/config
    host gitolite  
        user git  
        hostname localhost  
        port 22  
        identityfile ~/.ssh/admin
    
    這個設定的重點是指定連線時使用特定的 identity file (private key),如此才能被 gitolite 認可為管理者 (gitolite 是看你用什麼 key 來決定你的身分)。記得 hostname 的部分要以自己的狀況更換成正確的主機位址。
  2. 取得管理 gitolite 的 repository
    $ git clone gitolite:gitolite-admin
    
    這個 repository 紀錄了所有 gitolite 的權限資料,包含所有 user 的 public key 與 repository 的存取權限設定。conf/gitolite.conf 中記載了所有專案的名稱以及每個 user 對專案的權限。而 keydir 中即為所有 user 的 keys。對 gitolite 的管理與設定都必須透過這個 repo 進行。

管理與設定 (參考資料)

新增使用者

只要將新使用者的 public key 放入 keydir 中並 add, commit, push 至 gitolite server 即可,檔名即為使用者的帳號。 假設現在使用者 someone 提供給我們 public key,我們要將他加入 gitolite 的使用者中:
$ cp /PATH/TO/someone.pub keypair/someone.pub
$ git add keypair/someone.pub
$ git commit -m "Add user someone"
$ git push origin master
完成以上步驟後,someone 就可以利用他的 private key 來存取 server 上的 repos。如果他嘗試直接使用 ssh 登入時,畫面會列出他有權限存取的 repo,以及相對應的權限等級,並立刻結束連線。(這是 gitolite-shell 提供的功能) 下面是舉例:
$ ssh gitolite # 這是我在 ~/.ssh/config 中設定的 host 名稱
PTY allocation request failed on channel 0
hello admin, this is git@CrBoy-VM running gitolite3 v3.01-14-gbc3eb34 on git 1.7.9.5

 R W    gitolite-admin
 R W    testing
Connection to localhost closed.
可以看到那個 admin 就是我們在 gitolite 中的虛擬帳號。再次提醒,gitolite 是根據你使用的 key 決定你的身分,如果你用了別把 key 那就會被認為是別的身分。萬一你用的 key 是不能通過的,那 ssh 會提示輸入密碼。為了安全性考量,可以禁止 git 帳號透過密碼登入。

新增專案 repository

修改 conf/gitolite.conf 即可新增或移除專案,並可以設定群組,方便管理。
repo    gitolite-admin
        RW+ = admin

repo    testing
        RW+ = @all
gitolite 預設了兩個 repo,一個就是我們正在使用的 gitolite-admin,另一個是 testing。repo 底下的則是該 repo 的權限設定。以此範例而言,gitolite-admin 僅有 admin 有權限存取,而 testing 則是所有人都可以存取。(由於 @ 開頭的表示群組,@all 應該是 gitolite 預設的群組)
值得注意的是,即使是 gitolite 的管理者,如果他沒有被加入 repo 的話,也是沒有權限存取的。同時也因為設定檔是經由 git 管理,管理者如果想要偷看別人的 repo,也很難完全隱匿 (有 log)。另外,如果管理者把自己的權限給拿掉的話,那就.....(但是還是可以登入主機去修理的,作法很簡單)

指定群組

可以透過 @ 來指定群組,群組中也可以包含群組,如下
@project1 = alice bob
@project2 = crboy dean
@company = boss @project1 @project2
repo 也可以組成群組
@system = proj1 proj2 proj3
repo    @system
        RW+ = boss

repo 名稱

repo 的名稱可能是一個明確的名稱:
repo some_project
也可能用正規表示法 (regular expression) 表示:
repo team/.+$
結尾加上 $ 符號是為了確保系統將這個名稱認定為正規表示式,避免誤判。 關於 repo 名稱比較複雜,進階設定方式可參考這裡

權限控制

權限控制的語法為 (我用了類似正規表示法的寫法)
<權限> [<引用>]* = [<user>]+
可用的權限有:C, R, RW, RW+, RWC, RW+C, RWD, RW+D, RWCD, RW+CD (這是從 gitolite 給的 vim syntax 裡面挖出來的),還有一個 -,說明如下
  • R 讀取
  • W 寫入或建立新的 refs (branches, tags)
  • + 刪除或改變 refs (允許 push -f)
  • - 拒絕存取 (可用以明確拒絕使用者存取此 repo,須寫在 R 權限之前)
C 和 D 是比較特別的權限
  • C (獨立) 僅用於使用正規表示法的 repo,表示可建立符合該正規表示法的 repo 名稱
  • C (組合) 僅用於使用正規表示法的 refs,表示可建立符合該正規表示法的 refs 名稱
  • D 僅用於使用正規表示法的 refs,表示可刪除符合該正規表示法的 refs 名稱

完整範例

@team = alice bob ### user 群組
@system = proj1 proj2 proj3 ### repo 群組

repo @all                       ### 所有 repo
    R = boss                    ### 老闆都可以看
repo @system                    ### 前面定義過的 repos
    RW+ = crboy                 ### CrBoy 都可以讀寫
repo project                    ### 單一 repo
    RW+ master = crboy @team    ### 這些人可以讀寫與強制修改 master branch
    RWCD dev/ = @team           ### team 的人可以在 dev/ 開頭的 branch 底下任意操作
    RW+ release = crboy         ### 只有 CrBoy 可以更改 release branch
repo crboy/.+$                  ### crboy 目錄下的任意 repo
    C = crboy                   ### CrBoy 可以隨意創建
    RW+ = crboy                 ### 當然也可以隨意讀寫 (這行似乎不必要,因為創建的人就可以讀寫)

沒有留言:

張貼留言