GIT服務(wù)器鉤子設(shè)置

項目越來越大称鳞,人員越來越多,代碼變動很難通知到每一個項目組成員稠鼻,尤其是一些核心配置的變動冈止,故此需要在GIT代碼庫服務(wù)端做控制,客戶端也可以候齿,但是需要每一個人都在本地進(jìn)行配置熙暴,麻煩亦沒必要

核心訴求:

1、限制成員提交代碼注釋長度

2慌盯、核心配置文件修改需要郵件通知到每一個開發(fā)人員

要解決第一個訴求用到了GIT的pre-receive鉤子周霉,這個鉤子會在客戶端發(fā)起push請求后調(diào)用執(zhí)行,只有執(zhí)行通過才能合并進(jìn)代碼庫亚皂,話不多說直接上代碼:


#!/bin/bash

#pre-receive script

#set -x #for debugging

validate_ref()

{

    # --- Arguments

    oldrev=$(git rev-parse $1)

    newrev=$(git rev-parse $2)

    refname="$3"

    commitList=`git rev-list $oldrev..$newrev`

        #echo $commitList

    split=($commitList)

    for s in ${split[@]}

    do

        echo "@@@@@@@"

        echo "$s"

        msg=`git cat-file commit $s | sed '1,/^$/d'`

        echo $msg

        if [ ${#msg} -lt 15 ];then

            echo "!!! Commit message length less than 15"

            exit 1

        else

            echo "bigger than 5"

        fi

    done

}

fail=""

# Allow dual mode: run from the command line just like the update hook, or

# if no arguments are given then run as a hook script

if [ -n "$1" -a -n "$2" -a -n "$3" ]; then

    # Output to the terminal in command line mode - if someone wanted to

    # resend an email; they could redirect the output to sendmail

    # themselves

    PAGER= validate_ref $2 $3 $1

else

    while read oldrev newrev refname

    do

        validate_ref $oldrev $newrev $refname

    done

fi

if [ -n "$fail" ]; then

    exit $fail

fi

將代碼文件命名為pre-receive俱箱,并且可執(zhí)行權(quán)限設(shè)置為777(注意跨平臺文件格式問題)
在git服務(wù)器源代碼存儲的目錄(如abc.git),在abc.git目錄創(chuàng)建一個新目錄custom_hooks
將pre-receive放在custom_hooks目錄下灭必,不用重啟gitlab會立刻生效狞谱。

第二個訴求的實現(xiàn)要稍微復(fù)雜一些,因為涉及到發(fā)送郵件禁漓,需要外掛一個python腳本實現(xiàn)跟衅,這里用到了git的另一個鉤子post_receive,這個鉤子會在代碼入庫后執(zhí)行播歼,文件內(nèi)容很簡單:

#!/bin/sh
#一定要編寫這句話伶跷,清除GIT自己設(shè)置的根目錄,否則無法正常執(zhí)行下一句
#經(jīng)過實際測試荚恶,可能不需要此行撩穿,大家看自己情況加
#unset GIT_DIR

#用python2執(zhí)行py文件,就是cmd命令谒撼,需要指定py文件的絕對路徑食寡,python3需要多加一行,具體看代碼
python /data/hooks/send.py

下面是send.py的代碼:

# coding:utf-8
import smtplib as sm
from email.mime.text import MIMEText
from subprocess import check_output

#發(fā)送郵箱的smtp服務(wù)器
mail_host = 'smtpdm.aliyun.com'
#發(fā)送郵箱
sender = '77777777@qq.com'
#發(fā)送郵箱的smtp的授權(quán)碼(非郵箱的登錄密碼)
password = '12345678'
#接收者郵箱
receiver = '8888@qq.com,9999@qq.com'
#郵箱主題
subject = 'Code Update Notification'

#需要郵件提醒的文件
file1 = 'src/main/webapp/WEB-INF/web.xml'
file2 = 'src/main/resources/'

def Info():
    '''
    該函數(shù)主要用來獲取最近一次更新記錄,并提取主要信息:
    '''
    #使用subprocess的check_output函數(shù)來捕獲git命令后的
    #標(biāo)準(zhǔn)輸出廓潜,以獲取最近一次更新記錄,該記錄是一個字符串
    #log = check_output(['git','log','-l','-p'])
    log = check_output(['git','show','--stat'])
    #規(guī)避TypeError: a bytes-like object is required, not 'str'抵皱,byte轉(zhuǎn)str
    log = str(log,encoding="utf-8")

    #print(files)
    if (file1 in log) or (file2 in log):
        detail = log.split('\n\n')
        #對字符串進(jìn)行分割善榛,以獲取相關(guān)信息author date comment
        #更新者
        #print(detail)
        updater = detail[0].split('\n')[1].replace('Author','Updater')
        #print(updater)
        #更新時間,去掉最后的更新次數(shù)信息
        update_time = detail[0].split('\n')[-1].replace('Date','Update time')[0:-6]
        #注釋,并去掉左右兩邊空格
        try:
            comment = 'Comment: '+detail[1].strip()
        except:
            comment = 'Comment: '+"Sorry,the updater didn't comment."
        #影響文件
        files = 'Files:<br>'+detail[2].replace('\n','<br>')
        #要比對文件需拿到第一步驟中的commitId使用git show commitId命令獲取
        msg = """
            <h3 style='color:red'>Hi,buddy!</h3>
            <h3 style='color:red;text-indent:2em'>The resource file has been updated,the following is details:</h3>
            <h3 style='color:red;text-indent:4em'>{0}</h3>
            <h3 style='color:red;text-indent:4em'>{1}</h3>
            <h3 style='color:red;text-indent:4em'>{2}</h3>
            <h3 style='color:red;text-indent:4em'>{3}</h3>
            <h3 style='color:red;text-indent:2em'>If any question,please contact the updater</h3>
            """.format(updater,update_time,comment,files) 
    
        msg = MIMEText(msg,'html','utf-8')

        send_email(msg)

def send_email(msg):
    '''
    發(fā)送郵件
    '''
    msg['From'] = sender
    msg['To'] = receiver
    msg['Subject'] = subject

    smtpObj = sm.SMTP(mail_host)
    smtpObj.login(sender,password)
    smtpObj.sendmail(sender,receiver.split(','),msg.as_string())
    smtpObj.quit()

if __name__ =='__main__':
    Info()

是不是很簡單呻畸!看完記得點贊哦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末移盆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伤为,更是在濱河造成了極大的恐慌咒循,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绞愚,死亡現(xiàn)場離奇詭異叙甸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)位衩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門裆蒸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人糖驴,你說我怎么就攤上這事僚祷。” “怎么了贮缕?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵辙谜,是天一觀的道長。 經(jīng)常有香客問我感昼,道長筷弦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任抑诸,我火速辦了婚禮,結(jié)果婚禮上爹殊,老公的妹妹穿的比我還像新娘蜕乡。我一直安慰自己,他們只是感情好梗夸,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布层玲。 她就那樣靜靜地躺著,像睡著了一般反症。 火紅的嫁衣襯著肌膚如雪辛块。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天铅碍,我揣著相機(jī)與錄音润绵,去河邊找鬼。 笑死胞谈,一個胖子當(dāng)著我的面吹牛尘盼,可吹牛的內(nèi)容都是我干的憨愉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卿捎,長吁一口氣:“原來是場噩夢啊……” “哼配紫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起午阵,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤躺孝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后底桂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體植袍,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年戚啥,在試婚紗的時候發(fā)現(xiàn)自己被綠了奋单。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡猫十,死狀恐怖览濒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拖云,我是刑警寧澤贷笛,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站宙项,受9級特大地震影響乏苦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尤筐,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一汇荐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盆繁,春花似錦掀淘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冕碟,卻和暖如春拦惋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背安寺。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工厕妖, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人我衬。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓叹放,卻偏偏與公主長得像饰恕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子井仰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354