SVN实现commit后自动发送邮件

SVN通过hooks+python实现提交后自动发送邮件

       今天捣鼓想尝试在本地提交SVN到服务端后,发送邮件到指定的邮箱,从而实现可以知道自己提交代码是否成功推到同步目录,主要是利用SVN的钩子原理,去触发python发送邮件到自己指定的邮箱。在准备之前大家需要创建好SVN仓库,安装好python3以及准备好发送邮件的基础信息(自行百度)。

       1、准备工作

       首先创建一个仓库,并可以实现本地代码提交,可以推到服务器目录,这个可以看我过往的文章去搞定。

       2、创建通知脚本

       我们在/home/python目录下创建一个sendEmailToCodeUpdate.py文件,脚本内容如下

# -*- coding: utf-8 -*-
import sys
import os
import smtplib
from email.mime.text import MIMEText

# 代码更新邮件通知

# 组合邮件内容
html_template = """
<html>
        <head>
        <meta charset="utf-8">
        </head>
        <h2 style="color:#FFFFFF; background: #008040;">基本信息</h2>
        <div> <b>版本库:</b>
                <a href="svn:%s">%s</a>
        </div>
        <div> <b>版本号:</b>%s
        </div>
        <div>
                <b>提交者:</b>%s
        </div>
        <div>
                <b>提交时间:</b>%s
        </div>
        <h2 style="color:#FFFFFF; background: #4682B4;">提交说明</h2> <font size="4" color="#BF6000"><xmp>%s</xmp></font>
        <h2 style="color:#FFFFFF; background: #5353A8;">文件清单</h2>
        <xmp>%s</xmp>
        <hr>
        <center>
                ☆ Powered by
                <a href="https://hongzx.cn">FBLSJ</a>
        </center>
</html>
"""


# 拼接组合HTML内容
def write_mail_content(repo, rev):
    """
    repo: repository
    rev: revision
    """
    repo_name = get_repo_name(repo)
    author = get_author(repo, rev)
    date = get_date(repo, rev)
    log = get_log(repo, rev)
    file_list = get_file_list(repo, rev)
    content = html_template % (repo, repo_name, rev, author, date, log, file_list)
    return content


# 获取项目名
def get_repo_name(repo):
    return os.path.basename(repo)


# 获取提交者
def get_author(repo, rev):
    """svnlook author -r REV REPOS 得到提交者
    """
    cmd = '%s author -r %s %s' % (svnlook_bin_path, rev, repo)
    output = os.popen(cmd).read()
    return output


# 获取提交时间
def get_date(repo, rev):
    """svnlook date -r REV REPOS 得到提交时间
    """
    cmd = '%s date -r %s %s' % (svnlook_bin_path, rev, repo)
    output = os.popen(cmd).read()
    return output


# 获取提交日志
def get_log(repo, rev):
    """svnlook log -r REV REPOS 得到提交日志
    """
    cmd = '%s log -r %s %s' % (svnlook_bin_path, rev, repo)
    output = os.popen(cmd).read()
    return output


# 获取变动内容
def get_file_list(repo, rev):
    """svnlook changed -r REV REPOS 得到发生变动的文件
    """
    cmd = '%s changed -r %s %s' % (svnlook_bin_path, rev, repo)
    output = os.popen(cmd).read()
    return output


# 发送邮件
def send_mail(subject, content):
    # 发送方邮箱
    msg_from = '发送方邮箱'
    # 填入发送方邮箱的授权码
    passwd = '填入发送方邮箱的授权码'
    # 收件人邮箱
    msg_to = '收件人邮箱'
    # 发送邮件
    msg = MIMEText(content, 'html', 'utf-8')
    msg['Subject'] = subject
    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()


global svnlook_bin_path
if __name__ == '__main__':
    # 日志记录路径
    svnlook_bin_path = '/usr/bin/svnlook'
    # 通知主题
    subject = 'SVN提交通知'
    # 通知内容
    content = write_mail_content(sys.argv[1], sys.argv[2])
    # 发送邮件
    send_mail(subject, content)

上面脚本我们只需修改send_mail函数里面的发送方信息即可(前提发送方用的是QQ邮箱,如果是其他邮箱,需要修改邮件服务器及端口号),需要安装python3以及安装脚本里面所用到的扩展,可以看我过往的文章,有介绍到如何兼容情况下安装python3。

      三、编辑钩子

      在我们的仓库hooks目录写入以下这段代码

#发送邮件
# REPOS-PATH (the path to this repository)
REPOS="$1"
# REV (the number of the revision just committed)
REV="$2"
LANG=zh_CN.GB18030
#没有这句不起做用
export LANG
HOOK_DIR=/home/python
SVNLOOK_BIN=/usr/bin/svnlook
PYTHON_BIN=/usr/bin/python3
${PYTHON_BIN} ${HOOK_DIR}/sendEmailToCodeUpdate.py ${REPOS} ${REV}

       完成后最终效果图如下:

1.png

博主最开始是用python2执行发送邮件脚本,但是遇到中文会乱码,后面改用python3情况下,中文不会乱码,如果有遇到问题可以在底下评论留言~

0条评论

发表评论