【CI学习】Jenkins批量停止队列和正在运行的任务

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 from fuer.common.jenkins_base import Cmd
 4 import json
 5 import optparse
 6 import pymongo
 7 import sys
 8 import time
 9 
10 
11 if __name__ == '__main__':
12     # 用于批量关闭job的脚本
13     usage = """python fast_close_jenkins_jobs.py -e [0 or 1 or 2 or 3 or 4 or 5 or 6] -s [all or linux or windows]"""
14     parser = optparse.OptionParser(usage)
15     env_help = "The envs to close jenkins job, e.g. 1 ==> 10.186.1.x"
16     parser.add_option('-e', '--env', help=env_help, type='str')
17 
18     env_help = "The system to close jenkins job combine with env param"
19     parser.add_option('-s', '--system', help=env_help, type='str')
20 
21     options, args = parser.parse_args()
22 
23     env_param = options.env
24     if env_param is None:
25         print('param env is null, finish script')
26         sys.exit(0)
27 
28     system_param = options.system
29     if system_param is None:
30         print('system is null, finish script')
31         sys.exit(0)
32 
33     system_filter_param = ''
34     if system_param.lower() == 'linux':
35         system_filter_param = 'Linux'
36     elif system_param.lower() == 'windows':
37         system_filter_param = 'Windows'
38     else:
39         pass
40     env_filter_param = '10.186.' + env_param + '.'
41 
42     # # debug
43     # system_filter_param = ''
44     # env_filter_param = '10.186.' + '2' + '.'
45 
46 
47     jenkins_instance = Cmd()
48     mongodb_instance = pymongo.MongoClient(host='192.186.0.5', port=27017)['edrFuerNew']
49 
50     need_close_jenkins = []
51 
52     filter_param = {}
53     if env_filter_param:
54         filter_param['ip'] = {'$regex': env_filter_param}
55     if system_filter_param:
56         filter_param['os_type'] = system_filter_param
57     for item in mongodb_instance['agent_info'].find(filter=filter_param):
58         need_close_jenkins.append(item['jenkins_job'])
59 
60     all_wait_queue = jenkins_instance.server.get_queue_info()
61     # 关闭在队列但是未构建的job
62     for queue_item in all_wait_queue:
63         if queue_item['task']['name'] in need_close_jenkins:
64             jenkins_instance.server.cancel_queue(queue_item['id'])
65 
66     # 关闭正在构建中的job
67     all_running_queue = jenkins_instance.server.get_running_builds()
68     for queue_item in all_running_queue:
69         if queue_item['name'] in need_close_jenkins:
70             for i in range(3):
71                 jenkins_instance.server.stop_build(name=queue_item['name'], number=queue_item['number'])
72                 time.sleep(2)
73 
74     print 'run success'

document:agent_info 字段jenkins_job是jenkins上的job name

  1 #!/usr/bin/env python
  2 # encoding: utf-8
  3 import re, jenkins
  4 from time import sleep
  5 from fuer.conf import conf
  6 from fuer.common.logger import LOG_DEBUG, LOG_ERROR
  7 from jenkins import NotFoundException
  8 
  9 
 10 class Cmd(object):
 11     """jenkins cmd 接口
 12     主要提供一下API
 13         update_mgr
 14         _build_job  # TODO 移除保护方法
 15         is_job_finish
 16     """
 17 
 18     def __init__(self):
 19         self.url = conf.JENKINS["server_url"]
 20         self.uid = conf.JENKINS["user_id"]
 21         self.token = conf.JENKINS["token"]
 22         self.server = None
 23         self.create_server()
 24 
 25     def create_server(self):
 26         """
 27         创建连接jenkins
 28         :return:bool
 29         """
 30         self.server = jenkins.Jenkins(self.url, username=self.uid, password=self.token)
 31 
 32     def update_mgr(self, job_name, mgr_id, ver):
 33         """
 34         :param job_name:mgr对应的jenkins job
 35         :param mgr_id:mgr id
 36         :param ver: 此次升级的版本信息
 37         :return:
 38         """
 39         LOG_DEBUG('Job:{},update_mgr {0} {1}'.format(job_name, mgr_id, ver))
 40         self._build_job(job_name, mgr_id=mgr_id, ver=ver, wait=0)
 41 
 42     def update_agent(self, uid, cfg, tests_ver):
 43         """
 44         :param uid:对应的jenkins job id
 45         :param cfg:升级对应的配置
 46         :param tests_ver:用例标签
 47         :return:返回本次执行id
 48         """
 49         LOG_DEBUG('执行update_agent {0} {1} {2}'.format(uid, cfg, tests_ver))
 50         last_number = self.get_last_build_number(uid)
 51         self._build_job(uid, cfg=cfg, tests_ver=tests_ver)
 52         return int(last_number) + 1
 53 
 54     def _build_job(self, name, **kwargs):
 55         """
 56         :param name: 对应的jenkins job name
 57         :param kwargs:  对应配置信息
 58         :return:
 59         """
 60         if not kwargs:
 61             self.server.build_job(name)
 62         else:
 63             # String参数化构建job名为job_name的job, 参数param_dict为字典形式,如:param_dict= {"param1":“value1”, “param2”:“value2”}
 64             self.server.build_job(name, parameters=kwargs)
 65 
 66     def is_job_finish(self, name, build_number=None, retry_times=10):
 67         """
 68         判断job名为job_name的job的某次构建是否还在构建中
 69         :param name: 对应的jenkins job name
 70         :param build_number:默认:lastBuild
 71         :param retry_times:
 72         :return:
 73         """
 74         if not build_number:
 75             try:
 76                 build_number = self.server.get_job_info(name)['lastBuild']['number']
 77             except Exception, e:  # TODO 由于节点未连接导致的
 78                 return False
 79         for retry in xrange(retry_times):
 80             try:
 81                 ret = self.server.get_build_info(name, build_number)['building']
 82             except Exception, e:
 83                 ret = True
 84                 sleep(retry)
 85             else:
 86                 return not ret
 87         return not ret
 88 
 89     def get_build_job_info(self, name, build_number=None):
 90         """
 91         获取job构建信息
 92         :param name: 对应的jenkins job name
 93         :param build_number:默认:lastBuild
 94         :return:
 95         """
 96         if not build_number:
 97             build_number = self.server.get_job_info(name)['lastBuild']['number']
 98         build_info = None
 99         try:
100             build_info = self.server.get_build_info(name, build_number)['result']
101 
102         except Exception as e:
103             LOG_ERROR("获取job构建信息出错 %s" % e)
104 
105         return build_info
106 
107     def get_job_result(self, name, build_number=None):
108         """
109         返回job执行结果
110         :param name: 对应的jenkins job name
111         :param build_number:默认:lastBuild
112         :return:
113         """
114         if not build_number:
115             build_number = self.server.get_job_info(name)['lastBuild']['number']
116 
117         build_result = None
118         try:
119             build_result = self.server.get_build_info(name, build_number)['result']
120 
121         except Exception as e:
122             LOG_ERROR("获取job执行结果出错 %s" %e )
123 
124         return build_result
125 
126     def get_job_console(self, name, build_number=None, regular=None, group_id=1):
127         """
128         返回job执行日志信息
129         :param name: 对应的jenkins job name
130         :param build_number:默认:lastBuild
131         :param regular:日志结

 

posted @ 2020-04-02 12:22  gtea  阅读(3511)  评论(0编辑  收藏  举报