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条评论