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

哪一個-哈德森還是詹金斯?

都。 幾個月前,我開始使用Hudson v1.395來從事這個小項目,在出現巨大分歧之后又回到了這個項目。 我以此為契機,看我將來選擇永久搬到詹金斯時是否會遇到任何重大問題。 有很多麻煩-最值得注意的是,新的CLI jar不能立即使用-但Jenkins的整體v1.401在切換后按預期工作。 好消息是,舊版本的CLI jar仍然有效,因此此示例實際上是使用代碼混合來完成工作。 無論如何,該軟件非常出色,并且值得稱贊的有余。

API

Jenkins / Hudson有一個便捷的遠程API,其中包含有關您的構建的信息,并支持一組豐富的功能來遠程控制它們以及服務器(通常是服務器)。 可以觸發構建,復制作業,停止服務器,甚至遠程安裝插件。 與服務器的API交互時,可以選擇XML,JSON或Python。 而且,正如內置文檔所述,您可以在以下位置的相對路徑中找到構建服務器URL所需的功能:

“ /.../api/,其中“ ...”部分是您要訪問的對象”。

如果您在瀏覽器中導航到該頁面,它將顯示一個簡短的文檔頁面,如果您將所需的格式添加為路徑的最后一部分,則將返回結果。 例如,要加載有關運行本地托管Jenkins服務器的計算機的信息,對此URL的get請求將以JSON格式返回結果:http:// localhost:8080 / computer / api / json。

{'busyExecutors': 0,'displayName': 'nodes','computer': [{'idle': true,'executors': [{},{}],'actions': [],'temporarilyOffline': false,'loadStatistics': {},'displayName': 'master','oneOffExecutors': [],'manualLaunchAllowed': true,'offline': false,'launchSupported': true,'icon': 'computer.png','monitorData': {'hudson.node_monitors.ResponseTimeMonitor': {'average': 111},'hudson.node_monitors.ClockMonitor': {'diff': 0},'hudson.node_monitors.TemporarySpaceMonitor': {'size': 58392846336},'hudson.node_monitors.SwapSpaceMonitor': null,'hudson.node_monitors.DiskSpaceMonitor': {'size': 58392846336},'hudson.node_monitors.ArchitectureMonitor': 'Mac OS X (x86_64)'},'offlineCause': null,'numExecutors': 2,'jnlpAgent': false}],'totalExecutors': 2
}

這是使用GraphViz渲染的同一棵樹。

此功能從服務器的根開始在樹中擴展,您可以通過在網址上提供“ depth”參數來控制從任何特定分支加載的樹的數量。 請注意您指定此變量的高度。 在人口眾多,運行時間較長的構建服務器(數十個具有數千個作業執行的構建)上進行了四個加載深度的測試,從而設法使我定期超時。 為了讓您有個想法,這里是api根深3處的域的非常粗略的可視化。

從服務器中獲取數據非常簡單,但是遠程觸發服務器上的活動的能力更加有趣。 為了觸發名為“ test”的作業的構建,http:// localhost:8080 / job / test / build上的POST執行了該作業。 使用可用的設施,很容易做到:

  • 加載作業的配置文件,對其進行修改并通過發布新的config.xml文件來創建新作業
  • 將作業從一臺構建機器移至另一臺
  • 建立計劃的構建概述

CLI Jar

還有另一種方法可以在與服務器一起分發的CLI jar中遠程驅動構建服務器。 這個jar提供了用于在構建服務器上遠程執行某些命令的簡單工具。 值得注意的是,這使遠程安裝插件和執行遠程Groovy Shell成為可能。 我將這個功能與CLI罐公開的主類的非常薄的包裝器結合在一起,如下一個代碼示例所示。

/*** Drive the CLI with multiple arguments to execute.* Optionally accepts streams for input, output and err, all of which* are set by default to System unless otherwise specified.* @param rootUrl* @param args* @param input* @param output* @param err* @return*/
def runCliCommand(String rootUrl, List<String> args, InputStream input = System.in,OutputStream output = System.out, OutputStream err = System.err)
{def CLI cli = new CLI(rootUrl.toURI().toURL())cli.execute(args, input, output, err)cli.close()
}

