jenkins api_接触Jenkins(Hudson)API,第2部分
jenkins api
這篇文章從本教程的第1部分繼續(xù)。 已經(jīng)快一年了,但是我終于有時(shí)間重新審視我為與Jenkins api交互而編寫(xiě)的一些代碼。 我已經(jīng)使用了部分工作來(lái)幫助管理許多Jenkins構(gòu)建服務(wù)器,主要是保持插件同步以及將作業(yè)從一臺(tái)機(jī)器移動(dòng)到另一臺(tái)機(jī)器。 在本文中,我將主要關(guān)注CLI jar功能以及您可以使用它進(jìn)行的一些操作。 這主要是針對(duì)Jenkins開(kāi)發(fā)的,但是我對(duì)Hudson進(jìn)行了一些輕量級(jí)測(cè)試,并且可以在我嘗試過(guò)的所有地方工作,因此對(duì)于您選擇的構(gòu)建服務(wù)器,代碼始終是不可知的。項(xiàng)目結(jié)構(gòu)
該代碼托管在Github上 ,并提供一個(gè)Gradle構(gòu)建,該構(gòu)建可在本地下載并啟動(dòng)Jenkins(或Hudson)服務(wù)器以執(zhí)行測(cè)試。 服務(wù)器設(shè)置為使用Gradle構(gòu)建目錄作為其工作目錄,因此只需執(zhí)行gradle clean即可將其刪除。 我使用所需庫(kù)的Jenkins版本和Hudson版本進(jìn)行了嘗試,除了兩個(gè)CLI實(shí)現(xiàn)之間的一些古怪之處外,它們的功能仍然相同。 如果要使用Hudson而不是Jenkins進(jìn)行嘗試,請(qǐng)傳遞命令標(biāo)志-Pswitch,并將使用適當(dāng)?shù)膚ar和庫(kù)。 該項(xiàng)目旨在與Gradle 1.0-milestone-8一起運(yùn)行,并附帶該版本的Gradle包裝器 。 自原始文章以來(lái),大多數(shù)代碼都保持不變,但是對(duì)Jenkins和Hudson的較新版本進(jìn)行了一些增強(qiáng)和更改。
這個(gè)項(xiàng)目產(chǎn)生的庫(kù)以Maven工件的形式發(fā)布,稍后我將確切描述如何獲得它。 還包括一些示例,這些示例演示了在Gradle或Maven項(xiàng)目中以及在Grapes的Groovy腳本中如何使用該庫(kù)。 我們正在使用Groovy 1.8.6,Gradle 1.0-milestone-8和Maven 3.0.3來(lái)構(gòu)建所有內(nèi)容。
充分利用CLI
作為api的替代,CLI jar是一種非常強(qiáng)大的與構(gòu)建服務(wù)器進(jìn)行交互的方式。 除了各種內(nèi)置命令之外,Groovy腳本還可以遠(yuǎn)程執(zhí)行,而我們只需付出一點(diǎn)努力就可以輕松地序列化響應(yīng),以處理服務(wù)器上提取的數(shù)據(jù)。 作為執(zhí)行環(huán)境,服務(wù)器提供了Groovysh shell并為hudson.model包存儲(chǔ)了導(dǎo)入內(nèi)容 。 該包中Jenkins / Hudson單例對(duì)象的實(shí)例也傳遞到Binding中。 在這些示例中,我使用的是向后兼容的Hudson版本,因?yàn)樵摯a旨在在兩種服務(wù)器上均可運(yùn)行。
可用命令
內(nèi)置命令種類(lèi)繁多,所有這些命令均在hudson.cli包中實(shí)現(xiàn)。 以下是正在運(yùn)行的應(yīng)用程序的CLI頁(yè)面上列出的內(nèi)容:
- build:構(gòu)建作業(yè),并且可以選擇等待直到完成。
- cancel-quiet-down:取消“ quiet-down”命令的效果。
- clear-queue:清除構(gòu)建隊(duì)列
- connect-node:重新連接到節(jié)點(diǎn)
- 復(fù)制作業(yè):復(fù)制一份工作。
- create-job:通過(guò)讀取stdin作為配置XML文件來(lái)創(chuàng)建新作業(yè)。
- delete-builds:刪除構(gòu)建記錄。
- delete-job:刪除工作
- delete-node:刪除節(jié)點(diǎn)
- disable-job:禁用工作
- 斷開(kāi)節(jié)點(diǎn):與節(jié)點(diǎn)斷開(kāi)連接
- enable-job:啟用工作
- get-job:將作業(yè)定義XML轉(zhuǎn)儲(chǔ)到stdout
- groovy:執(zhí)行指定的Groovy腳本。
- groovysh:運(yùn)行交互式groovy shell。
- help:列出所有可用的命令。
- install-plugin:從文件,URL或從更新中心安裝插件。
- install-tool:執(zhí)行自動(dòng)工具安裝,并將其位置打印到stdout。 只能從
內(nèi)部版本。 - keep-build:標(biāo)記該構(gòu)建以永久保留該構(gòu)建。
- list-changes:轉(zhuǎn)儲(chǔ)指定構(gòu)建的變更日志。
- login:保存當(dāng)前憑證,以允許將來(lái)的命令在沒(méi)有顯式憑證信息的情況下運(yùn)行。
- 注銷(xiāo):刪除使用登錄命令存儲(chǔ)的憑證。
- 郵件:讀取stdin并將其作為電子郵件發(fā)送出去。
- offline-node(離線節(jié)點(diǎn)):停止使用臨時(shí)執(zhí)行構(gòu)建的節(jié)點(diǎn),直到下一個(gè)“ online-node”命令。
- online-node:在線使用節(jié)點(diǎn)執(zhí)行構(gòu)建,以取消先前的“ offline-node”命令。
- 安靜:靜默Jenkins,為重新啟動(dòng)做準(zhǔn)備。 不要開(kāi)始任何構(gòu)建。
- 重新加載配置:丟棄內(nèi)存中所有已加載的數(shù)據(jù),然后從文件系統(tǒng)重新加載所有內(nèi)容。 有用的時(shí)候
您直接在磁盤(pán)上修改了配置文件。 - 重新啟動(dòng):重新啟動(dòng)詹金斯
- 安全重啟:安全重啟詹金斯
- 安全關(guān)閉:將Jenkins置于安靜模式,等待現(xiàn)有構(gòu)建完成,然后關(guān)閉
詹金斯 - set-build-description:設(shè)置構(gòu)建的描述。
- set-build-display-name:設(shè)置構(gòu)建的displayName
- set-build-result:設(shè)置當(dāng)前構(gòu)建的結(jié)果。 僅當(dāng)從內(nèi)部調(diào)用時(shí)才有效。
- shutdown:立即關(guān)閉Jenkins服務(wù)器
- update-job:從stdin更新作業(yè)定義XML。 與get-job命令相反
- version:輸出當(dāng)前版本。
- wait-node-offline:等待節(jié)點(diǎn)脫機(jī)
- wait-node-online:等待節(jié)點(diǎn)聯(lián)機(jī)
- 我是誰(shuí):報(bào)告您的憑據(jù)和權(quán)限
目前尚不清楚每個(gè)參數(shù)都需要什么參數(shù),但是在不帶參數(shù)調(diào)用時(shí),它們幾乎都遵循CLI的用法用法打印模式。 例如,當(dāng)您不帶任何參數(shù)調(diào)用build命令時(shí),以下是您在錯(cuò)誤流中返回的內(nèi)容:
參數(shù)“ JOB”為必填項(xiàng)
java -jar jenkins-cli.jar建立args…
開(kāi)始構(gòu)建,然后選擇等待完成。 除了一般的腳本使用之外,該命令還可以 用于從一個(gè)作業(yè)的構(gòu)建中調(diào)用另一個(gè)作業(yè)。 使用-s選項(xiàng),此命令將根據(jù)以下命令更改退出代碼 構(gòu)建的結(jié)果(退出代碼0表示成功。) 使用-c選項(xiàng),只有在存在 SCM變更 職位:要建立的工作名稱(chēng) -c:在開(kāi)始構(gòu)建之前檢查SCM更改,如果沒(méi)有,請(qǐng)檢查 更改,不進(jìn)行構(gòu)建即退出 -p:以鍵=值格式指定構(gòu)建參數(shù)。 -s:等待命令完成/中止
從系統(tǒng)中取出數(shù)據(jù)
與遠(yuǎn)程系統(tǒng)的所有交互都由流處理,編寫(xiě)腳本非常容易,這些腳本將使用內(nèi)置的Groovy工具以易于解析的String格式返回?cái)?shù)據(jù)。 從理論上講,您還應(yīng)該能夠封送更復(fù)雜的對(duì)象,但是現(xiàn)在讓我們保持簡(jiǎn)單。 這是一個(gè)Groovy腳本,該腳本僅將所有作業(yè)名稱(chēng)提取到List中,調(diào)用Groovy inspect方法引用所有值。
@GrabResolver(name = 'glassfish', root = 'http://maven.glassfish.org/content/groups/public/') @GrabResolver(name = "github", root = "http://kellyrob99.github.com/Jenkins-api-tour/repository") @Grab('org.kar:hudson-api:0.2-SNAPSHOT') @GrabExclude('org.codehaus.groovy:groovy') import org.kar.hudson.api.cli.HudsonCliApiString rootUrl = 'http://localhost:8080' HudsonCliApi cliApi = new HudsonCliApi() OutputStream out = new ByteArrayOutputStream() cliApi.runCliCommand(rootUrl, ['groovysh', 'hudson.jobNames.inspect()'], System.in, out, System.err) List allJobs = Eval.me(cliApi.parseResponse(out.toString())) println allJobs收到響應(yīng)后,我們將做一些整理工作以刪除String開(kāi)頭的一些多余字符,并使用Eval.me將String轉(zhuǎn)換為L(zhǎng)ist。 Groovy提供了多種將文本轉(zhuǎn)換為代碼的方法,因此,如果您的使用情況比這種簡(jiǎn)單情況復(fù)雜,則可以使用帶有Binding或其他替代方法的GroovyShell將結(jié)果解析為有用的東西。 這種簡(jiǎn)單的技術(shù)也擴(kuò)展到了Maps和其他類(lèi)型,從而使得處理從服務(wù)器發(fā)送回的數(shù)據(jù)變得簡(jiǎn)單。
一些有用的例子
查找具有更新的插件并更新所有插件
這是一個(gè)使用Groovy腳本查找所有具有可用更新的插件,然后將結(jié)果返回給調(diào)用者,然后在所有插件上調(diào)用CLI'install-plugin'命令的示例。 方便地,此命令將安裝插件(如果尚未安裝)或?qū)⑵涓碌阶钚掳姹?#xff08;如果已安裝)。
def findPluginsWithUpdates = ''' Hudson.instance.pluginManager.plugins.inject([]) { List toUpdate, plugin ->if(plugin.hasUpdate()){toUpdate << plugin.shortName}toUpdate }.inspect() ''' OutputStream updateablePlugins = new ByteArrayOutputStream() cliApi.runCliCommand(rootUrl, ['groovysh', findPluginsWithUpdates], System.in, updateablePlugins, System.err)def listOfPlugins = Eval.me(parseOutput(updateablePlugins.toString())) listOfPlugins.each{ plugin ->cliApi.runCliCommand(rootUrl, ['install-plugin', plugin]) }一次安裝或升級(jí)一套插件
使用“管理插件” UI絕對(duì)可以勝任,并且是冪等的,因此多次運(yùn)行它只會(huì)導(dǎo)致可能升級(jí)已安裝的插件。 這套插件可能有些過(guò)分,但是我最近調(diào)查了一些插件以供使用。
@GrabResolver(name='glassfish', root='http://maven.glassfish.org/content/groups/public/') @GrabResolver(name="github", root="http://kellyrob99.github.com/Jenkins-api-tour/repository") @Grab('org.kar:hudson-api:0.2-SNAPSHOT') @GrabExclude('org.codehaus.groovy:groovy') import static java.net.HttpURLConnection.* import org.kar.hudson.api.* import org.kar.hudson.api.cli.HudsonCliApiString rootUrl = 'http://localhost:8080' HudsonCliApi cliApi = new HudsonCliApi()['groovy', 'gradle', 'chucknorris', 'greenballs', 'github', 'analysis-core', 'analysis-collector', 'cobertura','project-stats-plugin','audit-trail', 'view-job-filters', 'disk-usage', 'global-build-stats','radiatorviewplugin', 'violations', 'build-pipeline-plugin', 'monitoring', 'dashboard-view','iphoneview', 'jenkinswalldisplay'].each{ plugin ->cliApi.runCliCommand(rootUrl, ['install-plugin', plugin]) }// Restart a node, required for newly installed plugins to be made available. cliApi.runCliCommand(rootUrl, 'safe-restart')查找所有失敗的構(gòu)建并觸發(fā)它們
網(wǎng)絡(luò)問(wèn)題或基礎(chǔ)設(shè)施事件可能導(dǎo)致大量構(gòu)建一次全部失敗,這并非罕見(jiàn)。 解決問(wèn)題后,此腳本可用于驗(yàn)證構(gòu)建是否均正常工作。
@GrabResolver(name = 'glassfish', root = 'http://maven.glassfish.org/content/groups/public/') @GrabResolver(name = "github", root = "http://kellyrob99.github.com/Jenkins-api-tour/repository") @Grab('org.kar:hudson-api:0.2-SNAPSHOT') @GrabExclude('org.codehaus.groovy:groovy') import org.kar.hudson.api.cli.HudsonCliApiString rootUrl = 'http://localhost:8080' HudsonCliApi cliApi = new HudsonCliApi() OutputStream out = new ByteArrayOutputStream() def script = '''hudson.items.findAll{ job ->job.isBuildable() && job.lastBuild && job.lastBuild.result == Result.FAILURE }.collect{it.name}.inspect() ''' cliApi.runCliCommand(rootUrl, ['groovysh', script], System.in, out, System.err) List failedJobs = Eval.me(cliApi.parseResponse(out.toString())) failedJobs.each{ job ->cliApi.runCliCommand(rootUrl, ['build', job]) }打開(kāi)一個(gè)交互式Groovy Shell
如果您確實(shí)想在服務(wù)器上戳戳,則可以啟動(dòng)一個(gè)交互式外殼程序以檢查狀態(tài)并執(zhí)行命令。 綁定了System.in流,并立即回顯了來(lái)自服務(wù)器的響應(yīng)。
@GrabResolver(name = 'glassfish', root = 'http://maven.glassfish.org/content/groups/public/') @GrabResolver(name = "github", root = "http://kellyrob99.github.com/Jenkins-api-tour/repository") @Grab('org.kar:hudson-api:0.2-SNAPSHOT') @GrabExclude('org.codehaus.groovy:groovy') import org.kar.hudson.api.cli.HudsonCliApi /*** Open an interactive Groovy shell that imports the hudson.model.* classes and exposes* a 'hudson' and/or 'jenkins' object in the Binding which is an instance of hudson.model.Hudson*/ HudsonCliApi cliApi = new HudsonCliApi() String rootUrl = args ? args[0] :'http://localhost:8080' cliApi.runCliCommand(rootUrl, 'groovysh')項(xiàng)目更新
去年發(fā)生了很多事情,所有項(xiàng)目依賴(lài)項(xiàng)都需要更新。 特別是,對(duì)Groovy,Gradle和Spock進(jìn)行了一些非常不錯(cuò)的改進(jìn)。 最值得注意的是,從0.9.2版開(kāi)始,Gradle已經(jīng)走了很長(zhǎng)一段路。 Groovy 1.8中添加的JSON支持也很方便。 Spock在使用@Unroll時(shí)需要進(jìn)行一些小的調(diào)整才能在測(cè)試報(bào)告中呈現(xiàn)動(dòng)態(tài)內(nèi)容,但這對(duì)于“老”方法和“ 鏈?zhǔn)酱娓?”之類(lèi)的功能來(lái)說(shuō)是一筆不小的代價(jià)。 本質(zhì)上,為了響應(yīng)Groovy 1.8+中的更改,Spock @Unroll注釋需要從以下更改:
@Unroll('querying of #rootUrl should match #xmlResponse')閉包封裝的GString表達(dá)式:
@Unroll({'querying of $rootUrl should match $xmlResponse'})聽(tīng)起來(lái)語(yǔ)法似乎還在不斷變化,我很高興在網(wǎng)上找到了關(guān)于該問(wèn)題的討論 。
在Github上托管Maven存儲(chǔ)庫(kù)
也許您從前面的腳本示例中注意到了,我們正在引用一個(gè)已發(fā)布的庫(kù)來(lái)獲取HudsonCliApi類(lèi)。 上周 ,我讀了一篇有趣的文章 ,描述了如何使用內(nèi)置的Github Pages發(fā)布Maven存儲(chǔ)庫(kù)。 盡管它的功能不如Nexus或Artifactory這樣的存儲(chǔ)庫(kù),但足以以標(biāo)準(zhǔn)方式將一些二進(jìn)制文件提供給大多數(shù)常見(jiàn)的構(gòu)建工具。 只需在標(biāo)準(zhǔn)Maven回購(gòu)布局中發(fā)布二進(jìn)制文件以及關(guān)聯(lián)的Pom,即可開(kāi)始比賽! 每個(gè)依賴(lài)項(xiàng)管理系統(tǒng)都有其怪癖(我在看著您Ivy!),但是它們很容易解決,因此這里是Gradle,Maven和Groovy Grapes使用此項(xiàng)目代碼生成的庫(kù)的示例。 請(qǐng)注意,Jenkins / Hudson所需的某些依賴(lài)項(xiàng)在Maven中央存儲(chǔ)庫(kù)中不可用,因此我們從Glassfish存儲(chǔ)庫(kù)中獲取它們。
Gradle
非常簡(jiǎn)單,這適用于最新版本的Gradle,并假定您使用的是Groovy插件。
repositories {mavenCentral()maven {url 'http://maven.glassfish.org/content/groups/public/'}maven {url 'http://kellyrob99.github.com/Jenkins-api-tour/repository'} } dependencies {groovy 'org.codehaus.groovy:groovy-all:${versions.groovy}'compile 'org.kar:hudson-api:0.2-SNAPSHOT' }Maven
xml中的內(nèi)容基本相同,在這種情況下,假設(shè)您使用的是GMaven插件
<repositories><repository><id>glassfish</id><name>glassfish</name><url>http://maven.glassfish.org/content/groups/public/</url></repository><repository><id>github</id><name>Jenkins-api-tour maven repo on github</name><url>http://kellyrob99.github.com/Jenkins-api-tour/repository</url></repository> </repositories><dependencies><dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy-all</artifactId><version>${groovy.version}</version></dependency><dependency><groupId>org.kar</groupId><artifactId>hudson-api</artifactId><version>0.2-SNAPSHOT</version></dependency> </dependencies>葡萄
在這種情況下,解決舊版本Groovy的某些傳遞依賴(lài)關(guān)系似乎存在問(wèn)題,這就是為什么對(duì)此有明確排除的原因。
@GrabResolver(name='glassfish', root='http://maven.glassfish.org/content/groups/public/') @GrabResolver(name='github', root='http://kellyrob99.github.com/Jenkins-api-tour/repository') @Grab('org.kar:hudson-api:0.2-SNAPSHOT') @GrabExclude('org.codehaus.groovy:groovy')鏈接
相關(guān)文章:
參考: 《 The Kaptain on…東西》博客中的JCG合作伙伴 Kelly Robinson 的Jenkins(Hudson)API的第2部分 。
翻譯自: https://www.javacodegeeks.com/2012/08/hooking-into-jenkins-hudson-api-part-2.html
jenkins api
總結(jié)
以上是生活随笔為你收集整理的jenkins api_接触Jenkins(Hudson)API,第2部分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑最好用的词典(电脑上好用的英语词典)
- 下一篇: [MEGA DEAL]终极Java捆绑包