jenkins构建自动发送邮件功能一_sendmail.py


1.pip install python-jenkins
2. 如果没有网络,就需要把源码下载下来,使用setup.py 进行安装 
下载网址:https://pypi.python.org/pypi/python-jenkins/ 
下载之后使用 命令安装: python setup.py install
安装setup.py时会报错,查看requirement.txt,里面写明了安装时必需要依赖的模块,分别安装requirement.txt中的模块再安装jenkins
3.参考别的项目的脚本发现,它们的实现方式是,将报告内容存放到数据库表中,然后再将表中的内容传到报告html文件中,刚开始时尝试使用这种方法,前一段实现了将自动化报告内容存放到表中,但是将表中的内容传到html文件时,无法替换,故转变思想,直接将自动化报告内容替换到html文件中,取消数据库这一操作,每个参数单独赋值,效果很明显,然后我将报告print,查看到参数的确变了,然后再去从自动化输出报告中查找相关结果值,有疑问的请教测试经理,再对content.html文件进行修改,改成匹配我们项目的,最后打通发送邮件功能,申请网关、端口、帐号、密码,待一切准备后,将py文件和html文件放到jnekins环境中,运行后,正确,然后再搭建jenkins自动构建,设置自动构建时间,xshell脚本实现,最后成功

脚本 如下:

sendmail.py

# -*- coding: UTF-8 -*-
#encoding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

import jenkins, requests
from bs4 import BeautifulSoup
import datetime, time
import pymysql
import re
import cx_Oracle
import os
from email.mime.text import MIMEText
import smtplib


#job_Settings.py
project_name = 'ERMP'
job_pom_reflact_dict = {'ERMP':'htermp'}
ERMP_job_list = ['ERMP_Jacoco_at', 'ERMP_Jacoco_mt', 'ERMP_Jacoco_total', 'ERMP_Jacoco_ust', 'ERMP_Jacoco_ut','ERMP_incoco_ut', 'ERMP_incoco_total','ERMP_sonar']

project_dict = {'ERMP':ERMP_job_list}

mail_list = [ "zhengjialiang@htsc.com", "506949409@qq.com"]


##getreportfrom db.pyt

def readMailTemp():
    #f = open(r'D:\Users\K0730005\Desktop\fast_send_email\mail_content.html', 'r')
    f = open(r'mail_content.html', 'r')
    res = f.read()
    f.close()
    return res


def send_mail(to_list, sub, content):  #to_list:收件人;sub:主题;content:邮件内容
    mail_host = "168.8.250.75"  #设置服务器
    mail_port = 25
    mail_user = "ci.jenkins"    #用户名
    mail_pass = "jenkins@1208"   #口令
    mail_postfix = "htsc.com"  #发件箱的后缀

    me = u"ERMP"+"<"+mail_user+"@"+mail_postfix+">"   #这里的hello可以任意设置,收到信后,将按照设置显示
    msg = MIMEText(content, 'html', 'utf-8')    #创建一个实例,这里设置为html格式邮件
    msg['Subject'] = sub

    msg['From'] = me
    msg['To'] = ";".join(to_list)

    print "---msb[subject]---"
    print msg['Subject']
    print "---msb[from]---"
    print msg['From']
    
    try:
        s = smtplib.SMTP()
        print "11"
        s.connect(mail_host, mail_port)  #连接smtp服务器
        print "22"
        s.login(mail_user, mail_pass)  #登陆服务器
        print "33"
        s.sendmail(me, to_list, msg.as_string())  #发送邮件
        print "44"
        s.close()
    except Exception, e:
        print str(e)


##savetoDB.PY
            
def emma_type(i):
    reflax = {
        0: lambda: ' Classes ',
        1: lambda: ' Methods ',
        2: lambda: ' Blocks ',
        3: lambda: ' Lines ',
    }
    return reflax[i]()

def timestamp2datetime(timestamp, convert_to_local=True):
    ''' Converts UNIX timestamp to a datetime object. '''
    if isinstance(timestamp, (int, long, float)):
        dt = datetime.datetime.utcfromtimestamp(timestamp)
        if convert_to_local:
            # 中国默认时区
            dt = dt + datetime.timedelta(hours=8)
            return dt
    return timestamp

