python实现git代码更新后发送邮件通知

  当一个团队使用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)

  

原文地址:https://www.cnblogs.com/xcfzy/p/9995012.html

时间: 2024-08-26 01:26:00

python实现git代码更新后发送邮件通知的相关文章

ReactOS 代码更新后的编译安装

其实四月份就已经更新过了,最新版应该是0.4.11+,具体去GITHUB上去看. 至于编译,其实在最早的0.2版本时代,ReactOS就曾经给出过一套完整的编译方式, 并且给出过一个完整的编译环境,版本是2.1.6,目前还可以用, 这里就开始说明编译方法. 其实具体的编译方法,在其官网有详细的英文解释,但是太墨迹... https://reactos.org/wiki/Building_ReactOS 这里简单地说,其实就那么几步. 1:下载ReactOS编译工具集,此工具集是ReactOS早期

Git 代码更新:git fetch 和 git pull 的区别

Git 从远程的分支获取最新的版本到本地有这样 2 个命令: 1. git fetch:相当于是从远程获取最新版本到本地,但不会自动 merge git fetch origin master git log -p master origin/master git merge origin/master 以上命令的含义: 首先从远程的 origin 的 master 主分支下载最新的版本到 origin/master 分支上 然后比较本地的 master 分支和 origin/master 分支

做了一个简易的git 代码自动部署脚本

项目是THINKPHP写的 用了 oschina git 进行版本管理. 公网服务器是CentOS.每次用FTP上传很麻烦. 所以想到了在服务器上安装一个GIT进行 pull代码.因为我的远程服务器数据库和本地不一样,所以代码pull后还需要修改 几个config.php数据库配置文件. 所以想再git 代码更新后,要自动执行config.php文件的替换或者修改. 其中看到这里讨论http://www.v2ex.com/t/81173  git hook 然后看了下比较麻烦.也看不懂. 所以就

Unity手游之路&lt;十三&gt;手游代码更新策略探讨

这几个月公司项目非常忙,加上家里事情也多,所以blog更新一直搁置了.最近在项目开发上线过程中遇到了一些新问题,接下来的时间和大家多多探讨学习.大家在工作中遇到技术问题,或者有什么想分享的,欢迎多多探讨 [email protected] ----------------------------------------------------------------------------------------------------------------------------------

Unity手游之路手游代码更新策略探讨

版权声明: https://blog.csdn.net/janeky/article/details/25923151 这几个月公司项目非常忙.加上家里事情也多,所以blog更新一直搁置了. 近期在项目开发上线过程中遇到了一些新问题,接下来的时间和大家多多探讨学习. 大家在工作中遇到技术问题,或者有什么想分享的,欢迎多多探讨 ken@iamcoding.com. -------------------------------------------------------------------

做web项目时对代码改动后浏览器端不生效的应对方法(持续更新)

做web项目时,常常会遇到改动了代码,但浏览器端没有生效,原因是多种多样的,我会依据我遇到的情况逐步更新解决的方法 1.执行的时候採用debug模式,普通情况下使用项目部署button右边那个button下的tomcat7中的run即可,假设使用的是serves中的run serves,这样的情况貌似不会自己主动编译 2.点击project菜单下的clean选项,在打开的窗体中选择你使用的项目,ok,这样会删除tomcat容器中关于该项目的一些信息,然后又一次部署,执行 3.删除电脑中tomca

手动下载python更新后 换回以前版本

因为用的时Ubuntu略低版本的,不想更新版本,但是经常更新内核和其他软件,尤其是最近自己更新python,但是软件更新救出错了,而且不能打开“Languae Support”(软件支持)和ibus输入法,非常烦恼,尝试了很多解决方法,但是都不行,只能再改回来了. 改回步骤如下: 改回以前的python,其实就是修改链接. 1. 删除链接,即: rm /usr/bin/python 2. 重建链接,连接到系统python. 首先,查看自己python版本号: ls /usr/bin | grep

做web项目时对代码修改后浏览器端不生效的应对方法(持续更新)

做web项目时,经常会遇到修改了代码,但浏览器端没有生效,原因是多种多样的,我会根据我遇到的情况逐步更新解决办法 1.运行的时候采用debug模式,一般情况下使用项目部署按钮右边那个按钮下的tomcat7中的run就行,如果使用的是serves中的run serves,这种情况貌似不会自动编译 2.点击project菜单下的clean选项,在打开的窗口中选择你使用的项目,ok,这样会删除tomcat容器中关于该项目的一些信息,然后重新部署,运行 3.删除电脑中tomcat文件夹,重新解压,然后在

CENTOS下搭建git代码仓库 ssh协议

centos服务器下搭建git仓库,使用ssh协议管理仓库代码权限    git官网(http://git-scm.com/) 使用ssh协议: 一.安装git,使用yum install git 或者使用 源码包安装git-2.2.0.tar.gz(https://www.kernel.org/pub/software/scm/git/) 新建git用户与用户组 # useradd git # passwd git 二,新建git仓库(仓库位置自己随用户自己决定,例/var/git/testp