Selaa lähdekoodia

获取最近几次 build 记录
app-config 用环境变量填充

Shifang Lei 7 vuotta sitten
vanhempi
commit
aa96df5662

+ 9 - 0
src/main/java/nju/seec/SEECdemo/data/dao/assignment/BuildRecordDAO.java

@@ -1,7 +1,16 @@
 package nju.seec.SEECdemo.data.dao.assignment;
 
 import nju.seec.SEECdemo.data.entity.assignment.BuildRecord;
+import nju.seec.SEECdemo.data.entity.assignment.CodeWorkResult;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
 
 public interface BuildRecordDAO extends JpaRepository<BuildRecord, Integer> {
+
+    @Query(value = "select * from ENTITY_BUILD_RECORD where code_work_result = ?1 order by build_time desc limit ?2",nativeQuery = true)
+    List<BuildRecord> findLatestNRecord(int codeWorkResultId, int limit);
+
+    BuildRecord findFirstByCodeWorkResultOrderByBuildTimeDesc(CodeWorkResult codeWorkResult);
 }

+ 22 - 14
src/main/java/nju/seec/SEECdemo/data/entity/assignment/BuildRecord.java

@@ -1,10 +1,10 @@
 package nju.seec.SEECdemo.data.entity.assignment;
 
 import lombok.Data;
-import nju.seec.SEECdemo.util.enums.BuildStatus;
+import nju.seec.SEECdemo.util.BuildState;
 
 import javax.persistence.*;
-import java.sql.Timestamp;
+import java.time.LocalDateTime;
 
 @Data
 @Entity
@@ -17,27 +17,35 @@ public class BuildRecord {
     private Integer id;
 
     @Basic
-    @Column(name = "number")
+    @Column(name = "number", nullable = false)
     private Integer number;
 
+    @Basic
+    @Column(name="branch_id", nullable = false)
+    private String branchId;
+
     @ManyToOne(targetEntity = CodeWorkResult.class, fetch = FetchType.LAZY)
-    @JoinColumn(name = "code_result", referencedColumnName = "id")
-    private CodeWorkResult codeResult;
+    @JoinColumn(name = "code_work_result", referencedColumnName = "id")
+    private CodeWorkResult codeWorkResult;
 
     @Basic
-    @Column(name = "build_time")
-    private Timestamp buildTime;
+    @Column(name = "build_time", nullable = false)
+    private LocalDateTime buildTime;
 
     @Basic
-    @Column(name = "console_output", columnDefinition = "LONGTEXT NOT NULL")
-    private String consoleOutput = "";
+    @Column(name = "build_message", columnDefinition = "LONGTEXT NOT NULL")
+    private String buildMessage = "";
 
     @Basic
-    @Column(name = "image_name")
-    private String imageName = "";
+    @Column(name = "commit_message", nullable = false)
+    private String commitMessage;
 
-    @Enumerated(EnumType.STRING)
-    @Column(name = "status", columnDefinition = "VARCHAR(255) NOT NULL DEFAULT 'WAITING'")
-    private BuildStatus buildStatus = BuildStatus.WAITING;
+    @Basic
+    @Column(name = "mirror_id")
+    private String mirrorId = "";
+
+    @Basic
+    @Column(name = "build_state", nullable = false)
+    private int buildState = BuildState.UN_COMMITTED;
 
 }

+ 2 - 2
src/main/java/nju/seec/SEECdemo/logic/api/impl/JenkinsApiImpl.java

