1. 程式人生 > 程式設計 >Python-jenkins模組獲取jobs的執行狀態操作

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

1 獲取jobs的當前任務狀態

server_1 = jenkins.Jenkins('http://%s:%[email protected]: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:%[email protected]: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的執行狀態操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。