import json import jenkins import requests import os from config import settings # 需要發版的版本號:從jenkins參數中獲取 version_branch = os.environ['version'] # 不同項目harbor鏈接 注意:harbor_url_list必須與pooltest_item_list中的先后順序一一對應 harbor_url_list = [ 此處保密 ] # 發版xxx環境項目 pooltest_item_list = [ 此處保密 ] # 需要發版的環境 wanted_environment = pooltest_item_list # 鏈接jenkins username = xxx # jenkins 用戶名 password = xxx # jenkins 密碼 server = jenkins.Jenkins(r'jenkins地址', username=username,password=password) # 獲取最后一次構建鏡像版本 def last_successful_image(): last_successful_image = [] for ever in wanted_environment: lastID = server.get_job_info(ever)["lastSuccessfulBuild"]['number']#獲取最后一次構建ID # print(lastID) last_build_info = server.get_build_info(ever, lastID)#獲取最后一次構建新型(可以從此方法中獲取很多想要的東西,包括最新鏡像版本其實也可以從這里得到,無需從harbor獲取) last_build_image = last_build_info['actions'][0]['parameters'][0]['value']#獲取最后一次構建鏡像版本 last_successful_image.append(last_build_image) # print(ever+' : '+str(lastID)+' : '+last_build_image) return last_successful_image #返回最后一次構建鏡像的列表 # 訪問harbor接口獲取所有鏡像 def image_all(): image_list = [] requests.packages.urllib3.disable_warnings() # 屏蔽錯誤提醒 s = requests.session() s.auth = ('用戶名', '密碼') # 鏈接harbor環境 for ever in harbor_url_list: r = s.get(ever, verify=False) r1 = json.loads(r.text) image_list.append(r1) return image_list # 獲取最新鏡像 def newest_image(): image_list = [] for image_single_items in image_all(): for row in reversed(image_single_items): # 倒序遍歷鏡像列表 name = row['name'] if name[2:7] == version_branch: image_list.append(name) break # 匹配到相關版本的鏡像后跳出循環 # print(image_list) return image_list # 調取jenkins自動發版 def auto_build(): # 循環遍歷不同項目進行發版 for i in range(0, len(wanted_environment)): if newest_image()[i] != last_successful_image()[i]: server.build_job(wanted_environment[i], {'IMAGE_VERS': newest_image()[i]}) #方法build_job print({wanted_environment[i]: newest_image()[i]}) else: continue if __name__ == '__main__': auto_build()
注釋:上面標紅的為jenkins庫的一些方法,詳見下述
1. jenkins庫安裝
sudo pip install python-jenkins
2. 庫的使用
import jenkins
#定義遠程的jenkins master server的url,以及port
jenkins_server_url='xxxx:xxxx'
#定義用戶的User Id 和 API Token,獲取方式同上文
user_id='xxxx'
api_token='xxxx'
#實例化jenkins對象,連接遠程的jenkins master server
server=jenkins.Jenkins(jenkins_server_url, username=user_id, password=api_token)
不帶構建參數:
#構建job名為job_name的job
server.build_job(job_name)
帶參數構建:
#String參數化構建job名為job_name的job, 參數param_dict為字典形式,如:param_dict= {"param1":“value1”, “param2”:“value2”}
server.build_job(job_name, parameters=param_dict)
#獲取job名為job_name的job的相關信息
server.get_job_info(job_name)
#獲取job名為job_name的job的最后次構建號
server.get_job_info(job_name)['lastBuild']['number']
#獲取job名為job_name的job的某次構建的執行結果狀態
server.get_build_info(job_name,build_number)['result']
#判斷job名為job_name的job的某次構建是否還在構建中
server.get_build_info(job_name,build_number)['building']