最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年05月12日 11:32:39   作者:沉豆  
這篇文章主要介紹了使用Java實(shí)現(xiàn)構(gòu)建jenkins的多個(gè)job并返回構(gòu)建結(jié)果示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

背景:

使用java實(shí)現(xiàn)jenkins構(gòu)建很簡(jiǎn)單,但是如何確定什么時(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é)果,如果對(duì)應(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 對(duì)接Jenkins API操作(不需要勾選允許站點(diǎn)跨域訪問)

最先的是jenkins的跨域問題 如果是一般學(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 不用勾選跨域也可以訪問

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 不需要勾選跨域訪問也可以:

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é)果示例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Java Bellman-Ford算法原理及實(shí)現(xiàn)

    詳解Java Bellman-Ford算法原理及實(shí)現(xiàn)

    Bellman-Ford算法與Dijkstra算法類似,都是以松弛操作作為基礎(chǔ),Bellman-Ford算法是對(duì)所有邊都進(jìn)行松弛操作,本文將詳解Bellman-Ford算法原理及實(shí)現(xiàn),感興趣的可以了解一下
    2022-07-07
  • 淺談一下Java中的幾種JVM級(jí)別的鎖

    淺談一下Java中的幾種JVM級(jí)別的鎖

    這篇文章主要介紹了淺談一下Java中的幾種JVM級(jí)別的鎖,當(dāng)存在安全漏洞時(shí),也必須有相應(yīng)的防護(hù)措施。順應(yīng)這種趨勢(shì),虛擬"鎖"被發(fā)明出來,以解決線程的安全問題。在這篇文章中,我們將研究多年來出現(xiàn)的?Java?中幾種典型的?JVM?級(jí)鎖,需要的朋友可以參考下
    2023-08-08
  • Java JDBC自定義封裝工具類的步驟和完整代碼

    Java JDBC自定義封裝工具類的步驟和完整代碼

    這篇文章主要給大家介紹了關(guān)于Java JDBC自定義封裝工具類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 淺談SpringMVC請(qǐng)求映射handler源碼解讀

    淺談SpringMVC請(qǐng)求映射handler源碼解讀

    這篇文章主要介紹了淺談SpringMVC請(qǐng)求映射handler源碼解讀,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Spring Cloud Gateway替代zuul作為API網(wǎng)關(guān)的方法

    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)添加、取消與重置詳解

    Spring內(nèi)置任務(wù)調(diào)度如何實(shí)現(xiàn)添加、取消與重置詳解

    任務(wù)調(diào)度是我們?nèi)粘i_發(fā)中經(jīng)常會(huì)碰到的,下面這篇文章主要給大家介紹了關(guān)于Spring內(nèi)置任務(wù)調(diào)度如何實(shí)現(xiàn)添加、取消與重置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • mybatis中的if-else及if嵌套使用方式

    mybatis中的if-else及if嵌套使用方式

    這篇文章主要介紹了mybatis中的if-else及if嵌套使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Springboot集成Kafka進(jìn)行批量消費(fèi)及踩坑點(diǎn)

    Springboot集成Kafka進(jìn)行批量消費(fèi)及踩坑點(diǎn)

    本文主要介紹了Springboot集成Kafka進(jìn)行批量消費(fèi)及踩坑點(diǎn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 使用java自帶des加密算法實(shí)現(xiàn)文件加密和字符串加密

    使用java自帶des加密算法實(shí)現(xiàn)文件加密和字符串加密

    這篇文章主要介紹了使用java自帶des加密算法實(shí)現(xiàn)文件加密和字符串加密的示例,需要的朋友可以參考下
    2014-03-03
  • SpringBoot集成Mybatis-plus并實(shí)現(xiàn)自動(dòng)生成相關(guān)文件的示例代碼

    SpringBoot集成Mybatis-plus并實(shí)現(xiàn)自動(dòng)生成相關(guān)文件的示例代碼

    Mybatis-Plus是一個(gè)優(yōu)秀的Mybatis增強(qiáng)工具,目前更新到3.1.1,本文通過示例代碼給大家介紹SpringBoot集成Mybatis-plus并實(shí)現(xiàn)自動(dòng)生成相關(guān)文件的問題,感興趣的朋友跟隨小編一起看看吧
    2021-12-12

最新評(píng)論

旌德县| 郁南县| 罗江县| 武川县| 巴林左旗| 会昌县| 留坝县| 盐亭县| 稻城县| 墨脱县| 贵南县| 五峰| 保德县| 松江区| 和平区| 丹棱县| 桂林市| 建德市| 黑山县| 凤庆县| 揭阳市| 武城县| 天津市| 东源县| 桐乡市| 花莲市| 会泽县| 枣阳市| 中阳县| 蒙山县| 虎林市| 顺昌县| 岫岩| 武夷山市| 贵定县| 蚌埠市| 岚皋县| 古丈县| 城市| 温州市| 江西省|