需求背景:
现在用jenkins构建自动化测试(2个job),公司现将自动化纳入到发布系统
要求每次构建成功之后,把测试结果发送给发布系统。这就需要先获取jenkins构建的结果,如果构建结束,才能发送测试结果,否则就要等待jenkins构建结束。
理解回调函数:
像这样类似:男女朋友约会结束,男方要求女方到家后发1个信息,告诉他安全到家了。就是python回调函数的应用场景。男女朋友约会结束是在主函数mainfunc中,女朋友回家这个动作由callback函数完成。
在mainfunc函数中,男朋友会接收女朋友发送已到家的消息,那怎么接收呢?就是通过调用callback这个函数来获得女朋友到家的状态,这个过程就称之为回调函数
基本思路:
- 先用一个demo理清自己的思路,要做哪些事?共分几个步骤?
- 每个步骤要完成哪些事情?这些思路搞定之后,代码也就完成了。
- 这里的有一个技巧:先用randomint随机生成一个数字,用来代表jenkins的构建结果状态,而不是每次都真的去请求接口。因为这会增加验证结果的时间成本,分散精力。
- 最后整个流程顺下来,再把随机数部分替换为真正去请求jenkins接口,这会大大节约调试时间。
version1:
demo 理清思路,用简单的代码描述清楚自己想要实现的效果
1 def mainfunc(func):
2 '''
3
4 :param func: callback func Name
5 :return:
6 '''
7 print('start build job')
8 func()
9 print('send report to ding wen qi')
10
11
12 def callback():
13 '''
14
15 :return: jenkins job build state
16 '''
17 print('jenkins is done')
18
19 mainfunc(callback)
version2:
callback函数,获取job的构建状态。该函数返回一个状态,true或false。true表示job已经构建结束,false表示程序仍然在构建中
1 def callback():
2 '''
3
4 :return: jenkins job build state
5 '''
6 num = random.randint(1,10)
7 #利用randint随机生成一个num 假装enkins是返回的构建结果。偶数认为已经构建结束,奇数认为仍在构建中
8 print(num)
9 if num % 2 != 0:#奇数
10 print('kins is building job')
11 return {'buildState':False}
12 else:#偶数
13 print('jenkins is done')
14 return {'buildState': True}
version3:
mainfunc接收callback返回的状态,true:做send report操作,false 再次调用func函数确认,直到结果是true
while True:
flag = func()
if flag :
print('step3:send report to ding wen qi')
break
结果:
1 step1:start build job
2 step2:jenkins is building job
3 step2:jenkins is building job
4 step2:jenkins is done
5 step3:send report to ding wen qi
version4:
加入等待时间,在询问jenkins是否构建结束之前,先等上10秒1钟(正常1个job至少构建1分钟以上,不停询问很浪费资源)
1 time.sleep(2)
完整的demo代码:
1 import random
2 import time
3
4 def mainfunc(func):
5 '''
6 :param func: callback func Name
7 :return:
8 '''
9 print('step1:start build job')
10
11 #根据callback返回的状态,决定是否进行下一步操作
12 while True:
13 flag = func()
14 if flag :
15 print('step3:send report')
16 break
17
18 def callback():
19 '''
20 :return: jenkins job build state
21 '''
22 #jenkins构建job需要至少3分钟,所以每隔1分钟请求一次
23 time.sleep(2)
24 num = random.randint(1,100)
25 #利用randint随机生成一个num 假装enkins是返回的构建结果。偶数认为已经构建结束,奇数认为仍在构建中
26 # print(num)
27 if num % 2 != 0:#奇数
28 print('step2:jenkins is building job')
29 return False
30 else:#偶数
31 print('step2:jenkins is done')
32 return True
33
34 mainfunc(callback)