BuildManager.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package nju.seec.SEECdemo.logic.service.impl;
  2. import com.offbytwo.jenkins.model.QueueItem;
  3. import lombok.extern.apachecommons.CommonsLog;
  4. import nju.seec.SEECdemo.data.dao.assignment.BuildRecordDAO;
  5. import nju.seec.SEECdemo.data.dao.assignment.CodeWorkResultDAO;
  6. import nju.seec.SEECdemo.data.entity.assignment.BuildRecord;
  7. import nju.seec.SEECdemo.data.entity.assignment.CodeWorkResult;
  8. import nju.seec.SEECdemo.logic.api.JenkinsApi;
  9. import nju.seec.SEECdemo.logic.api.vo.BuildDetails;
  10. import nju.seec.SEECdemo.util.ApplicationProperties;
  11. import nju.seec.SEECdemo.util.ToolKit;
  12. import nju.seec.SEECdemo.util.enums.BuildStatus;
  13. import org.springframework.stereotype.Component;
  14. import org.springframework.transaction.annotation.Transactional;
  15. import java.io.IOException;
  16. import java.sql.Timestamp;
  17. import java.util.HashMap;
  18. import java.util.Map;
  19. @Component
  20. @CommonsLog
  21. public class BuildManager {
  22. private final CodeWorkResultDAO codeResultDAO;
  23. private final BuildRecordDAO buildRecordDao;
  24. private final JenkinsApi jenkinsApi;
  25. private final ApplicationProperties properties;
  26. public BuildManager(CodeWorkResultDAO codeResultDAO, BuildRecordDAO buildRecordDao, JenkinsApi jenkinsApi, ApplicationProperties properties)
  27. {
  28. this.codeResultDAO = codeResultDAO;
  29. this.buildRecordDao = buildRecordDao;
  30. this.jenkinsApi = jenkinsApi;
  31. this.properties = properties;
  32. }
  33. @SuppressWarnings("BooleanMethodIsAlwaysInverted")
  34. @Transactional
  35. public boolean invokeNextBuild(int codeId,String commitHash) {
  36. CodeWorkResult codeResult = codeResultDAO.findById(codeId);
  37. if (codeResult == null) return false;
  38. try {
  39. QueueItem item = jenkinsApi.invokeBuild(codeId, buildParam(codeResult, commitHash));
  40. System.out.println(item.getExecutable().getNumber().intValue());
  41. return true;
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. }
  45. // Record record;
  46. // while ((record = nextUnbuiltRecord(result)) != null) {
  47. // try {
  48. // QueueItem item = jenkinsApi.invokeBuild(resultId, buildParam(record));
  49. // record.setNumber(item.getExecutable().getNumber().intValue());
  50. // record.setStatus(BuildStatus.RUNNING);
  51. // return true;
  52. // } catch (Exception e) {
  53. // log.error("触发构建" + record.getId() + "时发生异常" + ToolKit.format(e));
  54. // record.setConsoleOutput("系统内部发生未知异常,请尝试重新提交!");
  55. // record.setStatus(BuildStatus.FAILURE);
  56. // } finally {
  57. // recordDAO.save(record);
  58. // }
  59. // }
  60. return true;
  61. }
  62. @Transactional
  63. public boolean recordBuildResult(int codeId, int buildNumber, String imageName) {
  64. System.out.println("id " + codeId + " buildNumber " + buildNumber);
  65. CodeWorkResult codeResult = codeResultDAO.findById(codeId);
  66. if (codeResult == null) return false;
  67. BuildRecord buildRecord = new BuildRecord();
  68. try{
  69. BuildDetails buildDetails = jenkinsApi.fetchBuildDetails(codeId,buildNumber,"PACKAGE",true);
  70. buildRecord.setBuildTime(new Timestamp(System.currentTimeMillis()));
  71. buildRecord.setBuildStatus(BuildStatus.SUCCESS);
  72. buildRecord.setConsoleOutput(buildDetails.getConsoleOutput());
  73. buildRecord.setNumber(buildNumber);
  74. buildRecord.setCodeResult(codeResult);
  75. buildRecord.setImageName(imageName);
  76. }catch (Exception e) {
  77. log.error("获取构建记录" + buildNumber + "时发生异常" + ToolKit.format(e));
  78. buildRecord.setConsoleOutput("系统内部发生未知异常,请尝试重新提交!");
  79. buildRecord.setBuildStatus(BuildStatus.FAILURE);
  80. } finally {
  81. buildRecordDao.save(buildRecord);
  82. }
  83. return true;
  84. }
  85. // private Record nextUnbuiltRecord(Result result) {
  86. // Commit commit = commitDAO.findFirstUnfinishedByResult(result);
  87. // if (commit == null) return null;
  88. // Record unbuiltRecord = null;
  89. // for (Record record : commit.getRecords()) {
  90. // switch (record.getStatus()) {
  91. // case RUNNING:
  92. // return null;
  93. // case WAITING:
  94. // if (unbuiltRecord == null) {
  95. // unbuiltRecord = record;
  96. // }
  97. // }
  98. // }
  99. // return unbuiltRecord;
  100. // }
  101. private Map<String, String> buildParam(CodeWorkResult codeResult,String commitHash) {
  102. Map<String, String> param = new HashMap<>();
  103. param.put("GIT_URL", properties.getGitlab().getHost() + "/" + codeResult.getGroupId() + "/" + codeResult.getCode().getName());
  104. param.put("COMMIT_HASH", commitHash);
  105. param.put("DOCKER_FILE", "#基于openjdk:8\n" +
  106. "FROM openjdk:8-jdk-alpine\n" +
  107. "\n" +
  108. "VOLUME /tmp\n" +
  109. "ARG JAR_FILE=target/build-demo-1.0-SNAPSHOT.jar\n" +
  110. "ARG DEPENDENCY=target/dependency\n" +
  111. "ARG LIB=target/lib/*\n" +
  112. "# 将jar包拷贝进来\n" +
  113. "COPY ${JAR_FILE} /app/app.jar\n" +
  114. "COPY ${LIB} /app/lib/\n" +
  115. "# 将manifest文件拷贝进来\n" +
  116. "COPY ${DEPENDENCY}/META-INF /app/META-INF\n" +
  117. "\n" +
  118. "EXPOSE 8081\n" +
  119. "ENTRYPOINT [\"java\",\"-jar\",\"/app/app.jar\"]");
  120. return param;
  121. }
  122. }