首页 > 其他分享 >py调jenkins接口发布-优化篇

py调jenkins接口发布-优化篇

时间:2022-09-25 15:22:55浏览次数:49  
标签:py 任务 接口 job 构建 build print jenkins

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    

标签:py,任务,接口,job,构建,build,print,jenkins
From: https://www.cnblogs.com/windysai/p/16727930.html

相关文章

  • ★★★PAT 1003 我要通过!Python
    ★★★PAT1003我要通过!Python题号:PATbasiclevel1003引文链接PAT-1003猫猫虫(——)-思路:正则匹配+数学归纳crayonJJ-注释补充:正则匹配菜鸟教程-Python正则表......
  • mac配置python环境变量
    1,whichpython3.72,vim~/.bash_profile3,#settingpathforpython3.7PATH=”/usr/local/bin:${PATH}”exportPATH PATH=”/Library/Frameworks/Python.framework/......
  • python-the first week
    python-thefirstweek目录python-thefirstweektypora软件安装文件路径markdown语法标题小标题语言环境表格表情查看源代码图片展示水平线目录链接下划线使用删除线计算......
  • Python每周总结——Week01
    Python每周总结——Week01目录Python每周总结——Week01Day_01:1、计算机的五大组成部分2、Typora软件的使用3、进制数4、计算机文件路径Day_02:1、计算机的三大核心硬件......
  • Pytorch实现VAE
    变分自编码器Pytorch实现。1classVAE(nn.Module):2def__init__(self):3super(VAE,self).__init__()45self.fc1=nn.Linear(784,......
  • python中的刽子手游戏
    python中的刽子手游戏使用python编程构建游戏总是很有趣。本项目涉及相同。刽子手游戏或更像是“猜词”游戏是良好的交互式Python学习的最佳程序。在这里,用户必须猜一......
  • 在 Python 初学者中创建井字游戏
    在Python初学者中创建井字游戏我们都有和朋友一起玩井字游戏的有趣回忆,不是吗?这是在任何地方玩的最有趣和最有趣的游戏,您只需要一支笔和一张纸。只需应用一些核心概念,我......
  • 本周回顾-- 计算机基础、python、pycharm、基本数据类型
    1、计算机基础1.1计算机组成部分:1、控制器2、运算器(控制器+运算器=cpu)3、存储器 内存:速度快,断电失效 外寸:硬盘,速度相对慢,永久保存4、输入设备 鼠标,键盘5、输出设......
  • 14.4 Python中的包
     #目录和包的区别   #模块的导入的2种方式 #模块1module_Aa=10 #模块2moduleBb=100#模块3名称:demo55'''使用import方式进行导入时,只能跟......
  • Python安装PIL报错:No module named 'PIL'的解决方法
    在Python中,如果import了PIL,但是本机上并没有安装相应的组件,在运行py程序时会报错:ModuleNotFoundError:Nomodulenamed'PIL'。D:\Python\PY>MYPYAPP.pyTraceback(mos......