|
|
@@ -0,0 +1,137 @@
|
|
|
+package nju.seec.SEECdemo.logic.service.impl;
|
|
|
+
|
|
|
+
|
|
|
+import com.offbytwo.jenkins.model.QueueItem;
|
|
|
+import lombok.extern.apachecommons.CommonsLog;
|
|
|
+import nju.seec.SEECdemo.data.dao.assignment.BuildRecordDAO;
|
|
|
+import nju.seec.SEECdemo.data.dao.assignment.CodeWorkResultDAO;
|
|
|
+import nju.seec.SEECdemo.data.entity.assignment.BuildRecord;
|
|
|
+import nju.seec.SEECdemo.data.entity.assignment.CodeWorkResult;
|
|
|
+import nju.seec.SEECdemo.logic.api.JenkinsApi;
|
|
|
+import nju.seec.SEECdemo.logic.api.vo.BuildDetails;
|
|
|
+import nju.seec.SEECdemo.util.ApplicationProperties;
|
|
|
+import nju.seec.SEECdemo.util.ToolKit;
|
|
|
+import nju.seec.SEECdemo.util.enums.BuildStatus;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.sql.Timestamp;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+@Component
|
|
|
+@CommonsLog
|
|
|
+public class BuildManager {
|
|
|
+
|
|
|
+ private final CodeWorkResultDAO codeResultDAO;
|
|
|
+ private final BuildRecordDAO buildRecordDao;
|
|
|
+ private final JenkinsApi jenkinsApi;
|
|
|
+ private final ApplicationProperties properties;
|
|
|
+
|
|
|
+ public BuildManager(CodeWorkResultDAO codeResultDAO, BuildRecordDAO buildRecordDao, JenkinsApi jenkinsApi, ApplicationProperties properties)
|
|
|
+ {
|
|
|
+ this.codeResultDAO = codeResultDAO;
|
|
|
+ this.buildRecordDao = buildRecordDao;
|
|
|
+ this.jenkinsApi = jenkinsApi;
|
|
|
+ this.properties = properties;
|
|
|
+ }
|
|
|
+
|
|
|
+ @SuppressWarnings("BooleanMethodIsAlwaysInverted")
|
|
|
+ @Transactional
|
|
|
+ public boolean invokeNextBuild(int codeId,String commitHash) {
|
|
|
+ CodeWorkResult codeResult = codeResultDAO.findById(codeId);
|
|
|
+ if (codeResult == null) return false;
|
|
|
+ try {
|
|
|
+ QueueItem item = jenkinsApi.invokeBuild(codeId, buildParam(codeResult, commitHash));
|
|
|
+ System.out.println(item.getExecutable().getNumber().intValue());
|
|
|
+ return true;
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+// Record record;
|
|
|
+// while ((record = nextUnbuiltRecord(result)) != null) {
|
|
|
+// try {
|
|
|
+// QueueItem item = jenkinsApi.invokeBuild(resultId, buildParam(record));
|
|
|
+// record.setNumber(item.getExecutable().getNumber().intValue());
|
|
|
+// record.setStatus(BuildStatus.RUNNING);
|
|
|
+// return true;
|
|
|
+// } catch (Exception e) {
|
|
|
+// log.error("触发构建" + record.getId() + "时发生异常" + ToolKit.format(e));
|
|
|
+// record.setConsoleOutput("系统内部发生未知异常,请尝试重新提交!");
|
|
|
+// record.setStatus(BuildStatus.FAILURE);
|
|
|
+// } finally {
|
|
|
+// recordDAO.save(record);
|
|
|
+// }
|
|
|
+// }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional
|
|
|
+ public boolean recordBuildResult(int codeId, int buildNumber, String imageName) {
|
|
|
+
|
|
|
+ System.out.println("id " + codeId + " buildNumber " + buildNumber);
|
|
|
+ CodeWorkResult codeResult = codeResultDAO.findById(codeId);
|
|
|
+ if (codeResult == null) return false;
|
|
|
+
|
|
|
+ BuildRecord buildRecord = new BuildRecord();
|
|
|
+
|
|
|
+ try{
|
|
|
+ BuildDetails buildDetails = jenkinsApi.fetchBuildDetails(codeId,buildNumber,"PACKAGE",true);
|
|
|
+ buildRecord.setBuildTime(new Timestamp(System.currentTimeMillis()));
|
|
|
+ buildRecord.setBuildStatus(BuildStatus.SUCCESS);
|
|
|
+ buildRecord.setConsoleOutput(buildDetails.getConsoleOutput());
|
|
|
+ buildRecord.setNumber(buildNumber);
|
|
|
+ buildRecord.setCodeResult(codeResult);
|
|
|
+ buildRecord.setImageName(imageName);
|
|
|
+ }catch (Exception e) {
|
|
|
+ log.error("获取构建记录" + buildNumber + "时发生异常" + ToolKit.format(e));
|
|
|
+ buildRecord.setConsoleOutput("系统内部发生未知异常,请尝试重新提交!");
|
|
|
+ buildRecord.setBuildStatus(BuildStatus.FAILURE);
|
|
|
+ } finally {
|
|
|
+ buildRecordDao.save(buildRecord);
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+// private Record nextUnbuiltRecord(Result result) {
|
|
|
+// Commit commit = commitDAO.findFirstUnfinishedByResult(result);
|
|
|
+// if (commit == null) return null;
|
|
|
+// Record unbuiltRecord = null;
|
|
|
+// for (Record record : commit.getRecords()) {
|
|
|
+// switch (record.getStatus()) {
|
|
|
+// case RUNNING:
|
|
|
+// return null;
|
|
|
+// case WAITING:
|
|
|
+// if (unbuiltRecord == null) {
|
|
|
+// unbuiltRecord = record;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return unbuiltRecord;
|
|
|
+// }
|
|
|
+
|
|
|
+ private Map<String, String> buildParam(CodeWorkResult codeResult,String commitHash) {
|
|
|
+
|
|
|
+ Map<String, String> param = new HashMap<>();
|
|
|
+ param.put("GIT_URL", properties.getGitlab().getHost() + "/" + codeResult.getGroupId() + "/" + codeResult.getCode().getName());
|
|
|
+ param.put("COMMIT_HASH", commitHash);
|
|
|
+ param.put("DOCKER_FILE", "#基于openjdk:8\n" +
|
|
|
+ "FROM openjdk:8-jdk-alpine\n" +
|
|
|
+ "\n" +
|
|
|
+ "VOLUME /tmp\n" +
|
|
|
+ "ARG JAR_FILE=target/build-demo-1.0-SNAPSHOT.jar\n" +
|
|
|
+ "ARG DEPENDENCY=target/dependency\n" +
|
|
|
+ "ARG LIB=target/lib/*\n" +
|
|
|
+ "# 将jar包拷贝进来\n" +
|
|
|
+ "COPY ${JAR_FILE} /app/app.jar\n" +
|
|
|
+ "COPY ${LIB} /app/lib/\n" +
|
|
|
+ "# 将manifest文件拷贝进来\n" +
|
|
|
+ "COPY ${DEPENDENCY}/META-INF /app/META-INF\n" +
|
|
|
+ "\n" +
|
|
|
+ "EXPOSE 8081\n" +
|
|
|
+ "ENTRYPOINT [\"java\",\"-jar\",\"/app/app.jar\"]");
|
|
|
+ return param;
|
|
|
+ }
|
|
|
+}
|