接觸Jenkins(Hudson)API,第2部分

這篇文章從本教程的第1部分繼續。 已經快一年了,但是我終于有時間重新審視我為與Jenkins api交互而編寫的一些代碼。 我已經使用了部分工作來幫助管理許多Jenkins構建服務器,主要是保持插件同步以及將作業從一臺機器移動到另一臺機器。 在本文中,我將主要關注CLI jar功能以及您可以使用它進行的一些操作。 這主要是針對Jenkins開發的,但是我對Hudson進行了一些輕量級測試,并且可以在我嘗試過的所有地方工作,因此對于您選擇的構建服務器,代碼始終是不可知的。

項目結構

該代碼托管在Github上 ,并提供一個Gradle構建,該構建可在本地下載并啟動Jenkins(或Hudson)服務器以執行測試。 服務器設置為使用Gradle構建目錄作為其工作目錄,因此只需執行gradle clean即可將其刪除。 我使用所需庫的Jenkins版本和Hudson版本進行了嘗試,除了兩個CLI實現之間的一些古怪之處外,它們的功能仍然相同。 如果要使用Hudson而不是Jenkins進行嘗試,請傳遞命令標志-Pswitch,并將使用適當的war和庫。 該項目旨在與Gradle 1.0-milestone-8一起運行,并帶有該版本的Gradle包裝器 。 自原始文章以來,大多數代碼都保持不變,但是對Jenkins和Hudson的較新版本進行了一些增強和更改。
該項目產生的庫以Maven工件的形式發布,稍后我將確切描述如何實現。 還包括一些示例,這些示例演示了在Gradle或Maven項目中以及在Grapes的Groovy腳本中如何使用該庫。 我們使用Groovy 1.8.6,Gradle 1.0-milestone-8和Maven 3.0.3構建所有內容。

充分利用CLI

作為api的替代方法,CLI jar是一種非常強大的與構建服務器進行交互的方式。 除了各種內置命令之外,Groovy腳本還可以遠程執行,而我們只需付出一點努力就可以輕松地序列化響應,以處理服務器上提取的數據。 作為執行環境,服務器提供Groovysh Shell并為hudson.model包存儲導入。 該包中的Jenkins / Hudson單例對象的實例也傳遞給Binding 。 在這些示例中,我使用的是向后兼容的Hudson版本,因為該代碼旨在在兩種服務器上均可運行。

可用命令

內置命令種類繁多,所有這些命令均在hudson.cli包中實現。 以下是正在運行的應用程序的CLI頁面上列出的內容:

  • build:構建作業,并且可以選擇等待直到完成。
  • cancel-quiet-down:取消“ quiet-down”命令的效果。
  • clear-queue:清除構建隊列
  • connect-node:重新連接到節點
  • 復制作業:復制一份工作。
  • create-job:通過讀取stdin作為配置XML文件來創建新作業。
  • delete-builds:刪除構建記錄。
  • delete-job:刪除工作
  • delete-node:刪除節點
  • disable-job:禁用工作
  • 斷開節點:與節點斷開連接
  • enable-job:啟用工作
  • get-job:將作業定義XML轉儲到stdout
  • groovy:執行指定的Groovy腳本。
  • groovysh:運行交互式groovy shell。
  • help:列出所有可用的命令。
  • install-plugin:從文件,URL或從更新中心安裝插件。
  • install-tool:執行自動工具安裝,并將其位置打印到stdout。 只能從
    內部版本。
  • keep-build:標記該構建以永久保留該構建。
  • list-changes:轉儲指定構建的變更日志。
  • login:保存當前憑證,以允許將來的命令在沒有顯式憑證信息的情況下運行。
  • 注銷:刪除使用登錄命令存儲的憑證。
  • 郵件:讀取stdin并將其作為電子郵件發送出去。
  • offline-node:停止使用臨時執行構建的節點,直到下一個“ online-node”命令。
  • online-node:在線使用節點執行構建,以取消先前的“ offline-node”命令。
  • 安靜:安靜下詹金斯,為重新啟動做準備。 不要開始任何構建。
  • 重新加載配置:丟棄內存中所有已加載的數據,然后從文件系統重新加載所有內容。 有用的時候
    您直接在磁盤上修改了配置文件。
  • 重新啟動:重新啟動詹金斯
  • 安全重啟:安全重啟詹金斯
  • 安全關閉:將Jenkins置于安靜模式,等待現有構建完成,然后關閉
    詹金斯
  • set-build-description:設置構建的描述。
  • set-build-display-name:設置構建的displayName
  • set-build-result:設置當前構建的結果。 僅當從內部調用時才有效。
  • shutdown:立即關閉Jenkins服務器
  • update-job:從stdin更新作業定義XML。 與get-job命令相反
  • version:輸出當前版本。
  • wait-node-offline:等待節點脫機
  • wait-node-online:等待節點聯機
  • 我是誰:報告您的憑據和權限

