com.liferay.jenkins.results.parser.metrics.BuildHistoryReport Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of com.liferay.jenkins.results.parser
Show all versions of com.liferay.jenkins.results.parser
Liferay Jenkins Results Parser
The newest version!
/**
* SPDX-FileCopyrightText: (c) 2023 Liferay, Inc. https://liferay.com
* SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
*/
package com.liferay.jenkins.results.parser.metrics;
import com.liferay.jenkins.results.parser.JenkinsResultsParserUtil;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
import org.apache.commons.io.FileUtils;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* @author Kenji Heigel
*/
public class BuildHistoryReport {
public static BuildHistoryReport newAggregateReport(
long durationDays, File outputDir, String startDateString) {
BuildHistoryReport buildHistoryReport = new BuildHistoryReport(
outputDir);
buildHistoryReport.addFilesFromResource(
"dependencies/metrics/aggregate-report", "/index.html");
long startTime = _getStartTime(startDateString);
long duration = TimeUnit.DAYS.toMillis(durationDays);
Collection buildHistories =
BuildHistoryProcessor.newAggregateJobHistories(duration, startTime);
buildHistoryReport.addFile(
"js/table-data.js",
_getTableDataJSFileContent(
buildHistories, "Job Category", 1, "[Total]"));
buildHistoryReport.addFile(
"js/timeline-data.js",
_getTimelineDataJSFileContent(buildHistories, duration, startTime));
return buildHistoryReport;
}
public static BuildHistoryReport newPullRequestTestSuiteReport(
long durationDays, File outputDir, String startDateString) {
return _newTestSuiteReport(
durationDays, _portalMasterPullRequestJobNamePattern, outputDir,
"liferay-portal/master Pull Request History Report",
startDateString);
}
public static BuildHistoryReport newReleaseTestSuiteReport(
long durationDays, File outputDir, String startDateString) {
return _newTestSuiteReport(
durationDays, _portalReleaseJobNamePattern, outputDir,
"Portal Release History Report", startDateString);
}
public static BuildHistoryReport newUpstreamTestSuiteReport(
long durationDays, File outputDir, String startDateString) {
return _newTestSuiteReport(
durationDays, _portalMasterUpstreamJobNamePattern, outputDir,
"liferay-portal/master Upstream History Report", startDateString);
}
public static BuildHistoryReport newUtilizationReport(
long durationDays, File outputDir, String startDateString) {
BuildHistoryReport buildHistoryReport = new BuildHistoryReport(
outputDir);
buildHistoryReport.addFilesFromResource(
"dependencies/metrics/utilization-report", "/index.html");
Collection buildHistories =
BuildHistoryProcessor.newUtilizationBuildHistories(
TimeUnit.DAYS.toMillis(durationDays),
_getStartTime(startDateString));
StringBuilder sb = new StringBuilder();
sb.append(
_getTableDataJSFileContent(buildHistories, "Category", 7, "All"));
sb.append("\nvar reportName = \"Utilization Report\";");
buildHistoryReport.addFile("js/table-data.js", sb.toString());
return buildHistoryReport;
}
public BuildHistoryReport(File outputDir) {
_outputDir = outputDir;
}
public void addFile(String fileName, String fileContent) {
_fileMap.put(new File(_outputDir, fileName), fileContent);
}
public void addFilesFromResource(
String resourceDirPath, String... fileNames) {
for (String fileName : fileNames) {
try {
addFile(
fileName,
JenkinsResultsParserUtil.getResourceFileContent(
resourceDirPath + fileName));
}
catch (IOException ioException) {
System.out.println(
"Unable to get file content from resource: " +
resourceDirPath + fileName);
}
}
}
public void write() throws IOException {
FileUtils.deleteDirectory(_outputDir);
for (Map.Entry entry : _fileMap.entrySet()) {
File file = entry.getKey();
String filePath = file.getCanonicalPath();
if (filePath.contains(".html")) {
System.out.println("Report created at: file://" + filePath);
}
JenkinsResultsParserUtil.write(entry.getKey(), entry.getValue());
}
}
private static LocalDateTime _getLocalDateTime(String startDateString) {
return LocalDateTime.parse(
startDateString + " 00:00:00",
DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss"));
}
private static long _getStartTime(String startDateString) {
return JenkinsResultsParserUtil.getMillis(
_getLocalDateTime(startDateString));
}
private static String _getTableDataJSFileContent(
Collection buildHistories, String groupIdentifierName,
int intervalDays, String mergedBuildHistoryName) {
JSONArray jsonArray = new JSONArray();
boolean removeHeader = false;
for (BuildHistory buildHistory : buildHistories) {
JSONArray tableJSONArray = buildHistory.getTableJSONArray(
groupIdentifierName, intervalDays);
if (removeHeader) {
tableJSONArray.remove(0);
}
else {
removeHeader = true;
}
jsonArray.putAll(tableJSONArray);
}
if (mergedBuildHistoryName != null) {
BuildHistory mergedBuildHistory =
BuildHistoryProcessor.mergeBuildHistories(
buildHistories, mergedBuildHistoryName);
JSONArray tableJSONArray = mergedBuildHistory.getTableJSONArray(
groupIdentifierName, intervalDays);
tableJSONArray.remove(0);
jsonArray.putAll(tableJSONArray);
}
return "var tableData = " + jsonArray.toString();
}
private static String _getTimelineDataJSFileContent(
Collection buildHistories, long duration,
long startTime) {
JSONObject jsonObject = new JSONObject();
JSONArray jsonArray = new JSONArray();
for (BuildHistory buildHistory : buildHistories) {
jsonArray.put(buildHistory.getTimelineJSONObject());
}
jsonObject.put(
"jobTimelines", jsonArray
).put(
"time", BuildHistory.getTimeJSONArray(duration, startTime)
);
return "var timelineData = " + jsonObject.toString();
}
private static BuildHistoryReport _newTestSuiteReport(
long durationDays, Pattern jobNamePattern, File outputDir,
String reportName, String startDateString) {
BuildHistoryReport buildHistoryReport = new BuildHistoryReport(
outputDir);
buildHistoryReport.addFilesFromResource(
"dependencies/metrics/test-suite-report", "/index.html");
long duration = TimeUnit.DAYS.toMillis(durationDays);
Collection buildHistories =
BuildHistoryProcessor.newTestSuiteJobHistories(
duration, jobNamePattern, _getStartTime(startDateString));
StringBuilder sb = new StringBuilder();
sb.append(
_getTableDataJSFileContent(
buildHistories, "Test Suite Name", 1, "[Total]"));
sb.append("\nvar reportName = \"");
sb.append(reportName);
sb.append("\";");
buildHistoryReport.addFile("js/table-data.js", sb.toString());
return buildHistoryReport;
}
private static final Pattern _portalMasterPullRequestJobNamePattern =
Pattern.compile(
"test-portal-acceptance-pullrequest(|-downstream)\\(master\\)");
private static final Pattern _portalMasterUpstreamJobNamePattern =
Pattern.compile(
"test-portal-(acceptance-upstream-dxp|testsuite-upstream)" +
"(|-downstream)\\(master\\)");
private static final Pattern _portalReleaseJobNamePattern = Pattern.compile(
"test-portal(|-fixpack|-hotfix)-release(|-downstream)");
private final Map _fileMap = new HashMap<>();
private final File _outputDir;
}