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的while循环中使用else以及循环嵌套的用法
Oct 14 Python
Python和Perl绘制中国北京跑步地图的方法
Mar 03 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
May 17 Python
Python+PIL实现支付宝AR红包
Feb 09 Python
Python3数据库操作包pymysql的操作方法
Jul 16 Python
Python实现去除图片中指定颜色的像素功能示例
Apr 13 Python
python基于itchat模块实现微信防撤回
Apr 29 Python
Python中Numpy mat的使用详解
May 24 Python
Python3.7 新特性之dataclass装饰器
May 27 Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
Django后端按照日期查询的方法教程
Feb 28 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
php统计文章排行示例
2014/03/04 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
PHP中读取文件的几个方法总结(推荐)
2016/06/03 PHP
PHP文件操作详解
2016/12/30 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
javascript EXCEL 操作类代码
2009/07/30 Javascript
javascript制作loading动画效果 loading效果
2014/01/14 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
使用watch在微信小程序中实现全局状态共享
2019/06/03 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
Python调用命令行进度条的方法
2015/05/05 Python
浅谈Python对内存的使用(深浅拷贝)
2018/01/17 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
在python中利用最小二乘拟合二次抛物线函数的方法
2018/12/29 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
区分python中的进程与线程
2020/08/13 Python
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
nohup的用法
2012/11/26 面试题
财会自我鉴定范文
2013/12/27 职场文书
感恩节红领巾广播稿
2014/02/11 职场文书
优质服务口号
2014/06/11 职场文书
大学生找工作求职信
2014/07/09 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
党员评议思想汇报
2014/10/08 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技