Python获取svn提交日志信息

作者: 风 哥 分类: Python 发布时间: 2019-08-06 14:24

需求来源: 

某日下午部门技术老大问我每天的项目增量补丁发布有没有做过统计? 以后要每周统计一次报表发送给老大,心想,纳尼,增量发布都是测试人员测试通过后,将补丁包上传到svn然后邮件通知运维要更新的项目和修复问题原因。难道要每次手动从邮件中摘出来更新内容存放到execl中,这样岂不是很麻烦呀,为了省懒事,想着用python能不能解决,既然有了需求,说干就干。

老大给的需求报表样例:

 

需求分析:

1、既然增量是存放在svn中的,那么我们只是不是只获到svn commit 信息,然后再截取对应的字段信息就可以了呢? 哈哈,对,就是这样。

svn log {文件名}        #执行这个命令可以看到commit信息,针对linux系统

当然我们也可以在windows通过小乌龟的工具也可以看到commit信息

2、Jenkins自动化构建的时候把对应的项目名称和增量包名传递给py脚本, 因为每周要统计一次,这个功能离不开定时计划任务,这里使用的是linux下的crontab, 我们在每周五的时候通过计划任务把报表发送给领导就ok 了。

3、 核心两个脚本,获取svn提交信息obtain_svn_commit.py ,发送邮件report_send_mail.py

#!/usr/bin/env python
#-*- coding: utf-8 -*-


'''
pip install xlwt xlrd xlutils
'''


import os
import sys,time
import logging
from xlrd import open_workbook
from xlutils.copy import copy


# reload(sys)
# sys.setdefaultencoding("gbk")
logging.basicConfig(level=logging.INFO,filename='/tmp/svn_update.log',format="%(levelname)s:%(asctime)s:%(message)s")



file_name = sys.argv[1]
project_name = sys.argv[2]
project_dir = "/jenkins/workspace/" + project_name + "/inc_update/"
report_save = "/root/report_svn/"

try:
    commit_read_log = os.popen(r'svn log %s%s'  % (project_dir, file_name ))
    commit_log = commit_read_log.read().replace('-', '').split('|')
except Exception as e:
    logging.error("svn log 失败,文件可能不存在...")


"""
对svn log信息内容进行处理:
"""
try:
    author = commit_log[1].strip()
    commit_time = commit_log[2].split("+")[0].strip()
    commit_info = commit_log[3].strip().split('\n')[2].replace('\\n','\n')

    # print (commit_log)
    # print (commit_info)
    convert = time.strptime(commit_time,"%Y%m%d %H:%M:%S")
    # 时间转换为yyyy/mm/dd
    convert_time = time.strftime("%Y/%m/%d %X", convert)



except IndexError:
    author = commit_log[1].strip()
    commit_time = commit_log[2].split("+")[0].strip()
    commit_info = commit_log[-1].strip().split('\n')[2].replace('\\n', '\n')

    convert = time.strptime(commit_time, "%Y%m%d %H:%M:%S")
    # 时间转换为yyyy/mm/dd
    convert_time = time.strftime("%Y/%m/%d %X", convert)


def svnlog():


        if not os.path.isfile(report_save + 'report.xls'):

            logging.info('文件不存在,执行拷贝命令')
            os.chdir(report_save)
            if os.system(r'cp template.xls report.xls') != 0:
                logging.error("拷贝文件失败,源文件不存在")
                sys.exit()

        try:

            open_xls = open_workbook(u"report.xls") # 读取excel文件
            row = open_xls.sheets()[0].nrows # 获取已有的行数
            excel = copy(open_xls) # 将xlrd的对象转化为xlwt的对象
            table = excel.get_sheet(0) # 获取要操作的sheet

            #对excel表追加一行内容
            table.write(row, 0, author.decode('utf-8')) #括号内分别为行数、列数、内容
            table.write(row, 1, '补丁'.decode('utf-8'))
            table.write(row, 2, commit_info.decode('utf-8'))
            table.write(row, 3, convert_time.decode('utf-8'))
            excel.save(u"report.xls")

            '''判断星期, 如果是星期五则把文件复制为当前时间以年月日存放'''
            if convert.tm_wday == 4:
                os.system('cp report.xls report_`date +%Y%m%d`.xls')


        except BaseException as e:
            print(e)


svnlog()

 

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import smtplib
import os,sys
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication


def send_email_text(subject, content, filepath, receive_email):
    """
    :param subject: 发信主题
    :param content: 发信内容
    :param filepath: 附件路径
    :param receive_email: 邮件接受人
    :return:
    """


    send_mail_addr = 'xxxx@126.com' #发送人邮箱
    passwd = 'xxxxx'       # 填入发送方邮箱的授权码   
    receivers = receive_email
    msgRoot = MIMEMultipart()
    msgRoot['Subject'] = subject
    msgRoot['From'] = send_mail_addr

    if len(receivers) > 1:
        msgRoot['To'] = ','.join(receivers)  # 群发邮件   
    else:
        msgRoot['To'] = receivers[0]

    part = MIMEText(content, _charset="utf-8")
    msgRoot.attach(part) # 添加附件部分   

    for path in filepath:
        part = MIMEApplication(open(path, 'rb').read())
        part.add_header('Content-Disposition', 'attachment', filename=path)
        msgRoot.attach(part)
    try:

        # s = smtplib.SMTP()
        # s.connect("smtp.exmail.qq.com")

        s = smtplib.SMTP_SSL('smtp.exmail.qq.com', 465)
        s.login(send_mail_addr, passwd)
        s.sendmail(send_mail_addr, receivers, msgRoot.as_string())
        print("邮件发送成功")
        
        os.remove(report_dir + report_time + ".xls") #邮件发送成功后删除临时文件
    except smtplib.SMTPException as e:

        print("Error, 发送失败",e)
    finally:
        s.quit()


subject = "版本发布记录"
content = "附件为本周版本发布情况,此邮件由Python自动化发出,请勿回复!"
report_dir = "/root/report_svn/"
report_time = (os.popen(r'date +%Y%m%d'))

report_time = "report_" + report_time.read().strip()


file_path = [report_dir + report_time + ".xls"]  #多个附件以列表的方式
receive_email = ["xxx@qq.com","xxxx@qq.com"]  #多个收件人以列表的方式

send_email_text(subject, content, file_path, receive_email)

在jenkins勾选增量更新代码,更新类型为补丁,同时选中svn_version下拉框中的补丁包文件名,在执行构建完成后会运行python脚本。

python /root/report_svn/svn-report.py ${svn_version} ${apps_name}

crontab 计划任务 00 22 * * 5 python /root/report_svn/send_mail.py > /dev/null 2>&1

 

最终的效果如下

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注