python
Git仓库实现push后邮件通知
Linux自建Git仓库实现push后邮件通知
这篇文章跟大家分享如何在自建的Git仓库下利用hooks+python实现push发送邮件通知到我们指定邮箱,在此之前我们需要安装python3以及需要提前建好仓库,在Linux上自建Git仓库,大家可以访问这篇教程来完成->Centos7安装Git并部署Git仓库。
一、编写钩子
我们新建一个仓库,名字就叫做projectHzx.git,然后在仓库钩子所在目录hooks下新建一个post-receive文件内容如下:
#!/bin/sh # 打印开始日志 echo "======= start =======" # 执行读取逻辑 while read oldrev newrev ref do #获取当前仓库名 if [ $(git rev-parse --is-bare-repository) = true ] then projectName=$(basename "$PWD") else projectName=$(basename $(readlink -nf "$PWD"/..)) fi # 获取当前提交分支 branch=`echo $ref | cut -d/ -f3` # 打印当前分支名 echo "Target branch: $branch" done #发送邮件 /usr/bin/python3 /home/python/sendEmailToCodeUpdateGit.py ${branch} ${projectName} # 打印结束日志 echo "======= end ======="
二、准备发送邮件脚本
我们在/home/python目录下新建一个sendEmailToCodeUpdateGit.py文件,内容如下:
# -*- coding: utf-8 -*- #引入扩展 import smtplib from email.mime.text import MIMEText from email.header import Header from subprocess import check_output import time import json import sys #Git仓库提交通知邮件 #获取内容 def infoMsg(): #标准输出,以获取最近一次更新记录,该记录是一个字符串 log = check_output(['git','show']).decode() #对字符串进行分割,以获取相关信息author date comment list detail = log.split('\n\n') #更新者 updater = detail[0].split('\n')[1].replace('Author: ','') #更新时间,去掉最后的更新次数信息 #update_time = detail[0].split('\n')[-1].replace('Date: ','')[0:-6] update_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) #获取提交列表 commitList = detail[2].split('\n') #初始化提交记录 commitDataString = '' #循环提取提交列表 for commitIndex in range(len(commitList)): #提取文件 if commitList[commitIndex].find('diff --git')>-1: #提取文件名 fileItemList = commitList[commitIndex].replace('diff --git ','').split('/') for fileItemIndex in range(len(fileItemList)): if fileItemIndex==1: commitDataString =commitDataString + fileItemList[2]+"\n" #注释,并去掉左右两边空格 try: comment = detail[1].strip() except: comment ="" return (updater,update_time,comment,commitDataString) #组合文本内容 def formatMsg(updater,update_time,comment,commitDataString,branch,projectName): msg = """ <html> <head> <meta charset="utf-8"> </head> <h2 style="color:#FFFFFF; background: #008040;padding-left:5px;">基本信息</h2> <div><b>提交仓库:</b>%s</div> <div><b>提交者:</b>%s</div> <div><b>提交时间:</b>%s</div> <div><b>提交分支:</b>%s</div> <h2 style="color:#FFFFFF; background: #4682B4;padding-left:5px;">提交说明</h2><font size="4" color="#BF6000"><xmp>%s</xmp></font> <h2 style="color:#FFFFFF; background: #5353A8;padding-left:5px;">文件清单</h2> <xmp>%s</xmp> <hr> <center> ☆ Powered by <a href="https://hongzx.cn">FBLSJ</a> </center> </html> """ content = msg % (projectName,updater,update_time,branch,comment,commitDataString) return content #发送邮件 def sendMail(theMessage): # 获取git最新的提交记录 message = theMessage #获取主题 curTime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())# 获取更新时间 subject = 'Git仓库更新:'+curTime # 发送方邮箱 msg_from = '发送方邮箱' # 填入发送方邮箱的授权码 passwd = '发送方邮箱的授权码' # 收件人邮箱 msg_to = '收件人邮箱' # 发送邮件 msg = MIMEText(message, 'html', 'utf-8') msg['Subject'] = Header(subject, 'utf-8') msg['From'] = msg_from msg['To'] = msg_to try: # 邮件服务器及端口号 s = smtplib.SMTP_SSL("smtp.qq.com", 465) s.login(msg_from, passwd) s.sendmail(msg_from, msg_to, msg.as_string()) print("OK") except: print("No") finally: # 关闭 s.quit() #主函数 if __name__ == '__main__': #获取分支 branch = sys.argv[1] #获取仓库名 projectName = sys.argv[2] #解析git最新历史记录 updater,update_time,comment,commitDataString = infoMsg() #用HTML排版解析信息 msg = formatMsg(updater,update_time,comment,commitDataString,branch,projectName) #发送邮件通知 sendMail(msg)
我这里用到的是QQ邮箱发送,所以只需要修改sendMail函数下:发送方邮箱、发送方邮箱授权码、收件人邮箱即可,这样就可以在我们push代码到仓库之后,自动发送邮件到我们指定邮箱。
三、最终效果
我们试验push代码到仓库,我的邮箱收到这封邮件
这样就可以实现git仓库push之后发送推送邮件。
0条评论