歡迎您光臨本站 註冊首頁

Python-jenkins模塊獲取jobs的執行狀態操作

←手機掃碼閱讀     limiyoyo @ 2020-05-13 , reply:0

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


[limiyoyo ] Python-jenkins模塊獲取jobs的執行狀態操作已經有278次圍觀

http://coctec.com/docs/python/shhow-post-234276.html