這是一個簡單的測試,顯示了如何執行Groovy腳本以加載有關作業的信息,類似于您可以從服務器上內置的Groovy腳本控制臺執行的操作,該操作可在http:/本地安裝的部署中找到。 / localhost:8080 / script。

def 'should be able to query hudson object through a groovy script'()
{final ByteArrayOutputStream output = new ByteArrayOutputStream()when:api.runCliCommand(rootUrl, ['groovysh', 'for(item in hudson.model.Hudson.instance.items) { println('job $item.name')}'],System.in, output, System.err)then:println output.toString()output.toString().split('\n')[0].startsWith('job')
}

如果您想了解更多信息,下面是一些有關CLI的文章鏈接:

  • 哈德遜CLI Wikidoc
  • Jenkins CLI Wikidoc
  • Jenkins上PHP作業的模板
  • 川口浩輔的文章
  • 一個不錯的教程

HTTPBuilder

如今 ,當針對HTTP API進行編程時, HTTPBuilder是我的首選工具。 用法非常簡單,我只能使用兩種方法來支持到達整個API:一種用于GET,一種用于POST。 這是GET方法,足以執行請求,解析JSON響應并完成(盡管很幼稚)錯誤處理。

/*** Load info from a particular rootUrl+path, optionally specifying a 'depth' query* parameter(default depth = 0)** @param rootUrl the base url to access* @param path  the api path to append to the rootUrl* @param depth the depth query parameter to send to the api, defaults to 0* @return parsed json(as a map) or xml(as GPathResult)*/
def get(String rootUrl, String path, int depth = 0)
{def statusHTTPBuilder http = new HTTPBuilder(rootUrl)http.handler.failure = { resp ->println 'Unexpected failure on $rootUrl$path: ${resp.statusLine} ${resp.status}'status = resp.status}def infohttp.get(path: path, query: [depth: depth]) { resp, json ->info = jsonstatus = resp.status}info ?: status
}

調用它來獲取數據是一個內襯,因為唯一的真正區別是調用API時使用的“路徑”變量。

private final GetRequestSupport requestSupport = new GetRequestSupport()...
/*** Display the job api for a particular Hudson job.* @param rootUrl the url for a particular build* @return job info in json format*/
def inspectJob(String rootUrl, int depth = 0)
{requestSupport.get(rootUrl, API_JSON, depth)
}

從技術上講,這里沒有什么可以將其限制為僅JSON。 HTTPBuilder的一大優點是,它將很高興地嘗試對響應進行正確的處理。 如果返回的數據為JSON格式(如以下示例所示),則將其解析為JSONObject。 另一方面,如果數據是XML,則將其解析為Groovy GPathResult。 盡管導航對象圖的語法不同,但它們都很容易導航。

你能做什么呢?

探索Hudson / Jenkins API的主要動機是了解如何使管理多臺服務器變得更加容易。 目前,我每天處理四臺構建服務器和另一臺從屬計算機,并支持各種不同版本的分支。 這包括單元測試套件和功能測試套件的混合,以及持續進行的部署作業,該作業定期將更改推送到與我們支持的平臺矩陣匹配的測試機上,因此,不幸的是,事情并沒有分支時復制單個作業那么簡單。 確實,以自動或至少半自動的方式為新功能分支創建構建基礎結構確實很有吸引力,尤其是因為正在制定擴展構建自動化的計劃時。 對于最近的555天項目,我利用API層構建了Grails應用程序,該應用程序既可以作為跨服務器構建的輻射器,又可以用作服務器管理的中央工具。 該概念證明能夠連接到多個構建服務器并可視化作業數據以及特定的系統配置,觸發構建,并直接鏈接到每個連接的服務器以允許進一步鉆取。 這是幾個樣機,幾乎可以顯示圖片。

只是一個非常酷的應用程序,用于安裝Jenkins

這只是非常間接的關系,但是我遇到了一個非常漂亮且簡單的Griffon應用程序,稱為Jenkins-Assembler ,它簡化了構建服務器的準備工作。 它為您提供了一系列插件,讓您選擇并選擇,然后下載并將它們組合成一個可部署的戰爭。

