1. 程式人生 > 程式設計 >使用Java實現構建jenkins的多個job並返回構建結果示例

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

背景:

使用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的話 還是不關閉

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

需要的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); /*根據名稱獲取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,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,JenkinsServer jenkinsServer) throws Exception {
 
    BuildWithDetails buildWithDetails=getBuildDetails(number,jenkinsServer);
    BuildResult result = buildWithDetails.getResult();
    return result.name();
 
  }
 
  private static BuildWithDetails getBuildDetails(Integer number,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 {
      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);

這個方法是帶引數構建job true表示需要跨域訪問 所以在程式碼底層為true時 會去

http://JENKINS_URL/crumbIssuer/api/xml

獲取crumb 然後放進header裡面 就可以了

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

以上這篇使用Java實現構建jenkins的多個job並返回構建結果示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。