使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個(gè)job并返回構(gòu)建結(jié)果示例
背景:
使用java實(shí)現(xiàn)jenkins構(gòu)建很簡單,但是如何確定什么時(shí)候job已經(jīng)構(gòu)建完成才是關(guān)鍵,而且要實(shí)現(xiàn)多個(gè)job并行構(gòu)建。
分析:
我有一篇文章提到過使用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é)果,如果對應(yīng)版本號(hào)的結(jié)果為空則證明還在構(gòu)建過程中,按照這個(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中沒有匹配的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 對接Jenkins API操作(不需要勾選允許站點(diǎn)跨域訪問)
最先的是jenkins的跨域問題 如果是一般學(xué)習(xí)直接關(guān)閉 在公司Java對接jenkins的話 還是不關(guān)閉
需要的maven 依賴
<dependency> <groupId>com.offbytwo.jenkins</groupId> <artifactId>jenkins-client</artifactId> <version>0.3.8</version> </dependency>
JenkinsUtil 不用勾選跨域也可以訪問
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對接jenkins 不需要勾選跨域訪問也可以:
job.build(params,true);
這個(gè)方法是帶參數(shù)構(gòu)建job true表示需要跨域訪問 所以在代碼底層為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é)果示例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java設(shè)計(jì)模式之橋梁(Bridge)模式
這篇文章主要介紹了Java設(shè)計(jì)模式之橋梁(Bridge)模式,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)Java設(shè)計(jì)模式的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05Java中實(shí)現(xiàn)二叉樹的遍歷與重構(gòu)
這篇文章主要介紹了Java中實(shí)現(xiàn)二叉樹的遍歷與重構(gòu),樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n>=0)個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合,把它叫做樹是因?yàn)樗雌饋硐褚豢玫箳斓臉?也就是說它是根朝上,而葉朝下的,需要的朋友可以參考下2023-10-10springboot定時(shí)任務(wù)備份mysql數(shù)據(jù)庫的實(shí)現(xiàn)示例
為了防止數(shù)據(jù)庫被清庫或者誤刪數(shù)據(jù)庫的情況,所以需要定時(shí)將mysql數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行備份,本文主要介紹了springboot定時(shí)任務(wù)備份mysql數(shù)據(jù)庫的實(shí)現(xiàn)示例,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03IDEA自動(dòng)清理類中未使用的import包的操作方法
在項(xiàng)目開發(fā)中,經(jīng)常會(huì)引入很多未使用的import包,這不僅增加了編譯時(shí)間,還會(huì)使代碼可讀性變差,設(shè)置IDEA自動(dòng)清理未使用的import包,可以提高代碼的可讀性,本文給大家介紹IDEA自動(dòng)清理類中未使用的import包的方法,感興趣的朋友一起看看吧2024-09-09SpringBoot自定義路由覆蓋實(shí)現(xiàn)流程詳解
這篇文章主要介紹了SpringBoot自定義路由覆蓋實(shí)現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01Java用三元運(yùn)算符判斷奇數(shù)和偶數(shù)的簡單實(shí)現(xiàn)
這篇文章主要介紹了Java用三元運(yùn)算符判斷奇數(shù)和偶數(shù)的簡單實(shí)現(xiàn),需要的朋友可以參考下2014-02-02