android api在线文档_通过 API 远程管理 Jenkins
背景介紹
最近接到一個(gè)需求,需要對(duì)公司內(nèi)部的Android性能測(cè)試平臺(tái)的分支管理模塊進(jìn)行改造。
為了更好地說明問題,在下圖中展示了一個(gè)精簡(jiǎn)的持續(xù)集成測(cè)試系統(tǒng)。
在該系統(tǒng)中,Jenkins負(fù)責(zé)定時(shí)檢測(cè)代碼庫(kù)(Code Repository)的代碼更新情況,當(dāng)檢測(cè)到有新的代碼提交時(shí),自動(dòng)采用最新的代碼進(jìn)行構(gòu)建,并采用構(gòu)建得到的包(apk)觸發(fā)自動(dòng)化測(cè)試平臺(tái)(DroidTestbed)執(zhí)行測(cè)試任務(wù)。
然后再說下分支管理模塊。
由于我們的持續(xù)集成平臺(tái)通常不止監(jiān)控一個(gè)產(chǎn)品,而每個(gè)產(chǎn)品又不止監(jiān)控一個(gè)tag(例如/trunk,/projects/cn/10.9.8),因此,我們的持續(xù)集成平臺(tái)需要有分支管理的功能,即針對(duì)每一個(gè)產(chǎn)品的每一個(gè)tag,單獨(dú)創(chuàng)建一個(gè)分支,并針對(duì)各個(gè)分支單獨(dú)指定測(cè)試用例集合測(cè)試設(shè)備。
具體實(shí)現(xiàn)方面,出于單一職責(zé)的原則,我們對(duì)功能進(jìn)行了如下劃分:
在Jenkins端針對(duì)每一個(gè)分支創(chuàng)建一個(gè)Job;
在DroidTestbed端配置測(cè)試資源,針對(duì)每一個(gè)分支分別綁定測(cè)試用例集和測(cè)試設(shè)備,每一個(gè)分支會(huì)存在一個(gè)單獨(dú)的branch_id;
在 Jenkins 端的Job配置中,保存該分支在DroidTestbed中對(duì)應(yīng)的branch_id,實(shí)現(xiàn)Jenkins與DroidTestbed的關(guān)聯(lián)。
整個(gè)過程看上去并沒有什么問題,那為什么需要對(duì)分支管理模塊進(jìn)行改造呢?
問題就出現(xiàn)在分支配置上面。
試想一下,每次要新增或修改一個(gè)分支的時(shí)候,由于Jenkins端和DroidTestbed端的配置是獨(dú)立的,那么我們就只能在兩個(gè)平臺(tái)上分別進(jìn)行配置。
另一方面,配置工作本身也較為復(fù)雜,例如,在Jenkins端就需要設(shè)置的參數(shù)包括:repository_url,tag,ref_tag,ref_revision,branch_id,schedule,user_name等;而這其中的大部分參數(shù)同樣也要在DroidTestbed端進(jìn)行配置。
根據(jù)歷史經(jīng)驗(yàn),但凡涉及到復(fù)雜且重復(fù)的手工操作時(shí),就容易出錯(cuò)。實(shí)際情況的確是這樣的。在該功能上線后,由于配置復(fù)雜,業(yè)務(wù)組的同學(xué)每次要新增一個(gè)監(jiān)控分支時(shí),都需要找到管理員來幫忙配置(說實(shí)話,管理員對(duì)業(yè)務(wù)同學(xué)能配置正確也沒信心);即使是管理員,也出現(xiàn)過好幾次因?yàn)槭韬鲈斐膳渲缅e(cuò)誤的情況。
那么,這個(gè)問題要怎么解決呢?
Jenkins Remote API 的簡(jiǎn)介
繞了這么大一個(gè)圈子,終于引出本文的主題,Jenkins Remote API。
實(shí)際上,Jenkins本身支持豐富的API接口,我們通過遠(yuǎn)程調(diào)用接口,基本上可以實(shí)現(xiàn)所有需要的功能,例如:
從Jenkins獲取Job狀態(tài)信息
觸發(fā)Jenkins執(zhí)行構(gòu)建
創(chuàng)建、復(fù)制、修改、刪除Job
回到前面的案例,我們就可以將配置操作全部放在DroidTestbed中,只需要在保存配置項(xiàng)時(shí),由DroidTestbed自動(dòng)調(diào)用Jenkins的Remote API,即可實(shí)現(xiàn)配置的同步。
Jenkins Remote API 的調(diào)用
現(xiàn)在我們來看下如何調(diào)用Jenkins的Remote API。
Jenkins的Remote API以REST-like的形式進(jìn)行提供,通過對(duì)特定的API執(zhí)行POST請(qǐng)求即可實(shí)現(xiàn)對(duì)Jenkins的操作。
例如,我們搭建的Jenkins站點(diǎn)為http://jenkins.debugtalk.com:8080,那么,訪問http://jenkins.debugtalk.com:8080/api即可查看到該站點(diǎn)所有可用的API;
若想某個(gè)具體的Job進(jìn)行操作,如job名稱android_core_dashboard_trunk,它的管理頁(yè)面為
http://jenkins.debugtalk.com:8080/job/android_core_dashboard_trunk
那么我們?cè)L問
http://jenkins.debugtalk.com:8080/job/android_core_dashboard_trunk/api/即可查看到該job可用的API。
更詳細(xì)的POST調(diào)用方式的介紹可以參考Jenkins的官方wiki,在此就不過多進(jìn)行介紹。
可以看出,通過對(duì)特定API執(zhí)行POST請(qǐng)求操作較為原始,因?yàn)槲覀冃枰P(guān)注過多底層細(xì)節(jié)。事實(shí)上,當(dāng)前已經(jīng)有前輩針對(duì)這一痛點(diǎn),對(duì)底層的POST操作細(xì)節(jié)進(jìn)行了封裝,形成了一些wrapper方便我們從上層進(jìn)行更便捷的操作。
這類wrapper實(shí)現(xiàn)的功能類似,都可以方便我們?cè)诖a中通過更簡(jiǎn)潔的方式調(diào)用Jenkins API,實(shí)現(xiàn)對(duì)Jenkins的遠(yuǎn)程管理,我們只需要根據(jù)我們采用的具體編程語言來選擇對(duì)應(yīng)的wrapper即可。當(dāng)然,如果沒有找到合適的,我們也可以參照已有的開源wrapper,自己再造一個(gè)輪子,原理都是相同的。
在Jenkins的官方wiki中,推薦了兩個(gè)較為成熟的API wrapper,一個(gè)是基于Python實(shí)現(xiàn)的salimfadhley/jenkinsapi,另一個(gè)是基于Ruby實(shí)現(xiàn)的arangamani/jenkins_api_client。
以salimfadhley/jenkinsapi為例,通過使用jenkinsapi,我們?cè)赑ython中就可以很方便地管理Jenkins。
常見的操作方式示例如下。
>>> import jenkinsapi>>> from jenkinsapi.jenkins import Jenkins
# 指定Jenkins實(shí)例
>>> J = Jenkins('http://jenkins.debugtalk.com:8080')
# 查看Jenkins版本
>>> J.version
1.542
# 查看Jenkins的所有jobs
>>> J.keys()
['foo', 'test_jenkinsapi']
# 查看指定job的配置信息
>>> J['test_jenkinsapi'].get_config()
# 創(chuàng)建Jenkins job
>>> jobName = 'test_job'
>>> EMPTY_JOB_CONFIG = '''
<?xml version='1.0' encoding='UTF-8'?>
jkkjjkfalsetruefalsefalsefalsefalse
'''
>>> new_job = J.create_job(jobName, EMPTY_JOB_CONFIG)
# 更新Jenkins job的配置
>>> import xml.etree.ElementTree as et
>>> new_conf = new_job.get_config()
>>> root = et.fromstring(new_conf.strip())
>>> builders = root.find('builders')
>>> shell = et.SubElement(builders, 'hudson.tasks.Shell')
>>> command = et.SubElement(shell, 'command')
>>> command.text = "ls"
>>> J[jobName].update_config(et.tostring(root))
# 刪除Jenkins job
>>> J.delete_job(jobName)
更多的使用方法可參考項(xiàng)目文檔。
有些同學(xué)在認(rèn)真研究了這些開源庫(kù)后也許會(huì)說,官方文檔已經(jīng)翻遍了,但是文檔中對(duì)用法的描述太少了,也沒給出API調(diào)用的實(shí)例,還是不知道怎么使用啊。這個(gè)問題在開源庫(kù)中的確是普遍存在的。
介紹個(gè)技巧,通常優(yōu)秀的開源庫(kù)都會(huì)很重視測(cè)試,作者可能在文檔中沒有針對(duì)每一個(gè)API接口的調(diào)用方式進(jìn)行說明,但通常會(huì)針對(duì)各個(gè)接口編寫較為完整的測(cè)試代碼。我們通過閱讀測(cè)試代碼,就可以充分了解API接口的使用方法了,這也比直接閱讀文檔有效率得多。
本文轉(zhuǎn)自公眾號(hào)“DebugTalk”,原文:通過 API 遠(yuǎn)程管理 Jenkins?。
總結(jié)
以上是生活随笔為你收集整理的android api在线文档_通过 API 远程管理 Jenkins的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态半导体ram依据什么存储信息_LPD
- 下一篇: 字典占内存大吗_微博热搜稳占第一!「美团