足夠多的談話–代碼在哪里???

與本文相關的源代碼可在github上找到 。 這些測試更多地是對實時API的探索,而不是對該項目中代碼的實際測試。 它們在使用Gradle Jetty插件啟動的本地服務器上運行。 最后,這是為您準備的一些漂亮圖片。
[以幻燈片顯示]
[使用PicLens查看]

繼續第2部分 。

參考:在The Kaptain on…博客上,從我們的JCG合作伙伴 Kelly Robinson接觸到Jenkins(Hudson)API 。


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

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

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

相關文章

使用javascript模擬常見數據結構(四)

七、樹 樹是一種非線性的分層的數據結構&#xff0c;在現實生活中比較常見的例子比如家譜和公司的組織架構圖&#xff0c;如下所示&#xff1a; 一個樹結構存在著一系列的父子結構&#xff0c;并且有著一個根節點&#xff0c;這種結構本質上表明了一對多的關系。 那&#xff0c…

C語言中實際參數太多,c – 宏的實際參數太多了?

碼&#xff1a;#include using namespace std;#define ADD(x,y) ((x)(y))int main( int argc, char** argv ){cout << ADD(1,2,) << endl;return 0;}編譯器輸出&#xff1a;1>Compiling…1>main.cpp1>c:\warn_test\main.cpp(9) : warning C4002: too many…

Web開發框架–第2部分:Play Framework 2.0

作為 評估系列 的第一個候選人&#xff0c; 我們回顧了 Play Framework v2.0 。 可以從Play 文檔站點獲得本文所使用的教程和參考文檔。 本文的第一部分將介紹我們建議對每個框架執行的一組任務&#xff0c;然后繼續評估每個標準項。 在開發工作站中安裝框架 非常簡單&#…

最全Pycharm教程(10)——Pycharm調試器總篇

最全Pycharm教程&#xff08;1&#xff09;——定制外觀 最全Pycharm教程&#xff08;2&#xff09;——代碼風格 最全Pycharm教程&#xff08;3&#xff09;——代碼的調試、執行 最全Pycharm教程&#xff08;4&#xff09;——有關Python解釋器的相關配置 最全Pycharm教程&am…

Looper.prepare()和Looper.loop()

什么時候需要 Looper Looper用于封裝了android線程中的消息循環&#xff0c;默認情況下一個線程是不存在消息循環&#xff08;message loop&#xff09;的&#xff0c;需要調用Looper.prepare()來給線程創建一個消息循環&#xff0c;調用Looper.loop()來使消息循環起作用&#…

超速問題的c語言編程,超速行駛問題--精選.doc

超速行駛問題摘要本文主要研究的是探討驅車從始發地至目的地的最短時間路徑問題和最少花費問題&#xff0c;以及在超速情況下的最短時間和最少花費問題。首先&#xff0c;從整個題目的兩個問題入手&#xff0c;發現兩個問題都是優化問題&#xff0c;具有一定的聯系。然后針對第…

重新查看Play Framework發布的值

與Play Framework 2.0一起使用發布的值而不定義表單映射&#xff0c;可能不像Play 1.x那樣明顯&#xff0c;這就是為什么我要編寫此快速備忘單。 對于此快速示例&#xff0c;讓我們定義以下視圖&#xff1a; app / views / index.scala.html (message: String)message: messa…

matlab 微積分

符號變量&#xff0c;symbolic variable 1. 高階導數 高階導數的計算&#xff0c;當然可以用手工的方式&#xff0c;但顯然這種機械重復的推導&#xff0c;更適用于計算機的計算方式&#xff1a; f(x)sinxx24x3?d4fdx4>> syms x; >> f sin(x) / (x^24*x3); >&…

如何查看Ubuntu版本,以及Linux內核版本??

查看Ubuntu版本&#xff1a; 方法一&#xff1a; cat /etc/issue 方法二&#xff1a; sudo lsb_release -a 查看內核版本&#xff1a; uname -r 轉載于:https://www.cnblogs.com/tanrong/p/6937749.html

c語言編碼風格,講嵌入式C語言編碼風格.ppt