目前尚不清楚每個參數都需要什么參數,但是在不帶參數調用時,它們幾乎普遍遵循打印使用情況詳細信息的CLI模式。 例如,當您不帶任何參數調用build命令時,以下是您在錯誤流中返回的內容:

參數“ JOB”為必填項
java -jar jenkins-cli.jar建立args…
開始構建,然后選擇等待完成。 除了一般的腳本使用之外,該命令可以是 用于從一個作業的構建中調用另一個作業。 使用-s選項,此命令將根據以下命令更改退出代碼 構建的結果(退出代碼0表示成功。) 使用-c選項,只有在存在 SCM變更 職位:要建立的工作名稱 -c:在開始構建之前檢查SCM更改,如果沒有,請檢查 更改,不進行構建即退出 -p:以鍵=值格式指定構建參數。 -s:等待命令完成/中止

從系統中取出數據

與遠程系統的所有交互都由流處理,編寫腳本非常容易,這些腳本將使用內置的Groovy工具以易于解析的String格式返回數據。 從理論上講,您也應該能夠封送更復雜的對象,但是現在讓我們保持簡單。 這是一個Groovy腳本,該腳本僅將所有作業名稱提取到List中,并調用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

收到響應后,我們將做一些整理工作以刪除String開頭的一些多余字符,并使用Eval.me將String轉換為List。 Groovy提供了多種將文本轉換為代碼的方法,因此,如果您的使用情況比這種簡單情況復雜,則可以使用GroovyShell和Binding或其他替代方法將結果解析為有用的東西。 這種簡單的技術也擴展到了Maps和其他類型,從而使得處理從服務器發送回的數據變得簡單。

一些有用的例子

查找具有更新的插件并更新所有插件

這是一個使用Groovy腳本查找所有具有可用更新的插件,然后將結果返回給調用者,然后在所有插件上調用CLI'install-plugin'命令的示例。 方便地,此命令將安裝插件(如果尚未安裝)或將其更新到最新版本(如果已安裝)。

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])
}

一次安裝或升級一套插件

使用“管理插件” UI絕對可以勝任,并且是冪等的,因此多次運行它只會導致可能升級已安裝的插件。 這套插件可能有些過分,但是我最近調查了一些插件以供使用。

@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')

查找所有失敗的構建并觸發它們

網絡問題或基礎設施事件可能導致大量構建一次全部失敗,這并非罕見。 解決問題后,該腳本可用于驗證構建是否均正常工作。

@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])
}

打開一個交互式Groovy Shell

如果您確實想在服務器上戳戳,則可以啟動一個交互式外殼程序以檢查狀態并執行命令。 綁定了System.in流,并立即回顯了來自服務器的響應。

@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')

項目更新

去年發生了很多事情,所有項目依賴項都需要更新。 特別是,對Groovy,Gradle和Spock進行了一些非常不錯的改進。 最值得注意的是,自0.9.2版以來,Gradle已經走了很長一段路。 Groovy 1.8中添加的JSON支持也很方便。 Spock在使用@Unroll時需要進行一些小的調整才能在測試報告中呈現動態內容,但這對于“老”方法和“ 鏈式存根 ”之類的功能來說是一筆不小的代價。 本質上,為了響應Groovy 1.8+中的更改,Spock @Unroll注釋需要從以下更改:

@Unroll('querying of #rootUrl should match #xmlResponse')

閉包封裝的GString表達式:

@Unroll({'querying of $rootUrl should match $xmlResponse'})

聽起來語法還在不斷變化,很高興我在網上找到了關于這個問題的討論 。

在Github上托管Maven存儲庫

也許您從前面的腳本示例中注意到了,我們正在引用一個已發布的庫來獲取HudsonCliApi類。 上周 ,我讀了一篇有趣的文章 ,描述了如何使用內置的Github Pages發布Maven存儲庫。 盡管它的功能不如Nexus或Artifactory這樣的存儲庫,但足以以標準方式將一些二進制文件提供給大多數常見的構建工具。 只需在標準Maven回購布局中發布二進制文件以及相關的Pom,即可開始比賽! 每個依賴關系管理系統都有其怪癖(我在看著您Ivy!),但是它們很容易解決,因此這里是Gradle,Maven和Groovy Grapes使用此項目代碼生成的庫的示例。 請注意,Jenkins / Hudson所需的某些依賴項在Maven中央存儲庫中不可用,因此我們從Glassfish存儲庫中獲取它們。

