热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

py调jenkins接口发布优化篇

py调jenkins接口发布-优化篇之前写的文章,python调jenkins接口【https:www.cnblogs.comwindysaip16709313.html】,用

py调jenkins接口发布-优化篇

  之前写的文章,python调jenkins接口【https://www.cnblogs.com/windysai/p/16709313.html】,用于晚上10点后自动构建jenkins任务并发通知,但是有误报情况。

       现象包括:未发布完,就去拿jenkins任务的状态结果判断,误报成构建失败。我觉得如果睡眠时间设置得足够长,例如10分钟(time.sleep(600)),应该不会再出现这种情况,因为需要构建的任务,在10分钟内完成绰绰有余。

  但是我觉得发布任务之间,时间间隔那么久,才能知道所有任务的构建结果(有时一天发布要5个任务),我要知道这个结果后,才能群上通知公司人任务是否都发布成功(即使有些任务没有关系,能并行跑,这样弄完差不多10点30分以后,还是觉得太晚),还不如手动跑、盯着还快 ——》!!!

  然而人都是有惰性的,为了解放我双手及眼睛,我特意去研究python的回调函数,参考【https://blog.csdn.net/sinat_38682860/article/details/115351094】

  经过我周末两天零碎时间的艰苦奋斗,改成这样,基本没bug。。。了吧,测试过应该没问题。

1、整个思路:

  先观察要发布的任务,取历史最短的构建时间 tt(以秒为单位),写入main函数的:server.build_job 后面的 time.sleep( tt )里,然后过了这个 tt 时间之后,每3秒去请求jenkins任务的构建结果值,直到得到最终构建结果,通知到人

 

先贴代码,再讲注意点:

1 #!/usr/bin/python3.6
2 #coding=UTF-8
3
4 '''
5 输入:jenkins服务器的地址,用户名和密码
6 输出:已构建任务的状态
7 '''
8 import requests
9 import datetime, time
10 import timeit
11 import jenkinsapi
12 import jenkins
13 import sys
14 import random
15
16 from jenkinsapi.jenkins import *
17 from jenkinsapi.job import *
18 from jenkinsapi.build import Build
19
20 def mainfunc(func):
21 '''
22 :param func: callback func Name
23 :return:
24
25 '''
26
27 # last_build_number = server.get_job_info(jobname)['lastBuild']['number']
28 # print("最近一次构建编号为:", last_build_number)
29 global msg2
30 #根据callback返回的状态,决定是否进行下一步操作
31 while True:
32 #如果为true,就执行下一步,否则,再次调用func获取状态结果
33 flag = func()
34 if flag:
35 print('step2: 发送信息')
36 end = timeit.default_timer()
37 spend = end - start
38 spend = round(spend, 2)
39 print("执行时间为: 秒", spend)
40
41 msg2 = msg2 + job_status + '\n' + '执行时间为: ' + str(spend) + ''
42 print("msg2 = ", msg2)
43
44 send_msg(msg2)
45 break
46
47 def callback():
48 '''
49 :return: jenkins job build state
50 '''
51 #jenkins构建job需要至少xx分钟,后续每隔3秒,请求一次;如果显示构建中,则多间隔3秒
52
53 print("进入callback函数。。。")
54 last_build_number = server.get_job_info(jobname)['lastBuild']['number']
55 print("构建中,任务构建编号:", last_build_number)
56
57 global job_status
58 job_status = server.get_build_info(jobname, last_build_number)['result']
59
60 time.sleep(3)
61 print("任务状态为:", job_status)
62 print('-' * 30)
63 if job_status == 'SUCCESS':
64 print('step2: jenkins 构建完成!')
65 return True
66 elif job_status == 'ABORTED':
67 print('step2: jenkins 任务被中断,请重新构建!')
68 return True
69 elif job_status == 'FAILURE' or job_status == 'UNSTABLE':
70 print('step2: jenkins 任务构建失败!')
71 return True
72 # 构建中
73 else:
74 ## 再等3秒
75 time.sleep(3)
76 print('step2: jenkins 正在构建。。。')
77 return False
78
79
80 '''
81 钉钉通知
82
83 '''
84 def send_msg(text):
85 start = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
86 headers = {'Content-Type': 'application/json;charset=utf-8'}
87 api_url = "token机器人"
88 json_text= {
89 "msgtype": "text",
90 "text": {
91 "content": '测试'
92 + '\n当前时间:' + str(start)
93 + '\n' + text
94 },
95 "at": {
96 "atMobiles": [
97 "加一我的手机号码"
98 ],
99 "isAtAll": False
100 }
101 }
102 result = requests.post(api_url,json.dumps(json_text),headers=headers).content
103 print(result)
104
105
106 if __name__=="__main__":
107 # jobname = sys.argv[1] ##到时部署生产,传参:任务名
108
109 #前端任务
110 jobname = 'xxx_系统平台_前端'
111
112 #后端任务
113 #jobname = 'xxx_系统平台_后端'
114
115 url = "jenkins登录地址"
116 username='jenkins登录账号'
117 password='jenkins登录账号密码'
118 # 实例化jenkins对象,连接远程的 jenkins server
119 server = jenkins.Jenkins(url, username, password)
120
121 last_build_number = server.get_job_info(jobname)['lastBuild']['number']
122 print("未构建前,main 初始化,任务上一次构建编号:", last_build_number)
123
124 print('step1: 开始构建 任务')
125 print('-' * 20)
126 msg1 = jobname + "--- step1:开始构建任务"
127 msg2 = jobname + "构建结果:"
128
129 send_msg(msg1)
130
131 #前端
132 param_dict = {'BRANCH': '分支名'}
133
134 #后端
135 # param_dict = {'BRANCH': '分支名', 'Environment': '选项参数'}
136
137 # 开始执行时间
138 start = timeit.default_timer()
139 end = timeit.default_timer()
140 ## 构建任务
141
142 server.build_job(jobname, parameters=param_dict)
143
144 # 等120秒开始,每隔3秒请求,jenkins构建状态
145 #前端等待时间
146 time.sleep(150)
147 #后端等待时间,真实后端设置180秒
148
149 #测试时,不能太短,不然获取不了最近一次编号,而是获取上一次任务构建编号,导致误报
150 #time.sleep(20)
151
152 job_status = 'None'
153
154
155 mainfunc(callback)

2、注意点:

(1)全局变量设置

有几个:

实例化jenkins对象:server

任务状态:job_status

任务执行和结束时间:start、end

如果函数里面需要修改全局变量的值,要先在函数里面声明该变量为:global

(2)测试人为中断发布任务时(ABORTED),main里面的time.sleep,别设置太短

main里面的time.sleep,别设置太短,我之前设置5秒,发现竟然误报成成功,想想python去调jenkins接口到真正触发构建,是需要时间的。设置20秒差不多了。

 

3、测试效果

模拟结果值

(1)人为中断:ABORTED

time

 

 



推荐阅读
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
author-avatar
小白一枚
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有