@@ -73,7 +73,7 @@ public class JenkinsApiImpl implements JenkinsApi {
 			reference = server.getJob(String.valueOf(id)).build();
 		} else {
 			// 0.3.7版本的Jenkins客户端库中build(Map<String, String> params)方法存在BUG,会触发两次构建
-			reference = server.getJob(String.valueOf(id)+"-build").build(paramMap, false);
+			reference = server.getJob(id+"-build").build(paramMap, false);
 		}
 		QueueItem item = server.getQueueItem(reference);
 		while (item.getExecutable() == null) {
@@ -96,7 +96,7 @@ public class JenkinsApiImpl implements JenkinsApi {
 	public BuildDetails fetchBuildDetails(int id, int buildNumber, String target, boolean waitFinished) throws IOException {
 		BuildDetails result = new BuildDetails();
 		BuildWithDetails build;
-		build = server.getJob(String.valueOf(id)+"-build").getBuildByNumber(buildNumber).details();
+		build = server.getJob(id+"-build").getBuildByNumber(buildNumber).details();
 		while (waitFinished && (build.getResult() == null || build.getDuration() == 0)) {
 			try {
 				Thread.sleep(500);

+ 14 - 0
src/main/java/nju/seec/SEECdemo/logic/service/BuildService.java

@@ -0,0 +1,14 @@
+package nju.seec.SEECdemo.logic.service;
+
+import nju.seec.SEECdemo.web.dto.BuildRecordDTO;
+
+import java.util.List;
+
+public interface BuildService {
+
+    BuildRecordDTO getBuildRecord(int id);
+
+    List<BuildRecordDTO> getLastNRecord(int codeWorkResultId, int limit);
+
+    int getLatestBuildStatus(int codeWorkId);
+}

+ 16 - 17
src/main/java/nju/seec/SEECdemo/logic/service/impl/BuildManager.java

@@ -10,13 +10,13 @@ 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.BuildState;
 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.time.LocalDateTime;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -39,11 +39,11 @@ public class BuildManager {
 
     @SuppressWarnings("BooleanMethodIsAlwaysInverted")
     @Transactional
-    public boolean invokeNextBuild(int codeId,String commitHash) {
-        CodeWorkResult codeResult = codeResultDAO.findById(codeId);
+    public boolean invokeNextBuild(int codeResultId,String commitHash) {
+        CodeWorkResult codeResult = codeResultDAO.findById(codeResultId);
 		if (codeResult == null) return false;
         try {
-            QueueItem item = jenkinsApi.invokeBuild(codeId, buildParam(codeResult, commitHash));
+            QueueItem item = jenkinsApi.invokeBuild(codeResultId, buildParam(codeResult, commitHash));
             System.out.println(item.getExecutable().getNumber().intValue());
             return true;
         } catch (IOException e) {
@@ -70,27 +70,26 @@ public class BuildManager {
     @Transactional
     public boolean recordBuildResult(int codeId, int buildNumber, String imageName) {
 
-        System.out.println("id " + codeId + " buildNumber " + buildNumber);
-        CodeWorkResult codeResult = codeResultDAO.findById(codeId);
+        CodeWorkResult codeResult = codeResultDAO.findById(1);
         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.setBuildTime(LocalDateTime.now());
+            buildRecord.setBuildState(BuildState.BUILD_SUCCESS);
+            buildRecord.setBuildMessage(buildDetails.getConsoleOutput());
             buildRecord.setNumber(buildNumber);
-            buildRecord.setCodeResult(codeResult);
-            buildRecord.setImageName(imageName);
+            buildRecord.setCodeWorkResult(codeResult);
+            buildRecord.setMirrorId(imageName);
         }catch (Exception e) {
 			log.error("获取构建记录" + buildNumber + "时发生异常" + ToolKit.format(e));
-            buildRecord.setConsoleOutput("系统内部发生未知异常,请尝试重新提交!");
-            buildRecord.setBuildStatus(BuildStatus.FAILURE);
+            buildRecord.setBuildMessage("系统内部发生未知异常,请尝试重新提交!");
+            buildRecord.setBuildState(BuildState.BUILD_FAILURE);
 		} finally {
-			buildRecordDao.save(buildRecord);
-		}
+            buildRecordDao.save(buildRecord);
+        }
 
         return true;
     }
@@ -116,7 +115,7 @@ public class BuildManager {
 
         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("COMMIT_HASH", commitHash);
 		param.put("DOCKER_FILE", "#基于openjdk:8\n" +
                 "FROM openjdk:8-jdk-alpine\n" +
                 "\n" +

+ 45 - 0
src/main/java/nju/seec/SEECdemo/logic/service/impl/assignment/BuildServiceImpl.java

@@ -0,0 +1,45 @@
+package nju.seec.SEECdemo.logic.service.impl.assignment;
+
+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.service.BuildService;
+import nju.seec.SEECdemo.web.dto.BuildRecordDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class BuildServiceImpl implements BuildService {
+
+    private final CodeWorkResultDAO codeWorkResultDAO;
+    private final BuildRecordDAO buildRecordDAO;
+
+    @Autowired
+    public BuildServiceImpl(CodeWorkResultDAO codeWorkResultDAO,BuildRecordDAO buildRecordDAO) {
+        this.codeWorkResultDAO = codeWorkResultDAO;
+        this.buildRecordDAO = buildRecordDAO;
+    }
+
+    @Override
+    public BuildRecordDTO getBuildRecord(int id) {
+        return buildRecordDAO.findById(id).map((BuildRecord buildRecord) -> new BuildRecordDTO(buildRecord, false))
+                .get();
+    }
+
+    @Override
+    public List<BuildRecordDTO> getLastNRecord(int codeWorkResultId, int limit) {
+        return buildRecordDAO.findLatestNRecord(codeWorkResultId, limit).stream()
+                .map((BuildRecord buildRecord) -> new BuildRecordDTO(buildRecord, true)).collect(Collectors.toList());
+    }
+
+    @Override
+    public int getLatestBuildStatus(int codeWorkId) {
+        CodeWorkResult codeWorkResult = codeWorkResultDAO.getOne(codeWorkId);
+        BuildRecord buildRecord = buildRecordDAO.findFirstByCodeWorkResultOrderByBuildTimeDesc(codeWorkResult);
+        return buildRecord.getBuildState();
+    }
+}

+ 8 - 0
src/main/java/nju/seec/SEECdemo/util/BuildState.java

@@ -0,0 +1,8 @@
+package nju.seec.SEECdemo.util;
+
+public class BuildState {
+    public static final int BUILD_SUCCESS = 1;
+    public static final int BUILD_FAILURE = -1;
+    public static final int UN_COMMITTED = 0;
+
+}

+ 19 - 2
src/main/java/nju/seec/SEECdemo/web/dto/BuildRecordDTO.java

@@ -1,12 +1,29 @@
 package nju.seec.SEECdemo.web.dto;
 
 import lombok.Data;
+import nju.seec.SEECdemo.data.entity.assignment.BuildRecord;
+import org.springframework.beans.BeanUtils;
 
-import java.sql.Timestamp;
+import java.time.LocalDateTime;
 
 @Data
 public class BuildRecordDTO {
 
+    public BuildRecordDTO(BuildRecord buildRecord, boolean simpleMap) {
+        if (simpleMap) {
+            this.id = buildRecord.getId();
+            this.buildTime = buildRecord.getBuildTime();
+            this.buildState = buildRecord.getBuildState();
+        } else {
+            BeanUtils.copyProperties(buildRecord, this);
+        }
+    }
+
     private int id;
-    private Timestamp buildTime;
+    private String branchId;
+    private LocalDateTime buildTime;
+    private int buildState;
+    private String buildMessage;
+    private String mirrorId;
+    private String commitMessage;
 }

+ 9 - 0
src/main/resources/jenkins/app-config.yml

@@ -0,0 +1,9 @@
+server:
+  port: ${APP_PORT}
+spring:
+  datasource:
+    url: jdbc:mysql://${DB_URL}/${DB_SCHEMA}?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false
+    username: ${DB_USERNAME}
+    password: ${DB_PASSWORD}
+  jpa:
+    database-platform: org.hibernate.dialect.MySQL57InnoDBDialect