搖籃

很簡單,這適用于最新版本的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'
}

馬文

xml中的內容基本上相同,在這種情況下,假設您使用的是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的某些傳遞依賴關系似乎存在問題,這就是為什么對此有顯式排除的原因。

@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')

鏈接

  1. Github Jenkins-api-tour項目頁面
  2. Github上的Maven存儲庫
  3. 腳本程序示例Groovy腳本
  4. Jenkins CLI文檔

相關文章:

  1. 接觸Jenkins(Hudson)API
  2. 使用Groovy腳本可以做的五件事
  3. Grails應用程序演示StackExchange API

參考:在Japkin上的“ ...”博客上 ,我們的JCG合作伙伴 Kelly Robinson 著手研究 Jenkins(Hudson)API,第2部分 。


翻譯自: https://www.javacodegeeks.com/2012/08/hooking-into-jenkins-hudson-api-part-2.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372175.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372175.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php樹莓派魔鏡,用樹莓派和顯示器制作一面“魔鏡”

所需要的材料一臺顯示器一塊和顯示器大小相同的雙面鏡一些2*4米的細木條樹莓派機器必要組件(電源、HDMI線、usb無線網卡、鍵盤)木工工具(鋸子、磨砂機、螺絲刀)螺絲、液態釘子選一個合適的顯示器鏡子的大小完全由顯示器的類型和大小決定&#xff0c;所以我希望得到一個盡量大的…

【數字圖像處理】[3]--直方圖規范化

【數字圖像處理】[3]--直方圖規范化直方圖規范化出現的原因是因為直方圖均衡只能產生出固定的圖像&#xff0c;不滿足于需求&#xff0c;有時我們需要讓直方圖變成特定的直方圖&#xff0c;于是有了直方圖規范化原理&#xff1a;可能只看公式沒什么感覺&#xff0c;我們來舉一個…

JavaFX 2.0布局窗格– GridPane

毫無疑問&#xff0c; GridPane是JavaFX 2.0中功能最強大&#xff0c;最靈活的布局窗格。 它在由行和列組成的靈活網格中布置其子項&#xff0c;與Swing的GridBagLayout或HTML的表格模型非常相似。 這種方法使該窗格非常適合于任何形式的表單&#xff08;例如網站上的聯系表單&…

leecode 題解 || Merge k Sorted Lists 問題

problem&#xff1a; Merge k sorted linked lists and return it as one sorted list.Analyze and describe its complexity.Tags Divide and Conquer Linked List Heap合并K個已序單鏈表 thinking&#xff1a; &#xff08;1&#xff09;題目沒有要求不能夠新開ListNode,所以…

PHP在瀏覽器中被拒絕請求,php控制請求頁面瀏覽器緩

緩存的主要作用是防止用戶頻繁刷新網站頁面&#xff0c;導致服務器數據庫負擔&#xff0c;既要保證信息更新的及時性&#xff0c;也要保證緩存能被充分利用。http協議里控制瀏覽器緩存的頭有三個Cache-Control&#xff0c;Expires&#xff0c;Last-Modified&#xff0c;在PHP下…

js -03課 -03 js中的真假判斷

真假的問題&#xff1a;數據類型-數字&#xff08;NaN&#xff09;、字符串、布爾、函數、對象&#xff08;elem、[]、{}、null&#xff09;、未定義真&#xff1a;非0的數字、非空字符串、true、函數、能找到的元素、[]、{}假&#xff1a;0、NaN、空字符串、false、不能找到的…

HBASE啟動失敗,Failed construction of Master: class org.apache.hadoop.hbase.master.HMaster

Master日志錯誤&#xff1a;2015-12-02 06:34:32,394 ERROR [main] master.HMasterCommandLine: Master exitingjava.lang.RuntimeException: Failed construction of Master: class org.apache.hadoop.hbase.master.HMasterat org.apache.hadoop.hbase.master.HMaster.constru…

Java線程:我應該創建幾個

介紹 “我應該創建多少個線程&#xff1f;”。 許多年前&#xff0c;我的一個朋友問我這個問題&#xff0c;然后我按照“ CPU核心數 1”的指示給了他答案。 當您在這里閱讀時&#xff0c;大多數人都在點頭。 不幸的是&#xff0c;我們所有人當時都錯了。 現在&#xff0c;如果您…

java ui自動化測試腳本,如何用Airtest編寫UI自動化腳本(示例代碼)

前言游戲并不像app一樣直接把渲染樹節點暴露出來&#xff0c;這就造成游戲UI自動化在元素定位上的不方便性&#xff0c;不過依賴airtest的圖片識別&#xff0c;我們可以直接跳過元素檢查&#xff0c;以圖片對比的形式進行自動化&#xff0c;雖然效率可能會低一些&#xff0c;但…

