#!/usr/bin/python
#coding=UTF-8
‘’’
Created on 2018-07-24
@author: wanghuan
@module: jenkinsApi.jenkinsApi
入参:
应用名 jenkins地址 cmdb接口地址 git提交哈希值
appname jenkins_Url cmdb_url commit_id
功能:
执行jenkins相关操作:
根据提供的应用名和commit_id执行jenkinsjob任务,并返回job最终执行状态
‘’’
import requests
import os,sys
import pyaml
import jenkins
import time
reload(sys)
sys.setdefaultencoding(‘utf-8’)
class jenkinsApi():
#初始化jenkins相关信息
def init(self,jenkins_Url,cmdb_url):
#cmdb接口地址和jenkins地址
self._jenkins_Url = jenkins_Url
self._cmdb_url = cmdb_url
def getCmdbInfo(self,appname):
r = requests.get(self._cmdb_url+appname).json()
if r['data']:
data=r['data']
#fin=pyaml.dump(data)
#print fin
jenkins_job=data.get('jenkinsjob')
if jenkins_job:
jenkinsjob=data['jenkinsjob']
print 'jenkinsjob=',jenkinsjob
return jenkinsjob
else:
print '应用名和jenkins job名字一致,直接使用应用名'
jenkinsjob=appname
print 'jenkinsjob=',jenkinsjob
print "appname=",appname
return jenkinsjob
else:
print "cmdb接口有问题,请确认"
'''
def store_package(self,app_name,branch_name):
path ='/opt/build_package/'+app_name+'/'+branch_name
print path
isExists=os.path.exists(path)
if isExists:
print '此版本号已经构建'
return False
else:
os.makedirs(path)
print path+' 创建成功'
return True
'''
def getJenkinsInfo(self,appname,commit_id,username,job_name,password,param_dict,branch_name):
server = jenkins.Jenkins(self._jenkins_Url,username,password)
time.sleep(5)
print 'jenkins调用参数=',job_name,param_dict
#print server.get_job_info(job_name)
try:
next_bn = server.get_job_info(job_name)['nextBuildNumber']
except:
print "可能是应用名和jenkinsjob名不一致,你可以尝试修改一下应用拓展信息"
print "next_bn获取异常,重试"
time.sleep(5)
next_bn = server.get_job_info(job_name)['nextBuildNumber']
else:
print '本次执行的jenkins job编号为:',next_bn
try:
server.build_job(job_name,param_dict)
except:
print "可能是应用名和jenkinsjob名不一致,你可以尝试修改一下应用拓展信息"
print "启动jenkinsjob异常,重试"
time.sleep(5)
server.build_job(job_name,param_dict)
else:
print 'jenkins job地址获取成功'
# 启动一个job的时候经常会有延迟的,这是个经验值,暂定10秒,可根据实际情况进行更改。
time.sleep(10)
sleeptime=0
while sleeptime < 50:
#print "sleep 循环中"
try:
server.get_build_info(job_name,next_bn)['building']
except:
time.sleep(5)
print "jenkins job还没有启动起来,继续等待5秒..."
sleeptime = sleeptime+5
else:
print "jenkins job启动成功"
sleeptime=50
print "sleeptime",sleeptime
print "退出sleep循环"
while True:
if server.get_build_info(job_name,next_bn)['building'] == False:
jobstatus=server.get_build_info(job_name,next_bn)['result']
print jobstatus
print '应用名=',appname
print 'job编号名字=',next_bn
print 'commitid=',commit_id
if jobstatus == "FAILURE":
#print "jenkins构建结果:",jobstatus
return False
else:
#print "jenkins构建结果:",jobstatus
#if self.store_package(appname,branch_name):
return True
#else:
# return False
if name == “main”:
jenkinsMain()
def jenkeinsMain():
releaseSheetNum=os.getenv(‘ITSM_TICKET’)
#print ‘\033[1;31;42mreleaseSheetNum=\033[0m’,releaseSheetNum
app_name=sys.argv[1]
version=sys.argv[2]
branch_name=‘release-’+version
commit_id=sys.argv[3]
jenkinsurl = ‘xxxx’
cmdburl=‘xxxxx’
username = ‘xxxxx’
password = ‘xxxxx.’
param_dict={“commit_ID”:commit_id}
jA=jenkinsApi(jenkinsurl,cmdburl)
job_name=jA.getCmdbInfo(app_name)
jobstauts=jA.getJenkinsInfo(app_name,commit_id,username,job_name,password,param_dict,branch_name)
return jobstauts