com.liferay.jenkins.results.parser.GenerateReportsControllerBuildRunner 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;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
/**
* @author Kenji Heigel
*/
public class GenerateReportsControllerBuildRunner
extends BaseBuildRunner {
@Override
public Workspace getWorkspace() {
if (_workspace != null) {
return _workspace;
}
_workspace = WorkspaceFactory.newWorkspace();
return _workspace;
}
@Override
public void run() {
invokeGenerateReportsBuild();
}
@Override
public void tearDown() {
}
protected GenerateReportsControllerBuildRunner(BuildData buildData) {
super(buildData);
}
protected void invokeGenerateReportsBuild() {
List reportNames = _getSelectedReportNames();
if (reportNames.isEmpty()) {
System.out.println("There are no reports to create at this time.");
keepJenkinsBuild(false);
return;
}
Properties buildProperties = null;
try {
buildProperties = JenkinsResultsParserUtil.getBuildProperties();
}
catch (IOException ioException) {
throw new RuntimeException(ioException);
}
StringBuilder sb = new StringBuilder();
String jenkinsMasterName = buildProperties.getProperty(
"report.generate.reports.jenkins.master");
String jobURL = "http://" + jenkinsMasterName + "/job/generate-reports";
sb.append(jobURL);
sb.append("/buildWithParameters?token=");
sb.append(buildProperties.getProperty("jenkins.authentication.token"));
Map invocationParameters = new HashMap<>();
BuildData buildData = getBuildData();
invocationParameters.put(
"JENKINS_GITHUB_URL", buildData.getJenkinsGitHubURL());
Collections.sort(reportNames);
invocationParameters.put("REPORT_NAMES", String.join(",", reportNames));
for (Map.Entry invocationParameter :
invocationParameters.entrySet()) {
String invocationParameterValue = invocationParameter.getValue();
if (JenkinsResultsParserUtil.isNullOrEmpty(
invocationParameterValue)) {
continue;
}
sb.append("&");
sb.append(invocationParameter.getKey());
sb.append("=");
sb.append(invocationParameterValue);
}
try {
JenkinsResultsParserUtil.toString(sb.toString());
System.out.println(
"The following reports will be generated at: " + jobURL);
for (String reportName : reportNames) {
System.out.println(reportName);
}
}
catch (IOException ioException) {
System.out.println(
"Unable to invoke a new build to generate reports");
ioException.printStackTrace();
}
_updateBuildDescription(reportNames);
}
private String _getBuildDescription(Build build) {
String buildDescription = build.getBuildDescription();
if (buildDescription == null) {
return "";
}
return buildDescription;
}
private List _getBuildHistory() {
BuildData buildData = getBuildData();
Build build = BuildFactory.newBuild(buildData.getBuildURL(), null);
Job job = JobFactory.newJob(buildData.getJobName());
return job.getBuildHistory(build.getJenkinsMaster());
}
private Map _getLatestReportUpdateTimes() {
Map latestReportUpdateTimes = new HashMap<>();
List builds = _getBuildHistory();
BuildData buildData = getBuildData();
Build currentBuild = BuildFactory.newBuild(
buildData.getBuildURL(), null);
builds.remove(currentBuild);
for (GenerateReportsBuildRunner.Report report :
GenerateReportsBuildRunner.Report.values()) {
String reportName = report.toString();
for (Build build : builds) {
String buildDescription = _getBuildDescription(build);
if (buildDescription.contains(reportName)) {
latestReportUpdateTimes.put(
reportName, build.getStartTime());
break;
}
}
}
for (GenerateReportsBuildRunner.Report report :
GenerateReportsBuildRunner.Report.values()) {
String reportName = report.toString();
long defaultStartTime =
buildData.getStartTime() - _getReportStaleDuration(reportName);
if (!latestReportUpdateTimes.containsKey(reportName)) {
latestReportUpdateTimes.put(reportName, defaultStartTime);
}
}
return latestReportUpdateTimes;
}
private long _getReportStaleDuration(String reportName) {
Properties buildProperties;
try {
buildProperties = JenkinsResultsParserUtil.getBuildProperties();
}
catch (IOException ioException) {
throw new RuntimeException(ioException);
}
String reportStaleDuration = buildProperties.getProperty(
JenkinsResultsParserUtil.combine(
"report.stale.duration[", reportName, "]"));
if (reportStaleDuration == null) {
return _DEFAULT_REPORT_STALE_DURATION;
}
return TimeUnit.MINUTES.toMillis(Long.parseLong(reportStaleDuration));
}
private List _getSelectedReportNames() {
if (_selectedReportNames != null) {
return _selectedReportNames;
}
_selectedReportNames = new ArrayList<>();
Map latestReportUpdateTimes =
_getLatestReportUpdateTimes();
BuildData buildData = getBuildData();
long startTime = buildData.getStartTime();
for (Map.Entry entry :
latestReportUpdateTimes.entrySet()) {
String reportName = entry.getKey();
long reportStaleDuration = startTime - entry.getValue();
if (reportStaleDuration >= _getReportStaleDuration(reportName)) {
System.out.println(
JenkinsResultsParserUtil.combine(
reportName, " was last generated ",
JenkinsResultsParserUtil.toDurationString(
reportStaleDuration),
" ago which exceeds the stale duration of ",
JenkinsResultsParserUtil.toDurationString(
_getReportStaleDuration(reportName))));
_selectedReportNames.add(reportName);
}
}
return _selectedReportNames;
}
private void _updateBuildDescription(List reportNames) {
StringBuilder sb = new StringBuilder();
for (String reportName : reportNames) {
sb.append(reportName);
sb.append(" - ");
}
sb.setLength(sb.length() - 3);
BuildData buildData = getBuildData();
buildData.setBuildDescription(sb.toString());
updateBuildDescription();
}
private static final long _DEFAULT_REPORT_STALE_DURATION = 1440 * 60 * 1000;
private List _selectedReportNames;
private Workspace _workspace;
}