|
@@ -1,16 +1,23 @@
|
|
|
package cn.seecoder.build.server.service.impl;
|
|
package cn.seecoder.build.server.service.impl;
|
|
|
|
|
|
|
|
import cn.seecoder.build.model.vo.BuildDetailsVO;
|
|
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.model.vo.PipelineVO;
|
|
|
import cn.seecoder.build.server.data.dao.PipelineDAO;
|
|
import cn.seecoder.build.server.data.dao.PipelineDAO;
|
|
|
import cn.seecoder.build.server.data.entity.Pipeline;
|
|
import cn.seecoder.build.server.data.entity.Pipeline;
|
|
|
import cn.seecoder.build.server.service.JobService;
|
|
import cn.seecoder.build.server.service.JobService;
|
|
|
import cn.seecoder.build.server.service.facade.jenkins.JenkinsApi;
|
|
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.PipelineConverter;
|
|
|
|
|
+import cn.seecoder.build.server.service.model.converter.TestResultConvertor;
|
|
|
import cn.seecoder.build.server.util.ServiceException;
|
|
import cn.seecoder.build.server.util.ServiceException;
|
|
|
|
|
+import com.offbytwo.jenkins.model.Artifact;
|
|
|
import com.offbytwo.jenkins.model.BuildWithDetails;
|
|
import com.offbytwo.jenkins.model.BuildWithDetails;
|
|
|
import com.offbytwo.jenkins.model.QueueItem;
|
|
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.apache.commons.lang3.RandomStringUtils;
|
|
|
|
|
+import org.dom4j.*;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
import org.springframework.util.CollectionUtils;
|
|
@@ -18,6 +25,8 @@ import org.springframework.util.StringUtils;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
import java.io.InputStream;
|
|
import java.io.InputStream;
|
|
|
|
|
+import java.net.URISyntaxException;
|
|
|
|
|
+import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
@Service
|
|
@Service
|
|
@@ -64,9 +73,9 @@ public class JobServiceImpl implements JobService {
|
|
|
buildDetailsVO.setResult(buildWithDetails.getResult());
|
|
buildDetailsVO.setResult(buildWithDetails.getResult());
|
|
|
buildDetailsVO.setTimestamps(buildWithDetails.getTimestamp());
|
|
buildDetailsVO.setTimestamps(buildWithDetails.getTimestamp());
|
|
|
buildDetailsVO.setArtifacts(buildWithDetails.getArtifacts());
|
|
buildDetailsVO.setArtifacts(buildWithDetails.getArtifacts());
|
|
|
- buildDetailsVO.setTestResult(buildWithDetails.getTestResult());
|
|
|
|
|
|
|
+ fetchBuildResult(buildWithDetails, buildDetailsVO);
|
|
|
return buildDetailsVO;
|
|
return buildDetailsVO;
|
|
|
- } catch (IOException e) {
|
|
|
|
|
|
|
+ } catch (IOException | DocumentException | URISyntaxException e) {
|
|
|
throw ServiceException.BAD_REQUEST;
|
|
throw ServiceException.BAD_REQUEST;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -105,4 +114,39 @@ public class JobServiceImpl implements JobService {
|
|
|
QueueItem item = jenkinsApi.invokeBuild(jobName, params);
|
|
QueueItem item = jenkinsApi.invokeBuild(jobName, params);
|
|
|
return item.getExecutable().getNumber().intValue();
|
|
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);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|