java代碼獲取jenkins數(shù)據(jù),構(gòu)建歷史等信息方式
本篇文章主要介紹如何獲取jenkins構(gòu)建歷史數(shù)據(jù)等信息,不包含java構(gòu)建等操作。
1.jenkins所需jar,后續(xù)如有缺少可百度自行補(bǔ)齊。
<!--jenkins所需jar包開(kāi)始--> <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5</version> </dependency>
2.首先介紹下本次jenkins數(shù)據(jù)獲取的方式,主要通過(guò)jenkins提供的rest api 接口獲取數(shù)據(jù),rest api 接口提供了獲取數(shù)據(jù)展示的幾種方式:
(1).XML API
(2).JSON API
(3).Python API
大家可以針對(duì)自己所有,通過(guò)以上幾種方式去獲取數(shù)據(jù)。
3.本次通過(guò)JSON API格式獲取數(shù)據(jù)信息
(1).打開(kāi)jenkins,找到rest api 進(jìn)入。

(2).進(jìn)入api展示如圖,點(diǎn)擊JSON API:

(3).點(diǎn)擊JSON API數(shù)據(jù)結(jié)構(gòu)展示如下,地址:http://localhost:8081/api/json?pretty=true,
可以看到以下json數(shù)據(jù)結(jié)構(gòu)。同時(shí),我們看到了自己所創(chuàng)建的jobs

(4).我們看到自己所創(chuàng)建的jobs,接下來(lái)就是對(duì)jobs下的詳細(xì)信息進(jìn)行獲取,可以以tree的形式獲取,地址:
http://localhost:8081/api/json?pretty=true&tree=jobs[*]
來(lái)獲取所有job下的詳細(xì)信息,通過(guò)下圖我們可以發(fā)現(xiàn),我們能獲取到的信息都有哪些,我們可以根據(jù)自己所需去展示自己的數(shù)據(jù),如下:

注:比如:我只想要上圖中的屬性:displayName、fullName、jobs我們的請(qǐng)求可以這樣寫(xiě):

展示效果如下:我們可以看到我們想要的屬性,以及可以看到我想要的當(dāng)前job下的allbuilds屬性(當(dāng)前工程構(gòu)建下的所有工程構(gòu)建情況)

(5).接下來(lái)就是獲取jobs下的allbuilds屬性,依照規(guī)則我們?nèi)缦拢?/p>
地址:
http://localhost:8081/api/json?pretty=true&tree=jobs[displayName[*],fullName[*],jobs[displayName[*],name[*],fullDisplayName[*],allBuilds[*]]]
這樣我們就可以獲取構(gòu)建歷史的詳細(xì)信息:
1>.構(gòu)建編號(hào)
2>.構(gòu)建用時(shí)
3>.構(gòu)建全路徑
4>.構(gòu)建結(jié)果
5>.構(gòu)建時(shí)間

