国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個job并返回構(gòu)建結(jié)果示例

瀏覽:82日期:2022-09-01 18:24:39

背景:

使用java實(shí)現(xiàn)jenkins構(gòu)建很簡單,但是如何確定什么時候job已經(jīng)構(gòu)建完成才是關(guān)鍵,而且要實(shí)現(xiàn)多個job并行構(gòu)建。

分析:

我有一篇文章提到過使用java實(shí)現(xiàn)jenkins構(gòu)建,但是獲取的結(jié)果是最后一次構(gòu)建的結(jié)果,不能實(shí)時獲取構(gòu)建結(jié)果.實(shí)時獲取構(gòu)建結(jié)果有個關(guān)鍵的點(diǎn),在于他會根據(jù)構(gòu)建的版本號獲取當(dāng)前版本號的結(jié)果,如果對應(yīng)版本號的結(jié)果為空則證明還在構(gòu)建過程中,按照這個思路我們就可以進(jìn)行編碼了.

1.判斷指定構(gòu)建版本號的job是否執(zhí)行完;

2.根據(jù)是否構(gòu)建完成獲取構(gòu)建結(jié)果;

/** * 判斷指定的構(gòu)建版本號是否執(zhí)行完成 * * @param number * 構(gòu)建版本號 * @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ǔ)充知識:Java 對接Jenkins API操作(不需要勾選允許站點(diǎn)跨域訪問)

最先的是jenkins的跨域問題 如果是一般學(xué)習(xí)直接關(guān)閉 在公司Java對接jenkins的話 還是不關(guān)閉

使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個job并返回構(gòu)建結(jié)果示例

需要的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)建編號,可以用于在觸發(fā)構(gòu)建前,先記錄構(gòu)建編號。在后續(xù)獲取指定編號的構(gòu)建結(jié)果*/ //這里需要 一個插件 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ò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ò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; } //暫時解析一層文件夾 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);

這個方法是帶參數(shù)構(gòu)建job true表示需要跨域訪問 所以在代碼底層為true時 會去

http://JENKINS_URL/crumbIssuer/api/xml

獲取crumb 然后放進(jìn)header里面 就可以了

使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個job并返回構(gòu)建結(jié)果示例

以上這篇使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個job并返回構(gòu)建結(jié)果示例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产在线欧美日韩一区二区 | 亚洲99在线的 | 欧美日韩看看2015永久免费 | 国产成人在线视频播放 | 中文字幕高清在线天堂网 | 国产乱码精品一区二区三上 | 日韩精品久久久免费观看夜色 | 免费观看欧美成人h | 香蕉一区二区三区观 | 在线精品一区二区三区 | 国产精品久久久久久福利 | 91寡妇天天综合久久影院 | 国产区香蕉精品系列在线观看不卡 | 成人免费黄色网址 | 97在线视频免费观看费观看 | 国产性做久久久久久 | 成人影院免费看 | 日本精品一区二区三区在线 | 国产精品久久久久久久久久久威 | 一级毛片免费播放 | 日本成本人视频 | 亚洲精品久久久久久久久久久网站 | 欧美视频精品一区二区三区 | 国产精品一区伦免视频播放 | 日本一在线中文字幕天堂 | 性欧美17一18sex性高清播放 | 91亚洲精品久久91综合 | 另类视频区第一页 | 成年男女男精品免费视频网站 | 久久久久成人精品一区二区 | 日韩欧美特级毛片 | 免费一级毛片在线观看 | 欧美一区a | 国产精品一区二区在线观看 | 免费一级做a爰片久久毛片 免费一级做a爰片性色毛片 | 亚洲自拍偷拍图 | 日本精品久久 | 亚洲网站在线观看 | 国产4tube在线播放 | 欧美xxx国产xxx | a级精品九九九大片免费看 a级毛片免费观看网站 |