这是无量测试之道的第204篇原创
前期推文:精准测试系列《二》中我们讲了一下实现的逻辑,今天的分享主要是来看看精准测试系列《二》中底层的代码是如何实现的。
今日分享主题:部署这个功能是如何实现的?
核心代码如下
Step1:页面上【部署】按钮的代码
代码语言:javascript复制<button class='btn btn-info' id='deploy' align='center' onclick='deploy($(this))'>部署</button>
Step2:调用 javaScript 代码
代码语言:javascript复制function deploy(td) {
var tr=td.parent().parent()
console.log(tr);
var tdlist=tr.find("td");
console.log(tdlist);
var id=$(tdlist[0]).find('input').val()
console.log(id);
if(id.length != 0) {
var mymessage = confirm("确定现在部署吗?")
if (mymessage == true) {
$.ajax({
url:'/jacoco_deploy/' id,
type: 'GET',
dataType: 'json',
timeout: 1000,
cache: false,
beforeSend: function () {
$("#mainbody").html('<div align="center">部署执行中...</div>');
}, //加载执行方法
error: function () {
alert('数据加载失败!!!');
}, //错误执行方法
success: function () {
var time=3;
setInterval(function () {
if(time==0){
location.href="/jacoco_index/1"
}else{
$("#mainbody").html('<div align="center">部署执行中,<span id="sid">' time '</span>s 自动后返回</div>');
time--;
}
},1000);
}
})
}
}
}
Step3:flask路由规则
代码语言:javascript复制(r"/jacoco_deploy/(?P<id>d*)",JacocoDeployHander),
Step4:部署代码
代码语言:javascript复制class JacocoDeployHander(RequestHandler):
def get(self,id):
print("the id is:",id)
sql1="select env,project_name,job_branch,cover_module from jacoco_info where id=" str(id)
sql2="select env,project_name,job_branch,cover_module from jacoco_info"
db=conndb()
result=db.get_data(sql1,sql2)
print(result)
env=result[0]['env']
project_name=result[0]['project_name']
branch=result[0]['job_branch']
module=result[0]['cover_module']
print("the env is:",env)
deploy(env, project_name, branch, module,id)
data={"meg":"success"}
return self.write(data)
这里实际是调用了一个 deploy 的方法,这个方法被加上一个 async 的注解,用来表示异常调用,独立开启一个线程来调用部署。
代码语言:javascript复制def async(func):
def wrapper(*args,**kwargs):
t1=Thread(target=func,args=args,kwargs=kwargs)
t1.start()
return wrapper
@async
def deploy(env,project_name,branch,module,id):
jd = Jenkins_delploy()
jd.beta_deploy(env, project_name, branch, module)
jobName = jd.job_name[0]
for i in range(10):
time.sleep(30)
jobId = jd.getLastJobId(str(jd.job_name[0]))
jobStatus = jd.getJobResultStatus(jobName, jobId)
if (jobStatus is None):
jobStatus = "'none'"
else:
jobStatus = "'" str(jobStatus) "'"
print(jobId, jobStatus)
sql3 = "update jacoco_info set job_id=" str(jobId) ",job_status=" jobStatus " where id=" str(id)
print(sql3)
db = conndb()
db.execute_sql(sql3)
if ("'SUCCESS'" == jobStatus):
print("exit")
break
至此部署的相关核心代码如上所示,里面的逻辑也不是很难理解,主要是要在整体上有一个全局的理解,然后再结合着掌握的技术体系给实现出来。
备注:
关于 Python 如何调用 jenkins 做发布操作的,这个在前期的推文 Python 调用Jenkins API自动化发布服务(完整版)中分享过,可以温习一下,这里不再赘述。
end