使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個(gè)job并返回構(gòu)建結(jié)果示例
背景:
使用java實(shí)現(xiàn)jenkins構(gòu)建很簡(jiǎn)單,但是如何確定什么時(shí)候job已經(jīng)構(gòu)建完成才是關(guān)鍵,而且要實(shí)現(xiàn)多個(gè)job并行構(gòu)建。
分析:
我有一篇文章提到過(guò)使用java實(shí)現(xiàn)jenkins構(gòu)建,但是獲取的結(jié)果是最后一次構(gòu)建的結(jié)果,不能實(shí)時(shí)獲取構(gòu)建結(jié)果.實(shí)時(shí)獲取構(gòu)建結(jié)果有個(gè)關(guān)鍵的點(diǎn),在于他會(huì)根據(jù)構(gòu)建的版本號(hào)獲取當(dāng)前版本號(hào)的結(jié)果,如果對(duì)應(yīng)版本號(hào)的結(jié)果為空則證明還在構(gòu)建過(guò)程中,按照這個(gè)思路我們就可以進(jìn)行編碼了.
1.判斷指定構(gòu)建版本號(hào)的job是否執(zhí)行完;
2.根據(jù)是否構(gòu)建完成獲取構(gòu)建結(jié)果;
/**
* 判斷指定的構(gòu)建版本號(hào)是否執(zhí)行完成
*
* @param number
* 構(gòu)建版本號(hào)
* @param jobName
* 構(gòu)建名稱
* @return true為構(gòu)建完成,false為未構(gòu)建完成
*/
public static boolean isFinished(int number, String jobName) {
boolean isBuilding = false;
if (number <= 0) {
throw new IllegalArgumentException("jenkins build number must greater than 0!");
}
try {
JobWithDetails job = jobs.get(jobName).details();
// build 如果為空則證明正在構(gòu)建,走else了
Build buildByNumber = job.getBuildByNumber(number);
if (null != buildByNumber) {
BuildWithDetails details = buildByNumber.details();
if (null != details) {
isBuilding = details.isBuilding();
} else {
isBuilding = true;
}
} else {
isBuilding = true;
}
return !isBuilding;
} catch (Exception e) {
e.printStackTrace();
} finally {
}
return false;
}
private static int nextNum = 0;
private static JobWithDetails jobWithDetails = null;
private static boolean flag = true;
private static BuildResult buildResult = null;
/**
* 根據(jù)項(xiàng)目名稱觸發(fā)jenkins構(gòu)建
*
* @param paramJobName
* 項(xiàng)目名稱
* @return 構(gòu)建結(jié)果:如果為null則表明項(xiàng)目名稱在jenkins中沒(méi)有匹配的job
*/
public static BuildResult triggerJenkins(String paramJobName) {
try {
jobWithDetails = jobs.get(paramJobName).details();
nextNum = jobWithDetails.getNextBuildNumber();
jobWithDetails.build();
System.out.println("正在構(gòu)建……");
while (flag) {
jobWithDetails = jobs.get(paramJobName).details();
if (isFinished(nextNum, paramJobName)) {
flag = false;
System.out.println("構(gòu)建完成……");
}
Thread.sleep(2000);
}
buildResult = jobWithDetails.getLastBuild().details().getResult();
return buildResult;
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return buildResult;
補(bǔ)充知識(shí):Java 對(duì)接Jenkins API操作(不需要勾選允許站點(diǎn)跨域訪問(wèn))
最先的是jenkins的跨域問(wèn)題 如果是一般學(xué)習(xí)直接關(guān)閉 在公司Java對(duì)接jenkins的話 還是不關(guān)閉

需要的maven 依賴
<dependency> <groupId>com.offbytwo.jenkins</groupId> <artifactId>jenkins-client</artifactId> <version>0.3.8</version> </dependency>
JenkinsUtil 不用勾選跨域也可以訪問(wèn)
public class JenkinsUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(JenkinsUtils.class);
private static String job_class="hudson.model.FreeStyleProject";
private static String folder_class= "com.cloudbees.hudson.plugins.folder.Folder";
public static JenkinsServer getJenkinsServer(String userName, String password, String jenkinsUrl) {
JenkinsHttpClient jenkinsHttpClient=null;
JenkinsServer jenkinsServer=null;
try{
jenkinsHttpClient = new JenkinsHttpClient(new URI(jenkinsUrl), userName, password);
jenkinsServer = new JenkinsServer(jenkinsHttpClient);
}catch (URISyntaxException ex){
LOGGER.info("JenkinsUtils :{}",ex.getMessage());
throw new ResourceCenterException(ResponseCodeEnum.SYSTEM_ERROR_MESSAGE);
}
return jenkinsServer;
}
;
public static Integer buildWithParams(HashMap<String, String> params,String jobName, JenkinsServer jenkinsServer) {
JobWithDetails job=null;
int nextBuildNumber =0;
try{
job = jenkinsServer.getJob(jobName); /*根據(jù)名稱獲取job*/
if(null==job){
LOGGER.info("jenkins 不存在該Job :{}",jobName);
throw new ResourceCenterException(ResponseCodeEnum.JOB_NOT_EXIST);
}
/*獲取下一次構(gòu)建的構(gòu)建編號(hào),可以用于在觸發(fā)構(gòu)建前,先記錄構(gòu)建編號(hào)。在后續(xù)獲取指定編號(hào)的構(gòu)建結(jié)果*/
//這里需要 一個(gè)插件 Build With Parameters Plugin
nextBuildNumber=job.getNextBuildNumber();
job.build(params,true);
}catch (IOException ex){
LOGGER.info("JenkinsUtils :{}",ex.getMessage());
throw new ResourceCenterException(ResponseCodeEnum.SYSTEM_ERROR_MESSAGE);
}
//獲取結(jié)果 如果為null表示正在構(gòu)建中 SUCCESS 表示構(gòu)建成功
return nextBuildNumber;
}
;
/**
* 獲取job 某一個(gè)構(gòu)建的日志
* @param number
* @param jobName
* @param jenkinsServer
* @return
* @throws Exception
*/
public static String getBuildLogPrint(Integer number, String jobName, JenkinsServer jenkinsServer) {
BuildWithDetails buildWithDetails=getBuildDetails(number,jobName,jenkinsServer);
String log =null;
try{
log=buildWithDetails.getConsoleOutputText();
}catch (IOException ex){
LOGGER.info("JenkinsUtils :{}",ex.getMessage());
throw new ResourceCenterException(ResponseCodeEnum.SYSTEM_ERROR_MESSAGE);
}
return log;
}
/**
* 獲取job 某一個(gè)構(gòu)建的結(jié)果 :成功,失敗,取消等狀態(tài)
* @param number
* @param jobName
* @param jenkinsServer
* @return
* @throws Exception
*/
public static String getBuildLogResult(Integer number, String jobName, JenkinsServer jenkinsServer) throws Exception {
BuildWithDetails buildWithDetails=getBuildDetails(number,jobName,jenkinsServer);
BuildResult result = buildWithDetails.getResult();
return result.name();
}
private static BuildWithDetails getBuildDetails(Integer number, String jobName, JenkinsServer jenkinsServer){
JobWithDetails job = null;
Build build=null;
BuildWithDetails buildWithDetails=null;
try{
job=jenkinsServer.getJob(jobName); /*根據(jù)jobName名稱獲取job*/
build = job.getBuildByNumber(number);
buildWithDetails = build.details();
}catch (Exception e){
LOGGER.info("JenkinsUtils :{}",e.getMessage());
throw new ResourceCenterException(ResponseCodeEnum.SYSTEM_ERROR_MESSAGE);
}
return buildWithDetails;
}
//暫時(shí)解析一層文件夾
public static String getJobFullName(JenkinsServer jenkinsServer,String jobName){
String jobFullName="";
try {
Map<String, Job> jobs1 = jenkinsServer.getJobs();
if(null!=jobs1.get(jobName)){
return jobName;
}
Set<String> params = jobs1.keySet();
for (String tempKey: params) {
jobFullName=tempKey;
JobWithDetails job = jenkinsServer.getJob(tempKey);
if(!folder_class.equals(job.get_class())){
continue;
}
Optional<FolderJob> folderJob = jenkinsServer.getFolderJob(job);
FolderJob folderJob1 = folderJob.get();
Map<String, Job> jobs = folderJob1.getJobs();
Job targetJob = jobs.get(jobName);
if(null!=targetJob){
jobFullName=jobFullName+"/"+jobName;
return jobFullName;
}
}
}catch (IOException ex){
LOGGER.info("JenkinsUtils :{}",ex.getMessage());
throw new ResourceCenterException(ResponseCodeEnum.SYSTEM_ERROR_MESSAGE);
}
return jobFullName;
}
}
為什么Java對(duì)接jenkins 不需要勾選跨域訪問(wèn)也可以:
job.build(params,true);
這個(gè)方法是帶參數(shù)構(gòu)建job true表示需要跨域訪問(wèn) 所以在代碼底層為true時(shí) 會(huì)去
http://JENKINS_URL/crumbIssuer/api/xml
獲取crumb 然后放進(jìn)header里面 就可以了

以上這篇使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個(gè)job并返回構(gòu)建結(jié)果示例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Java Bellman-Ford算法原理及實(shí)現(xiàn)
Bellman-Ford算法與Dijkstra算法類似,都是以松弛操作作為基礎(chǔ),Bellman-Ford算法是對(duì)所有邊都進(jìn)行松弛操作,本文將詳解Bellman-Ford算法原理及實(shí)現(xiàn),感興趣的可以了解一下2022-07-07
淺談SpringMVC請(qǐng)求映射handler源碼解讀
這篇文章主要介紹了淺談SpringMVC請(qǐng)求映射handler源碼解讀,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Spring Cloud Gateway替代zuul作為API網(wǎng)關(guān)的方法
本文簡(jiǎn)要介紹如何使用Spring Cloud Gateway 作為API 網(wǎng)關(guān)(不是使用zuul作為網(wǎng)關(guān)),結(jié)合實(shí)例代碼給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧2023-02-02
Spring內(nèi)置任務(wù)調(diào)度如何實(shí)現(xiàn)添加、取消與重置詳解
任務(wù)調(diào)度是我們?nèi)粘i_(kāi)發(fā)中經(jīng)常會(huì)碰到的,下面這篇文章主要給大家介紹了關(guān)于Spring內(nèi)置任務(wù)調(diào)度如何實(shí)現(xiàn)添加、取消與重置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
Springboot集成Kafka進(jìn)行批量消費(fèi)及踩坑點(diǎn)
本文主要介紹了Springboot集成Kafka進(jìn)行批量消費(fèi)及踩坑點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
使用java自帶des加密算法實(shí)現(xiàn)文件加密和字符串加密
這篇文章主要介紹了使用java自帶des加密算法實(shí)現(xiàn)文件加密和字符串加密的示例,需要的朋友可以參考下2014-03-03
SpringBoot集成Mybatis-plus并實(shí)現(xiàn)自動(dòng)生成相關(guān)文件的示例代碼
Mybatis-Plus是一個(gè)優(yōu)秀的Mybatis增強(qiáng)工具,目前更新到3.1.1,本文通過(guò)示例代碼給大家介紹SpringBoot集成Mybatis-plus并實(shí)現(xiàn)自動(dòng)生成相關(guān)文件的問(wèn)題,感興趣的朋友跟隨小編一起看看吧2021-12-12

