소스 검색

release version 0.2.0

TianChenjiang 4 년 전
부모
커밋
374f3de86c

+ 2 - 2
pom.xml

@@ -12,14 +12,14 @@
     <groupId>cn.seecoder</groupId>
     <artifactId>seecoder-build</artifactId>
     <packaging>pom</packaging>
-    <version>0.1.4</version>
+    <version>0.2.0</version>
     <modules>
         <module>seecoder-build-client</module>
         <module>seecoder-build-server</module>
         <module>seecoder-build-common</module>
     </modules>
     <properties>
-        <seecoder-build-version>0.1.4</seecoder-build-version>
+        <seecoder-build-version>0.2.0</seecoder-build-version>
     </properties>
     <dependencyManagement>
         <dependencies>

+ 1 - 1
seecoder-build-client/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>seecoder-build</artifactId>
         <groupId>cn.seecoder</groupId>
-        <version>0.1.4</version>
+        <version>0.2.0</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 1 - 1
seecoder-build-common/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>seecoder-build</artifactId>
         <groupId>cn.seecoder</groupId>
-        <version>0.1.4</version>
+        <version>0.2.0</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 8 - 6
seecoder-build-common/src/main/java/cn/seecoder/build/model/vo/BuildDetailsVO.java

@@ -1,9 +1,7 @@
 package cn.seecoder.build.model.vo;
 
 
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.offbytwo.jenkins.model.Artifact;
 import com.offbytwo.jenkins.model.BuildResult;
 import com.offbytwo.jenkins.model.TestResult;
@@ -15,6 +13,7 @@ import java.util.List;
 
 @Data
 @ToString(exclude = "consoleOutput")
+@JsonInclude(JsonInclude.Include.NON_NULL)
 public class BuildDetailsVO implements Serializable {
 
     private String jobName;
@@ -31,8 +30,11 @@ public class BuildDetailsVO implements Serializable {
 
     private Long timestamps;
 
-    // 目前只返回test类型问题的结果,对于Coverage和Mutation暂未解决
-    @JsonIgnoreProperties({"client", "_class"})
-    private TestResult testResult;
+    //由于 com.offbytwo.jenkins.model.TestResult 继承了BaseModel,并且无法把其中的client属性序列化,因此这里用VO来对TestResult做了转换
+    private TestResultVO testResultVO;
+
+    private CoverageResult coverageResult;
+
+    private MutationResult mutationResult;
 
 }

+ 30 - 0
seecoder-build-common/src/main/java/cn/seecoder/build/model/vo/CoverageResult.java

@@ -0,0 +1,30 @@
+package cn.seecoder.build.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.offbytwo.jenkins.model.BaseModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.util.List;
+
+@Setter
+@EqualsAndHashCode(callSuper = true)
+@ToString
+@JsonIgnoreProperties({"client", "_class"})
+public class CoverageResult extends BaseModel {
+    private Results results;
+
+    public List<CoverageResultElement> getElements() {
+        return results.getElements();
+    }
+
+    @Data
+    @EqualsAndHashCode
+    @ToString
+    private static class Results {
+        private List<CoverageResultElement> elements;
+    }
+}

+ 11 - 0
seecoder-build-common/src/main/java/cn/seecoder/build/model/vo/CoverageResultElement.java

@@ -0,0 +1,11 @@
+package cn.seecoder.build.model.vo;
+
+import lombok.Data;
+
+@Data
+public class CoverageResultElement {
+    private String name;
+    private int numerator;
+    private int denominator;
+    private int ratio;
+}

+ 9 - 0
seecoder-build-common/src/main/java/cn/seecoder/build/model/vo/MutationResult.java

@@ -0,0 +1,9 @@
+package cn.seecoder.build.model.vo;
+
+import lombok.Data;
+
+@Data
+public class MutationResult {
+    private int mutations;
+    private int detectedMutations;
+}

+ 26 - 0
seecoder-build-common/src/main/java/cn/seecoder/build/model/vo/TestResultVO.java

@@ -0,0 +1,26 @@
+package cn.seecoder.build.model.vo;
+
+import com.offbytwo.jenkins.model.TestSuites;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author mars
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+public class TestResultVO implements Serializable {
+    private Double duration;
+    private Boolean empty;
+    private Integer failCount;
+    private Integer passCount;
+    private Integer skipCount;
+    private List<TestSuites> suites;
+}

+ 1 - 1
seecoder-build-server/pom.xml

@@ -18,7 +18,7 @@
     <parent>
         <groupId>cn.seecoder</groupId>
         <artifactId>seecoder-build</artifactId>
-        <version>0.1.4</version>
+        <version>0.2.0</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 

+ 46 - 2
seecoder-build-server/src/main/java/cn/seecoder/build/server/service/impl/JobServiceImpl.java

@@ -1,16 +1,23 @@
 package cn.seecoder.build.server.service.impl;
 
 import cn.seecoder.build.model.vo.BuildDetailsVO;
+import cn.seecoder.build.model.vo.CoverageResult;
+import cn.seecoder.build.model.vo.MutationResult;
 import cn.seecoder.build.model.vo.PipelineVO;
 import cn.seecoder.build.server.data.dao.PipelineDAO;
 import cn.seecoder.build.server.data.entity.Pipeline;
 import cn.seecoder.build.server.service.JobService;
 import cn.seecoder.build.server.service.facade.jenkins.JenkinsApi;
 import cn.seecoder.build.server.service.model.converter.PipelineConverter;
+import cn.seecoder.build.server.service.model.converter.TestResultConvertor;
 import cn.seecoder.build.server.util.ServiceException;
+import com.offbytwo.jenkins.model.Artifact;
 import com.offbytwo.jenkins.model.BuildWithDetails;
 import com.offbytwo.jenkins.model.QueueItem;
+import com.offbytwo.jenkins.model.TestResult;
+import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.commons.lang3.RandomStringUtils;
+import org.dom4j.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -18,6 +25,8 @@ import org.springframework.util.StringUtils;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URISyntaxException;
+import java.util.List;
 import java.util.Map;
 
 @Service
@@ -64,9 +73,9 @@ public class JobServiceImpl implements JobService {
                 buildDetailsVO.setResult(buildWithDetails.getResult());
                 buildDetailsVO.setTimestamps(buildWithDetails.getTimestamp());
                 buildDetailsVO.setArtifacts(buildWithDetails.getArtifacts());
-                buildDetailsVO.setTestResult(buildWithDetails.getTestResult());
+                fetchBuildResult(buildWithDetails, buildDetailsVO);
                 return buildDetailsVO;
-            } catch (IOException e) {
+            } catch (IOException  | DocumentException | URISyntaxException e) {
                 throw ServiceException.BAD_REQUEST;
             }
         }
