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:日志结