需求背景:
現在用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)
