歡迎您光臨本站 註冊首頁

使用Java實現構建jenkins的多個job並返回構建結果示例

←手機掃碼閱讀     zmcjlove @ 2020-05-13 , reply:0

背景:
使用java實現jenkins構建很簡單,但是如何確定什麼時候job已經構建完成才是關鍵,而且要實現多個job並行構建。
分析:
我有一篇文章提到過使用java實現jenkins構建,但是獲取的結果是最後一次構建的結果,不能實時獲取構建結果.實時獲取構建結果有個關鍵的點,在於他會根據構建的版本號獲取當前版本號的結果,如果對應版本號的結果為空則證明還在構建過程中,按照這個思路我們就可以進行編碼了.
1.判斷指定構建版本號的job是否執行完;
2.根據是否構建完成獲取構建結果;
/** * 判斷指定的構建版本號是否執行完成 * * @param number * 構建版本號 * @param jobName * 構建名稱 * @return true為構建完成,false為未構建完成 */ 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 如果為空則證明正在構建,走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; /** * 根據項目名稱觸發jenkins構建 * * @param paramJobName * 項目名稱 * @return 構建結果:如果為null則表明項目名稱在jenkins中沒有匹配的job */ public static BuildResult triggerJenkins(String paramJobName) { try { jobWithDetails = jobs.get(paramJobName).details(); nextNum = jobWithDetails.getNextBuildNumber(); jobWithDetails.build(); System.out.println("正在構建……"); while (flag) { jobWithDetails = jobs.get(paramJobName).details(); if (isFinished(nextNum, paramJobName)) { flag = false; System.out.println("構建完成……"); } Thread.sleep(2000); } buildResult = jobWithDetails.getLastBuild().details().getResult(); return buildResult; } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } return buildResult;
補充知識:Java 對接Jenkins API操作(不需要勾選允許站點跨域訪問)
最先的是jenkins的跨域問題 如果是一般學習直接關閉 在公司Java對接jenkins的話 還是不關閉
需要的maven 依賴

com.offbytwo.jenkinsjenkins-client0.3.8


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

params,String jobName, JenkinsServer jenkinsServer) { JobWithDetails job=null; int nextBuildNumber =0; try{ job = jenkinsServer.getJob(jobName); /*根據名稱獲取job*/ if(null==job){ LOGGER.info("jenkins 不存在該Job :{}",jobName); throw new ResourceCenterException(ResponseCodeEnum.JOB_NOT_EXIST); } /*獲取下一次構建的構建編號,可以用於在觸發構建前,先記錄構建編號。在後續獲取指定編號的構建結果*/ //這裡需要 一個插件 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); } //獲取結果 如果為null表示正在構建中 SUCCESS 表示構建成功 return nextBuildNumber; } ; /** * 獲取job 某一個構建的日誌 * @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 某一個構建的結果 :成功,失敗,取消等狀態 * @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); /*根據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; } //暫時解析一層文件夾 public static String getJobFullName(JenkinsServer jenkinsServer,String jobName){ String jobFullName=""; try { Mapjobs1 = jenkinsServer.getJobs(); if(null!=jobs1.get(jobName)){ return jobName; } Setparams = jobs1.keySet(); for (String tempKey: params) { jobFullName=tempKey; JobWithDetails job = jenkinsServer.getJob(tempKey); if(!folder_class.equals(job.get_class())){ continue; } OptionalfolderJob = jenkinsServer.getFolderJob(job); FolderJob folderJob1 = folderJob.get(); Mapjobs = 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);
這個方法是帶參數構建job true表示需要跨域訪問 所以在代碼底層為true時 會去
http://JENKINS_URL/crumbIssuer/api/xml
獲取crumb 然後放進header裡面 就可以了

[zmcjlove ] 使用Java實現構建jenkins的多個job並返回構建結果示例已經有272次圍觀

http://coctec.com/docs/java/show-post-234295.html