安装第三方依赖:six,requests,python_jenkins,pbr
下载地址:https://pypi.tuna.tsinghua.edu.cn/simple
jenkinsapi基本语法:
#实例化jenkins对象,连接远程的jenkins master server
server=jenkins.Jenkins(jenkins_server_url, username=user_id, password=api_token)
#构建job名为job_name的job(不带构建参数)
server.build_job(job_name)
#String参数化构建job名为job_name的job, 参数param_dict为字典形式,如:param_dict= {"param1":“value1”, “param2”:“value2”}
server.build_job(job_name, parameters=param_dict)
#获取job名为job_name的job的相关信息
server.get_job_info(job_name)
#获取job名为job_name的job的最后次构建号
server.get_job_info(job_name)['lastBuild']['number']
#获取job名为job_name的job的某次构建的执行结果状态
server.get_build_info(job_name,build_number)['result']
#判断job名为job_name的job的某次构建是否还在构建中
server.get_build_info(job_name,build_number)['building']
完整代码
#!/usr/bin/python3
#-*-coding: UTF-8 -*-
import xml.etree.ElementTree as ET
import jenkins
import time
import sys
from threading import Thread
def init_jenkins():
'''
初始化jenkins连接对象
:return:jenkins对象
'''
server =jenkins.Jenkins('http://xxx/',username='xxx',password='xxx')
return server
def get_param(buildname):
'''
获取jenkins的参数
:param buildname:
:return:
'''
# 获取job名为job_name的job的相关信息
job_info=j_server.get_job_config(buildname)
#截取参数化部分
job_info = '<properties>' + job_info.split('</properties>')[0].split('<properties>')[1] + '</properties>'
tree = ET.fromstring(job_info)
para_d = {}
paramobj = tree.find('hudson.model.ParametersDefinitionProperty').find('parameterDefinitions')
for child in paramobj.findall('hudson.model.StringParameterDefinition'):
para_d[child.find('name').text] = child.find('defaultValue').text
for child in paramobj.findall('hudson.model.TextParameterDefinition'):
para_d[child.find('name').text] = child.find('defaultValue').text
return para_d
def get_last_version(build_name):
'''
:return:最后构建版本号
'''
#获取最后一次构建版本号
return j_server.get_job_info(build_name)['lastBuild']['number']
def is_building(j_server,job_name,last_version):
'''
获取执行状态
:param j_server:
:param job_name:
:param last_version:
:return:
'''
return j_server.get_build_info(job_name, int(last_version) + 1)['building']
def is_pedding(j_server,job_name):
queue_info = j_server.get_queue_info()
if queue_info:
for queue_job_info in queue_info:
if queue_job_info['task']['name']==job_name:
print(job_name,'在jenkins等待队列中,休眠30秒。')
return True
else:
return False
else:
return False
def get_build_stat(j_server,job_name,last_version):
'''
获取构建结果
:param j_server:
:param job_name:
:param last_version:
:return:
'''
while True:
time.sleep(30)
if is_pedding(j_server,job_name):
continue
if is_building(j_server,job_name,last_version):
print(job_name,'构建中,休眠30秒。')
else:
build_result=j_server.get_build_info(job_name, int(last_version) + 1)['result']
if build_result == 'FAILURE':
print(job_name, '版本:', last_version + 1, '构建失败,详细日志登陆jenkins查看!')
elif build_result=='SUCCESS':
print('构建结果:', build_result)
else:
print('构建结果未知错误,请登陆jenkins页面查看!')
break
return j_server.get_build_info(job_name, int(last_version) + 1)['result']
# return j_server.get_build_info(job_name,int(last_version)+1)['result']
def do_build(j_server,job_name,jenkins_param_dict):
'''
执行构建函数
:param j_server:
:param job_name:
:param jenkins_param_dict:
:return:
'''
j_server.build_job(job_name, parameters=jenkins_param_dict,token=None)
def work(j_server,job_name,jenkins_param_dict,last_version):
#执行构建
print(job_name,'开始构建。。。')
#构建jenkins任务
do_build(j_server,job_name,jenkins_param_dict)
#判断是否执行完
get_build_stat(j_server, job_name, last_version)
# if build_result=='FAILURE':
# print(job_name,'版本:',last_version+1,'构建失败,详细日志登陆jenkins查看!')
# else:
# print('构建结果:',build_result)
if __name__ == '__main__':
active_list = ['bianyi', 'push']
#获取jenkins任务清单
job_name_list = []
#用开发任务测试用
if sys.argv[1]=='dev':
for i in sys.argv[2:]:
job_name = 'build-' + i + '-dev-manu'
job_name_list.append(job_name)
# job_name_list=['build-broad-dev-manu','build-cust-dev-manu']
for job_name in job_name_list:
j_server = init_jenkins()
last_version = get_last_version(job_name)
# 获取jenkins参数
jenkins_param_dict = get_param(job_name)
p1 = Thread(target=work, args=(j_server, job_name, jenkins_param_dict, last_version,))
p1.start() # 开启进程
else:
if sys.argv[-1:][0] not in active_list:
print('参数输入异常')
exit(0)
if len(sys.argv) > 6:
print('编译队列要少于5,请分批执行!')
exit(0)
f = open(r'moudle_list.txt', 'r')
dict_ = eval(f.read())
for i in sys.argv[1:-1]:
if i not in dict_:
print('code输入有误请重启输入!')
exit(0)
j_server=init_jenkins()
if sys.argv[-1:][0] == 'bianyi':
for job_code in sys.argv[1:-1]:
job_name=dict_[job_code][0]
# 获取最后一次编译号
last_version = get_last_version(job_name)
# 获取jenkins参数
jenkins_param_dict = get_param(job_name)
p1=Thread(target=work,args=(j_server,job_name,jenkins_param_dict,last_version,))
p1.start()#开启进程
else:
for job_code in sys.argv[1:-1]:
#获取push对应的准发布任务
job_name = dict_[job_code][0]
#获取push的任务名
job_push_name=dict_[job_code][1]
last_version = get_last_version(job_name)
last_push_version=get_last_version(job_push_name)
# 获取jenkins参数
jenkins_param_dict = get_param(job_push_name)
print(job_name,'最后一次构建版本号为:',dict_[job_code][2]+str(last_version))
jenkins_param_dict["TAG_VERSION"]=dict_[job_code][2]+str(last_version)
print(jenkins_param_dict)
p1=Thread(target=work,args=(j_server,job_push_name,jenkins_param_dict,last_push_version,))
p1.start()#开启进程