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代码到仓库,我的邮箱收到这封邮件

微信截图_20211103142744.png

这样就可以实现git仓库push之后发送推送邮件。

0条评论

发表评论