(6).以下是java代碼實(shí)現(xiàn),構(gòu)建歷史記錄的獲取
jenkins的MODEL:
package com.zkr.cxhjcxt.model;
import lombok.Data;
import java.util.Date;
/**
* Created by youzongxu on 2018/9/27.
*/
@Data
public class JenkinsData extends BaseEntity<Long>{
private static final long serialVersionUID = 2582107289140922375L;
private String displayName;
private String fullDisplayName;
private String duration;
private String fullname;
private String sunfullname;
private String result;
private Date commitTime;
}
具體實(shí)現(xiàn)方法:
package com.zkr.cxhjcxt.timedutils;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.zkr.cxhjcxt.model.JenkinsData;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.AuthCache;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.joda.time.DateTime;
import java.io.IOException;
import java.net.URI;
import java.util.List;
import java.util.Map;
/**
* Created by youzongxu on 2018/9/28.
*/
@Slf4j
public class jenkinsutil {
static String username = "";
static String password = "";
static String jenkinsUrl = "";
public jenkinsutil(String u,String p,String url){
username = u;
password = p;
jenkinsUrl = url;
}
/**
* 獲取數(shù)據(jù)
* @return
*/
public List<JenkinsData> getJenkinsData(){
log.info("start");
try {
String urlString = jenkinsUrl + "/api/json?pretty=true&tree=jobs[jobs[allBuilds[building[*],description[*],displayName[*],fullDisplayName[*],estimatedDuration[*],duration[*],id[*],keepLog[*],number[*],queueId[*],result[*],timestamp[*]]]]";
String jobsString = getJobs(urlString,username,password);
if(StringUtils.isNotBlank(jobsString)){
String builds1 = "["+jobsString+"]";
JSONObject json = new JSONObject();
List<Map<String, Object>> list = (List<Map<String, Object>>) json.parse(builds1);
//獲取項(xiàng)目名稱(chēng)
String jobs = list.get(0).get("jobs").toString();
List<JenkinsData> jenkinsDataLists = Lists.newArrayList();
if(StringUtils.isNotBlank(jobs)){
List<Map<String, Object>> jobs1 = (List<Map<String, Object>>) json.parse(jobs);
for (Map<String, Object> s:jobs1) {
String jobsx = s.get("jobs").toString();
if(StringUtils.isNotBlank(jobsx)){
List<Map<String, Object>> jobsxx = (List<Map<String, Object>>) json.parse(jobsx);
for (Map<String, Object> s1 :jobsxx) {
String allBuilds = s1.get("allBuilds").toString();
if(StringUtils.isNotBlank(allBuilds)){
List<Map<String, Object>> jobsxxx = (List<Map<String, Object>>) json.parse(allBuilds);
for (Map<String, Object> s2 :jobsxxx) {
//開(kāi)始
float duration = (float) ((int) s2.get("duration")/1000.0);
String result = s2.get("result").toString();
String displayName = s2.get("displayName").toString();
//處理項(xiàng)目名稱(chēng)---子項(xiàng)目名稱(chēng)
String fullDisplayName = s2.get("fullDisplayName").toString();
Long timestamp = Long.valueOf(s2.get("timestamp").toString()) ;
String fullname = StringUtils.isNotBlank(fullDisplayName)?fullDisplayName.substring(0,fullDisplayName.indexOf("»")):"";
String sunfullname = StringUtils.isNotBlank(fullDisplayName)?fullDisplayName.substring(fullDisplayName.indexOf("»")+1,fullDisplayName.indexOf("#")):"";
JenkinsData jenkinsData = new JenkinsData();
jenkinsData.setDisplayName(displayName);
jenkinsData.setCommitTime(new DateTime(timestamp).toDate());
jenkinsData.setDuration(String.valueOf(duration));
jenkinsData.setFullDisplayName(fullDisplayName);
jenkinsData.setFullname(fullname.trim());
jenkinsData.setSunfullname(sunfullname.trim());
jenkinsData.setResult(result);
jenkinsDataLists.add(jenkinsData);
}
}
}
}
}
}
return jenkinsDataLists;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
log.info("end");
return null;
}
/**
* 執(zhí)行語(yǔ)句,上面已經(jīng)定義了成員變量,String username,String password可以不用傳,我是后面有再次調(diào)用該方法,所以又傳遞了一遍,這里可以按照自己所需來(lái)處理。
* @param urlString
* @return
* @throws IOException
*/
public static String getJobs(String urlString,String username,String password)throws IOException{
URI uri = URI.create(urlString);
HttpHost host = new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme());
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope(uri.getHost(), uri.getPort()), new UsernamePasswordCredentials(username, password));
AuthCache authCache = new BasicAuthCache();
BasicScheme basicAuth = new BasicScheme();
authCache.put(host, basicAuth);
CloseableHttpClient httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
HttpGet httpGet = new HttpGet(uri);
HttpClientContext localContext = HttpClientContext.create();
localContext.setAuthCache(authCache);
HttpResponse response = httpClient.execute(host, httpGet, localContext);
String result = EntityUtils.toString(response.getEntity());
return result;
}
}
以上這篇java代碼獲取jenkins數(shù)據(jù),構(gòu)建歷史等信息方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
實(shí)例解決Java異常之OutOfMemoryError的問(wèn)題
在本篇文章中,我們給大家分享了關(guān)于解決Java異常之OutOfMemoryError的問(wèn)題的方法,有此需要的朋友們學(xué)習(xí)下。2019-02-02
解決SpringBoot自定義攔截器和跨域配置沖突的問(wèn)題
這篇文章主要介紹了解決SpringBoot自定義攔截器和跨域配置沖突的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
JAVA包裝類(lèi)及自動(dòng)封包解包實(shí)例代碼
JAVA包裝類(lèi)及自動(dòng)封包解包實(shí)例代碼,需要的朋友可以參考一下2013-03-03
Spring aop 如何通過(guò)獲取代理對(duì)象實(shí)現(xiàn)事務(wù)切換
這篇文章主要介紹了Spring aop 如何通過(guò)獲取代理對(duì)象實(shí)現(xiàn)事務(wù)切換的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Spring?Security配置多個(gè)數(shù)據(jù)源并添加登錄驗(yàn)證碼的實(shí)例代碼
這篇文章主要介紹了Spring?Security配置多個(gè)數(shù)據(jù)源并添加登錄驗(yàn)證碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
Java并發(fā)工具之Exchanger線(xiàn)程間交換數(shù)據(jù)詳解
這篇文章主要介紹了Java并發(fā)工具之Exchanger線(xiàn)程間交換數(shù)據(jù)詳解,Exchanger是一個(gè)用于線(xiàn)程間協(xié)作的工具類(lèi),Exchanger用于進(jìn)行線(xiàn)程間的數(shù)據(jù)交 換,它提供一個(gè)同步點(diǎn),在這個(gè)同步點(diǎn),兩個(gè)線(xiàn)程可以交換彼此的數(shù)據(jù),需要的朋友可以參考下2023-12-12
一文搞懂SpringBoot如何利用@Async實(shí)現(xiàn)異步調(diào)用
異步調(diào)用幾乎是處理高并發(fā),解決性能問(wèn)題常用的手段,如何開(kāi)啟異步調(diào)用?SpringBoot中提供了非常簡(jiǎn)單的方式,就是一個(gè)注解@Async。今天我們重新認(rèn)識(shí)一下@Async,以及注意事項(xiàng)2022-09-09

