Python-jenkins模块获取jobs的执行状态操作
作者:Sudley 发布时间:2022-07-29 14:15:09
1 获取jobs的当前任务状态
server_1 = jenkins.Jenkins('http://%s:%s@192.168.37.134:8081/',username, password)
获取状态前先确认2019文件夹下的get_node_list任务是否存在:
server_1.assert_job_exists('2019/get_node_list')
获取最后一次完成(不包括执行中的)的job任务执行number:
server_1.get_job_info('2019/get_node_list')['lastCompletedBuild']['number']
查看job状态(SUCCESS/FAILURE/ABORTED):
server_1.get_build_info('2019/get_node_list',3)['result']
server_1.get_build_console_output('2019/get_node_list',7).split('\n')[-2].split(':')[-1].strip()
启动jobs:
server_1.build_job('2019/get_node_list')
在job执行结束前使用server_1.get_build_console_output(‘2019/get_node_list',7).split('\n')[-2].split(':')[-1].strip()获取的状态信息不符合预期。
job状态应该还包括running,pending状态,那么获取job的当前状态正确姿势如下:
job_name = '2019/get_node_list'
def get_jobs_status(job_name,server):
try:
server.assert_job_exists(job_name)
except Exception as e:
print(e)
job_statue = '1'
#判断job是否处于排队状态
inQueue = server.get_job_info(job_name)['inQueue']
if str(inQueue) == 'True':
job_statue = 'pending'
running_number = server.get_job_info(job_name)['nextBuildNumber']
else:
#先假设job处于running状态,则running_number = nextBuildNumber -1 ,执行中的job的nextBuildNumber已经更新
running_number = server.get_job_info(job_name)['nextBuildNumber'] -1
try:
running_status = server.get_build_info(job_name,running_number)['building']
if str(running_status) == 'True':
job_statue = 'running'
else:
#若running_status不是True说明job执行完成
job_statue = server.get_build_info(job_name,running_number)['result']
except Exception as e:
#上面假设job处于running状态的假设不成立,则job的最新number应该是['lastCompletedBuild']['number']
lastCompletedBuild_number = server.get_job_info(job_name)['lastCompletedBuild']['number']
job_statue = server.get_build_info(job_name,lastCompletedBuild_number)['result']
return job_statue,running_number
注意:
可能还存在下图的情况,这个时候获取的是26的状态,这时候也许你想获取25的状态,26是不小心误操作触发的,这个时候任务的最新状态也许就无法满足预期要求,或者是支持并发构建的job场景中就不适用了,关键还是需要结合应用场景制定对应的方案。
2 统计jobs的执行成功率和平均执行时间
统计场景说明:
设计了一个统计job执行成功率的工程,主要从执行时间以及视图两个维度来划定需要统计的jobs及jobs对应的运行范围。
在这里我在job里面添加了DAYS和VIEWS两个参数:
**DAYS:**默认统计最近一天的运行情况,如果执行的时候输入的是0则代表统计所有的运行情况。
**VIEWS:**对应的是视图名称,“2019-1,test”代表统计这两个视图的运行情况
对应的视图如下:
执行成功后以表格形式列出统计的数据,表头如下
列出了序号、视图名称、job名称、job执行成功的平均执行时间、job执行成功次数、总的执行时间、job执行成功率
job执行演示:
执行构建时配置的参数如下
job_data任务的主要执行内容如下:
执行成功后查看HTML_Report统计的数据如下:
get_job_data.py源码如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: Sudley
# ctime: 2020/02/12
import sys
import jenkins
import time
from dominate.tags import *
def Count_the_success_rate_of_jobs(days,views):
username = 'sudley'
password = '******'
with open('//home/Sudley/python-jenkins/get_job_data.txt','w') as f:
print('create a new file //home/Sudley/python-jenkins/get_job_data.txt')
serial_number = 0 #统计任务的累计序号
for view in views.split(','):
#根据视图名称拼接视图的URL,多个视图间用','分隔
URL = ('http://%s:%s@192.168.37.134:8081/job/2019/view/%s/')%(username, password, view)
server = jenkins.Jenkins(URL)
#依次获取当前view视图中jobs的信息
for num in range(0,len(server.get_all_jobs())):
job_name = server.get_all_jobs()[num]['fullname']
#获取最后一次完成构建的编号,用于划定时间范围(如果需要的话)
try:
lastCompletedBuild_num = server.get_job_info(job_name)['lastCompletedBuild']['number']
except:
#假如job下面一个构建记录都没有则补0
print('There is not build number in',job_name)
average_success_duration = success_count = all_count = success_rate = 0
line = str(serial_number) + ' ' + view + ' ' + job_name + ' ' + str(int(average_success_duration)) + ' ' + str(success_count) + ' ' + str(all_count) + ' ' + str(success_rate) + '%'
with open('//home/Sudley/python-jenkins/get_job_data.txt','a') as f:
f.write(str(line))
f.write('\n')
serial_number = serial_number + 1
continue
#获取最后一次完成构建的时间戳,单位由毫秒转换为秒
lastCompletedBuild_timestamp = server.get_build_info(job_name,lastCompletedBuild_num)['timestamp'] / 1000
#将时间先由秒转化为元组在转化为字符串并取到天数
lastCompletedBuild_date = time.strftime("%Y%m%d",time.localtime(lastCompletedBuild_timestamp))
#print(lastCompletedBuild_date)
#根据变量days和lastCompletedBuild_timestamp计算出days天前的日期,若days为0则没有日期限制,统计之前运行的所有任务
if str(days) == '0':
end_date = 'false'
else:
end_timestamp = float(lastCompletedBuild_timestamp) - float(days) * 24 * 3600
end_date = time.strftime("%Y%m%d",time.localtime(end_timestamp))
#print(end_date)
#获取days天内job的执行情况
success_count = 0 #job执行成功的总数
success_duration = 0 #执行成功的job执行时间之和,单位是s
for number in range(0,len(server.get_job_info(job_name)['builds'])):
job_build_number = server.get_job_info(job_name)['builds'][number]['number']
job_build_timestamp = server.get_build_info(job_name,job_build_number)['timestamp'] / 1000
job_build_date = time.strftime("%Y%m%d",time.localtime(job_build_timestamp))
#如果日期和end_date相同则终止此job数据的累计
if job_build_date == end_date:
number = number - 1
break
#累计执行成功的次数和duration执行时间
job_build_result = server.get_build_info(job_name,job_build_number)['result']
if str(job_build_result) == 'SUCCESS':
job_build_duration = server.get_build_info(job_name,job_build_number)['duration']
success_duration = success_duration + job_build_duration / 1000
success_count = success_count + 1
#计算执行成功的平均执行时间和成功率,打印关键信息
all_count = number + 1
success_rate = success_count * 1.0 / all_count * 100
if success_count == 0:
average_success_duration = success_duration
else:
average_success_duration = success_duration * 1.0 / success_count
#将关心的数据按照一定的格式写到/home/Sudley/python-jenkins/get_job_data.txt文件中
line = str(serial_number) + ' ' + view + ' ' + job_name + ' ' + str(int(average_success_duration)) + ' ' + str(success_count) + ' ' + str(all_count) + ' ' + str(round(success_rate,2)) + '%'
with open('//home/Sudley/python-jenkins/get_job_data.txt','a') as f:
f.write(str(line))
f.write('\n')
serial_number = serial_number + 1
def txt2xml():
h = html()
with h.add(body()):
h2('job执行效率统计')
caption('summary:')
with table(border="2",cellspacing="0"):
l = tr(bgcolor="#0000FF")
l += th('序号')
l += th('view_name')
l += th('job_name')
l += th('average_success_duration')
l += th('success_count')
l += th('all_count')
l += th('success_rate')
file=open('/home/Sudley/python-jenkins/get_job_data.txt')
for line in file.readlines():
curLine=line.strip().split(" ")
l = tr()
for i in range(0,len(curLine)):
l += td(curLine[i])
with open('/home/Sudley/python-jenkins/get_job_data.html','w') as f:
f.write(h.render())
if __name__ == '__main__' :
days = sys.argv[1]
views = sys.argv[2]
Count_the_success_rate_of_jobs(days,views)
txt2xml()
来源:https://blog.csdn.net/Sudley/article/details/104262734


猜你喜欢
- 一:从版本3.23升级到4.104.10新特性:支持事务处理和存储过程升级过程的注意事项:1:升级采用直接复制安装文件的方法,简单实用,但要
- 学习总结(1)和上一讲的模型训练是类似的,只是在线性模型的基础上加个sigmoid,然后loss函数改为交叉熵BCE函数(当然也可以用其他函
- 今天在pycharm中手贱,点击了项目exclude,直接懵逼,项目东西找不到了,奶奶的如图一番操作后如图所示,捣鼓了很久,恢复方法点击se
- 本文实例讲述了Python实现随机生成手机号及正则验证手机号的方法。分享给大家供大家参考,具体如下:依据根据2017年10月份最新的手机号正
- 本文实例讲述了JavaScript设计模式之模板方法模式原理与用法。分享给大家供大家参考,具体如下:一、模板方法模式:一种只需使用继承就可以
- 爱如风过 问:js如何能知道浏览者计算机或者浏览器使用的语言是繁体还是简体?如题,我想用jS检测到浏览者使用的是繁体还是简体中文,以便设置页
- 阅读上一篇:什么是名字空间<meta http-equiv="Content-Type" co
- 常有新手问我该怎么备份数据库,下面介绍3种备份数据库的方法:(1)备份数据库文件MySQL中的每一个数据库和数据表分别对应文件系统中的目录和
- 导语今天在写 SQL 的时候,遇到一个问题。需求是这样的,查询数据,按照评分倒序、近一周访问量倒序,这样进行排序。问题是常规的写法,将 da
- 话不多说,请看代码------------------------------------------作者:张欣宇-----时间:2013-
- 安装Pytorch在pytorch官网上选择相应选项,我的是OS X, pip, python2.7, none CUDA。(之所以用pyt
- 一,原图和效果图二,代码//#########################产生随机颜色#########################
- 在Python中通过GET来获取页面的COOKIE是非常简单的事情,下面的代码实例演示了如何利用Python 获取COOKIE内容#! /u
- 1 Kmean图像分割按照Kmean原理,对图像像素进行聚类。优点:此方法原理简单,效果显著。缺点:实践发现对于前景和背景颜色相近或者颜色区
- imadjustimadjust是一个计算机函数,该函数用于调节灰度图像的亮度或彩色图像的颜色矩阵。在matlab的命令窗口中键入: doc
- 在Python3.6提供f-Strings新的字符串格式化语法。不仅更加可读、简洁,相比其他方式也不易造成错误,而且还更快。看完本文你将学习
- 用Flask处理图片非常容易,这一篇学习一下图片的上传、下载及展示。还是以实例代码演示为主。首先,实现一个简单的上传(过程中未做任何处理,只
- [asp] 献一函数:ASP获取ACCESS数据库的表名以及表名对应的字段名和字段类型<%showtable "../dat
- 一、PHP动态生成第一步:在PHP文件中直接写入JS代码,并在头部声明这是一个JavaScript文件<?php header(
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:jquery读取xml文件 <!DOCTYPE html PUBLIC "