講嵌入式C語言編碼風格目 錄 簡介及說明 語言規則 1.基礎 2.數據 3.說明與表達式 4.函數 5.內存及資源 6.源文件 風格指導 7.程序書寫 8.命名 9.文檔 簡介及說明 正確性 易維護性 易移植性 代碼的高效性 語言規則——基礎 編寫清晰表達設計思路和意圖的代碼 針對易讀來優化代碼…

使用Gradle引導舊式Ant構建

Gradle提供了幾種不同的方式來利用您現有的對Ant的投資&#xff0c;包括積累的知識和您已經放入構建文件中的時間。 這可以極大地方便將Ant生成的項目移植到Gradle的過程&#xff0c;并為您提供逐步進行此操作的路徑。 Gradle文檔在描述如何在Gradle構建腳本中使用Ant方面做得很…

實現chrome擴展啟動本地進程 - 補充

實現chrome擴展啟動本地進程 - 補充 標簽&#xff1a; chrome擴展啟動本地程序訪問本地磁盤2014-10-17 11:42 6753人閱讀 評論(17) 收藏 舉報分類&#xff1a;Chrome Plugin版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 示例 主要包含如下部分 c…

SpringMVC整合MongoDB

首先&#xff0c;在pom文件中新增spring-data-mongodb的依賴&#xff1a; <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.8.1.RELEASE</version>&l…

單路電壓表c語言編程,用AT89C51單片機制作的數字電壓表

此數字電壓表&#xff0c;利用A/D轉換原理將被測模擬量轉換成數字量&#xff0c;并通過控制系統用數字方式顯示測量結果。本設計采用AT89C51單片機&#xff0c;ADC0809進行模/數轉換&#xff0c;能夠測量8路0&#xff5e;5V的輸入電壓值&#xff0c;可用四位LED數碼管輪流或單路…

ZK的實際應用:MVVM –加載和渲染數據

先前的文章簡要介紹了RIA框架ZK&#xff0c;以及它CSS Selector啟發式控制器機制如何通過使在控制器類中引用UI組件的任務變得相對靈活來減輕UI更改所帶來的一些負擔。 然后&#xff0c;我們在上一篇文章中探討了ZK中的MVVM模式如何允許單個ViewModel提供不同的視圖。 這篇文章…

搭建一個簡單的mybatis框架

一、Mybatis介紹 MyBatis是一個支持普通SQL查詢&#xff0c;存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或注解用于配置和原始映射&#xff0c;將接口和Java的POJO&#xff08;Pla…

定時操作范例

1 package timetask.demo;2 3 import java.text.SimpleDateFormat;4 import java.util.Date;5 import java.util.Timer;6 import java.util.TimerTask;7 8 /*9 * time類 是一個線程實施&#xff0c;可以用來實現在某一個時間或者某一個時間段后安排某一個任務執行一次或者定期…

c語言空格符 r t,c語言中、\t \r \n 和空格什么意思

具體意思&#xff1a;都是轉義字符&#xff0c;空格就是單純的空格&#xff0c;輸入時可以輸入空格\t 跳格 \r 回車 \n 換行\\ 反斜杠 \a 警告 \b 退格 \f 換頁 \v 垂直跳格 \ddd ddd 是 1、2 或 3 位八進制數字。轉義字符串(Escap…

如何在運行時更改日志記錄級別

在運行時中更改日志記錄級別很重要&#xff0c;這主要在生產環境中非常重要&#xff0c;在生產環境中&#xff0c;您可能希望在有限的時間內進行調試日志記錄。 好了&#xff0c;更改根記錄器非常簡單–假設您有一個具有所需記錄級別的輸入參數&#xff0c;只需獲取根記錄器并…

擴展中國剩余定理

轉自&#xff1a;http://blog.csdn.net/clove_unique/article/details/54571216 對于兩個方程$x\equiv c_1\pmod {m_1}$$x\equiv c_2\pmod {m_2}$將其合并為一個方程&#xff0c;有解條件為$(m1,m2)|(c2-c1)$$m\frac{m1m2}{(m1,m2)}$$c(inv(\frac{m1}{(m1,m2)},\frac{m2}{(m1,m…