最近在做一個項目的CI雙流水線建設,因為一個流水線涉及到多個job,那上一個流水線沒有全部結束的話,這邊項目要求是不能開始下一個CI流程的,那么,此時就需要判斷上一個流程里的所有job是否結束,需要獲取job的狀態,因此寫了下面的代碼,僅供參考。
復制或者轉發請附上我的鏈接。
1 import jenkins 2 import time 3 import sys 4 5 6 def login_jenkins(username="賬戶", password="密碼"): 7 server = jenkins.Jenkins("Jenkins服務URL", username=username, password=password) 8 print(server) 9 return server 10 11 12 def get_jobs_status(job_name, server): 13 try: 14 server.assert_job_exists(job_name) 15 except Exception as e: 16 print(e) 17 job_statue = '1' 18 19 # 判斷job是否處於排隊狀態 20 inQueue = server.get_job_info(job_name)['inQueue'] 21 print("任務是否處於排隊狀態:", inQueue) 22 if str(inQueue) == 'True': # 排隊 23 job_statue = 'pending' 24 running_number = server.get_job_info(job_name)['nextBuildNumber'] 25 else: 26 # 沒有在排隊的job,獲取最新一個的執行編號 27 running_number = server.get_job_info(job_name)['nextBuildNumber'] - 1 28 29 try: 30 running_status = server.get_build_info(job_name, running_number)['building'] # 判斷job是否在執行中 31 if str(running_status) == 'True': 32 job_statue = 'running' 33 else: 34 # 若running_status不是True說明job執行完成 35 job_statue = server.get_build_info(job_name,running_number)['result'] 36 except Exception as e: 37 # 上面假設job處於running狀態的假設不成立,則job的最新number應該是['lastCompletedBuild']['number'] 38 lastCompletedBuild_number = server.get_job_info(job_name)['lastCompletedBuild']['number'] 39 job_statue = server.get_build_info(job_name, lastCompletedBuild_number)['result'] 40 41 return job_statue, running_number 42 43 44 if __name__ == "__main__": 45 server = login_jenkins(username="賬戶", password="密碼") 46 job_name_list = ["job1", "job2", "job3", "job4"..........] # 監控的任務名列表 47 if len(sys.argv) > 1: # 可接受傳參,多個請以逗號分隔 48 job_name_list = list(sys.argv[1].split(",")) 49 print(job_name_list) 50 for job_name in job_name_list: 51 num = 0 52 while True: 53 print("\n任務第%d次輪詢!"%int(num+1)) 54 job_statue, running_number = get_jobs_status(job_name, server) 55 print("任務執行狀態:", job_statue) 56 print("任務執行編號:", running_number) 57 if job_statue in ("pending", "running"): 58 # time.sleep(3*60) # 如果自動化腳本還在執行,新版本的環境部署job需要等待 59 time.sleep(60) 60 num += 1 61 if num == 20: # 控制輪詢等待的次數,不能一直等待(看個人場景需求) 62 break 63 else: 64 break