jenkins多节点集成allure
jenkins多节点配置
解决对docker部署的jenkins增加子节点时遇到的坑
插件管理–安装allure插件
重要:在开始之前要确保你的master节点已经安装好了allure!!
我这里踩到的一个坑就是因为jenkins master节点用docker进行部署的,所以只在linux子节点服务器上部署了java和allure运行环境,导致jenkins再启动allure服务时,找不到对应的路径。
java和allure的运行环境部署参考
接下来开始正式配置
系统配置–全局工具变量
别名随便起不做要求,这里建议加上allure版本号
设置完成后点击应用,保存。
配置从节点
JOB配置
增加构建后操作
选择高级,继续配置
构建后触发shell脚本
# 定义bash格式,很重要!!
#!/bin/bash
# 使环境变量生效,我这边不知道为什么配置的环境变量总是莫名其妙失效了,所以加了这步操作
source /etc/profile
# 对当前构建项目创建python3虚拟环境,如果已创建,则忽略(第二个venv是环境名称)
python3 -m venv venv
# 进入项目虚拟环境
source venv/bin/activate
# 安装依赖
pip install -r requirements.txt
# 执行pytest
pytest --alluredir ./report/tmp --clean-alluredir
# 输出allure报告
allure generate ./report/tmp -o ./report/report --clean
# 执行发送钉钉脚本
python common/DingDing.py
触发钉钉脚本
import json
import jenkins
import requests
import sys
import os
# 这里有一个坑,在linux使用from...import...语法时,需要加上path路径,否者会报找不到模块异常
object_path = os.path.join(os.path.abspath(os.path.dirname(os.path.dirname(__file__))))
sys.path.append(object_path)
from common.LoggerHandler import logger
jenkins_url = "jenkins地址"
server = jenkins.Jenkins(jenkins_url, username="用户账号", password="用户密码")
job_name = "job名称"
job_url = jenkins_url + job_name
job_last_build_url = server.get_info(job_name)['lastBuild']['url']
report_url = job_last_build_url + 'allure-2.13.0'
def dd_push():
d = {}
path = os.path.abspath("../")
f = open(path + r'xxxxxxxx/prometheusData.txt', 'r')
logger.info(f'读取路径==={f}===')
headers = {"Content-Type": "application/json;charset=utf-8"}
# allure_ip = 'http://' + get_ip() + ':8282'
# logger.info(f"报告地址===={allure_ip}")
url = 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxx'
for lines in f:
for i in lines:
launch_name = lines.strip('\n').split(' ')[0]
num = lines.strip('\n').split(' ')[1]
d.update({launch_name: num})
f.close()
logger.info(f'===文件读取完毕===')
retries_run = d.get('launch_retries_run')
logger.info('运行总数:{}'.format(retries_run))
# print('运行总数:{}'.format(retries_run))
status_passed = d.get('launch_status_passed')
logger.info('通过数量:{}'.format(status_passed))
# print('通过数量:{}'.format(status_passed))
status_failed = d.get('launch_status_failed')
logger.info('通过数量:{}'.format(status_failed))
# print('通过数量:{}'.format(status_failed))
execute_time = d.get('launch_time_duration')
logger.info('执行时间:{}'.format(execute_time))
logger.info(f'===关键字段复制完成,准备发送钉钉===')
# content里面要设置关键字
data_info = {
"msgtype": "text",
"text": {
"content": '测试报告,接口自动化case执行完毕:'
"\n本次运行case总数:" + retries_run +
"\n本次执行总时长:" + f'{execute_time}ms' +
"\n通过case数量:" + status_passed +
"\n失败case数量:" + status_failed +
"\n构建地址:\n" + job_url +
"\n报告地址:\n" + report_url
},
"isAtAll": False,
# 需要@的人
"at": {"atMobiles": ["xxxxxx"]}
}
value = json.dumps(data_info)
logger.info(f'===钉钉参数组装完成,调用钉钉===')
response = requests.post(url, data=value, headers=headers)
logger.info(response.text)
if response.json()['errmsg'] != 'ok':
print(response.text)
# 发送markdown格式钉钉消息
data_info = {
"msgtype": "markdown",
"markdown": {
"title": "skr_autotest 测试报告",
"text": "### skr_autotest 测试报告 \n"
f"- **本次执行总时长:**\n{execute_time}ms\n\n"
f"- **执行case总数:**\n{retries_run}\n\n"
f"- **通过case数量:**\n{status_passed}\n\n"
f"- **失败case数量:**\n{status_failed}\n\n"
f"- **失败重试次数:**\n{status_failed}\n\n"
f"- **详细报告跳转链接:**\n"
f"\n>>>[构建地址]({job_url})\n\n"
f"\n>>>[报告地址]({report_url})\n\n@xxxx"
},
# 需要@的人
"at": {"atMobiles": ["xxxxx"]}
}
value = json.dumps(data_info)
logger.info(f'===钉钉参数组装完成,调用钉钉===')
response = requests.post(url, data=value, headers=headers)
logger.info(response.text)
if response.json()['errmsg'] != 'ok':
print(response.text)
# actionCard格式消息
data_info = {
"msgtype": "actionCard",
"actionCard": {
"title": "skr_autotest 测试日报",
"text": f"skr_autotest {day_time} 巡检日报\n\n"
f"![告警图片](http://res-static.inframe.mobi/ui/16723199168274d.png)\n"
f"今日巡检次数:\n{day_job_count}\n\n"
f"今日执行case次数:\n{day_retries_run}\n\n"
f"今日通过case次数:\n{day_passed_count}\n\n"
f"今日失败case次数:\n{day_failed_count}\n\n"
f"今日失败case重试次数:\n{day_retries_count}\n\n",
"singleTitle": "报告详情",
"singleURL": dd_report_url
},
# 需要@的人
"at": {"isAtAll": True}
}
value = json.dumps(data_info)
logger.info(f'send dingding daily report !')
response = requests.post(url, data=value, headers=headers)
logger.info(f"dingding response : {response.text}")
if response.json()['errmsg'] != 'ok':
print(response.text)