@@ -105,4 +114,39 @@ public class JobServiceImpl implements JobService {
         QueueItem item = jenkinsApi.invokeBuild(jobName, params);
         return item.getExecutable().getNumber().intValue();
     }
+
+    private void fetchBuildResult(BuildWithDetails buildWithDetails, BuildDetailsVO buildDetailsVO) throws IOException, URISyntaxException, DocumentException {
+        TestResult testResult = buildWithDetails.getTestResult();
+        if (testResult != null) {
+            buildDetailsVO.setTestResultVO(TestResultConvertor.convertToVO(buildWithDetails.getTestResult()));
+            return;
+        }
+        CoverageResult coverageResult = buildWithDetails.getClient().get(buildWithDetails.getUrl() + "/cobertura/?depth=2", CoverageResult.class);
+        if (coverageResult != null) {
+            buildDetailsVO.setCoverageResult(coverageResult);
+        } else {
+            List<Artifact> artifactList = buildWithDetails.getArtifacts();
+            Artifact artifact = artifactList.stream().filter(a -> a.getFileName().equals("mutations.xml")).findFirst().orElse(null);
+            if (artifact != null) {
+                MutationResult mutationResult = new MutationResult();
+                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+                outputStream.write(buildWithDetails.downloadArtifact(artifact));
+                String mutationReport = new String(outputStream.toByteArray());
+                Document document = DocumentHelper.parseText(mutationReport);
+                Element root = document.getRootElement();
+                for (Object element : root.elements("mutation")) {
+                    if (element instanceof Element) {
+                        Attribute attribute = ((Element) element).attribute("detected");
+                        if (attribute != null) {
+                            mutationResult.setMutations(mutationResult.getMutations() + 1);
+                            if ("true".equals(attribute.getValue())) {
+                                mutationResult.setDetectedMutations(mutationResult.getDetectedMutations() + 1);
+                            }
+                        }
+                    }
+                }
+                buildDetailsVO.setMutationResult(mutationResult);
+            }
+        }
+    }
 }

+ 17 - 0
seecoder-build-server/src/main/java/cn/seecoder/build/server/service/model/converter/TestResultConvertor.java

@@ -0,0 +1,17 @@
+package cn.seecoder.build.server.service.model.converter;
+
+import cn.seecoder.build.model.vo.BuildDetailsVO;
+import cn.seecoder.build.model.vo.TestResultVO;
+import com.offbytwo.jenkins.model.TestResult;
+import org.springframework.beans.BeanUtils;
+
+/**
+ * @author mars
+ */
+public class TestResultConvertor {
+    public static TestResultVO convertToVO(TestResult testResult)  {
+        TestResultVO testResultVO = new TestResultVO();
+        BeanUtils.copyProperties(testResult, testResultVO);
+        return testResultVO;
+    }
+}