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参考另一个内容