| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- 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;
- }
- }
|