为方便打包,使用Python做了jenkins打包工具,便于提醒打包结果和版本变更信息。
class Jenkins(object):
def __init__(self,jenkins_server_url,user_id,password,job_name):
self.server=jenkins.Jenkins(jenkins_server_url, username=user_id, password=password)
self.job_name=job_name
@property
def get_job_number(self):
"""
功能:返回正在运行的job的number
:param job_name: 正在构建的jenkins名称
:return: 存在正在执行的job返回int类型的number,不存在的时候返回none
"""
run_buid =self.server.get_running_builds()
if run_buid:
for job in run_buid:
if urllib.parse.unquote(job.get('name')) == self.job_name:
number = job.get('number')
return number
return None
else:
return None
def get_output(self,number):
"""
功能:获取编译报错信息
number:在正在执行的job返回int类型的number
"""
ouput=self.server.get_build_console_output(name=self.job_name,number=number).replace('\n','!')
pattern_recommed_res = re.search(r'Execution failed(.*?)BUILD FAILED in', ouput, re.M | re.I)
if pattern_recommed_res:
if pattern_recommed_res.group():
return pattern_recommed_res.group().replace("BUILD FAILED in","").replace('!','\n')
else:
return None
def get_jobs_status(self):
"""
功能:返回当前job状态
:param job_name:job名称
:return:
"""
try:
self.server.assert_job_exists(self.job_name)
except Exception as e:
print(e)
job_statue = '1'
# 判断job是否处于排队状态
inQueue = self.server.get_job_info(self.job_name)['inQueue']
if str(inQueue) == 'True':
job_statue = 'pending'
running_number = self.server.get_job_info(self.job_name)['nextBuildNumber']
else:
# 先假设job处于running状态,则running_number = nextBuildNumber -1 ,执行中的job的nextBuildNumber已经更新
running_number = self.server.get_job_info(self.job_name)['nextBuildNumber'] - 1
try:
running_status = self.server.get_build_info(self.job_name, running_number)['building']
if str(running_status) == 'True':
job_statue = 'running'
else:
# 若running_status不是True说明job执行完成
job_statue = self.server.get_build_info(self.job_name, running_number)['result']
except Exception as e:
# 上面假设job处于running状态的假设不成立,则job的最新number应该是['lastCompletedBuild']['number']
lastCompletedBuild_number = self.server.get_job_info(self.job_name)['lastCompletedBuild']['number']
job_statue = self.server.get_build_info(self.job_name, lastCompletedBuild_number)['result']
return job_statue
def get_jenkins_change(self,number,toenv,env):
global url
try:
response =self.server.jenkins_open(requests.Request(
'GET',headers={"Connection": "close"}, url="http://XXXXX//job/{0}/{1}/changes".format(self.job_name,number))
)
if response:
soup = BeautifulSoup(response, 'lxml')
# a_lists=soup.body.find_all('a')
name_lists = soup.select("b a")
chang_lists = soup.select("pre")
name_result_lists = []
change_result_lists = []
for a_list in name_lists:
name_result_lists.append(a_list.string)
for change_list in chang_lists:
change_result_lists.append(change_list.text)
change_dict = dict(zip(change_result_lists, name_result_lists))
return change_dict
else:
raise Exception('job[%s] number[%d] does not exist'
% (self.job_name, number))