Gitlab 服務(wù)器端 custom hook 配置

fox

Gitlab 是不錯(cuò)的代碼托管工具闯估,最近一年更新也很頻繁憔四。最新的 8.15 版本加入了自定義 git hook 的支持旬昭,在服務(wù)器端寫腳本控制用戶的提交情況變得很方便旧噪。這里介紹如何配置服務(wù)器端 hook。

Gitlab custom hook 官方文檔在此: Custom Git Hooks - GitLab Documentation

Tips: Git hook 是 git 提供的特定工作流事件自動(dòng)觸發(fā)腳本機(jī)制,本文介紹的是配置所有項(xiàng)目通用的 server hook赦抖,如果要使用 local hook舱卡,建議使用 git template + 軟鏈接解決分發(fā)和更新的問題。

具體步驟

1. 修改 gitlab 配置 vi /etc/gitlab/gitlab.rb 队萤,增加 custom_hooks_dir 路徑:

gitlab_shell['custom_hooks_dir'] = "<custom_hooks_dir>"

2. 執(zhí)行 sudo gitlab-ctl reconfigure

Tips:不要嘗試直接修改 <gitlab-shell>/config.yml 的文件內(nèi)容轮锥,文件中有說明:
This file is managed by gitlab-ctl. Manual changes will be erased! To change the contents below, edit /etc/gitlab/gitlab.rb and run sudo gitlab-ctl reconfigure.

3. 創(chuàng)建 hook 文件