def readScanXML(url):
    res = None
    try:
        content = requests.session().get(url, timeout=3).content
        res = BeautifulSoup(''.join(content))
    except:
        pass
    return res

def search_ut_result(data):
    patten = re.compile(r'Tests run: \d+, Failures: \d+, Errors: \d+, Skipped: \d+\n')
    match = patten.search(data)
    if match:
        return match.group()
    else:
        return None

def search_ut_time(data):
    patten = re.compile(r'Total time: \d*:*\d*.\d* s\n')
    match = patten.search(data)
    if match:
        return match.group()
    else:
        return None

def search_sonar_time(data):
    patten = re.compile(r'Task total time: \d*:*\d*.\d* s\n')
    match = patten.search(data)
    if match:
        return match.group()
    else:
        return None

def search_sec_date(data):
    patten = re.compile(r'\d{12}')
    match = patten.findall(data)
    date_stamp_list = list(set(match))
    if date_stamp_list:
        return sorted(date_stamp_list)[-1]
    else:
        return None

if __name__ == '__main__':

    server = jenkins.Jenkins(url='http://jenkins.htzq.htsc.com.cn/jenkins', username='012499', password='Zjl2018@')
    for subproject in project_dict.keys(): 
        project_info_dict = {'project_name': 'NA', 'subproject_name': 'NA', 'build_date': 'NA', 'build_time': 'NA', 'sonar_time': 'NA', 'ut_time': 'NA',
                     'at_time': 'NA', 'incoco_line': 'NA','total_line': 'NA', 'secu_time': 'NA', 'sonar_report': 'NA', 'sonar_url': 'NA', 'ut_report_summary': 'NA', 
                     'ut_report_detail': 'NA', 'at_report_summary': 'NA', 'at_report_detail': 'NA', 'ut_coco_summary': 'NA', 'ut_coco_detail': 'NA', 'at_coco_summary': 'NA',
                     'at_coco_detail': 'NA', 'total_coco_summary': 'NA', 'total_coco_detail': 'NA', 'ut_incoco_summary': 'NA', 'ut_incoco_detail': 'NA','ut_line':'NA',
                     'at_incoco_summary': 'NA', 'at_incoco_detail': 'NA', 'total_incoco_summary': 'NA', 'total_incoco_detail': 'NA', 'secu_report_summary': 'NA', 'secu_report_detail': 'NA','ust_coco_detail':'NA','ust_coco_summary':'NA','ust_line':'NA'}

        #sonar_report_url = "http://sonar.htzq.htsc.com.cn/api/resources?resource=%s&metrics=bugs,reliability_rating,vulnerabilities,security_rating,code_smells,sqale_rating&format=xml"

        project_info_sql = "insert INTO ermp.project_info(project_name, subproject_name, build_date, build_time, sonar_time, ut_time, at_time, incoco_line, total_line, " \
                   "secu_time, sonar_report, sonar_url, ut_report_summary, ut_report_detail, at_report_summary, at_report_detail, ut_coco_summary, " \
                   "ut_coco_detail, at_coco_summary, at_coco_detail, total_coco_summary, total_coco_detail, ut_incoco_summary, ut_incoco_detail, " \
                   "at_incoco_summary, at_incoco_detail, total_incoco_summary, total_incoco_detail, secu_report_summary, secu_report_detail,ust_coco_detail,ust_coco_summary,ust_line) " \
                   "VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s','%s','%s','%s')"


        for job_name in project_dict[subproject]:
            pom_name = job_pom_reflact_dict[subproject]
            project_info_dict['project_name'] = project_name
            project_info_dict['subproject_name'] = subproject
            print 'project_name = ' + project_name + ', subproject = '+ subproject + ' ,job_name = ' + job_name + ', pom_name = ' + pom_name
            print "0000"

            try:
                try: 
                    ji = server.get_job_info(job_name)
                    print "11"
                except jenkins.NotFoundException:
                    print 'project_name = ' + project_name + ', subproject = ' + subproject + ', job_name = ' + job_name + ', pom_name = ' + pom_name + ', server.get_job_info failed'
                    continue
                #print ji
                last_succ_build_num = ji['lastSuccessfulBuild']['number']
                bi = server.get_build_info(job_name, last_succ_build_num)
            except jenkins.JenkinsException:
                time.sleep(3)
                ji = server.get_job_info(job_name)
                last_succ_build_num = ji['lastSuccessfulBuild']['number']
                bi = server.get_build_info(job_name, last_succ_build_num)
                #print ji
            description = ji['description']
            last_succ_build_num = ji['lastSuccessfulBuild']['number']
            bi = server.get_build_info(job_name, last_succ_build_num)
            job_date = timestamp2datetime(bi['timestamp']/1000)
            #print bi
            m, s = divmod(bi['duration']/1000, 60)
            job_time = str(m)+'m '+str(s)+'s'
            job_status = bi['result']

            if job_name.lower().__contains__('_jacoco_'):
                #ERMP_Jacoco_ut:全量单元测试     获取:ut_coco_detail,ut_coco_summary,ut_time
                if job_name.lower().__contains__('_ut'):
                    #project_info_dict['ut_coco_summary'] = ji['healthReport'][0]['description'][10:]
                    project_info_dict['ut_coco_summary'] = ji['healthReport'][0]['description']
                    #print "--print project_info_dict['ut_coco_summary']--"
                    #print project_info_dict['ut_coco_summary']
                    ut_jacoco_url = 'http://jenkins.htzq.htsc.com.cn/jenkins/job/%s/lastBuild/jacoco/' % job_name
                    project_info_dict['ut_coco_detail'] = ut_jacoco_url
                    project_info_dict['ut_time'] = job_time
                    print project_info_dict['ut_coco_summary']
                    #i1 = project_info_dict['ut_coco_summary'].index('Lines')
                    #i2 = project_info_dict['ut_coco_summary'].index('Branches')
                    #project_info_dict['ut_line'] = project_info_dict['ut_coco_summary'][i1 + 6: i2 - 2]
                    #print project_info_dict['ut_line']

                    
                #ERMP_Jacoco_at:全量自动化测试,    获取:at_coco_summary,at_time,at_coco_detail
                elif job_name.lower().__contains__('_at'):

                    project_info_dict['at_time'] = job_time
                    project_info_dict['at_coco_summary'] = ji['healthReport'][1]['description']
                    at_jacoco_url = 'http://jenkins.htzq.htsc.com.cn/jenkins/job/%s/lastBuild/jacoco/' % job_name
                    project_info_dict['at_coco_detail'] = at_jacoco_url
                    #print project_info_dict['at_coco_detail']
                    
                  #ERMP_Jacoco_total,total_coco_summary,total_coco_detail,total_line
                elif job_name.lower().__contains__('_total'):
                    project_info_dict['total_coco_summary'] = ji['healthReport'][0]['description'][10:]
                    total_jacoco_url = 'http://jenkins.htzq.htsc.com.cn/jenkins/job/%s/lastBuild/jacoco/' % job_name
                    project_info_dict['total_coco_detail'] = total_jacoco_url
                    print project_info_dict['total_coco_summary']
                    i1 = project_info_dict['total_coco_summary'].index('Lines')
                    i2 = project_info_dict['total_coco_summary'].index('Branches')
                    project_info_dict['total_line'] = project_info_dict['total_coco_summary'][i1+6: i2-2]
                    print project_info_dict['total_line']
                    
                #ERMP_Jacoco_UST,获取 ust_coco_summary,ust_coco_detail,ust_line
                elif job_name.lower().__contains__('_ust'):                    
                    project_info_dict['ust_coco_summary'] = ji['healthReport'][0]['description'][10:]
                    ust_jacoco_url = 'http://jenkins.htzq.htsc.com.cn/jenkins/job/%s/lastBuild/jacoco/' % job_name
                    project_info_dict['ust_coco_detail'] = ust_jacoco_url
                    print project_info_dict['ust_coco_summary']
                    #获取ust_line
                    i1 = project_info_dict['ust_coco_summary'].index('Lines')
                    i2 = project_info_dict['ust_coco_summary'].index('Branches')
                    project_info_dict['ust_line'] = project_info_dict['ust_coco_summary'][i1+6: i2-2]
                    print project_info_dict['ust_line']

                elif job_name.lower().__contains__('_mt'):
                    project_info_dict['mt_coco_summary'] = ji['healthReport'][0]['description']
                    mt_jacoco_url = 'http://jenkins.htzq.htsc.com.cn/jenkins/job/%s/lastBuild/jacoco/' % job_name
                    project_info_dict['mt_coco_detail'] = mt_jacoco_url

                    
                else:
                    pass
            elif job_name.lower().__contains__('_incoco_'):
            #ERMP_Incoco_ut,获取ut_incoco_summary,ut_incoco_detail
                if job_name.lower().__contains__('_ut'):
                    #project_info_dict['ut_incoco_summary'] = ji['healthReport'][0]['description'][10:]
                    project_info_dict['ut_incoco_summary'] = ji['healthReport'][0]['description']
                    ut_incoco_url = 'http://jenkins.htzq.htsc.com.cn/jenkins/job/%s/lastBuild/jacoco/' % job_name
                    project_info_dict['ut_incoco_detail'] = ut_incoco_url
                    print project_info_dict['ut_incoco_summary']
                    #i1 = project_info_dict['ut_incoco_summary'].index('Lines')
                    #i2 = project_info_dict['ut_incoco_summary'].index('Branches')
                    #project_info_dict['incoco_line']

                # elif job_name.lower().__contains__('_at'):
                    # project_info_dict['at_incoco_summary'] = ji['healthReport'][1]['description']
                    # at_incoco_url = 'http://jenkins.htzq.htsc.com.cn/jenkins/job/%s/lastBuild/jacoco/' % job_name
                    #project_info_dict['at_incoco_detail'] = at_incoco_url
                    
                #ERMP_incoco_total,获取total_incoco_summary,total_incoco_detail
                elif job_name.lower().__contains__('_total'):
                    #project_info_dict['total_incoco_summary'] = ji['healthReport'][0]['description'][10:]
                    project_info_dict['total_incoco_summary'] = ji['healthReport'][0]['description']
                    total_incoco_url = 'http://jenkins.htzq.htsc.com.cn/jenkins/job/%s/lastBuild/jacoco/' % job_name
                    project_info_dict['total_incoco_detail'] = total_incoco_url
                    print project_info_dict['total_incoco_summary']
                    #i1 = project_info_dict['total_incoco_summary'].index('Lines')
                    #i2 = project_info_dict['total_incoco_summary'].index('Branches')
                    #project_info_dict['incoco_line'] = project_info_dict['total_incoco_summary'][i1+6: i2-2]
                    #print project_info_dict['incoco_line']
                else:
                    pass
            elif job_name.lower().__contains__('_sonar'):
                    '''collect compile , deploy, sonar information'''
                    #project_info_dict['build_time'] = job_time
                    project_info_dict['sonar_time'] = job_time
                    sonar_url = 'http://jenkins.htzq.htsc.com.cn/jenkins/job/%s/lastBuild/jacoco/' % job_name
                    project_info_dict['sonar_url'] = sonar_url
                    project_info_dict['sonar_report'] = ji['healthReport'][0]['description']
                    #project_info_dict['sonar_report'] = bi['result']

                    project_info_dict['build_date'] = str(job_date.strftime("%Y/%m/%d"))
                    bco = server.get_build_console_output(job_name, last_succ_build_num)
                    # print bco
                    #project_info_dict['sonar_time'] = search_sonar_time(bco)[17:].replace(' ', '')


            else:
                
                for action in bi['actions']:
                    if action != {}:
                        if action['_class'].__eq__('hudson.plugins.robot.RobotBuildAction'):
                            if action['failCount'] > 0:
                                project_info_dict['at_report_summary'] = 'TotalCount: ' + str(action['totalCount']) + ', FailCount: <b><font color="#FF0000">' + str(action['failCount']) + '</font></b>, SkipCount: ' + str(action['skipCount'])
                            else:
                                project_info_dict['at_report_summary'] = 'TotalCount: ' + str(action['totalCount']) + ', FailCount: ' + str(action['failCount']) + ', SkipCount: ' + str(action['skipCount'])

                project_info_dict['at_report_detail'] = bi['url']+'robcot/report/report.html'
                project_info_dict['at_time'] = job_time


          

        #print "====================="
        #print project_info_dict
        #print "====================="
      

        print  project_info_dict['project_name']
        print  project_info_dict['subproject_name']
        print project_info_dict['build_date']
        print project_info_dict['build_time']

        print 'gather %s data success!' % project_info_dict['subproject_name']
        #sendReport()
        print project_name
        mail_content = readMailTemp()
        #mail_content = mail_content.replace('$%s' % (item), project_info_dict[item])
        mail_content = mail_content.replace('$project_name', project_name)
        mail_content = mail_content.replace('$subproject_name', project_info_dict['subproject_name'])
        mail_content = mail_content.replace('$build_date', project_info_dict['build_date'])
        mail_content = mail_content.replace('$build_time', project_info_dict['build_time'])
        mail_content = mail_content.replace('$sonar_time', project_info_dict['sonar_time'])
        mail_content = mail_content.replace('$ut_time', project_info_dict['ut_time'])
        mail_content = mail_content.replace('$at_time', project_info_dict['at_time'])
        mail_content = mail_content.replace('$incoco_line', project_info_dict['incoco_line'])
        mail_content = mail_content.replace('$total_line', project_info_dict['total_line'])
        mail_content = mail_content.replace('$secu_time', project_info_dict['secu_time'])
        mail_content = mail_content.replace('$sonar_report', project_info_dict['sonar_report'])
        mail_content = mail_content.replace('$sonar_url', project_info_dict['sonar_url'])
        mail_content = mail_content.replace('$ut_report_summary', project_info_dict['ut_report_summary'])
        mail_content = mail_content.replace('$ut_report_detail', project_info_dict['ut_report_detail'])
        mail_content = mail_content.replace('$at_report_summary', project_info_dict['at_report_summary'])
        mail_content = mail_content.replace('$at_report_detail', project_info_dict['at_report_detail'])
        mail_content = mail_content.replace('$ut_coco_summary', project_info_dict['ut_coco_summary'])
        mail_content = mail_content.replace('$ut_coco_detail', project_info_dict['ut_coco_detail'])
        mail_content = mail_content.replace('$at_coco_summary', project_info_dict['at_coco_summary'])
        mail_content = mail_content.replace('$at_coco_detail', project_info_dict['at_coco_detail'])
        mail_content = mail_content.replace('$total_coco_summary', project_info_dict['total_coco_summary'])
        mail_content = mail_content.replace('$total_coco_detail', project_info_dict['total_coco_detail'])
        mail_content = mail_content.replace('$ut_incoco_summary', project_info_dict['ut_incoco_summary'])
        mail_content = mail_content.replace('$ut_incoco_detail', project_info_dict['ut_incoco_detail'])
        mail_content = mail_content.replace('$at_incoco_summary', project_info_dict['at_incoco_summary'])
        mail_content = mail_content.replace('$at_incoco_detail', project_info_dict['at_incoco_detail'])
        mail_content = mail_content.replace('$total_incoco_summary', project_info_dict['total_incoco_summary'])
        mail_content = mail_content.replace('$total_incoco_detail', project_info_dict['total_incoco_detail'])
        mail_content = mail_content.replace('$secu_report_summary', project_info_dict['secu_report_summary'])
        mail_content = mail_content.replace('$secu_report_detail', project_info_dict['secu_report_detail'])
        mail_content = mail_content.replace('$ust_coco_detail', project_info_dict['ust_coco_detail'])
        mail_content = mail_content.replace('$ust_coco_summary', project_info_dict['ust_coco_summary'])
        mail_content = mail_content.replace('$ust_line', project_info_dict['ust_line'])
        mail_content = mail_content.replace('$mt_coco_summary', project_info_dict['mt_coco_summary'])
        mail_content = mail_content.replace('$mt_coco_detail', project_info_dict['mt_coco_detail'])
        mail_content = mail_content.replace('$ut_line', project_info_dict['ut_line'])


        print mail_content

        if mail_content is None:
            mailto_list = ["506949409@qq.com"]
            print "email is empty"
        else:
            mailto_list = mail_list
            print "email is not empty"
        send_mail(mailto_list, '%s项目持续集成质量报告%s' % (project_name, time.strftime('%Y-%m-%d', time.localtime(time.time()))),mail_content)
        
        
        发送邮件需要的mail_content.html参考另一个内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值