python-jenkins 调用方法实时返回构建进度

文章目录

      • 前文
      • 解决方法和思路
        • 简单介绍
        • 解决方法
      • 总结

前文

  在devops的开发过程中,说到构建,jenkins是必不可少的,但是用jenkins来实现权限控制却不是那么理想,所以项目里可以基于jenkins来单独实现一套构建系统,而底层用的就是jenkins的api!而python也单独提供了库来封装jenkins-api,库名即是jenkins。相关文档如下:

  • 官方文档
  • 官方示例

  而在调用上述文档的方法是,无论是创建任务、获取任务结果、获取构建状态等等都是很顺利,但是当构建时长过长时却无法获取到构建进度,这个对用户体验就非常差,此时jenkins已经是对用户透明的,用户无法登录jenkins查看当前的构建进度,所以如何获取构建进度就成为当前所需,可惜官方文档并没有提供相关解决方法。

解决方法和思路

简单介绍

  可以简单地看下python-jenkins所提供的功能:
python-jenkins 调用方法实时返回构建进度_第1张图片
  可以看到并没有构建进度的返回,都是关于任务的增删改查,比如我要构建一个任务,步骤如下:

  1. 构建jenkins-server:server=jenkins.Jinkins(url,user,passwd)
  2. 获取下一个构建编号:build_number = server.get_job_info(task)[“nextBuildNumber”]
  3. 开始构建:output = server.build_job(task, parameters)
  4. 获取构建信息:build_info = server.get_build_info(task, build_number)
  5. 获取构建状态:is_building = build_info[“building”] —>如果这个值存在,则说明在构建,如果不存在则说明已经构建完成了,通过build_info[“result”]获取构建成功还是构建失败!

  根据上述就能轻而易举地搭建一个自定义的构建系统,但是并不能解决开篇所提的问题,那很明显,要获取构建进度,一定要从build_info即本次构建信息里取想办法!

解决方法

  通过观察获取的结果,我发现可以得到上一次的构建时间,所以可以”绕“过去来解决这个问题,即不一定要实时地获取当前最准确的构建进度,而是通过上一次的构建时间来打造一个构建进度,然后实时返回百分比!而这个方式得到的时间准确度也达到了90%,只有当网络异常或者构建方法异常时才会失效,不过这也足够了!详细代码如下:

job_info = app_builder.server.get_build_info(task,build_number)
jobstart_time = job_info['timestamp'] #任务启动时间
now_timestamp = int(round(time.time() * 1000)) #当前时间戳
estimatedDuration = job_info['estimatedDuration']  #上次构建时间
building_process = int(((now_timestamp - jobstart_time) /estimatedDuration) * 100) if estimatedDuration > -1 else -1 #如果estimatedDuration是-1,则说明是首次构建
if building_process>=100:building_process=99 #因为是预估,即使超过了100,也位于99
console_output = app_builder.get_build_console_output(build_number) #获取构建输出

  上面的注释写的很清楚,则每次可以通过前端轮询来一遍遍地获取档期构建百分比以及构建输出,这样用户就能清晰地看到当前构建进度!

总结

  项目用到了jenkins-api实现自定义系统的CI/CD,减少用户单独登录jenkins,并且能很好地管理用户的权限,效果还是不错的~

你可能感兴趣的:(devops)