自定義腳本目錄要符合 <custom_hooks_dir>/<hook_name.d>/* 的規(guī)范。具體來說就是:

  • 在自定的 custom_hooks_dir 目錄下可創(chuàng)建三個(gè)文件夾對(duì)應(yīng)三類 server hook name
    • pre-receive.d
    • update.d
    • post-receive.d
  • 在每個(gè)文件夾下可創(chuàng)建任意文件要尔,在對(duì)應(yīng)的 hook 時(shí)期舍杜,gitlab 就會(huì)主動(dòng)調(diào)用
  • 文件名以 ~ 結(jié)尾的文件會(huì)被忽略
  • 如果想看這部分的實(shí)現(xiàn)細(xì)節(jié)可以看 <gitlab-shell>/lib/gitlab_custom_hook.rb 文件

目錄結(jié)構(gòu)示意:

[root@localhost custom_hooks]# tree
.
├── post-receive.d
│   ├── 01.sh
│   └── 02.sh~
├── pre-receive.d
│   ├── 01.sh
│   ├── 02.py
│   └── 03.rb
└── update.d
    ├── 01.sh
    └── 02.sh

4. 編寫 hook 腳本

Hook 腳本就是 git 自身的規(guī)范,寫 shell赵辕、python既绩、ruby 都可以。

留意腳本最后的退出值:0 正常退出还惠,用戶可以 push熬词;非 0 異常退出,中斷提交(pre-receive 和 update) 吸重。
細(xì)節(jié)參見: 5.4 Git鉤子:自定義你的工作流 · geeeeeeeeek/git-recipes Wiki · GitHub

如果想讓用戶 push 時(shí)看到相應(yīng)的日志直接在腳本中 echo 即可互拾。

這里舉兩個(gè)例子:

??:Say hi.

#!/bin/sh

echo "Say hi from gitlab server. ??"
exit 0

??:檢查提交修改的文件,發(fā)現(xiàn)有特定內(nèi)容禁止提交

#!/bin/sh
FIND_KEY='.test.51offer.com'
OLD_VALUE=$2
NEW_VALUE=$3

FILES=$(git rev-list --objects $OLD_VALUE...$NEW_VALUE | egrep '\.(jsp|vm|java)$' | awk '{print $2}' | sort | uniq )

FLAG=0
for FILE in $FILES
do
    git show $NEW_VALUE:$FILE | grep -q "$FIND_KEY"
    if [ $? -eq 0 ]
    then
        FLAG=1
        echo "??  包含非法字段 '$FIND_KEY' : $FILE"
    fi
done

if [ $FLAG -eq 0 ]
then
    echo "?  代碼檢查通過."
else
    echo "?  代碼檢查不通過!"
    exit 1
fi

exit 0

4. Enjoy!

上面第二個(gè)例子中嚎幸,嘗試 git push颜矿,就能看到如下的日志:

Pushing to git@gitlab.51offer.inner:mall/paycenter.git
remote: ??  包含非法字段 '.test.51offer.com' : service/src/main/java/com/horizon/module/paycenter/service/PayService.java        
remote: ?  代碼檢查不通過!        
remote: error: hook declined to update refs/heads/test        
To git@gitlab.51offer.inner:mall/paycenter.git
 = [up to date]      release/old -> release/old
 = [up to date]      v1.0.0.2016.9.8 -> v1.0.0.2016.9.8
 ! [remote rejected] test -> test (hook declined)
error: failed to push some refs to 'git@gitlab.51offer.inner:mall/paycenter.git'
Completed with errors, see above

總結(jié):

Gitlab 官方對(duì)配置細(xì)節(jié)的表達(dá)并不清楚,配置過程中走了些彎路嫉晶,翻了翻源碼才摸索成功骑疆。 在此記錄下來,過程并不算繁瑣替废。

其實(shí)在 8.15 之前的版本通過修改 <gitlab-shell> 下的 hook 文件也能達(dá)到自定義 hook 的目的箍铭,不過升級(jí)版本可能會(huì)被沖掉。
畢竟官方提供了新的自定義方式椎镣,推薦大家用新方式來配置诈火,后續(xù)維護(hù)都會(huì)容易很多。

題圖來源:Photo by Ray Hennessy | Unsplash

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末状答,一起剝皮案震驚了整個(gè)濱河市冷守,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惊科,老刑警劉巖拍摇,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異馆截,居然都是意外死亡充活,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來混卵,“玉大人映穗,你說我怎么就攤上這事』床ぃ” “怎么了男公?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵荤堪,是天一觀的道長合陵。 經(jīng)常有香客問我,道長澄阳,這世上最難降的妖魔是什么拥知? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮碎赢,結(jié)果婚禮上低剔,老公的妹妹穿的比我還像新娘。我一直安慰自己肮塞,他們只是感情好襟齿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枕赵,像睡著了一般猜欺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拷窜,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天开皿,我揣著相機(jī)與錄音,去河邊找鬼篮昧。 笑死赋荆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的懊昨。 我是一名探鬼主播窄潭,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼酵颁!你這毒婦竟也來了狈孔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤材义,失蹤者是張志新(化名)和其女友劉穎均抽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體其掂,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡油挥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片深寥。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡攘乒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惋鹅,到底是詐尸還是另有隱情则酝,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布闰集,位于F島的核電站沽讹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏武鲁。R本人自食惡果不足惜爽雄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沐鼠。 院中可真熱鬧挚瘟,春花似錦、人聲如沸饲梭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憔涉。三九已至订框,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間监氢,已是汗流浹背布蔗。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浪腐,地道東北人纵揍。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像议街,于是被迫代替她去往敵國和親泽谨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理特漩,服務(wù)發(fā)現(xiàn)吧雹,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,809評(píng)論 6 342
  • 簡(jiǎn)介 gitlab-ci全稱是gitlab continuous integration的意思涂身,也就是持續(xù)集成雄卷。中...
    st0rm23閱讀 66,746評(píng)論 9 46
  • 一、系統(tǒng)環(huán)境 服務(wù)器:阿里云主機(jī) 操作系統(tǒng):Centos7.0 64位 已裝軟件:Nginx(80端口)蛤售、Apac...
    tsyeyuanfeng閱讀 77,805評(píng)論 18 92
  • 一丁鹉, 服務(wù)器快速搭建gitlab方法可以參考gitlab中文社區(qū) 的教程centos7安裝gitlab:https...
    彩虹之夢(mèng)閱讀 3,584評(píng)論 0 8