Python-jenkins模块获取jobs的执行状态操作


Posted in Python onMay 12, 2020

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场景中就不适用了,关键还是需要结合应用场景制定对应的方案。

Python-jenkins模块获取jobs的执行状态操作

2 统计jobs的执行成功率和平均执行时间

统计场景说明:

设计了一个统计job执行成功率的工程,主要从执行时间以及视图两个维度来划定需要统计的jobs及jobs对应的运行范围。

在这里我在job里面添加了DAYS和VIEWS两个参数:

**DAYS:**默认统计最近一天的运行情况,如果执行的时候输入的是0则代表统计所有的运行情况。

**VIEWS:**对应的是视图名称,“2019-1,test”代表统计这两个视图的运行情况

Python-jenkins模块获取jobs的执行状态操作

对应的视图如下:

Python-jenkins模块获取jobs的执行状态操作

执行成功后以表格形式列出统计的数据,表头如下

Python-jenkins模块获取jobs的执行状态操作

列出了序号、视图名称、job名称、job执行成功的平均执行时间、job执行成功次数、总的执行时间、job执行成功率

job执行演示:

执行构建时配置的参数如下

Python-jenkins模块获取jobs的执行状态操作

job_data任务的主要执行内容如下:

Python-jenkins模块获取jobs的执行状态操作

执行成功后查看HTML_Report统计的数据如下:

Python-jenkins模块获取jobs的执行状态操作

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()

以上这篇Python-jenkins模块获取jobs的执行状态操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中关于时间和日期函数的常用计算总结(time和datatime)
Mar 08 Python
python将xml xsl文件生成html文件存储示例讲解
Dec 03 Python
Python中尝试多线程编程的一个简明例子
Apr 07 Python
Python中set与frozenset方法和区别详解
May 23 Python
利用python微信库itchat实现微信自动回复功能
May 18 Python
python线程池(threadpool)模块使用笔记详解
Nov 17 Python
python基于twisted框架编写简单聊天室
Jan 02 Python
Python实现的三层BP神经网络算法示例
Feb 07 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 Python
PythonPC客户端自动化实现原理(pywinauto)
May 28 Python
Python3爬虫中Selenium的用法详解
Jul 10 Python
用Python生成会跳舞的美女
Jan 18 Python
Python-jenkins 获取job构建信息方式
May 12 #Python
python进行参数传递的方法
May 12 #Python
python输出数学符号实例
May 11 #Python
使用matlab 判断两个矩阵是否相等的实例
May 11 #Python
Django models文件模型变更错误解决
May 11 #Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 #Python
Django静态资源部署404问题解决方案
May 11 #Python
You might like
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
php漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
PHP字符串长度计算 - strlen()函数使用介绍
2013/10/15 PHP
php生成excel列序号代码实例
2013/12/24 PHP
PHP实现根据数组的值进行分组的方法
2017/04/20 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
使用AngularJS来实现HTML页面嵌套的方法
2015/06/17 Javascript
jQuery实现仿百度帖吧头部固定导航效果
2015/08/07 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
JS使用正则表达式验证身份证号码
2017/06/23 Javascript
three.js 入门案例详解
2018/01/23 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
2019/04/09 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
python 读取摄像头数据并保存的实例
2018/08/03 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
对Python _取log的几种方式小结
2019/07/25 Python
Python常用GUI框架原理解析汇总
2020/12/07 Python
攀岩、滑雪、徒步旅行装备:Black Diamond Equipment
2019/08/16 全球购物
新学期校长寄语
2014/01/18 职场文书
机关党员公开承诺书
2014/08/30 职场文书
优秀团员事迹材料1500字
2014/08/31 职场文书
见习报告格式要求
2014/11/04 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书