[本文出自天外歸雲的博客園]
背景
1. 實際工作中涉及到安卓客戶端方面的測試,外推或運營部門經常會有很多的渠道,而每個渠道都對應着一個app的下載包,這些渠道都記錄在安卓項目下的一個渠道列表文件中。外推或運營部門經常會有新的渠道產生,而為了這些新增的渠道我們會將渠道配置到渠道列表文件中並push代碼,但是並不會為此在jenkins上重新進行一次整體構建。針對這些新增的零散渠道,我們會在jenkins中分渠道進行構建。
2. 外推或運營部門會有自己的渠道列表,我們在每次app的發版前都要對安卓項目中的渠道列表進行校對,以防項目中的渠道列表漏掉某些外推或運營渠道。
提效思路
1. 可以將對分渠道進行構建的工作編寫成腳本來完成;
2. 可以將渠道列表的校對過程編寫成腳本來完成。
腳本編寫
1. 自動化構建腳本:
# -*- coding: utf-8 -*- import jenkins,time def auto_build(channel): jenkins_server_url = 'http://package.ms.netease.com/jenkins' user_id = '需替換' api_token = '需替換' server = jenkins.Jenkins(jenkins_server_url, username=user_id, password=api_token) job_name = '需替換' last_build_number = server.get_job_info(job_name)['lastBuild']['number'] this_build_number = last_build_number+1 if server.get_build_info(job_name,last_build_number)['building'] == False: server.build_job(job_name, parameters={"channel":channel}, token=api_token) while server.get_build_info(job_name,last_build_number)['building'] == True: time.sleep(2) tip = "Build successfully, latest build number: "+str(this_build_number)+", channel: "+str(channel) print(tip) else: print "The latest job is still building." if __name__ == '__main__': channel = '需替換' auto_build(channel)
知識說明:這里用到了python-jenkins的api,借助這些rest api我們可以做通過ui界面才能完成的日常任務。將過程縮減,更加快捷直接。
程序中可變部分解釋:其中server.build_job方法傳入的參數channel為分渠道構建參數,也即jenkins job的參數,這個參數隨不同的日常job不同是不同的,實際編寫腳本的過程中這個parameters部分對應的就是jenkins job所需要傳入的參數。除此之外,代碼中標注需替換的部分均為可變部分,例如user_id和api_token,這兩個參數在jenkins個人頁面設置中點擊“Show API Token”按鈕可以查看,如下圖所示:
2. 渠道列表校對腳本:
# -*- coding: utf-8 -*- import os curr_dir = os.path.dirname(os.path.abspath(__file__)) def test_check_channels(channels_txt_name,check_list_txt_name): channels_txt_path = os.path.join(curr_dir,channels_txt_name) check_list_txt_path = os.path.join(curr_dir,check_list_txt_name) the_channels = [] with open(channels_txt_path) as channels: for line in channels.readlines(): line = line.strip() if line != '': the_channels.append(line) with open(check_list_txt_path) as check_list: check_items = check_list.readlines() for check_item in check_items: if check_item.strip() in the_channels: pass elif check_item=='\n': pass else: print check_item if __name__ == '__main__': test_check_channels("channels.txt","check_list.txt")
傳參說明:其中“channels.txt”文件為安卓項目中配置的渠道列表文件,“check_list.txt”文件為待檢查的外推或運營渠道列表文件。
文件內容格式:文件中每一行都對應記錄着一個渠道名。
運行結果:“check_list.txt”文件中包含,“channels.txt”文件中不包含的渠道會被過濾並打印出來。
應用與啟示
應用:在實際的工作中,在面對運營或外推所給的渠道文件時,可以通過渠道列表校對腳本過濾出不包含的渠道,(自動更新到安卓項目配置的渠道列表文件中並push代碼)。再通過jenkins自動化構建腳本對過濾出的渠道進行自動化構建。括號中的內容可以根據實際情況選擇是否需要來進行編寫腳本,然后編寫一個驅動腳本,將以上分離的自動化過程組合拼裝起來,形成一個連貫的包含完整工作流的自動化過程。
啟示:這個過程本來就是日常測試工作中所要面對的,稍加思考,就可以編寫一個包含自動化過程的腳本出來。對工作流的效率有一個提升的同時,也是一個經驗轉化的過程。以后新人面對這樣的過程,只需要執行腳本就可以,並不需要每次都翻看筆記或記住這個過程是什么。