Python-jenkins模塊獲取jobs的執(zhí)行狀態(tài)操作
1 獲取jobs的當(dāng)前任務(wù)狀態(tài)
server_1 = jenkins.Jenkins('http://%s:%s@192.168.37.134:8081/',username, password)
獲取狀態(tài)前先確認(rèn)2019文件夾下的get_node_list任務(wù)是否存在:
server_1.assert_job_exists('2019/get_node_list')
獲取最后一次完成(不包括執(zhí)行中的)的job任務(wù)執(zhí)行number:
server_1.get_job_info('2019/get_node_list')['lastCompletedBuild']['number']
查看job狀態(tài)(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()
啟動(dòng)jobs:
server_1.build_job('2019/get_node_list')
在job執(zhí)行結(jié)束前使用server_1.get_build_console_output(‘2019/get_node_list',7).split('\n')[-2].split(':')[-1].strip()獲取的狀態(tài)信息不符合預(yù)期。
job狀態(tài)應(yīng)該還包括running,pending狀態(tài),那么獲取job的當(dāng)前狀態(tài)正確姿勢如下:
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是否處于排隊(duì)狀態(tài)
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:
#先假設(shè)job處于running狀態(tài),則running_number = nextBuildNumber -1 ,執(zhí)行中的job的nextBuildNumber已經(jīng)更新
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執(zhí)行完成
job_statue = server.get_build_info(job_name,running_number)['result']
except Exception as e:
#上面假設(shè)job處于running狀態(tài)的假設(shè)不成立,則job的最新number應(yīng)該是['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
注意:
可能還存在下圖的情況,這個(gè)時(shí)候獲取的是26的狀態(tài),這時(shí)候也許你想獲取25的狀態(tài),26是不小心誤操作觸發(fā)的,這個(gè)時(shí)候任務(wù)的最新狀態(tài)也許就無法滿足預(yù)期要求,或者是支持并發(fā)構(gòu)建的job場景中就不適用了,關(guān)鍵還是需要結(jié)合應(yīng)用場景制定對應(yīng)的方案。

2 統(tǒng)計(jì)jobs的執(zhí)行成功率和平均執(zhí)行時(shí)間
統(tǒng)計(jì)場景說明:
設(shè)計(jì)了一個(gè)統(tǒng)計(jì)job執(zhí)行成功率的工程,主要從執(zhí)行時(shí)間以及視圖兩個(gè)維度來劃定需要統(tǒng)計(jì)的jobs及jobs對應(yīng)的運(yùn)行范圍。
在這里我在job里面添加了DAYS和VIEWS兩個(gè)參數(shù):
**DAYS:**默認(rèn)統(tǒng)計(jì)最近一天的運(yùn)行情況,如果執(zhí)行的時(shí)候輸入的是0則代表統(tǒng)計(jì)所有的運(yùn)行情況。
**VIEWS:**對應(yīng)的是視圖名稱,“2019-1,test”代表統(tǒng)計(jì)這兩個(gè)視圖的運(yùn)行情況

對應(yīng)的視圖如下:

執(zhí)行成功后以表格形式列出統(tǒng)計(jì)的數(shù)據(jù),表頭如下

列出了序號(hào)、視圖名稱、job名稱、job執(zhí)行成功的平均執(zhí)行時(shí)間、job執(zhí)行成功次數(shù)、總的執(zhí)行時(shí)間、job執(zhí)行成功率
job執(zhí)行演示:
執(zhí)行構(gòu)建時(shí)配置的參數(shù)如下

job_data任務(wù)的主要執(zhí)行內(nèi)容如下:

執(zhí)行成功后查看HTML_Report統(tǒng)計(jì)的數(shù)據(jù)如下:

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 #統(tǒng)計(jì)任務(wù)的累計(jì)序號(hào)
for view in views.split(','):
#根據(jù)視圖名稱拼接視圖的URL,多個(gè)視圖間用','分隔
URL = ('http://%s:%s@192.168.37.134:8081/job/2019/view/%s/')%(username, password, view)
server = jenkins.Jenkins(URL)
#依次獲取當(dāng)前view視圖中jobs的信息
for num in range(0,len(server.get_all_jobs())):
job_name = server.get_all_jobs()[num]['fullname']
#獲取最后一次完成構(gòu)建的編號(hào),用于劃定時(shí)間范圍(如果需要的話)
try:
lastCompletedBuild_num = server.get_job_info(job_name)['lastCompletedBuild']['number']
except:
#假如job下面一個(gè)構(gòu)建記錄都沒有則補(bǔ)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
#獲取最后一次完成構(gòu)建的時(shí)間戳,單位由毫秒轉(zhuǎn)換為秒
lastCompletedBuild_timestamp = server.get_build_info(job_name,lastCompletedBuild_num)['timestamp'] / 1000
#將時(shí)間先由秒轉(zhuǎn)化為元組在轉(zhuǎn)化為字符串并取到天數(shù)
lastCompletedBuild_date = time.strftime("%Y%m%d",time.localtime(lastCompletedBuild_timestamp))
#print(lastCompletedBuild_date)
#根據(jù)變量days和lastCompletedBuild_timestamp計(jì)算出days天前的日期,若days為0則沒有日期限制,統(tǒng)計(jì)之前運(yùn)行的所有任務(wù)
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天內(nèi)job的執(zhí)行情況
success_count = 0 #job執(zhí)行成功的總數(shù)
success_duration = 0 #執(zhí)行成功的job執(zhí)行時(shí)間之和,單位是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數(shù)據(jù)的累計(jì)
if job_build_date == end_date:
number = number - 1
break
#累計(jì)執(zhí)行成功的次數(shù)和duration執(zhí)行時(shí)間
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
#計(jì)算執(zhí)行成功的平均執(zhí)行時(shí)間和成功率,打印關(guān)鍵信息
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
#將關(guān)心的數(shù)據(jù)按照一定的格式寫到/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執(zhí)行效率統(tǒng)計(jì)')
caption('summary:')
with table(border="2",cellspacing="0"):
l = tr(bgcolor="#0000FF")
l += th('序號(hào)')
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的執(zhí)行狀態(tài)操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- python使用paramiko模塊實(shí)現(xiàn)ssh遠(yuǎn)程登陸上傳文件并執(zhí)行
- Python2.x利用commands模塊執(zhí)行Linux shell命令
- python通過getopt模塊如何獲取執(zhí)行的命令參數(shù)詳解
- python SSH模塊登錄,遠(yuǎn)程機(jī)執(zhí)行shell命令實(shí)例解析
- 使用Python paramiko模塊利用多線程實(shí)現(xiàn)ssh并發(fā)執(zhí)行操作
- python中使用paramiko模塊并實(shí)現(xiàn)遠(yuǎn)程連接服務(wù)器執(zhí)行上傳下載功能
- 執(zhí)行Python程序時(shí)模塊報(bào)錯(cuò)問題
- Python代碼執(zhí)行時(shí)間測量模塊timeit用法解析
- 解決Python paramiko 模塊遠(yuǎn)程執(zhí)行ssh 命令 nohup 不生效的問題
- Python實(shí)現(xiàn)以主程序的形式執(zhí)行模塊
相關(guān)文章
Python3 利用requests 庫進(jìn)行post攜帶賬號(hào)密碼請求數(shù)據(jù)的方法
今天小編就為大家分享一篇Python3 利用requests 庫進(jìn)行post攜帶賬號(hào)密碼請求數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
使用PyInstaller將Python程序文件轉(zhuǎn)換為可執(zhí)行程序文件
與py2exe一樣,PyInstaller程序也可以將Python的.py程序文件轉(zhuǎn)換為.exe,并且還有Linux的版本,下面我們就來詳細(xì)看一下如何使用PyInstaller將Python程序文件轉(zhuǎn)換為可執(zhí)行程序文件2016-07-07
Python StringIO如何在內(nèi)存中讀寫str
這篇文章主要介紹了python StringIO如何在內(nèi)存中讀寫str,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Python+Scipy實(shí)現(xiàn)自定義任意的概率分布
Scipy自帶了多種常見的分布,如正態(tài)分布、均勻分布、二項(xiàng)分布、多項(xiàng)分布、伽馬分布等等,還可以自定義任意的概率分布。本文將為大家介紹如何利用Scipy自定義任意的概率分布,感興趣的可以了解下2022-08-08
python xmind 包使用詳解(其中解決導(dǎo)出的xmind文件 xmind8可以打開 xmind2020及之后版本打
xmind8 可以打開xmind2020 報(bào)錯(cuò),如何解決這個(gè)問題呢?下面小編給大家?guī)砹藀ython xmind 包使用(其中解決導(dǎo)出的xmind文件 xmind8可以打開 xmind2020及之后版本打開報(bào)錯(cuò)問題),感興趣的朋友一起看看吧2021-10-10
Python+selenium 自動(dòng)化快手短視頻發(fā)布的實(shí)現(xiàn)過程
這篇文章主要介紹了Python+selenium 自動(dòng)化快手短視頻發(fā)布,通過調(diào)用已啟用的瀏覽器,可以實(shí)現(xiàn)直接跳過每次的登錄過程,上傳功能的使用方法通過代碼給大家介紹的也非常詳細(xì),需要的朋友可以參考下2021-10-10
Python設(shè)計(jì)模式行為型責(zé)任鏈模式
這篇文章主要介紹了Python設(shè)計(jì)模式行為型責(zé)任鏈模式,責(zé)任鏈模式將能處理請求的對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個(gè)對象處理請求為止,避免請求的發(fā)送者和接收者之間的耦合關(guān)系,下圍繞改內(nèi)容介紹具有一點(diǎn)的參考價(jià)值,需要的朋友可以參考下2022-02-02

