python實現git代碼更新後發送郵件通知
阿新 • • 發佈:2018-11-22
username date time 無法 pri save cati urn .proto 客戶
當一個團隊使用git進行開發時,一旦代碼更新就需要通知團隊成員。現在利用git的鉤子文件以及python寫的腳本自動去幫我們做成這件事。
git的鉤子文件分為服務器(遠端倉庫)鉤子文件和客戶端(本地)鉤子文件,進行腳本編寫時要區分好不同端所用的鉤子文件。編寫錯誤會導致郵件無法發送,
一般來講,只編寫服務端的鉤子文件,服務端鉤子文件主要有三種:
pre-receiver: 處理來自客戶端的推送操作時,首先執行的鉤子文件
update: 與pre-receiver類似,會為每一個被推送的分支各運行一次
post-receiver:整個過程完結以後運行,可以用來更新其他系統服務或者通知用戶
服務端代碼更新完後,最後啟動的是post-receiver,因此我們來編寫它的腳本文件:
1.進入git倉庫下的hooks裏面,新建名為post-receiver的shell腳本文件,向其中寫入:
#!/bin/sh #一定要編寫這句話,清除GIT自己設置的根目錄,否則無法正常執行下一句 unset GIT_DIR #用python2執行py文件,就是cmd命令,需要指定py文件的絕對路徑 python D:/testemail/hooks/send.py
2.send.py文件中的代碼:
郵箱服務器一般支持POP3 SMTP IMAP,另外還有Exchange。前三種需要進入郵箱查找服務器名稱以及設置授權碼。下方代碼是選取了SMTP服務器發送郵件。
# coding:utf-8 import smtplib as sm from email.mime.text import MIMEText from subprocess import check_output #發送郵箱的smtp服務器 mail_host = ‘smtp.163.com‘ #發送郵箱 sender = ‘xxxxxx@163.com‘ #發送郵箱的smtp的授權碼(非郵箱的登陸密碼) password = ‘xxxxxxxx‘ #接收者郵箱 receiver = ‘xxxxx1,xxxxxx2‘ #郵箱主題 subject = ‘Code Update Notification‘ def Info(): ‘‘‘ 該函數主要用來獲取最近一次更新記錄,並提取主要信息: author date comment ‘‘‘ #使用subprocess的check_output函數來捕獲git命令後的 #標準輸出,以獲取最近一次更新記錄,該記錄是一個字符串 log = check_output([‘git‘,‘log‘,‘-l‘,‘-p‘]) #對字符串進行分割,以獲取相關信息author date comment detail = log.split(‘\n\n‘) #更新者 updater = detail[0].split(‘\n‘)[1].replace(‘Author‘,‘Updater‘) #更新時間,去掉最後的更新次數信息 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." return (updater,update_time,comment) def Format(updater,update_time,comment): ‘‘‘ 排版信息 ‘‘‘ msg = """ <h6 style=‘color:red‘>Hi,buddy!</h6> <h6 style=‘color:red;text-indent:2em‘> The code has been updated,the following is details: </h6> <h6 style=‘color:red;text-indent:4em‘>{0}</h6> <h6 style=‘color:red;text-indent:4em‘>{1}</h6> <h6 style=‘color:red;text-indent:4em‘>{2}</h6> <h6 style=‘color:red;text-indent:2em‘>If any question,please contact the updater</h6> """.format(updater,update_time,comment) msg = MIMEText(msg,‘html‘,‘utf-8‘) return msg def send_email(msg): ‘‘‘ 發送郵件 ‘‘‘ 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__‘: updater,update_time,comment = Info() msg = Format(updater,update_time,comment) send_email(msg)
Exchange協議發送郵件send.py:
#coding:utf-8 from exchangelib import DELEGATE,Account,Credentials,Configuration,NTLM,Message from exchangelib import Mailbox,HTMLBody from exchangelib.protocol import BaseProtocol,NoVerifyHTTPAdapter from subprocess import check_output import sys #python2下面需要操作這一步,將默認編碼ASCII修改成UTF-8,改善對中文的處理 reload(sys) sys.setdefaultencoding(‘utf-8‘) #郵箱主題 subject = ‘Code Update Notification‘ #郵箱 account = ‘[email protected]‘ #接收者列表 reciever = [‘xxxxx01‘,‘xxxx02‘] #域賬號:域名\用戶名(不是郵箱賬號) username = r‘domain\username‘ #密碼,郵箱賬號密碼 password = ‘xxxxxx‘ def Info(): ‘‘‘ 該函數主要用來獲取最近一次更新記錄,並提取主要信息: author date comment ‘‘‘ #使用subprocess的check_output函數來捕獲git命令後的 #標準輸出,以獲取最近一次更新記錄,該記錄是一個字符串 log = check_output([‘git‘,‘log‘,‘-l‘,‘-p‘]).decode() #對字符串進行分割,以獲取相關信息author date comment detail = log.split(‘\n\n‘) #更新者 updater = detail[0].split(‘\n‘)[1].replace(‘Author‘,‘Updater‘) #更新時間,去掉最後的更新次數信息 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." return (updater,update_time,comment) def Format(updater,update_time,comment): ‘‘‘ 排版信息 ‘‘‘ msg = """ <h6 style=‘color:red‘>Hi,buddy!</h6> <h6 style=‘color:red;text-indent:2em‘> The code has been updated,the following is details: </h6> <h6 style=‘color:red;text-indent:4em‘>{0}</h6> <h6 style=‘color:red;text-indent:4em‘>{1}</h6> <h6 style=‘color:red;text-indent:4em‘>{2}</h6> <h6 style=‘color:red;text-indent:2em‘>If any question,please contact the updater</h6> """.format(updater,update_time,comment) return msg def send_email(msg): ‘‘‘ 發送郵件 ‘‘‘ #用來消除SSL證書錯誤, BaseProtocol.http_ADAPTER_CLS = NoVerifyHTTPAdapter credential = Credentials(username,password) act = Account(primary_smtp_address=account,credentials=credential,autodiscover=True,access_type=DELEGATE) mail = Message( account = act, subject = subject, body=HTMLBody(msg), to_recipients = [Mailbox(email_address=i) for i in reciever] ) mail.send_and_save() if __name__ == ‘__main__‘: updater,update_time,comment = Info() msg = Format(updater,update_time,comment) send_email(msg)
python實現git代碼更新後發送郵件通知