From 1b39dd5afbaacec4ce7a5be7c39a01f69d4e694a Mon Sep 17 00:00:00 2001 From: David Georg Reichelt Date: Wed, 11 Jan 2023 17:09:57 +0100 Subject: [PATCH 01/30] Mark builds as unstable where root node measured NaN --- .../de/dagere/peass/ci/rca/RCAVisualizer.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java b/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java index 3ff69375..6525a3f2 100644 --- a/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java +++ b/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java @@ -22,10 +22,12 @@ import de.dagere.peass.ci.helper.VisualizationFolderManager; import de.dagere.peass.config.MeasurementConfig; import de.dagere.peass.dependency.analysis.testData.TestMethodCall; +import de.dagere.peass.measurement.rca.data.CauseSearchData; import de.dagere.peass.utils.Constants; import de.dagere.peass.vcs.CommitList; import de.dagere.peass.vcs.GitCommit; import de.dagere.peass.visualization.VisualizeRCAStarter; +import hudson.model.Result; import hudson.model.Run; public class RCAVisualizer { @@ -89,6 +91,11 @@ private void createVisualizationActions(final File rcaResults, final Changes com LOG.info("Creating actions: " + commitChanges.getTestcaseChanges().size()); for (Entry> testcases : commitChanges.getTestcaseChanges().entrySet()) { for (Change change : testcases.getValue()) { + TestMethodCall testCall = TestMethodCall.createFromString(testcases.getKey()); + String commit = measurementConfig.getFixedCommitConfig().getCommit(); + File rcaTreeFile = visualizationFolders.getPeassRCAFolders().getRcaTreeFile(commit, testCall); + setUnstableIfNaNInRCA(rcaTreeFile); + RCAMetadata metadata = new RCAMetadata(change, testcases, peassConfig.getMeasurementConfig().getFixedCommitConfig(), rcaResults); File jsFile = new File(commitVisualizationFolder, metadata.getFileName() + ".js"); LOG.info("Trying to copy {} Exists: {}", jsFile.getAbsolutePath(), jsFile.exists()); @@ -101,6 +108,18 @@ private void createVisualizationActions(final File rcaResults, final Changes com } } } + + private void setUnstableIfNaNInRCA(final File rcaTreeFile) throws IOException { + if (rcaTreeFile.exists()) { + CauseSearchData data = Constants.OBJECTMAPPER.readValue(rcaTreeFile, CauseSearchData.class); + if (Double.isNaN(data.getNodes().getStatistic().getMeanCurrent()) || + Double.isNaN(data.getNodes().getStatistic().getMeanOld())) { + if (run.getResult() == Result.SUCCESS) { + run.setResult(Result.UNSTABLE); + } + } + } + } public void createRCAAction(final String longestPrefix, final Entry> testcases, final Change change, RCAMetadata metadata) throws IOException { From 8c66f0a53c7542b55ab084b4509c5b1884ce4900 Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Wed, 18 Jan 2023 13:09:33 +0100 Subject: [PATCH 02/30] Use TestMethodCall.createFromClassString instead of TestMethodCall.createFromString to avoid setting method to null --- .../de/dagere/peass/ci/rca/RCAVisualizer.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java b/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java index 6525a3f2..9d0fc557 100644 --- a/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java +++ b/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java @@ -90,12 +90,12 @@ private void createVisualizationActions(final File rcaResults, final Changes com LOG.info("Creating actions: " + commitChanges.getTestcaseChanges().size()); for (Entry> testcases : commitChanges.getTestcaseChanges().entrySet()) { + final String clazzname = testcases.getKey(); for (Change change : testcases.getValue()) { - TestMethodCall testCall = TestMethodCall.createFromString(testcases.getKey()); - String commit = measurementConfig.getFixedCommitConfig().getCommit(); - File rcaTreeFile = visualizationFolders.getPeassRCAFolders().getRcaTreeFile(commit, testCall); + + final File rcaTreeFile = getRcaTreeFile(clazzname, change); setUnstableIfNaNInRCA(rcaTreeFile); - + RCAMetadata metadata = new RCAMetadata(change, testcases, peassConfig.getMeasurementConfig().getFixedCommitConfig(), rcaResults); File jsFile = new File(commitVisualizationFolder, metadata.getFileName() + ".js"); LOG.info("Trying to copy {} Exists: {}", jsFile.getAbsolutePath(), jsFile.exists()); @@ -108,7 +108,15 @@ private void createVisualizationActions(final File rcaResults, final Changes com } } } - + + private File getRcaTreeFile(final String clazzname, final Change change) { + final String methodName = change.getMethod(); + final TestMethodCall testCall = TestMethodCall.createFromClassString(clazzname, methodName); + final String commit = measurementConfig.getFixedCommitConfig().getCommit(); + final File rcaTreeFile = visualizationFolders.getPeassRCAFolders().getRcaTreeFile(commit, testCall); + return rcaTreeFile; + } + private void setUnstableIfNaNInRCA(final File rcaTreeFile) throws IOException { if (rcaTreeFile.exists()) { CauseSearchData data = Constants.OBJECTMAPPER.readValue(rcaTreeFile, CauseSearchData.class); @@ -131,14 +139,15 @@ public void createRCAAction(final String longestPrefix, final Entry Date: Wed, 18 Jan 2023 13:23:56 +0100 Subject: [PATCH 03/30] Also check if run.getResult() == null --- .../de/dagere/peass/ci/rca/RCAVisualizer.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java b/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java index 9d0fc557..fc2075a0 100644 --- a/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java +++ b/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java @@ -23,6 +23,7 @@ import de.dagere.peass.config.MeasurementConfig; import de.dagere.peass.dependency.analysis.testData.TestMethodCall; import de.dagere.peass.measurement.rca.data.CauseSearchData; +import de.dagere.peass.measurement.statistics.data.TestcaseStatistic; import de.dagere.peass.utils.Constants; import de.dagere.peass.vcs.CommitList; import de.dagere.peass.vcs.GitCommit; @@ -120,15 +121,24 @@ private File getRcaTreeFile(final String clazzname, final Change change) { private void setUnstableIfNaNInRCA(final File rcaTreeFile) throws IOException { if (rcaTreeFile.exists()) { CauseSearchData data = Constants.OBJECTMAPPER.readValue(rcaTreeFile, CauseSearchData.class); - if (Double.isNaN(data.getNodes().getStatistic().getMeanCurrent()) || - Double.isNaN(data.getNodes().getStatistic().getMeanOld())) { - if (run.getResult() == Result.SUCCESS) { - run.setResult(Result.UNSTABLE); - } + final boolean meanOldOrCurrentIsNaN = checkMeanOldOrCurrentIsNaN(data.getNodes().getStatistic()); + final boolean resultIsNullOrSuccess = checkResultIsNullOrSuccess(); + + if (meanOldOrCurrentIsNaN && resultIsNullOrSuccess) { + run.setResult(Result.UNSTABLE); } } } + private boolean checkMeanOldOrCurrentIsNaN(final TestcaseStatistic testcaseStatistic) { + return Double.isNaN(testcaseStatistic.getMeanCurrent()) || + Double.isNaN(testcaseStatistic.getMeanOld()); + } + + private boolean checkResultIsNullOrSuccess() { + return run.getResult() == null || run.getResult() == Result.SUCCESS; + } + public void createRCAAction(final String longestPrefix, final Entry> testcases, final Change change, RCAMetadata metadata) throws IOException { final File rcaDestFile = metadata.getRCAMainFile(); From 3452252bea9dedf712dd356e43f24a9a1f5b4939 Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Wed, 18 Jan 2023 13:33:37 +0100 Subject: [PATCH 04/30] Added message if unstable because of meanOldOrCurrentIsNaN --- src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java b/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java index fc2075a0..6fdf2f76 100644 --- a/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java +++ b/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java @@ -126,6 +126,7 @@ private void setUnstableIfNaNInRCA(final File rcaTreeFile) throws IOException { if (meanOldOrCurrentIsNaN && resultIsNullOrSuccess) { run.setResult(Result.UNSTABLE); + LOG.warn("NaN for meanOld or meanCurrent was found in {}! Set buildstate to unstable.", rcaTreeFile.getAbsolutePath()); } } } From 7c36e41369d037943515c792c67ed1a17aae36a9 Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Wed, 18 Jan 2023 14:09:05 +0100 Subject: [PATCH 05/30] Cleaned up RCAVisualizer --- .../de/dagere/peass/ci/rca/RCAVisualizer.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java b/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java index 6fdf2f76..7e4a68ac 100644 --- a/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java +++ b/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java @@ -10,9 +10,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.fasterxml.jackson.core.exc.StreamReadException; -import com.fasterxml.jackson.databind.DatabindException; - import de.dagere.peass.analysis.changes.Change; import de.dagere.peass.analysis.changes.Changes; import de.dagere.peass.analysis.changes.ProjectChanges; @@ -60,7 +57,7 @@ public RCAVisualizer(final PeassProcessConfiguration peassConfig, final Visualiz mapping = readMapping; } - public void visualizeRCA() throws Exception { + public void visualizeRCA() throws IOException { final File visualizationFolder = visualizationFolders.getVisualizationFolder(); VisualizeRCAStarter visualizer = preparePeassVisualizer(visualizationFolder); @@ -80,7 +77,7 @@ private VisualizeRCAStarter preparePeassVisualizer(final File resultFolder) { File dataFolder = visualizationFolders.getDataFolder(); visualizer.setData(new File[] { dataFolder }); File propertyFolder = visualizationFolders.getPropertyFolder(); - LOG.info("Setting property folder: " + propertyFolder); + LOG.info("Setting property folder: {}", propertyFolder); visualizer.setPropertyFolder(propertyFolder); visualizer.setResultFolder(resultFolder); return visualizer; @@ -89,7 +86,7 @@ private VisualizeRCAStarter preparePeassVisualizer(final File resultFolder) { private void createVisualizationActions(final File rcaResults, final Changes commitChanges, final File commitVisualizationFolder) throws IOException { String longestPrefix = getLongestPrefix(commitChanges.getTestcaseChanges().keySet()); - LOG.info("Creating actions: " + commitChanges.getTestcaseChanges().size()); + LOG.info("Creating actions: {}", commitChanges.getTestcaseChanges().size()); for (Entry> testcases : commitChanges.getTestcaseChanges().entrySet()) { final String clazzname = testcases.getKey(); for (Change change : testcases.getValue()) { @@ -104,7 +101,7 @@ private void createVisualizationActions(final File rcaResults, final Changes com metadata.copyFiles(commitVisualizationFolder); createRCAAction(longestPrefix, testcases, change, metadata); } else { - LOG.error("An error occured: " + jsFile.getAbsolutePath() + " not found"); + LOG.error("An error occured: {} not found", jsFile.getAbsolutePath()); } } } @@ -114,8 +111,7 @@ private File getRcaTreeFile(final String clazzname, final Change change) { final String methodName = change.getMethod(); final TestMethodCall testCall = TestMethodCall.createFromClassString(clazzname, methodName); final String commit = measurementConfig.getFixedCommitConfig().getCommit(); - final File rcaTreeFile = visualizationFolders.getPeassRCAFolders().getRcaTreeFile(commit, testCall); - return rcaTreeFile; + return visualizationFolders.getPeassRCAFolders().getRcaTreeFile(commit, testCall); } private void setUnstableIfNaNInRCA(final File rcaTreeFile) throws IOException { @@ -144,7 +140,7 @@ public void createRCAAction(final String longestPrefix, final Entry tests) { String longestPrefix; - if (tests.size() > 0) { + if (!tests.isEmpty()) { longestPrefix = tests.iterator().next(); } else { longestPrefix = ""; From 986df8fd82eba3b173df90da76812d63e4c93283 Mon Sep 17 00:00:00 2001 From: David Georg Reichelt Date: Sun, 22 Jan 2023 23:00:33 +0100 Subject: [PATCH 06/30] Update to Peass 0.3.6-SNAPSHOT --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 68bb8500..4a1f0d92 100644 --- a/pom.xml +++ b/pom.xml @@ -16,10 +16,10 @@ 2.346.3 false - 2.3.5-SNAPSHOT + 2.3.6-SNAPSHOT 999999-SNAPSHOT jenkinsci/peass-ci-plugin - 0.3.5 + 0.3.6-SNAPSHOT From 018ebfc5c0a6b560a41b37547faa7044144e904b Mon Sep 17 00:00:00 2001 From: DaGeRe Date: Fri, 3 Feb 2023 09:05:23 +0100 Subject: [PATCH 07/30] Fix javaparser dependency problem after KoPeMe update --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4a1f0d92..805637f0 100644 --- a/pom.xml +++ b/pom.xml @@ -94,7 +94,7 @@ com.github.javaparser javaparser-core - 3.24.10 + 3.25.0 From 7dad9dc37c6fab2975a2c45b23d5d85edcc9e971 Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Mon, 6 Feb 2023 15:19:17 +0100 Subject: [PATCH 08/30] Cleaned up declarated exceptions in MeasureVersionBuilder --- .../de/dagere/peass/ci/MeasureVersionBuilder.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java index ef898cbf..5535e839 100644 --- a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java +++ b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java @@ -236,7 +236,7 @@ private boolean checkCommit(final Run run, final TaskListener listener, fi } private void runAllSteps(final Run run, final FilePath workspace, final TaskListener listener, final File localWorkspace, final PeassProcessConfiguration peassConfig) - throws IOException, InterruptedException, JsonParseException, Exception { + throws Exception { final LocalPeassProcessManager processManager = new LocalPeassProcessManager(peassConfig, workspace, localWorkspace, listener, run); AggregatedRTSResult rtsResult = processManager.rts(); @@ -293,7 +293,7 @@ private void checkStatistics(final Run run, final PeassProcessConfiguratio } private void measure(final Run run, final LocalPeassProcessManager processManager, final Set tests) - throws IOException, InterruptedException, Exception { + throws Exception { boolean worked = processManager.measure(tests); if (!worked) { run.setResult(Result.FAILURE); @@ -374,7 +374,7 @@ private String getJobName(final Run run) { return run.getParent().getFullDisplayName(); } - public MeasurementConfig getMeasurementConfig() throws JsonParseException, JsonMappingException, IOException { + public MeasurementConfig getMeasurementConfig() { if (significanceLevel == 0.0) { significanceLevel = 0.01; } @@ -422,7 +422,7 @@ public MeasurementConfig getMeasurementConfig() throws JsonParseException, JsonM return config; } - private void parameterizeExecutionConfig(final ExecutionConfig executionConfig) throws IOException, JsonParseException, JsonMappingException { + private void parameterizeExecutionConfig(final ExecutionConfig executionConfig) { if (measureJMH) { executionConfig.setTestTransformer("de.dagere.peass.dependency.jmh.JmhTestTransformer"); executionConfig.setTestExecutor("de.dagere.peass.dependency.jmh.JmhTestExecutor"); @@ -534,7 +534,7 @@ private void parameterizeKiekerConfig(final KiekerConfig kiekerConfig) { kiekerConfig.setKiekerWaitTime(kiekerWaitTime); } - private String getOldCommit() throws IOException, JsonParseException, JsonMappingException { + private String getOldCommit() { final String oldVersion; if (nightlyBuild) { oldVersion = null; @@ -1121,8 +1121,7 @@ public void setDirectlyMeasureKieker(boolean directlyMeasureKieker) { public static final class DescriptorImpl extends BuildStepDescriptor { public FormValidation doCheckName(@QueryParameter final String value, - @QueryParameter final boolean useFrench) - throws IOException, ServletException { + @QueryParameter final boolean useFrench) { if (value.length() == 0) return FormValidation.error("Strange value: " + value); return FormValidation.ok(); From 4619b06f7c6699288f049328fc59ec572a14972e Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Tue, 7 Feb 2023 16:12:26 +0100 Subject: [PATCH 09/30] Reformat MeasureVersionBuilder --- .../dagere/peass/ci/MeasureVersionBuilder.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java index 5535e839..b6a876f3 100644 --- a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java +++ b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java @@ -130,7 +130,7 @@ public class MeasureVersionBuilder extends Builder implements SimpleBuildStep, S private boolean updateSnapshotDependencies = false; private boolean removeSnapshots = false; private boolean useAlternativeBuildfile = false; - + private boolean useAnbox = false; private String androidManifest = "app/src/main/AndroidManifest.xml"; private String androidCompileSdkVersion = ""; @@ -138,7 +138,7 @@ public class MeasureVersionBuilder extends Builder implements SimpleBuildStep, S private String androidTargetSdkVersion = ""; private String androidGradleVersion = ""; private String androidGradleTasks = "installDebug;installDebugAndroidTest"; - + private boolean excludeLog4jSlf4jImpl = false; private boolean excludeLog4jToSlf4j = false; @@ -502,12 +502,13 @@ private void parameterizeExecutionConfig(final ExecutionConfig executionConfig) throw new RuntimeException("Emulator needs 'testExecutor' to be set to'de.dagere.peass.execution.gradle.AnboxTestExecutor'!"); } if (executionConfig.getAndroidGradleTasks().size() == 0) { - throw new RuntimeException("No Gradle install tasks set! Emulator needs Gradle tasks to compile and install the tests on the emulator like 'installDebug;installDebugAndroidTest'"); + throw new RuntimeException( + "No Gradle install tasks set! Emulator needs Gradle tasks to compile and install the tests on the emulator like 'installDebug;installDebugAndroidTest'"); } if (executionConfig.getAndroidManifest().equals("")) { throw new RuntimeException("No AndroidManifest.xml set! Default is 'app/src/main/AndroidManifest.xml'"); } - } + } } private void parameterizeKiekerConfig(final KiekerConfig kiekerConfig) { @@ -930,7 +931,7 @@ public void setAndroidManifest(final String androidManifest) { public String getAndroidCompileSdkVersion() { return androidCompileSdkVersion; } - + @DataBoundSetter public void setAndroidCompileSdkVersion(final String androidCompileSdkVersion) { this.androidCompileSdkVersion = androidCompileSdkVersion; @@ -939,7 +940,7 @@ public void setAndroidCompileSdkVersion(final String androidCompileSdkVersion) { public String getAndroidTargetSdkVersion() { return androidTargetSdkVersion; } - + @DataBoundSetter public void setAndroidTargetSdkVersion(final String androidTargetSdkVersion) { this.androidTargetSdkVersion = androidTargetSdkVersion; @@ -1192,8 +1193,8 @@ public FormValidation doCheckCredentialsId(@AncestorInPath final Item project, } for (ListBoxModel.Option o : CredentialsProvider .listCredentials(StandardUsernameCredentials.class, project, project instanceof Queue.Task - ? Tasks.getAuthenticationOf((Queue.Task) project) - : ACL.SYSTEM, + ? Tasks.getAuthenticationOf((Queue.Task) project) + : ACL.SYSTEM, new LinkedList<>(), CredentialsMatchers.instanceOf(StandardUsernamePasswordCredentials.class))) { if (StringUtils.equals(value, o.value)) { From 288e6f57e28f9dc3a66ee62adde34e7e08d6f474 Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Tue, 7 Feb 2023 16:14:06 +0100 Subject: [PATCH 10/30] Removed unused imports from MeasureVersionBuilder --- src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java index b6a876f3..a638910b 100644 --- a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java +++ b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java @@ -14,8 +14,6 @@ import java.util.UUID; import java.util.regex.Pattern; -import javax.servlet.ServletException; - import org.jenkinsci.Symbol; import org.kohsuke.stapler.AncestorInPath; import org.kohsuke.stapler.DataBoundConstructor; @@ -27,8 +25,6 @@ import com.cloudbees.plugins.credentials.common.StandardListBoxModel; import com.cloudbees.plugins.credentials.common.StandardUsernameCredentials; import com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.JsonMappingException; import de.dagere.peass.analysis.changes.ProjectChanges; import de.dagere.peass.analysis.measurement.ProjectStatistics; From ce97f1cd177445633fd7cf6fe238d36e62af64d1 Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Wed, 8 Feb 2023 09:21:45 +0100 Subject: [PATCH 11/30] Merge if-statements in MeasureVersionBuilder --- src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java index a638910b..055cae74 100644 --- a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java +++ b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java @@ -172,10 +172,8 @@ public void perform(final Run run, final FilePath workspace, final EnvVars final File localWorkspace = new File(run.getRootDir(), ".." + File.separator + ".." + File.separator + PEASS_FOLDER_NAME).getCanonicalFile(); printRunMetadata(run, workspace, listener, localWorkspace); - if (!localWorkspace.exists()) { - if (!localWorkspace.mkdirs()) { - throw new RuntimeException("Was not able to create folder"); - } + if (!localWorkspace.exists() && !localWorkspace.mkdirs()) { + throw new RuntimeException("Was not able to create folder"); } Pattern patternForBuild = getMaskingPattern(listener.getLogger()); From 70cd288b7300ecff5b6ec527b60896c7cbcb3c89 Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Wed, 8 Feb 2023 09:27:37 +0100 Subject: [PATCH 12/30] Use isEmpty instead of size==0 in MeasureVersionBuilder --- src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java index 055cae74..bad2b021 100644 --- a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java +++ b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java @@ -252,7 +252,7 @@ private void runAllSteps(final Run run, final FilePath workspace, final Ta processManager.visualizeRTSResults(run, rtsResult.getLogSummary()); - if (rtsResult.getResult().getTests().size() > 0) { + if (!rtsResult.getResult().getTests().isEmpty()) { measure(run, processManager, rtsResult.getResult().getTests()); checkStatistics(run, peassConfig, listener, processManager, rtsResult); @@ -278,7 +278,7 @@ private void checkStatistics(final Run run, final PeassProcessConfiguratio missingMeasurements.add(calledMethod); } } - if (missingMeasurements.size() > 0) { + if (!missingMeasurements.isEmpty()) { listener.getLogger().println("Did not succeed with all measurements, marking as unstable. Missing: " + missingMeasurements); if (run.getResult() == null || Result.FAILURE.equals(run.getResult())) { run.setResult(Result.UNSTABLE); @@ -495,7 +495,7 @@ private void parameterizeExecutionConfig(final ExecutionConfig executionConfig) if (!executionConfig.getTestExecutor().equals("de.dagere.peass.execution.gradle.AnboxTestExecutor")) { throw new RuntimeException("Emulator needs 'testExecutor' to be set to'de.dagere.peass.execution.gradle.AnboxTestExecutor'!"); } - if (executionConfig.getAndroidGradleTasks().size() == 0) { + if (executionConfig.getAndroidGradleTasks().isEmpty()) { throw new RuntimeException( "No Gradle install tasks set! Emulator needs Gradle tasks to compile and install the tests on the emulator like 'installDebug;installDebugAndroidTest'"); } From de28b6fb411b17fd45eb5020f702820cbe6b5fd2 Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Wed, 8 Feb 2023 10:15:55 +0100 Subject: [PATCH 13/30] Cleanup exceptions in LocalPeassProcessManager and RTSInfos --- .../ci/process/LocalPeassProcessManager.java | 15 ++++----------- .../java/de/dagere/peass/ci/process/RTSInfos.java | 6 +----- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/process/LocalPeassProcessManager.java b/src/main/java/de/dagere/peass/ci/process/LocalPeassProcessManager.java index 54600318..5ad4978d 100644 --- a/src/main/java/de/dagere/peass/ci/process/LocalPeassProcessManager.java +++ b/src/main/java/de/dagere/peass/ci/process/LocalPeassProcessManager.java @@ -10,12 +10,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.fasterxml.jackson.core.JsonGenerationException; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.exc.StreamReadException; -import com.fasterxml.jackson.databind.DatabindException; -import com.fasterxml.jackson.databind.JsonMappingException; - import de.dagere.peass.analysis.changes.Changes; import de.dagere.peass.analysis.changes.ProjectChanges; import de.dagere.peass.analysis.measurement.ProjectStatistics; @@ -94,8 +88,7 @@ public AggregatedRTSResult rts() throws IOException, InterruptedException { } - private AggregatedRTSResult displayRTSLogs(RTSResult result) - throws StreamReadException, DatabindException, IOException { + private AggregatedRTSResult displayRTSLogs(RTSResult result) throws IOException { RTSInfos infos = RTSInfos.readInfosFromFolders(results, peassConfig); RTSLogSummary summary = logActionCreator.createRTSActions(infos); AggregatedRTSResult aggregatedRTSResult = new AggregatedRTSResult(summary, result); @@ -113,7 +106,7 @@ public boolean measure(final Set tests) throws IOException, Inte return worked; } - public boolean rca(final ProjectChanges changes, CauseSearcherConfig causeSearcherConfig) throws IOException, InterruptedException, Exception { + public boolean rca(final ProjectChanges changes, CauseSearcherConfig causeSearcherConfig) throws IOException, InterruptedException { RemoteRCA remoteRCAExecutor = new RemoteRCA(peassConfig, causeSearcherConfig, changes, listener); RCAResult result = workspace.act(remoteRCAExecutor); copyFromRemote(); @@ -139,7 +132,7 @@ public void copyFromRemote() throws IOException, InterruptedException { listener.getLogger().println("Copied " + count + " files from " + remotePeassFolder + " to " + localWorkspace.getAbsolutePath()); } - public void visualizeRTSResults(final Run run, final RTSLogSummary logSummary) throws IOException { + public void visualizeRTSResults(final Run run, final RTSLogSummary logSummary) { RTSVisualizationCreator rtsVisualizationCreator = new RTSVisualizationCreator(results, peassConfig); rtsVisualizationCreator.visualize(run, logSummary); } @@ -166,7 +159,7 @@ public ProjectChanges visualizeMeasurementResults(final Run run) { return changes; } - public void visualizeRCAResults(final Run run, final ProjectChanges changes) throws Exception, IOException { + public void visualizeRCAResults(final Run run, final ProjectChanges changes) throws IOException { final RCAVisualizer rcaVisualizer = new RCAVisualizer(peassConfig, visualizationFolders, changes, run); rcaVisualizer.visualizeRCA(); diff --git a/src/main/java/de/dagere/peass/ci/process/RTSInfos.java b/src/main/java/de/dagere/peass/ci/process/RTSInfos.java index ba824f33..ad833e72 100644 --- a/src/main/java/de/dagere/peass/ci/process/RTSInfos.java +++ b/src/main/java/de/dagere/peass/ci/process/RTSInfos.java @@ -3,9 +3,6 @@ import java.io.File; import java.io.IOException; -import com.fasterxml.jackson.core.exc.StreamReadException; -import com.fasterxml.jackson.databind.DatabindException; - import de.dagere.peass.ci.PeassProcessConfiguration; import de.dagere.peass.dependency.analysis.data.TestSet; import de.dagere.peass.dependency.persistence.CommitStaticSelection; @@ -42,8 +39,7 @@ public TestSet getIgnoredTestsPredecessor() { return ignoredTestsPredecessor; } - public static RTSInfos readInfosFromFolders(final ResultsFolders results, final PeassProcessConfiguration peassConfig) - throws StreamReadException, DatabindException, IOException { + public static RTSInfos readInfosFromFolders(final ResultsFolders results, final PeassProcessConfiguration peassConfig) throws IOException { File staticTestSelectionFile = results.getStaticTestSelectionFile(); if (staticTestSelectionFile.exists()) { boolean staticChanges = false; From dc8c2884c825f3c38f2765b6029a9f26876af674 Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Wed, 8 Feb 2023 10:23:06 +0100 Subject: [PATCH 14/30] Removed unused Logger from LocalPeassProcessManager --- .../de/dagere/peass/ci/process/LocalPeassProcessManager.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/process/LocalPeassProcessManager.java b/src/main/java/de/dagere/peass/ci/process/LocalPeassProcessManager.java index 5ad4978d..6df71368 100644 --- a/src/main/java/de/dagere/peass/ci/process/LocalPeassProcessManager.java +++ b/src/main/java/de/dagere/peass/ci/process/LocalPeassProcessManager.java @@ -7,8 +7,6 @@ import java.util.Set; import org.apache.commons.io.FileUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import de.dagere.peass.analysis.changes.Changes; import de.dagere.peass.analysis.changes.ProjectChanges; @@ -44,8 +42,6 @@ public class LocalPeassProcessManager { - private static final Logger LOG = LogManager.getLogger(LocalPeassProcessManager.class); - private final FilePath workspace; private final File localWorkspace; private final TaskListener listener; From 5c204b35f4a84fe2cd8dca23377fe39595839f44 Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Wed, 8 Feb 2023 10:28:25 +0100 Subject: [PATCH 15/30] Removed unused exceptions from CleanBuilder --- src/main/java/de/dagere/peass/ci/clean/CleanBuilder.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/clean/CleanBuilder.java b/src/main/java/de/dagere/peass/ci/clean/CleanBuilder.java index 7ad9e8f7..55e0ae33 100644 --- a/src/main/java/de/dagere/peass/ci/clean/CleanBuilder.java +++ b/src/main/java/de/dagere/peass/ci/clean/CleanBuilder.java @@ -4,8 +4,6 @@ import java.io.IOException; import java.io.Serializable; -import javax.servlet.ServletException; - import org.jenkinsci.Symbol; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundSetter; @@ -114,8 +112,7 @@ public void setCleanRCA(final boolean cleanRCA) { public static final class DescriptorImpl extends BuildStepDescriptor { public FormValidation doCheckName(@QueryParameter final String value, - @QueryParameter final boolean useFrench) - throws IOException, ServletException { + @QueryParameter final boolean useFrench) { if (value.length() == 0) return FormValidation.error("Strange value: " + value); return FormValidation.ok(); From 9c318c4983b4322b8c2545c38304fac18580208e Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Wed, 8 Feb 2023 10:41:41 +0100 Subject: [PATCH 16/30] Throw specific exceptions, not generic one. --- src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java index bad2b021..b04e6c52 100644 --- a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java +++ b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java @@ -230,7 +230,7 @@ private boolean checkCommit(final Run run, final TaskListener listener, fi } private void runAllSteps(final Run run, final FilePath workspace, final TaskListener listener, final File localWorkspace, final PeassProcessConfiguration peassConfig) - throws Exception { + throws IOException, InterruptedException { final LocalPeassProcessManager processManager = new LocalPeassProcessManager(peassConfig, workspace, localWorkspace, listener, run); AggregatedRTSResult rtsResult = processManager.rts(); @@ -286,8 +286,7 @@ private void checkStatistics(final Run run, final PeassProcessConfiguratio } } - private void measure(final Run run, final LocalPeassProcessManager processManager, final Set tests) - throws Exception { + private void measure(final Run run, final LocalPeassProcessManager processManager, final Set tests) throws IOException, InterruptedException { boolean worked = processManager.measure(tests); if (!worked) { run.setResult(Result.FAILURE); From d5abeb70905c96890ed4b6fd28f6aa94282b9a91 Mon Sep 17 00:00:00 2001 From: Alex Korn Date: Fri, 27 Jan 2023 16:00:45 +0100 Subject: [PATCH 17/30] Add androidTestPackageName option --- .../peass/ci/MeasureVersionBuilder.java | 28 ++++++++++++++----- ...asureVersionBuilderConfigCreationTest.java | 2 ++ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java index ef898cbf..436bd91d 100644 --- a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java +++ b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java @@ -138,6 +138,7 @@ public class MeasureVersionBuilder extends Builder implements SimpleBuildStep, S private String androidTargetSdkVersion = ""; private String androidGradleVersion = ""; private String androidGradleTasks = "installDebug;installDebugAndroidTest"; + private String androidTestPackageName = ""; private boolean excludeLog4jSlf4jImpl = false; private boolean excludeLog4jToSlf4j = false; @@ -361,13 +362,16 @@ private void printRunMetadata(final Run run, final FilePath workspace, fin listener.getLogger().println("CleanGoal: " + cleanGoal); listener.getLogger().println("Execute @BeforeClass in measurement: " + executeBeforeClassInMeasurement); listener.getLogger().println("Clear mockito caches: " + clearMockitoCaches); - listener.getLogger().println("Use Anbox: " + useAnbox); - listener.getLogger().println("Android Manifest: " + androidManifest); - listener.getLogger().println("Android compileSdkVersion: " + androidCompileSdkVersion); - listener.getLogger().println("Android minSdkVersion: " + androidMinSdkVersion); - listener.getLogger().println("Android targetSdkVersion: " + androidTargetSdkVersion); - listener.getLogger().println("Android gradleVersion: " + androidGradleVersion); - listener.getLogger().println("Android gradleTasks: " + androidGradleTasks); + if (useAnbox) { + listener.getLogger().println("Use Anbox: " + useAnbox); + listener.getLogger().println("Android Manifest: " + androidManifest); + listener.getLogger().println("Android compileSdkVersion: " + androidCompileSdkVersion); + listener.getLogger().println("Android minSdkVersion: " + androidMinSdkVersion); + listener.getLogger().println("Android targetSdkVersion: " + androidTargetSdkVersion); + listener.getLogger().println("Android gradleVersion: " + androidGradleVersion); + listener.getLogger().println("Android gradleTasks: " + androidGradleTasks); + listener.getLogger().println("Android testPackageName: " + androidTestPackageName); + } } private String getJobName(final Run run) { @@ -456,6 +460,7 @@ private void parameterizeExecutionConfig(final ExecutionConfig executionConfig) executionConfig.setAndroidTargetSdkVersion(androidTargetSdkVersion.equals("") ? null : androidTargetSdkVersion); executionConfig.setAndroidGradleVersion(androidGradleVersion.equals("") ? null : androidGradleVersion); executionConfig.setAndroidGradleTasks(IncludeExcludeParser.getStringListSimple(androidGradleTasks)); + executionConfig.setAndroidTestPackageName(androidTestPackageName.equals("") ? null : androidTestPackageName); executionConfig.setRedirectSubprocessOutputToFile(redirectSubprocessOutputToFile); @@ -963,6 +968,15 @@ public void setAndroidGradleTasks(final String androidGradleTasks) { this.androidGradleTasks = androidGradleTasks; } + public String getAndroidTestPackageName() { + return androidTestPackageName; + } + + @DataBoundSetter + public void setAndroidTestPackageName(final String androidTestPackageName) { + this.androidTestPackageName = androidTestPackageName; + } + public boolean isExcludeLog4jSlf4jImpl() { return excludeLog4jSlf4jImpl; } diff --git a/src/test/java/de/dagere/peass/ci/MeasureVersionBuilderConfigCreationTest.java b/src/test/java/de/dagere/peass/ci/MeasureVersionBuilderConfigCreationTest.java index 8cb1d4a1..6a0a081c 100644 --- a/src/test/java/de/dagere/peass/ci/MeasureVersionBuilderConfigCreationTest.java +++ b/src/test/java/de/dagere/peass/ci/MeasureVersionBuilderConfigCreationTest.java @@ -120,5 +120,7 @@ public void testConfigCreationAnboxDefaultValues() throws JsonParseException, Js Assert.assertEquals("", builder.getAndroidTargetSdkVersion()); Assert.assertEquals(null, measurementConfig.getExecutionConfig().getAndroidGradleVersion()); Assert.assertEquals("", builder.getAndroidGradleVersion()); + Assert.assertEquals(null, measurementConfig.getExecutionConfig().getAndroidTestPackageName()); + Assert.assertEquals("", builder.getAndroidTestPackageName()); } } From c703f2b576b0882823a56167d8c14f289e3132ae Mon Sep 17 00:00:00 2001 From: Alex Korn Date: Fri, 27 Jan 2023 16:13:54 +0100 Subject: [PATCH 18/30] Add androidTestPackageName description --- .../ci/MeasureVersionBuilder/config.jelly | 7 + .../MeasureVersionBuilder/config.properties | 7 +- .../config_de.properties | 153 +++++++++--------- 3 files changed, 90 insertions(+), 77 deletions(-) diff --git a/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.jelly b/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.jelly index 7c9e752b..9b3ec786 100644 --- a/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.jelly +++ b/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.jelly @@ -409,6 +409,13 @@ + + + + + + + diff --git a/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.properties b/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.properties index 69b3adad..55c7f41e 100644 --- a/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.properties +++ b/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.properties @@ -28,7 +28,7 @@ executeRCA=Execute RCA executeRCADescr=If activated, root cause analysis will be executed includes=Includes -includesDescr=Definition of tests that will be included (otherwise all tests defined by surefire will be included). Matches are done against full-qualified classnames AND method names, so if you want to include org.TestA#method1 and org.TestA#method2, include org.TestA* or org.TestA#method*. If you use multi module project, add the module followed by §, e.g. moduleA§package.Clazz#method. +includesDescr=Definition of tests that will be included (otherwise all tests defined by surefire will be included). Matches are done against full-qualified classnames AND method names, so if you want to include org.TestA#method1 and org.TestA#method2, include org.TestA* or org.TestA#method*. If you use multi module project, add the module followed by §, e.g. moduleA§package.Clazz#method. excludes=Excludes excludesDescr=Definition of tests that will be excluded (from the tests defined by includes or all tests). Matches are checked as in Includes. @@ -205,4 +205,7 @@ androidGradleVersion=Override Gradle version androidGradleVersionDescr=Overrides the existing Gradle version with the specified version androidGradleTasks=Override Gradle install tasks -androidGradleTasksDescr=List of tasks that will be executed to compile and install the Android tests \ No newline at end of file +androidGradleTasksDescr=List of tasks that will be executed to compile and install the Android tests + +androidTestPackageName=Override test package name +androidTestPackageNameDescr=Will use this test package for every test executed with ADB \ No newline at end of file diff --git a/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config_de.properties b/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config_de.properties index ffb98217..37be6fc0 100644 --- a/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config_de.properties +++ b/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config_de.properties @@ -1,77 +1,77 @@ -ExecutionConfiguration=Ausführung -ExecutionConfigurationDescr=Konfiguriert die interne Ausführung von Workloads +ExecutionConfiguration=Ausführung +ExecutionConfigurationDescr=Konfiguriert die interne Ausführung von Workloads VersionSelection=Commitauswahl -VersionSelectionDescr=Konfiguriert wie der gemessene Commit ausgewählt wird +VersionSelectionDescr=Konfiguriert wie der gemessene Commit ausgewählt wird OutputHandling=Ausgabenverwaltung OutputHandlingDescr=Konfiguriert, wie die Ausgaben der Mess-VMs und von Peass selbst verarbeitet werden RCAConfig=Ursachenanalyse -RCAConfigDescr=Konfiguriert die Ausführung der Ursachenanalyse +RCAConfigDescr=Konfiguriert die Ausführung der Ursachenanalyse TracingConfig=Tracing -TracingConfigDescr=onfiguriert wie Ausführungstraces, sowohl für die Regressionstestselektion als auch für die Ursachenanalyse, ermittelt werden +TracingConfigDescr=onfiguriert wie Ausführungstraces, sowohl für die Regressionstestselektion als auch für die Ursachenanalyse, ermittelt werden -TechnicalCompatibility=Technische Kompatibilität -TechnicalCompatibilityDescr=Konfiguriert wie technische Kompatibilität für konkrete Projekte und Umgebungseinrichtungen hergestellt wird +TechnicalCompatibility=Technische Kompatibilität +TechnicalCompatibilityDescr=Konfiguriert wie technische Kompatibilität für konkrete Projekte und Umgebungseinrichtungen hergestellt wird VMs=VMs -VMsDescr=Anzahl der VM-Ausführungen pro Commit (Mehr VM-Ausführungen machen es möglich, kleinere Performanceänderungen zu identifizieren) +VMsDescr=Anzahl der VM-Ausführungen pro Commit (Mehr VM-Ausführungen machen es möglich, kleinere Performanceänderungen zu identifizieren) iterations=Iterationen iterationsDescr=Anzahl der Messiterationen innerhalb jeder VM (Mehr Messiterationen machen die Messergebnisse einer VM stabiler) warmup=Warmup -warmupDescr=Anzahl der Warmupiterationen innerhalb jeder VM (Die Warmupiterationen sollten alle Iterationen umfassen, bis der stationäre Zustand erreicht ist; die Messwerte der Warmupiterationen werden gelöscht. Ein beendeter Warmup bedeutet u.a., dass die Just-in-Time-Compilation abgeschlossen ist.) +warmupDescr=Anzahl der Warmupiterationen innerhalb jeder VM (Die Warmupiterationen sollten alle Iterationen umfassen, bis der stationäre Zustand erreicht ist; die Messwerte der Warmupiterationen werden gelöscht. Ein beendeter Warmup bedeutet u.a., dass die Just-in-Time-Compilation abgeschlossen ist.) repetitions=Wiederholungen -repetitionsDescr=Anzahl der Wiederholungen, die innerhalb einer Iteration ausführt wird -executeRCA=RCA ausführen -executeRCADescr=Definition, ob die Ursachenanalyse (Root-Cause-Analysis, RCA) ausgeführt werden soll +repetitionsDescr=Anzahl der Wiederholungen, die innerhalb einer Iteration ausführt wird +executeRCA=RCA ausführen +executeRCADescr=Definition, ob die Ursachenanalyse (Root-Cause-Analysis, RCA) ausgeführt werden soll includes=Includes -includesDescr=Definition der Tests, die ausschließlich einbezogen werden (andernfalls werden alle von surefire definierten Tests einbezogen). Matches werden gegen full-qualified classnames UND Methodennamen ausgeführt, wenn also org.TestA#method1 und org.TestA#method2 einbezogen werden sollen, sind org.TestA* oder org.TestA#method* mögliche include-Spezifikationen. Wenn es sich um ein Multimodulprojekt handelt, fügen Sie das module gefolgt von § hinzu, bspw. moduleA§package.Clazz#method. +includesDescr=Definition der Tests, die ausschließlich einbezogen werden (andernfalls werden alle von surefire definierten Tests einbezogen). Matches werden gegen full-qualified classnames UND Methodennamen ausgeführt, wenn also org.TestA#method1 und org.TestA#method2 einbezogen werden sollen, sind org.TestA* oder org.TestA#method* mögliche include-Spezifikationen. Wenn es sich um ein Multimodulprojekt handelt, fügen Sie das module gefolgt von § hinzu, bspw. moduleA§package.Clazz#method. excludes=Excludes -excludesDescr=Definition der Tests, die nicht einbezogen werden sollen (basieren auf den Includes-Tests oder allen Tests). Matches werden äquivalent zum Verfahren bei Includes durchgeführt. +excludesDescr=Definition der Tests, die nicht einbezogen werden sollen (basieren auf den Includes-Tests oder allen Tests). Matches werden äquivalent zum Verfahren bei Includes durchgeführt. includeByRule=Include by Rule -includeByRuleDescr=Definiert die Rules, bei denen ein Test einbezogen werden soll (sofern definiert, werden nur die Tests ausgeführt, die eine der definierten Rules enthalten) +includeByRuleDescr=Definiert die Rules, bei denen ein Test einbezogen werden soll (sofern definiert, werden nur die Tests ausgeführt, die eine der definierten Rules enthalten) excludeByRule=Exclude by Rule -excludeByRuleDescr=Definitoin der Rules, bei denen Tests nicht einbezogen werden sollen (Sofern gesetzt, werden Tests, die die Rule enthalten, nicht ausgeführt, auch wenn sie eine der Rules aus includeByRule enthalten oder durch include einbezogen werden) +excludeByRuleDescr=Definitoin der Rules, bei denen Tests nicht einbezogen werden sollen (Sofern gesetzt, werden Tests, die die Rule enthalten, nicht ausgeführt, auch wenn sie eine der Rules aus includeByRule enthalten oder durch include einbezogen werden) properties=Properties -propertiesDescr=Definiert die Properties, die an die Buildprozesse übergeben werden sollen +propertiesDescr=Definiert die Properties, die an die Buildprozesse übergeben werden sollen testGoal=Test Goal / Task -testGoalDescr=Test-Goal (maven) / Task (gradle) das für die Ausführung von Tests aufgerufen werden soll (default 'test') +testGoalDescr=Test-Goal (maven) / Task (gradle) das für die Ausführung von Tests aufgerufen werden soll (default 'test') cleanGoal=Clean Goal -cleanGoalDescr=Clean goal (maven) / task (gradle) das für die Reinigung der generierte Klasse aus dem vorherigen Build verwenden soll (default 'CleanTest') +cleanGoalDescr=Clean goal (maven) / task (gradle) das für die Reinigung der generierte Klasse aus dem vorherigen Build verwenden soll (default 'CleanTest') pl=Projektliste -plDescr=Liste der Maven-Module, die gebaut werden sollen, in der üblichen Maven Notation die --pl übergeben wird +plDescr=Liste der Maven-Module, die gebaut werden sollen, in der üblichen Maven Notation die --pl übergeben wird updateSnapshotDependencies=Update Snapshot Dependencies updateSnapshotDependenciesDescr=Ob Peass initial heruntergeladen werden soll, um alle Snapshot-Dependencies herunterzuladen removeSnapshots=SNAPSHOT-Versionen entfernen -removeSnapshotsDescr=Wenn das aktiviert ist, werden alle -SNAPSHOT-Abhängigkeiten durch reguläre Versionen ersetzt (1.1-SNAPSHOT -> 1.1). Dadurch wird es möglich, alte Versionen zu analysieren, bei denen die Abhängigkeiten schon released wurden. +removeSnapshotsDescr=Wenn das aktiviert ist, werden alle -SNAPSHOT-Abhängigkeiten durch reguläre Versionen ersetzt (1.1-SNAPSHOT -> 1.1). Dadurch wird es möglich, alte Versionen zu analysieren, bei denen die Abhängigkeiten schon released wurden. useAlternativeBuildfile=Nutze alternative Builddatei -useAlternativeBuildfileDescr=Ersetzt die Gradle Builddatei, d.h. wenn ein Module eine Datei alternative_build.gradle enthält, wird die Original-Builddatei durch die alternative Datei ersetzt. Dies ist bspw. nötig, wenn Zertifizierungsprozesse im finalen Prozess deaktiviert werden sollen. +useAlternativeBuildfileDescr=Ersetzt die Gradle Builddatei, d.h. wenn ein Module eine Datei alternative_build.gradle enthält, wird die Original-Builddatei durch die alternative Datei ersetzt. Dies ist bspw. nötig, wenn Zertifizierungsprozesse im finalen Prozess deaktiviert werden sollen. excludeLog4jSlf4jImpl=Log4j-slf4j-impl entfernen -excludeLog4jSlf4jImplDescr=Während der Ausführung werden KoPeMe- und Kieker-Abhängigkeiten zu den Projektabhängigkeiten hinzugefügt; wenn diese aktiviert ist, wird log4j-slf4j-impl zu den exclusions hinzugefügt (dies nicht zu den exklusions hinzuzufügen kann in einigen Spring-Konfigurationen Fehler verursachen) +excludeLog4jSlf4jImplDescr=Während der Ausführung werden KoPeMe- und Kieker-Abhängigkeiten zu den Projektabhängigkeiten hinzugefügt; wenn diese aktiviert ist, wird log4j-slf4j-impl zu den exclusions hinzugefügt (dies nicht zu den exklusions hinzuzufügen kann in einigen Spring-Konfigurationen Fehler verursachen) excludeLog4jToSlf4j=Log4j-to-slf4j-impl entfernen -excludeLog4jToSlf4jDescr=Manchmal kollidieren existierende log4j-to-slf4j-Abhängigkeiten mit der Kieker/KoPeMe-Abhängigkeit. Diese Flags exkludiert diese (nur in Gradle). +excludeLog4jToSlf4jDescr=Manchmal kollidieren existierende log4j-to-slf4j-Abhängigkeiten mit der Kieker/KoPeMe-Abhängigkeit. Diese Flags exkludiert diese (nur in Gradle). timeout=Timeout -timeoutDescr=Timeout in Minuten, nach dem eine VM-Ausführung abgebrochen wird +timeoutDescr=Timeout in Minuten, nach dem eine VM-Ausführung abgebrochen wird -executeParallel=Parallel Ausführen -executeParallelDescr=Wenn dies aktiviert ist, wird jeweils eine VM für die zu vergleichenden Commits gestartet; andernfalls werden die Experimente sequentiell ausgeführt +executeParallel=Parallel Ausführen +executeParallelDescr=Wenn dies aktiviert ist, wird jeweils eine VM für die zu vergleichenden Commits gestartet; andernfalls werden die Experimente sequentiell ausgeführt significanceLevel=Typ-1-Fehler significanceLevelDescr=Typ-1-Fehler der vom zweiseiten T-Test akzeptiert wird. Der Typ-1-Fehler entspricht 1 - Signifikanzniveau, d.h. ein Typ-1-Fehler von 0.01 entspricht einem Signifikanzniveau von 99%. @@ -82,14 +82,14 @@ commitDiffDescr=Anzahl der Commits, zwischen denen der Unterschied bestimmt werd generateCoverageSelection=Generiere abdeckungsbasierte selektierte Tests generateCoverageSelectionDescr=Definiert ob Tests basiert auf Abdeckung selektiert werden sollen -generateTwiceExecutability=Generiere Zweifach-Ausführbar Informationen -generateTwiceExecutabilityDescr=Erhebt die Information, ob ein Test zweimal in einer VM ausgeführt werden kann (durch zweifache Ausführung und Prüfung auf Fehler). Wenn dies aktiviert ist, werden nur die zweifach ausgeführten Tests gemessen (und potenzielle Fehler bei der Messung vermieden). +generateTwiceExecutability=Generiere Zweifach-Ausführbar Informationen +generateTwiceExecutabilityDescr=Erhebt die Information, ob ein Test zweimal in einer VM ausgeführt werden kann (durch zweifache Ausführung und Prüfung auf Fehler). Wenn dies aktiviert ist, werden nur die zweifach ausgeführten Tests gemessen (und potenzielle Fehler bei der Messung vermieden). useSourceInstrumentation=Quelltextinstrumentierung nutzen -useSourceInstrumentationDescr=Wenn aktiviert, wird in einer Kopie des Quelltextes Monitoringquelltext für die Messung eingeführt; andernfalls wird AspectJ genutzt +useSourceInstrumentationDescr=Wenn aktiviert, wird in einer Kopie des Quelltextes Monitoringquelltext für die Messung eingeführt; andernfalls wird AspectJ genutzt useAggregation=Aggregation nutzen -useAggregationDescr=Wenn aktiviert, wird für jede Methode die Ausführungszeit addiert und alle repetition Aufrufe werden zusammen verarbeitet; andernfalls erfolgt die Verarbeitung direkt +useAggregationDescr=Wenn aktiviert, wird für jede Methode die Ausführungszeit addiert und alle repetition Aufrufe werden zusammen verarbeitet; andernfalls erfolgt die Verarbeitung direkt rcaStrategy=RCA-Strategie rcaStrategyDescr=Definiert, in welcher Reihenfolge die Performance einzelner Knoten des Aufrufbaums gemessen wird @@ -98,43 +98,43 @@ createDefaultConstructor=Default-Konstruktor erstellen createDefaultConstructorDescr=Wenn aktiviert, werden Default-Konstruktoren explizit erstellt, sofern sie nicht vorhanden sind redirectSubprocessOutputToFile=Umleiten der Subprozessausgaben in Dateien -redirectSubprocessOutputToFileDescr=Ob Subprozessausgaben in Dateien umgeleitet werden sollen (default: true). Das Deaktivieren des Umleitens führt zu großen Jenkinslogs. +redirectSubprocessOutputToFileDescr=Ob Subprozessausgaben in Dateien umgeleitet werden sollen (default: true). Das Deaktivieren des Umleitens führt zu großen Jenkinslogs. useGC=GC aktivieren -useGCDescr=Wenn aktiviert, wird zwischen zwei Iterationen System.gc aufgerufen; dies kann die Abweichungen zwischen den Messwerten reduzieren, führt aber in der Regel zu (teilweise enorm) erhöhter Ausführungsdauer +useGCDescr=Wenn aktiviert, wird zwischen zwei Iterationen System.gc aufgerufen; dies kann die Abweichungen zwischen den Messwerten reduzieren, führt aber in der Regel zu (teilweise enorm) erhöhter Ausführungsdauer -measureJMH=JMH-Tests ausführen -measureJMHDescr=Wenn aktiviert, werden zur Performanzmessung JMH Benchmarks ausgeführt, anstelle von transformierten JUnit Tests. +measureJMH=JMH-Tests ausführen +measureJMHDescr=Wenn aktiviert, werden zur Performanzmessung JMH Benchmarks ausgeführt, anstelle von transformierten JUnit Tests. redirectToNull=Ausgabe nach null Umleiten -redirectToNullDescr=Ob die Ausgabe ignoriert werden soll oder auf die interne Konsole geschrieben werden soll (Um Messergebnisverfälschungen zu vermeiden, wird standardmäßig auf null umgeleitet) +redirectToNullDescr=Ob die Ausgabe ignoriert werden soll oder auf die interne Konsole geschrieben werden soll (Um Messergebnisverfälschungen zu vermeiden, wird standardmäßig auf null umgeleitet) showStart=Iterationsstart anzeigen -showStartDescr=Ob der Beginn jeder Messiteration angezeigt werden soll (Standardmäßig deaktiviert, um Messverfälschungen zu vermeiden) +showStartDescr=Ob der Beginn jeder Messiteration angezeigt werden soll (Standardmäßig deaktiviert, um Messverfälschungen zu vermeiden) -executeBeforeClassInMeasurement=@BeforeClass bei jeder Messunge ausführen -executeBeforeClassInMeasurementDescr=Definiert, ob @BeforeClass (und @AfterClass) in der Messung ausgeführt wird; wenn aktiviert, wird @BeforeClass vor jeder Mess-reptition ausgeführt, andernfalls nur einmal vor allen Iterationen. +executeBeforeClassInMeasurement=@BeforeClass bei jeder Messunge ausführen +executeBeforeClassInMeasurementDescr=Definiert, ob @BeforeClass (und @AfterClass) in der Messung ausgeführt wird; wenn aktiviert, wird @BeforeClass vor jeder Mess-reptition ausgeführt, andernfalls nur einmal vor allen Iterationen. -clearMockitoCaches=Löschen der Mockito-Caches vor jeder Ausführung.. -clearMockitoCachesDescr=wenn aktiviert, werden die Mockito-Caches vor jeder Ausführung geleert; dies ist nur möglich, wenn executeBeforeClassInMeasurement aktiviert ist. +clearMockitoCaches=Löschen der Mockito-Caches vor jeder Ausführung.. +clearMockitoCachesDescr=wenn aktiviert, werden die Mockito-Caches vor jeder Ausführung geleert; dies ist nur möglich, wenn executeBeforeClassInMeasurement aktiviert ist. onlyMeasureWorkload=Nur Workload messen (kein @Before/@After) -onlyMeasureWorkloadDescr=Wenn aktiviert, werden @Before und @After nicht gemessen; dies ist nur möglich wenn repetitions == 1 +onlyMeasureWorkloadDescr=Wenn aktiviert, werden @Before und @After nicht gemessen; dies ist nur möglich wenn repetitions == 1 displayRTSLogs=Regressionstestselektionslogs anzeigen -displayRTSLogsDescr=Logs der Regressionstestselektion speichern und anzeigen (erhöht Jenkins-internen Speicherverbrauch leicht) +displayRTSLogsDescr=Logs der Regressionstestselektion speichern und anzeigen (erhöht Jenkins-internen Speicherverbrauch leicht) displayLogs=Logs Anzeigen -displayLogsDescr=Logs einzelner VM-Ausführungen speichern und anzeigen (erhöht Jenkins-internen Speicherverbrauch) +displayLogsDescr=Logs einzelner VM-Ausführungen speichern und anzeigen (erhöht Jenkins-internen Speicherverbrauch) displayRCALogs=Ursachenanalyselogs Anzeigen -displayRCALogsDescr=Logs einzelner VM-Ausführungen zur Ursachenanalyse speichern und anzeigen (erhöht Jenkins-internen Speicherverbrauch) +displayRCALogsDescr=Logs einzelner VM-Ausführungen zur Ursachenanalyse speichern und anzeigen (erhöht Jenkins-internen Speicherverbrauch) testExecutor=Spezifiziert TestExecutor -testExecutorDescr=Spezifiziert dem TestExecutor (benötigt für alternative Buildtools, d.h. nicht maven oder Gradle) +testExecutorDescr=Spezifiziert dem TestExecutor (benötigt für alternative Buildtools, d.h. nicht maven oder Gradle) testTransformer=Spezifiziert TestTransformer -testTransformerDescr=Spezifiziert den TestTransformer (benötigt für alternative Workloaddefinitionen, bspw. JMH statt JUnit) +testTransformerDescr=Spezifiziert den TestTransformer (benötigt für alternative Workloaddefinitionen, bspw. JMH statt JUnit) clazzFolders=Spezifiziert den Buildtool-Klassenordner clazzFoldersDescr=Spezifiziert wo nach Klassen gesucht wird (default: src/main/java:src/java - der erste existierende Ordner wird im jeweiligen Modul genutzt) @@ -143,31 +143,31 @@ testClazzFolders=Spezifiziert die Buildtool-Testklassenordner testClazzFoldersDescr=Spezifiziert wo nach Testklassen gesucht wird (default: src/test/java:src/test - der erste existierende Ordner wird im jeweiligen Modul genutzt) failOnRtsError=Build scheitern lassen, wenn RTS-Logs Fehler zeigen -failOnRtsErrorDescr=Zeigen die RTS-Logs für irgendeinen Test in aktueller oder Vorgängercommit einen Fehler, schlägt der gesamte Build fehl +failOnRtsErrorDescr=Zeigen die RTS-Logs für irgendeinen Test in aktueller oder Vorgängercommit einen Fehler, schlägt der gesamte Build fehl -xmx=Heapgröße -xmxDescr=Heapgröße für Java (übergeben via -Xmx, derzeitig nur unterstützt für Gradle) +xmx=Heapgröße +xmxDescr=Heapgröße für Java (übergeben via -Xmx, derzeitig nur unterstützt für Gradle) kiekerWaitTime=Kieker Wait Time kiekerWaitTimeDescr=Zeit, die KoPeMe wartet, bis das Schreiben der Kieker-Record-Queue beendet ist (default: 10) kiekerQueueSize=Kieker Queue Size -kiekerQueueSizeDescr=Setzt die maximale Größe der Kieker-Record-Warteschlange (Speicher wird reserviert; Erhöhung ist sinnvoll, wenn Records geschluckt werden) +kiekerQueueSizeDescr=Setzt die maximale Größe der Kieker-Record-Warteschlange (Speicher wird reserviert; Erhöhung ist sinnvoll, wenn Records geschluckt werden) -traceSizeInMb=Tracegröße in MB -traceSizeInMbDescr=Maximale Größe, bis zu der Trace gelesen wird; andernfalls wird er ignoriert (und der jeweilige Test als nicht ausführbar betrachtet) +traceSizeInMb=Tracegröße in MB +traceSizeInMbDescr=Maximale Größe, bis zu der Trace gelesen wird; andernfalls wird er ignoriert (und der jeweilige Test als nicht ausführbar betrachtet) -importLogSizeInMb=Loggröße in MB -importLogSizeInMbDescr=Maximale Größe von Logs, die in Jenkins importiert werden; Logs die größer sind werden nicht importiert, aber die Tests werden regulär als ausführbar angesehen. +importLogSizeInMb=Loggröße in MB +importLogSizeInMbDescr=Maximale Größe von Logs, die in Jenkins importiert werden; Logs die größer sind werden nicht importiert, aber die Tests werden regulär als ausführbar angesehen. -onlyOneCallRecording=Registrierung nur eines Aufrufs für die Regressionstestselektion -onlyOneCallRecordingDescr=Speichert nur einen Aufruf jeder Methode im Trace (nur erlaubt für Regressionstestselektion) +onlyOneCallRecording=Registrierung nur eines Aufrufs für die Regressionstestselektion +onlyOneCallRecordingDescr=Speichert nur einen Aufruf jeder Methode im Trace (nur erlaubt für Regressionstestselektion) -excludeForTracing=Exclude für das Tracing -excludeForTracingDescr=Liste der Methoden die beim Tracing nicht instrumentiert werden (bspw. weil sie zu oft aufgerufen werden). Die Methoden werden als Kieker-Pattern angegeben, bspw. * de.package.Clazz.methodA(..) für alle methodA in Clazz mit beliebigem Rückgabetyp. +excludeForTracing=Exclude für das Tracing +excludeForTracingDescr=Liste der Methoden die beim Tracing nicht instrumentiert werden (bspw. weil sie zu oft aufgerufen werden). Die Methoden werden als Kieker-Pattern angegeben, bspw. * de.package.Clazz.methodA(..) für alle methodA in Clazz mit beliebigem Rückgabetyp. statisticalTest=Statistischer Test -statisticalTestDescr=Statistischer Test, der genutzt wird, um Performanzänderungen zu ermitteln +statisticalTestDescr=Statistischer Test, der genutzt wird, um Performanzänderungen zu ermitteln gradleJavaPluginName=Gradle Java Pluginname gradleJavaPluginNameDescr=Name des Gradle-Java-Plugins (falls ein anderer Name als 'Java' verwendet wird) @@ -176,32 +176,35 @@ gradleSpringBootPluginName=Spring Boot Plugin Name gradleSpringBootPluginNameDescr=Name des Gradle Spring Boot Plugins (falls ein anderer Name als der Standardname verwendet wird) writeAsZip=Als ZIP Schreiben -writeAsZipDescr=Ob Traces und Trace-Diffs als ZIP-Dateien geschrieben werden sollen (reduziert den benötigten Festplattenspeicher, verlangsamt aber die Verarbeitung) +writeAsZipDescr=Ob Traces und Trace-Diffs als ZIP-Dateien geschrieben werden sollen (reduziert den benötigten Festplattenspeicher, verlangsamt aber die Verarbeitung) directlyMeasureKieker=Direkt mit Kieker Messen -directlyMeasureKiekerDescr=Aktiviert die Messung durch Kieker statt KoPeMe (ist nur nützlich wenn repetitions = 1 und wenn der Testrunner großen Warmup erzeugt) +directlyMeasureKiekerDescr=Aktiviert die Messung durch Kieker statt KoPeMe (ist nur nützlich wenn repetitions = 1 und wenn der Testrunner großen Warmup erzeugt) -Android=Android Unterstützung -AndroidDescr=Optionen spezifisch für Androidprojekte +Android=Android Unterstützung +AndroidDescr=Optionen spezifisch für Androidprojekte useAnbox=Benutze den Android Emulator -useAnboxDescr=Wenn Tests auf einem Android Emulator laufen. Nutze diese Option, wenn die zu messenden Tests in einem Android Projekt auf einem verbunden Emulator oder Gerät sind. +useAnboxDescr=Wenn Tests auf einem Android Emulator laufen. Nutze diese Option, wenn die zu messenden Tests in einem Android Projekt auf einem verbunden Emulator oder Gerät sind. androidManifest=AndroidManifest.xml Datei androidManifestDescr=Setzt den relativen Pfad zur AndroidManifest.xml Datei -androidCompileSdkVersion=Überschreibt "compileSdkVersion" -androidCompileSdkVersionDescr=Überschreibt "compileSdkVersion" in der Modulverzeichnis "build.gradle" Datei +androidCompileSdkVersion=Ãœberschreibt "compileSdkVersion" +androidCompileSdkVersionDescr=Ãœberschreibt "compileSdkVersion" in der Modulverzeichnis "build.gradle" Datei -androidMinSdkVersion=Überschreibt "minSdkVersion" -androidMinSdkVersionDescr=Überschreibt "minSdkVersion" in der Modulverzeichnis "build.gradle" Datei +androidMinSdkVersion=Ãœberschreibt "minSdkVersion" +androidMinSdkVersionDescr=Ãœberschreibt "minSdkVersion" in der Modulverzeichnis "build.gradle" Datei -androidTargetSdkVersion=Überschreibt "targetSdkVersion" -androidTargetSdkVersionDescr=Überschreibt "targetSdkVersion" in der Modulverzeichnis "build.gradle" Datei +androidTargetSdkVersion=Ãœberschreibt "targetSdkVersion" +androidTargetSdkVersionDescr=Ãœberschreibt "targetSdkVersion" in der Modulverzeichnis "build.gradle" Datei -androidGradleVersion=Überschreibt Gradle version -androidGradleVersionDescr=Überschreibt die vorhandene Gradle Version in der Projektverzeichnis "build.gradle" Datei +androidGradleVersion=Ãœberschreibt Gradle version +androidGradleVersionDescr=Ãœberschreibt die vorhandene Gradle Version in der Projektverzeichnis "build.gradle" Datei -androidGradleTasks=Überschreibt Gradle install tasks -androidGradleTasksDescr=Liste von Gradle-Tasks mit denen die Tests kompiliert und auf dem Emulator installiert werden \ No newline at end of file +androidGradleTasks=Ãœberschreibt Gradle install tasks +androidGradleTasksDescr=Liste von Gradle-Tasks mit denen die Tests kompiliert und auf dem Emulator installiert werden + +androidTestPackageName=Ãœberschreibt den Test-Package Namen +androidTestPackageNameDescr=Benutzt dieses Test-Package für jede Testausführung mit ADB \ No newline at end of file From 26ca4b857f6a495ff97124712957928fa73b6b64 Mon Sep 17 00:00:00 2001 From: Behnaz Nabhan Date: Tue, 31 Jan 2023 11:59:21 +0100 Subject: [PATCH 19/30] Allow configuration of commit history tracking model --- .../de/dagere/peass/ci/MeasureVersionBuilder.java | 13 +++++++++++++ .../peass/ci/MeasureVersionBuilder/config.jelly | 12 +++++++++++- .../ci/MeasureVersionBuilder/config.properties | 4 ++++ .../ci/MeasureVersionBuilder/config_de.properties | 3 +++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java index 436bd91d..32b6be7d 100644 --- a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java +++ b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java @@ -117,6 +117,7 @@ public class MeasureVersionBuilder extends Builder implements SimpleBuildStep, S private String excludeByRule = ""; private String properties = ""; private String testGoal = "test"; + private boolean linearizeHistory; private String pl = ""; private RCAStrategy rcaStrategy = RCAStrategy.UNTIL_SOURCE_CHANGE; @@ -355,6 +356,7 @@ private void printRunMetadata(final Run run, final FilePath workspace, fin listener.getLogger().println("measureJMH: " + measureJMH); listener.getLogger().println("Includes: " + includes + " RCA: " + executeRCA); listener.getLogger().println("Excludes: " + excludes); + listener.getLogger().println("Commit history tracking model: " + (linearizeHistory? "Linear" : "Non-Linear")); listener.getLogger().println("Strategy: " + rcaStrategy + " Source Instrumentation: " + useSourceInstrumentation + " Aggregation: " + useAggregation); listener.getLogger().println("Create default constructor: " + createDefaultConstructor); listener.getLogger().println("Fail on error in RTS: " + failOnRtsError); @@ -449,6 +451,8 @@ private void parameterizeExecutionConfig(final ExecutionConfig executionConfig) executionConfig.setIncludes(IncludeExcludeParser.getStringList(includes)); executionConfig.setExcludes(IncludeExcludeParser.getStringList(excludes)); + executionConfig.setLinearizeHistory(linearizeHistory); + executionConfig.setIncludeByRule(IncludeExcludeParser.getStringListSimple(includeByRule)); executionConfig.setExcludeByRule(IncludeExcludeParser.getStringListSimple(excludeByRule)); @@ -752,6 +756,15 @@ public void setExcludeByRule(String excludeByRule) { this.excludeByRule = excludeByRule; } + @DataBoundSetter + public void setLinearizeHistory(boolean linearizeHistory){ + this.linearizeHistory = linearizeHistory; + } + + public boolean isLinearizeHistory() { + return linearizeHistory; + } + public boolean isExecuteRCA() { return executeRCA; } diff --git a/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.jelly b/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.jelly index 9b3ec786..47a08a6a 100644 --- a/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.jelly +++ b/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.jelly @@ -153,16 +153,26 @@ + + -
+ + + + + + + + +

${%OutputHandling}

diff --git a/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.properties b/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.properties index 55c7f41e..08a50167 100644 --- a/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.properties +++ b/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config.properties @@ -87,6 +87,10 @@ generateCoverageSelectionDescr=Defines whether to generate coverage based test s generateTwiceExecutability=Generate twice executability information generateTwiceExecutabilityDescr=Generates the information, whether a test case is executable twice (by running it twice and looking for errors); if activated, only those tests will be executed (probably preventing errors from occuring during measurement) + +linearizeHistory=Track commit history linear +linearizeHistoryDescr=Specified how to track commit history (by default tracking model is linear - Deactivating leads to Non-linear tracking) + useSourceInstrumentation=Source instrumentation useSourceInstrumentationDescr=If activated, monitoring source code will be inserted into a copy of the source code; otherwise, AspectJ will be used diff --git a/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config_de.properties b/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config_de.properties index 37be6fc0..2448e6c2 100644 --- a/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config_de.properties +++ b/src/main/resources/de/dagere/peass/ci/MeasureVersionBuilder/config_de.properties @@ -85,6 +85,9 @@ generateCoverageSelectionDescr=Definiert ob Tests basiert auf Abdeckung selektie generateTwiceExecutability=Generiere Zweifach-Ausführbar Informationen generateTwiceExecutabilityDescr=Erhebt die Information, ob ein Test zweimal in einer VM ausgeführt werden kann (durch zweifache Ausführung und Prüfung auf Fehler). Wenn dies aktiviert ist, werden nur die zweifach ausgeführten Tests gemessen (und potenzielle Fehler bei der Messung vermieden). +linearizeHistory=Commit-Verlauf linear verfolgen +linearizeHistoryDescr=Festgelegt, wie die Commit-Historie verfolgt werden soll (default: linear - die Deaktivierung führt zu einer nicht-linearen Verfolgung) + useSourceInstrumentation=Quelltextinstrumentierung nutzen useSourceInstrumentationDescr=Wenn aktiviert, wird in einer Kopie des Quelltextes Monitoringquelltext für die Messung eingeführt; andernfalls wird AspectJ genutzt From 17c89ee848882fcf831bb114823c1a9726fb4f6b Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Thu, 19 Jan 2023 11:19:25 +0100 Subject: [PATCH 20/30] Set buildstate unstable if json-file is not found in RCAVisualizer --- src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java b/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java index 7e4a68ac..034b8ec1 100644 --- a/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java +++ b/src/main/java/de/dagere/peass/ci/rca/RCAVisualizer.java @@ -101,7 +101,8 @@ private void createVisualizationActions(final File rcaResults, final Changes com metadata.copyFiles(commitVisualizationFolder); createRCAAction(longestPrefix, testcases, change, metadata); } else { - LOG.error("An error occured: {} not found", jsFile.getAbsolutePath()); + run.setResult(Result.UNSTABLE); + LOG.error("An error occured: {} not found. Set buildstate to unstable.", jsFile.getAbsolutePath()); } } } From b86ce106e38b244995519ed06d716c420a18c440 Mon Sep 17 00:00:00 2001 From: DaGeRe Date: Wed, 8 Feb 2023 16:07:22 +0100 Subject: [PATCH 21/30] Add test for setting to unstable when JSON is missing --- .../peass/ci/helper/TestRCAVisualizer.java | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/test/java/de/dagere/peass/ci/helper/TestRCAVisualizer.java b/src/test/java/de/dagere/peass/ci/helper/TestRCAVisualizer.java index ff798d57..46cbe727 100644 --- a/src/test/java/de/dagere/peass/ci/helper/TestRCAVisualizer.java +++ b/src/test/java/de/dagere/peass/ci/helper/TestRCAVisualizer.java @@ -19,9 +19,11 @@ import de.dagere.peass.ci.RCAVisualizationAction; import de.dagere.peass.ci.rca.RCAVisualizer; import de.dagere.peass.config.MeasurementConfig; +import de.dagere.peass.dependency.analysis.testData.TestMethodCall; import de.dagere.peass.folders.CauseSearchFolders; import de.dagere.peass.utils.Constants; import hudson.model.Job; +import hudson.model.Result; import hudson.model.Run; public class TestRCAVisualizer { @@ -38,7 +40,29 @@ public void testHTMLGeneration() throws Exception { final File visualizationResultFolder = new File(folder.getRoot(), "visualization_result"); final Run run = mockRun(visualizationResultFolder); + visualizeRCAForTest(changes, run); + testCorrectResult(run, visualizationResultFolder); + } + + @Test + public void testMissingJson() throws Exception { + final File testChangeFile = new File("src/test/resources/demo-results/rca/changes.json"); + ProjectChanges changes = Constants.OBJECTMAPPER.readValue(testChangeFile, ProjectChanges.class); + + final File visualizationResultFolder = new File(folder.getRoot(), "visualization_result"); + + CauseSearchFolders folders = initFolders(); + File rcaTreeFile = folders.getRcaTreeFile("b02c92af73e3297be617f4c973a7a63fb603565b", new TestMethodCall("de.test.CalleeTest", "onlyCallMethod1")); + rcaTreeFile.delete(); + + final Run run = mockRun(visualizationResultFolder); + visualizeRCAForTest(changes, run); + + Mockito.verify(run, Mockito.times(1)).setResult(Result.UNSTABLE); + } + + private void visualizeRCAForTest(ProjectChanges changes, final Run run) throws IOException { // Calls the RCAVisualizer, which should be tested MeasurementConfig measurementConfig = new MeasurementConfig(2); measurementConfig.getFixedCommitConfig().setCommit("b02c92af73e3297be617f4c973a7a63fb603565b"); @@ -50,8 +74,6 @@ public void testHTMLGeneration() throws Exception { visualizationFolders.getPropertyFolder().mkdir(); RCAVisualizer visualizer = new RCAVisualizer(peassConfig, visualizationFolders, changes, run); visualizer.visualizeRCA(); - - testCorrectResult(run, visualizationResultFolder); } private Run mockRun(final File visualizationResultFolder) { @@ -79,9 +101,11 @@ public boolean accept(File pathname) { MatcherAssert.assertThat(jsFile.getName(), Matchers.endsWith(".js")); } - private void initFolders() throws IOException { + private CauseSearchFolders initFolders() throws IOException { final File projectFolder = new File(folder.getRoot(), "project"); final CauseSearchFolders peassFolders = new CauseSearchFolders(projectFolder); FileUtils.copyDirectory(new File("src/test/resources/demo-results/rca/rca"), peassFolders.getRcaTreeFolder().getParentFile()); + + return peassFolders; } } From 39d9ef99f103a487afe8b2d61c625f93cf128506 Mon Sep 17 00:00:00 2001 From: DaGeRe Date: Wed, 15 Feb 2023 17:59:52 +0100 Subject: [PATCH 22/30] Add Jenkins bom --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 805637f0..3abe7049 100644 --- a/pom.xml +++ b/pom.xml @@ -203,7 +203,7 @@ io.jenkins.tools.bom bom-2.346.x - 1438.v6a_2c29d73f82 + 1742.vb_70478c1b_25f pom import From b69a5fffdc1b83d154f4d89dca714f83ab1ae168 Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Mon, 20 Feb 2023 15:37:36 +0100 Subject: [PATCH 23/30] Check vmResults for Error, Failure or SubthreadTimeout --- .../peass/ci/logs/CorrectRunChecker.java | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/logs/CorrectRunChecker.java b/src/main/java/de/dagere/peass/ci/logs/CorrectRunChecker.java index 94afd5c3..f3b4719b 100644 --- a/src/main/java/de/dagere/peass/ci/logs/CorrectRunChecker.java +++ b/src/main/java/de/dagere/peass/ci/logs/CorrectRunChecker.java @@ -1,13 +1,14 @@ package de.dagere.peass.ci.logs; import java.io.File; +import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import de.dagere.kopeme.datastorage.JSONDataLoader; -import de.dagere.kopeme.kopemedata.DatacollectorResult; import de.dagere.kopeme.kopemedata.Kopemedata; +import de.dagere.kopeme.kopemedata.VMResult; import de.dagere.peass.ci.helper.VisualizationFolderManager; import de.dagere.peass.config.FixedCommitConfig; import de.dagere.peass.config.MeasurementConfig; @@ -16,9 +17,8 @@ /** * Checks wether a measurement run is correct by checking the XML result files - * - * @author reichelt * + * @author reichelt */ public class CorrectRunChecker { @@ -43,22 +43,28 @@ public CorrectRunChecker(final TestMethodCall testcase, final int vmId, final Me predecessorRunning = checkIsRunning(vmId, resultFilePredecessor); } - private boolean checkIsRunning(final int vmId, final File resultFileCurrent) { - boolean isRunning = false; - if (resultFileCurrent.exists()) { - LOG.debug("Checking: {} - {} ", vmId, resultFileCurrent.getAbsolutePath()); - Kopemedata data = JSONDataLoader.loadData(resultFileCurrent); - DatacollectorResult datacollector = data.getFirstTimeDataCollector(); - if (datacollector.getResults().get(0) != null) { - isRunning = true; - LOG.debug("File and result are existing - success"); + private boolean checkIsRunning(final int vmId, final File resultFile) { + final boolean isRunning = true; + if (resultFile.exists()) { + LOG.debug("Checking: {} - {} ", vmId, resultFile.getAbsolutePath()); + Kopemedata data = JSONDataLoader.loadData(resultFile); + List vmResults = data.getMethods().get(0).getDatacollectorResults().get(0).getResults(); + for (VMResult vmResult : vmResults) { + if (anyErrorOccurredInVM(vmResult)) { + return !isRunning; + } } } else { - LOG.debug("File {} missing", resultFileCurrent); + LOG.debug("File {} missing", resultFile); + return !isRunning; } return isRunning; } + private boolean anyErrorOccurredInVM(final VMResult vmResult) { + return (vmResult.isError() || vmResult.isFailure() || vmResult.isSubthreadTimeout()); + } + public boolean isCurrentRunning() { return currentRunning; } From 6f3ec017761a5c781a02383ec959196ca99866eb Mon Sep 17 00:00:00 2001 From: David Georg Reichelt Date: Wed, 22 Feb 2023 10:14:49 +0100 Subject: [PATCH 24/30] Reduce declared exceptions --- .../java/de/dagere/peass/ci/MeasurementVisualizationAction.java | 2 +- src/test/java/de/dagere/peass/ci/helper/TestRCAVisualizer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/MeasurementVisualizationAction.java b/src/main/java/de/dagere/peass/ci/MeasurementVisualizationAction.java index 0408524e..678b8b8c 100644 --- a/src/main/java/de/dagere/peass/ci/MeasurementVisualizationAction.java +++ b/src/main/java/de/dagere/peass/ci/MeasurementVisualizationAction.java @@ -28,7 +28,7 @@ public String getCSS() throws IOException { return content; } - public String getDataJS() throws IOException { + public String getDataJS() { return jsData; } diff --git a/src/test/java/de/dagere/peass/ci/helper/TestRCAVisualizer.java b/src/test/java/de/dagere/peass/ci/helper/TestRCAVisualizer.java index 46cbe727..8e1ebdd3 100644 --- a/src/test/java/de/dagere/peass/ci/helper/TestRCAVisualizer.java +++ b/src/test/java/de/dagere/peass/ci/helper/TestRCAVisualizer.java @@ -32,7 +32,7 @@ public class TestRCAVisualizer { public TemporaryFolder folder = new TemporaryFolder(new File("target")); @Test - public void testHTMLGeneration() throws Exception { + public void testHTMLGeneration() throws IOException { final File testChangeFile = new File("src/test/resources/demo-results/rca/changes.json"); ProjectChanges changes = Constants.OBJECTMAPPER.readValue(testChangeFile, ProjectChanges.class); From cc2c665be97fa092e4ad92ceea2a634f8094b591 Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Wed, 8 Feb 2023 11:03:39 +0100 Subject: [PATCH 25/30] Don't let the whole build fail on errors for single steps or tests. You cannot set UNSTABLE, once FAILURE is set! --- .../de/dagere/peass/ci/MeasureVersionBuilder.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java index 8b0ad2ae..b44f3547 100644 --- a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java +++ b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java @@ -289,9 +289,10 @@ private void checkStatistics(final Run run, final PeassProcessConfiguratio } private void measure(final Run run, final LocalPeassProcessManager processManager, final Set tests) throws IOException, InterruptedException { - boolean worked = processManager.measure(tests); - if (!worked) { - run.setResult(Result.FAILURE); + final boolean measureWorked = processManager.measure(tests); + if (!measureWorked) { + //We don't want the whole build to fail, if measurements for single tests failed, so it's just UNSTABLE + run.setResult(Result.UNSTABLE); return; } @@ -299,10 +300,11 @@ private void measure(final Run run, final LocalPeassProcessManager process if (executeRCA) { final CauseSearcherConfig causeSearcherConfig = generateCauseSearchConfig(); - boolean rcaWorked = processManager.rca(changes, causeSearcherConfig); + final boolean rcaWorked = processManager.rca(changes, causeSearcherConfig); processManager.visualizeRCAResults(run, changes); if (!rcaWorked) { - run.setResult(Result.FAILURE); + //We don't want the whole build to fail, if rca for single tests failed, so it's just UNSTABLE + run.setResult(Result.UNSTABLE); } } } From 8a4199017084a2261986f2a28a3b7d49fe5bb89b Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Wed, 8 Feb 2023 11:07:13 +0100 Subject: [PATCH 26/30] FAILURE has no influence here, since it will not be overwritten by UNSTABLE --- src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java index b44f3547..8613e460 100644 --- a/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java +++ b/src/main/java/de/dagere/peass/ci/MeasureVersionBuilder.java @@ -282,7 +282,7 @@ private void checkStatistics(final Run run, final PeassProcessConfiguratio } if (!missingMeasurements.isEmpty()) { listener.getLogger().println("Did not succeed with all measurements, marking as unstable. Missing: " + missingMeasurements); - if (run.getResult() == null || Result.FAILURE.equals(run.getResult())) { + if (run.getResult() == null) { run.setResult(Result.UNSTABLE); } } From 889334a7f9998ca7b19a1eb0281bbd9d55da816d Mon Sep 17 00:00:00 2001 From: Matti Wilhelmi Date: Wed, 22 Feb 2023 13:38:54 +0100 Subject: [PATCH 27/30] Avoid FileNotFoundException if no measurement-log exists for current- or predecessor-commit of single testcase --- .../measurement/MeasurementActionCreator.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/logs/measurement/MeasurementActionCreator.java b/src/main/java/de/dagere/peass/ci/logs/measurement/MeasurementActionCreator.java index db774b0a..0182822f 100644 --- a/src/main/java/de/dagere/peass/ci/logs/measurement/MeasurementActionCreator.java +++ b/src/main/java/de/dagere/peass/ci/logs/measurement/MeasurementActionCreator.java @@ -1,5 +1,6 @@ package de.dagere.peass.ci.logs.measurement; +import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; @@ -67,12 +68,20 @@ private void createLogActions(final Run run, final Map run, TestCase testcase, int vmId, String commit, File logfile) throws IOException { + if (logfile.exists()) { + String logData = processConfig.getFileText(logfile); + run.addAction(new LogAction(IdHelper.getId(), testcase, vmId, commit, logData)); + } else { + LOG.error("No Logfile could be found for {} and commit {}", testcase, commit); + } + } + } From 072dd052cca5321b4117ee384b32f755491029b7 Mon Sep 17 00:00:00 2001 From: David Georg Reichelt Date: Wed, 22 Feb 2023 15:10:07 +0100 Subject: [PATCH 28/30] Do not pass instance variables to instance methods --- .../ci/logs/measurement/MeasurementActionCreator.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/dagere/peass/ci/logs/measurement/MeasurementActionCreator.java b/src/main/java/de/dagere/peass/ci/logs/measurement/MeasurementActionCreator.java index 0182822f..0089a081 100644 --- a/src/main/java/de/dagere/peass/ci/logs/measurement/MeasurementActionCreator.java +++ b/src/main/java/de/dagere/peass/ci/logs/measurement/MeasurementActionCreator.java @@ -44,7 +44,7 @@ public void createMeasurementActions(final Set tests) throws IOE createOverallLogAction(); Map> logFiles = reader.readAllTestcases(tests); - createLogActions(run, logFiles); + createLogActions(logFiles); FixedCommitConfig fixedCommitConfig = measurementConfig.getFixedCommitConfig(); String shortCommit = fixedCommitConfig.getCommit().substring(0, 6); @@ -62,20 +62,20 @@ private void createOverallLogAction() { } } - private void createLogActions(final Run run, final Map> logFiles) throws IOException { + private void createLogActions(final Map> logFiles) throws IOException { for (Map.Entry> entry : logFiles.entrySet()) { LOG.debug("Creating {} log actions for {}", entry.getValue().size(), entry.getKey()); TestCase testcase = entry.getKey(); int vmId = 0; for (LogFiles files : entry.getValue()) { - addLogAction(run, testcase, vmId, measurementConfig.getFixedCommitConfig().getCommit(), files.getCurrent()); - addLogAction(run, testcase, vmId, measurementConfig.getFixedCommitConfig().getCommitOld(), files.getPredecessor()); + addLogAction(testcase, vmId, measurementConfig.getFixedCommitConfig().getCommit(), files.getCurrent()); + addLogAction(testcase, vmId, measurementConfig.getFixedCommitConfig().getCommitOld(), files.getPredecessor()); vmId++; } } } - private void addLogAction(final Run run, TestCase testcase, int vmId, String commit, File logfile) throws IOException { + private void addLogAction(TestCase testcase, int vmId, String commit, File logfile) throws IOException { if (logfile.exists()) { String logData = processConfig.getFileText(logfile); run.addAction(new LogAction(IdHelper.getId(), testcase, vmId, commit, logData)); From a82649c8340ca045443e6ff7ec2f19432ae99106 Mon Sep 17 00:00:00 2001 From: David Georg Reichelt Date: Thu, 23 Feb 2023 14:09:35 +0100 Subject: [PATCH 29/30] Update to log4j-web 2.20.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3abe7049..82363228 100644 --- a/pom.xml +++ b/pom.xml @@ -118,7 +118,7 @@ org.apache.logging.log4j log4j-web - 2.19.0 + 2.20.0 From ac850c5059a1fe54bd2ea12afc2b2c25c66b1594 Mon Sep 17 00:00:00 2001 From: David Georg Reichelt Date: Thu, 23 Feb 2023 16:11:49 +0100 Subject: [PATCH 30/30] Update to Peass 0.3.6 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 82363228..accbc26c 100644 --- a/pom.xml +++ b/pom.xml @@ -16,10 +16,10 @@ 2.346.3 false - 2.3.6-SNAPSHOT + 2.3.6 999999-SNAPSHOT jenkinsci/peass-ci-plugin - 0.3.6-SNAPSHOT + 0.3.6