Spring JDBC數據庫連接池設置

對于任何Java應用程序而言&#xff0c; 在Spring框架中設置JDBC數據庫連接池都是很容易的&#xff0c;僅需更改spring配置文件中的一些配置即可。使用Apache Commons DBCP和Commons Pool以及Spring框架的連接池是不錯的選擇&#xff0c;但是如果您擁有Web服務器和托管的J2EE容器…

BZOJ 3505 [Cqoi2014]數三角形(組合數學)

【題目鏈接】 http://www.lydsy.com/JudgeOnline/problem.php?id3505 【題目大意】 給定一個nxm的網格&#xff0c;請計算三點都在格點上的三角形共有多少個。   注意三角形的三點不能共線。 【題解】 我們計算三個點組合的情況&#xff0c;去除橫豎三共線&#xff0c;以及斜…

matlab多項式加法運算,matlab多項式運算與代數方程求解解析.ppt

* 多項式運算與代數方程求解 數學軟件 Matlab Matlab基礎及應用 * 多項式轉化為符號表達式&#xff1a;poly2sym 四則運算&#xff1a;conv、deconv 導數與積分&#xff1a;ployder、polyint 求值與零點&#xff1a;polyval、polyvalm、roots、poly 多項式運算 主要內容 代數方…

java.lang.NoClassDefFoundError:如何解決–第3部分

本文是我們的NoClassDefFoundError故障排除系列的第3部分。 正如我在第一篇文章中提到的那樣&#xff0c;有許多可能導致NoClassDefFoundError的問題。 本文將重點介紹該問題的最常見原因之一&#xff1a;Java類靜態初始化程序塊或變量的失敗。 將提供一個示例Java程序&#xf…

django實現瀑布流、組合搜索、階梯評論、驗證碼

django實現圖片瀑布流布局 我們在一些圖片網站上經常會看到&#xff0c;滿屏都是圖片&#xff0c;而且圖片都大小不一&#xff0c;卻可以按空間排列。默認一個div是占用一行&#xff0c;當想把div里的圖片并排顯示的時候&#xff0c;只能使用float屬性&#xff0c;但是&#xf…

通過ifrmae異步下載文檔

//通過ifrmae異步下載文檔 function iframeGetFile(opts) {var defaultOpts {filePath: ,onload: function (e) { }}, iframeFile;$.extend(defaultOpts, opts);iframeFile document.createElement("iframe");iframeFile.onload function (e) {defaultOpts.onload…

IO與NIO –中斷,超時和緩沖區

假設有一個系統有時需要將文件復制到幾個位置&#xff0c;但是這種方式在響應速度至關重要的情況下。 換句話說&#xff0c;如果由于某種原因文件系統過載&#xff0c;并且我們無法在不到一秒鐘的時間內寫入文件&#xff0c;則應該放棄。 ExecutorService是一項非常方便的工作工…

實驗5 matlab程序設計2,實驗5 Matlab程序設計2

實驗5 Matlab程序設計21. 實驗目的&#xff1a;2. 掌握建立和執行M文件的方法&#xff1b; 3. 掌握實現選擇結構的方法&#xff1b; 4. 掌握實現循環結構的方法。5. 熟悉利用向量運算來代替循環操作的方法。 6. 實驗內容&#xff1a;27. 根據61111 122232n2&#xff0c;求π的近…

【poj1041】 John's trip

http://poj.org/problem?id1041 (題目鏈接) 題意 給出一張無向圖&#xff0c;求字典序最小歐拉回路。 Solution 這鬼畜的輸入是什么心態啊mdzz&#xff0c;這里用vector儲存邊&#xff0c;便于邊的排序。瞬間變成STL常數boy →_→。 細節 數組大小把握好。 代碼 // poj1041 #i…

記一次ora-1652錯誤的解決過程

報錯現象&#xff1a; 通過v$RMAN_BACKUP_JOB_DETAILS查看備份狀態&#xff0c;一直卡著不出結果&#xff0c;很長一段時間之后拋出ORA-1652: unable to extend temp segment by 128 in tablespace &#xff0c;此時查看臨時表空間使用情況&#xff0c;發現占用很少&#xff0c…

帶有docx4j的Java Word(.docx)文檔

幾個月前&#xff0c;我需要創建一個包含許多表和段落的動態Word文檔。 過去&#xff0c;我曾使用POI來實現此目的&#xff0c;但是我發現它很難使用&#xff0c;并且在創建更復雜的文檔時對我來說效果不佳。 因此&#xff0c;對于這個項目&#xff0c;經過一番搜索&#xff0c…