From 92949e528347c17238c00b22dbe95a538f64f8a7 Mon Sep 17 00:00:00 2001 From: Ulli Hafner Date: Mon, 8 Jan 2024 10:10:37 +0100 Subject: [PATCH] Add an option to skip the time-consuming post-processing step. --- .../analysis/core/steps/IssuesRecorder.java | 22 ++++++++++-- .../analysis/core/steps/IssuesScanner.java | 14 +++++--- .../core/steps/ScanForIssuesStep.java | 22 +++++++++++- .../help-skipPostProcessing.html | 5 +++ .../resources/issues/scan-parameters.jelly | 5 +++ .../issues/scan-parameters.properties | 1 + .../core/model/DetailsTableModelTest.java | 2 +- .../core/steps/IssuesAggregatorTest.java | 2 +- .../integrations/TimeStamperPluginITest.java | 2 +- .../steps/AffectedFilesResolverITest.java | 2 +- .../steps/MiscIssuesRecorderITest.java | 7 ++-- .../warnings/steps/ModuleDetectorITest.java | 31 ++++++++++++++++ .../warnings/steps/PackageDetectorsITest.java | 36 ++++++++++++++----- .../analysis/warnings/steps/StepsITest.java | 16 ++++----- .../warnings/steps/StepsOnAgentITest.java | 4 +-- .../warnings/tasks/TaskScannerTest.java | 4 +-- .../analysis/warnings/IssuesRecorder.java | 28 +++++++++++---- .../FreeStyleConfigurationUiTest.java | 2 ++ .../warnings/SnippetGeneratorUiTest.java | 3 ++ 19 files changed, 166 insertions(+), 42 deletions(-) create mode 100644 plugin/src/main/resources/io/jenkins/plugins/analysis/core/steps/RecordIssuesStep/help-skipPostProcessing.html diff --git a/plugin/src/main/java/io/jenkins/plugins/analysis/core/steps/IssuesRecorder.java b/plugin/src/main/java/io/jenkins/plugins/analysis/core/steps/IssuesRecorder.java index 062975832f..c683b720d5 100644 --- a/plugin/src/main/java/io/jenkins/plugins/analysis/core/steps/IssuesRecorder.java +++ b/plugin/src/main/java/io/jenkins/plugins/analysis/core/steps/IssuesRecorder.java @@ -51,6 +51,7 @@ import io.jenkins.plugins.analysis.core.model.StaticAnalysisLabelProvider; import io.jenkins.plugins.analysis.core.model.Tool; import io.jenkins.plugins.analysis.core.steps.IssuesScanner.BlameMode; +import io.jenkins.plugins.analysis.core.steps.IssuesScanner.PostProcessingMode; import io.jenkins.plugins.analysis.core.steps.WarningChecksPublisher.AnnotationScope; import io.jenkins.plugins.analysis.core.util.HealthDescriptor; import io.jenkins.plugins.analysis.core.util.ModelValidation; @@ -127,6 +128,8 @@ public class IssuesRecorder extends Recorder { private boolean skipPublishingChecks; // by default, checks will be published private boolean publishAllIssues; // by default, only new issues will be published + private boolean skipPostProcessing; // @since 10.6.0: by default, post-processing will be enabled + @CheckForNull private ChecksInfo checksInfo; @@ -482,6 +485,20 @@ public void setSkipPublishingChecks(final boolean skipPublishingChecks) { this.skipPublishingChecks = skipPublishingChecks; } + /** + * Returns whether post-processing of the issues should be disabled. + * + * @return {@code true} if post-processing of the issues should be disabled. + */ + public boolean isSkipPostProcessing() { + return skipPostProcessing; + } + + @DataBoundSetter + public void setSkipPostProcessing(final boolean skipPostProcessing) { + this.skipPostProcessing = skipPostProcessing; + } + /** * Returns whether all issues should be published using the Checks API. If set to {@code false} only new issues will * be published. @@ -643,7 +660,7 @@ public int getUnhealthy() { } /** - * Sets the healthy threshold, i.e. the number of issues when health is reported as 0%. + * Sets the healthy threshold, i.e., the number of issues when health is reported as 0%. * * @param unhealthy * the number of issues when health is reported as 0% @@ -806,7 +823,8 @@ private AnnotatedReport scanWithTool(final Run run, final FilePath workspa final Tool tool) throws IOException, InterruptedException { IssuesScanner issuesScanner = new IssuesScanner(tool, getFilters(), getSourceCodeCharset(), workspace, getSourceCodePaths(), run, new FilePath(run.getRootDir()), listener, - scm, isBlameDisabled ? BlameMode.DISABLED : BlameMode.ENABLED, quiet); + scm, isBlameDisabled ? BlameMode.DISABLED : BlameMode.ENABLED, + skipPostProcessing ? PostProcessingMode.DISABLED : PostProcessingMode.ENABLED, quiet); return issuesScanner.scan(); } diff --git a/plugin/src/main/java/io/jenkins/plugins/analysis/core/steps/IssuesScanner.java b/plugin/src/main/java/io/jenkins/plugins/analysis/core/steps/IssuesScanner.java index 7c3d216de8..5d3aac8e3d 100644 --- a/plugin/src/main/java/io/jenkins/plugins/analysis/core/steps/IssuesScanner.java +++ b/plugin/src/main/java/io/jenkins/plugins/analysis/core/steps/IssuesScanner.java @@ -74,17 +74,22 @@ class IssuesScanner { private final TaskListener listener; private final String scm; private final BlameMode blameMode; + private final PostProcessingMode postProcessingMode; private final boolean quiet; enum BlameMode { ENABLED, DISABLED } + enum PostProcessingMode { + ENABLED, DISABLED + } + @SuppressWarnings("checkstyle:ParameterNumber") IssuesScanner(final Tool tool, final List filters, final Charset sourceCodeEncoding, final FilePath workspace, final Set sourceDirectories, final Run run, final FilePath jenkinsRootDir, final TaskListener listener, - final String scm, final BlameMode blameMode, final boolean quiet) { + final String scm, final BlameMode blameMode, final PostProcessingMode postProcessingMode, final boolean quiet) { this.filters = new ArrayList<>(filters); this.sourceCodeEncoding = sourceCodeEncoding; this.tool = tool; @@ -95,6 +100,7 @@ enum BlameMode { this.listener = listener; this.scm = scm; this.blameMode = blameMode; + this.postProcessingMode = postProcessingMode; this.quiet = quiet; } @@ -123,7 +129,9 @@ private RepositoryStatistics getRepositoryStatistics(final Report report) { } private AnnotatedReport postProcessReport(final Report report) throws IOException, InterruptedException { - if (tool.getDescriptor().isPostProcessingEnabled() && report.isNotEmpty()) { + if (tool.getDescriptor().isPostProcessingEnabled() + && report.isNotEmpty() + && postProcessingMode == PostProcessingMode.ENABLED) { report.logInfo("Post processing issues on '%s' with source code encoding '%s'", getAgentName(), sourceCodeEncoding); AnnotatedReport result = workspace.act(createPostProcessor(report)); @@ -170,7 +178,6 @@ private Blamer createBlamer(final Report report) { report.logInfo("-> Filtering SCMs by key '%s'", scm); } Blamer blamer = BlamerFactory.findBlamer(scm, run, workspace, listener, log); - log.logSummary(); report.mergeLogMessages(log); return blamer; @@ -283,7 +290,6 @@ private Blames blame(final Report filtered, final FileLocations fileLocations) { } FilteredLog log = new FilteredLog("Errors while extracting author and commit information from Git:"); Blames blames = blamer.blame(fileLocations, log); - log.logSummary(); filtered.mergeLogMessages(log); return blames; } diff --git a/plugin/src/main/java/io/jenkins/plugins/analysis/core/steps/ScanForIssuesStep.java b/plugin/src/main/java/io/jenkins/plugins/analysis/core/steps/ScanForIssuesStep.java index 501a5afb8d..21cb893306 100644 --- a/plugin/src/main/java/io/jenkins/plugins/analysis/core/steps/ScanForIssuesStep.java +++ b/plugin/src/main/java/io/jenkins/plugins/analysis/core/steps/ScanForIssuesStep.java @@ -28,6 +28,7 @@ import io.jenkins.plugins.analysis.core.filter.RegexpFilter; import io.jenkins.plugins.analysis.core.model.Tool; import io.jenkins.plugins.analysis.core.steps.IssuesScanner.BlameMode; +import io.jenkins.plugins.analysis.core.steps.IssuesScanner.PostProcessingMode; import io.jenkins.plugins.prism.SourceCodeDirectory; /** @@ -41,6 +42,7 @@ public class ScanForIssuesStep extends Step { private String sourceDirectory = StringUtils.EMPTY; private Set sourceDirectories = new HashSet<>(); // @since 9.11.0 private boolean isBlameDisabled; + private boolean skipPostProcessing; // @since 10.6.0: by default, post-processing will be enabled private boolean quiet; private List filters = new ArrayList<>(); @@ -153,6 +155,20 @@ public void setForensicsDisabled(final boolean forensicsDisabled) { // do nothing } + /** + * Returns whether post-processing of the issues should be disabled. + * + * @return {@code true} if post-processing of the issues should be disabled. + */ + public boolean isSkipPostProcessing() { + return skipPostProcessing; + } + + @DataBoundSetter + public void setSkipPostProcessing(final boolean skipPostProcessing) { + this.skipPostProcessing = skipPostProcessing; + } + @CheckForNull public String getSourceCodeEncoding() { return sourceCodeEncoding; @@ -228,6 +244,7 @@ static class Execution extends AnalysisExecution { private final Tool tool; private final String sourceCodeEncoding; private final boolean isBlameDisabled; + private final boolean skipPostProcessing; private final List filters; private final Set sourceDirectories; private final String scm; @@ -250,6 +267,7 @@ static class Execution extends AnalysisExecution { filters = step.getFilters(); sourceDirectories = step.getAllSourceDirectories(); scm = step.getScm(); + skipPostProcessing = step.isSkipPostProcessing(); quiet = step.isQuiet(); } @@ -261,7 +279,9 @@ protected AnnotatedReport run() throws IOException, InterruptedException, Illega IssuesScanner issuesScanner = new IssuesScanner(tool, filters, getCharset(sourceCodeEncoding), workspace, sourceDirectories, getRun(), new FilePath(getRun().getRootDir()), listener, - scm, isBlameDisabled ? BlameMode.DISABLED : BlameMode.ENABLED, quiet); + scm, isBlameDisabled ? BlameMode.DISABLED : BlameMode.ENABLED, + skipPostProcessing ? PostProcessingMode.DISABLED : PostProcessingMode.ENABLED, + quiet); return issuesScanner.scan(); } diff --git a/plugin/src/main/resources/io/jenkins/plugins/analysis/core/steps/RecordIssuesStep/help-skipPostProcessing.html b/plugin/src/main/resources/io/jenkins/plugins/analysis/core/steps/RecordIssuesStep/help-skipPostProcessing.html new file mode 100644 index 0000000000..743539db09 --- /dev/null +++ b/plugin/src/main/resources/io/jenkins/plugins/analysis/core/steps/RecordIssuesStep/help-skipPostProcessing.html @@ -0,0 +1,5 @@ +
+ If this option is unchecked, then the plugin automatically resolves absolute paths, fingerprints, + package and module names from the source files in the workspace. + If this operation slows down your build, you can use this option to deactivate this feature. +
diff --git a/plugin/src/main/resources/issues/scan-parameters.jelly b/plugin/src/main/resources/issues/scan-parameters.jelly index f913542c40..4b3a203ca1 100644 --- a/plugin/src/main/resources/issues/scan-parameters.jelly +++ b/plugin/src/main/resources/issues/scan-parameters.jelly @@ -12,6 +12,11 @@ + + + + + diff --git a/plugin/src/main/resources/issues/scan-parameters.properties b/plugin/src/main/resources/issues/scan-parameters.properties index dffd331ddc..72aa44f91e 100644 --- a/plugin/src/main/resources/issues/scan-parameters.properties +++ b/plugin/src/main/resources/issues/scan-parameters.properties @@ -4,6 +4,7 @@ title.sourceDirectories=Source Directories description.sourceDirectories=Additional paths to the source code if not in the root of the workspace \ (or outside the workspace). title.blameDisabled=Disable retrieval of blame information (author and commit) from SCM +title.skipPostProcessing=Disable detection of missing package and module names title.filter=Issue Filters description.filter=Issues will be matched with all the specified filters. If no filter is \ defined, then all issues will be published. Filters with empty regular expression will be ignored. diff --git a/plugin/src/test/java/io/jenkins/plugins/analysis/core/model/DetailsTableModelTest.java b/plugin/src/test/java/io/jenkins/plugins/analysis/core/model/DetailsTableModelTest.java index 35959d66fb..371fbb6b6c 100644 --- a/plugin/src/test/java/io/jenkins/plugins/analysis/core/model/DetailsTableModelTest.java +++ b/plugin/src/test/java/io/jenkins/plugins/analysis/core/model/DetailsTableModelTest.java @@ -16,7 +16,7 @@ */ class DetailsTableModelTest extends AbstractDetailsModelTest { @Test - @org.jvnet.hudson.test.Issue("JENKINS-64051") + @org.junitpioneer.jupiter.Issue("JENKINS-64051") void shouldNotRemoveWhitespace() { try (IssueBuilder builder = new IssueBuilder()) { builder.setMessage("project: Defaults to NumberGroupSeparator on .NET Core except on Windows."); diff --git a/plugin/src/test/java/io/jenkins/plugins/analysis/core/steps/IssuesAggregatorTest.java b/plugin/src/test/java/io/jenkins/plugins/analysis/core/steps/IssuesAggregatorTest.java index 8fc53cd44a..cb6f79e2f1 100644 --- a/plugin/src/test/java/io/jenkins/plugins/analysis/core/steps/IssuesAggregatorTest.java +++ b/plugin/src/test/java/io/jenkins/plugins/analysis/core/steps/IssuesAggregatorTest.java @@ -74,7 +74,7 @@ void shouldCollectSingleResultForSingleAxis() { verify(recorder).publishResult(any(), any(), anyString(), any(), anyString(), any()); } - @Test @org.jvnet.hudson.test.Issue("JENKINS-59178") + @Test @org.junitpioneer.jupiter.Issue("JENKINS-59178") void shouldCollectDifferentResultsForTwoAxes() { IssuesRecorder recorder = mock(IssuesRecorder.class); IssuesAggregator aggregator = createIssueAggregator(recorder); diff --git a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/integrations/TimeStamperPluginITest.java b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/integrations/TimeStamperPluginITest.java index ffe284ad69..c0b51ba631 100644 --- a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/integrations/TimeStamperPluginITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/integrations/TimeStamperPluginITest.java @@ -65,7 +65,7 @@ private String getWorkspacePath(final WorkflowJob project, final String fileName /** * Tests JENKINS-56484: Error while parsing clang errors with active timestamper plugin. */ - @Test @org.jvnet.hudson.test.Issue("JENKINS-56484") + @Test @org.junitpioneer.jupiter.Issue("JENKINS-56484") void shouldCorrectlyParseClangErrors() { WorkflowJob project = createPipeline(); diff --git a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/AffectedFilesResolverITest.java b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/AffectedFilesResolverITest.java index 04129d9a1c..ebfbc79869 100644 --- a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/AffectedFilesResolverITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/AffectedFilesResolverITest.java @@ -210,7 +210,7 @@ void shouldShowNoFilesOutsideWorkspace() { * Verifies that a source code file will be copied from outside the workspace if configured correspondingly. */ @Test - @org.jvnet.hudson.test.Issue("JENKINS-55998") + @org.junitpioneer.jupiter.Issue("JENKINS-55998") void shouldShowFileOutsideWorkspaceIfConfigured() { FreeStyleProject job = createFreeStyleProject(); prepareGccLog(job); diff --git a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/MiscIssuesRecorderITest.java b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/MiscIssuesRecorderITest.java index 6c6975779f..afdb10d8a4 100644 --- a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/MiscIssuesRecorderITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/MiscIssuesRecorderITest.java @@ -57,7 +57,7 @@ class MiscIssuesRecorderITest extends IntegrationTestWithJenkinsPerSuite { /** * Verifies that {@link FindBugs} handles the different severity mapping modes ({@link PriorityProperty}). */ - @Test @org.jvnet.hudson.test.Issue("JENKINS-55514") + @Test @org.junitpioneer.jupiter.Issue("JENKINS-55514") void shouldMapSeverityFilterForFindBugs() { FreeStyleProject project = createFreeStyleProjectWithWorkspaceFilesWithSuffix("findbugs-severities.xml"); @@ -208,7 +208,6 @@ void shouldCreateSingleActionIfAggregationEnabled() { first -> assertThat(first).endsWith("checkstyle-issues.txt"), second -> assertThat(second).endsWith("pmd-warnings-issues.txt") ); - } private List runJobWithAggregation(final boolean isAggregationEnabled) { @@ -223,7 +222,7 @@ private List runJobWithAggregation(final boolean isAggregationEn /** * Runs the CheckStyle and PMD tools for two corresponding files which contain 10 issues in total. Since a filter - * afterwords removes all issues, the actual result contains no warnings. However, the two origins are still + * afterword removes all issues, the actual result contains no warnings. However, the two origins are still * reported with a total of 0 warnings per origin. */ @Test @@ -258,7 +257,7 @@ void shouldHaveOriginsIfBuildContainsWarnings() { * Verifies that a report that contains errors (since the report pattern does not find some files), * will fail the step if the property {@link IssuesRecorder#setFailOnError(boolean)} is enabled. */ - @Test @org.jvnet.hudson.test.Issue("JENKINS-58056") + @Test @org.junitpioneer.jupiter.Issue("JENKINS-58056") void shouldFailBuildWhenFailBuildOnErrorsIsSet() { FreeStyleProject job = createFreeStyleProject(); IssuesRecorder recorder = enableEclipseWarnings(job); diff --git a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/ModuleDetectorITest.java b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/ModuleDetectorITest.java index 79d24c66bf..31c45ff832 100644 --- a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/ModuleDetectorITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/ModuleDetectorITest.java @@ -14,6 +14,7 @@ import hudson.FilePath; import hudson.model.FreeStyleProject; +import hudson.model.Run; import io.jenkins.plugins.analysis.core.model.ResultAction; import io.jenkins.plugins.analysis.core.testutil.IntegrationTestWithJenkinsPerSuite; @@ -129,6 +130,36 @@ void shouldShowModulesForVariousModulesDetectedForOsgiMavenAndAntInTheHtmlOutput new PropertyRow("Test-Bundle-Name", 1)); } + @Test + void shouldSkipPostProcessing() { + String[] workspaceFiles = { + BUILD_FILE_PATH + ANT_BUILD_FILE_LOCATION + "build.xml", + BUILD_FILE_PATH + ANT_BUILD_FILE_LOCATION + "m1/build.xml", + BUILD_FILE_PATH + MAVEN_BUILD_FILE_LOCATION + "pom.xml", + BUILD_FILE_PATH + MAVEN_BUILD_FILE_LOCATION + "m1/pom.xml", + BUILD_FILE_PATH + MAVEN_BUILD_FILE_LOCATION + "m2/pom.xml", + BUILD_FILE_PATH + OSGI_BUILD_FILE_LOCATION + "META-INF/MANIFEST.MF", + BUILD_FILE_PATH + OSGI_BUILD_FILE_LOCATION + "m1/META-INF/MANIFEST.MF", + BUILD_FILE_PATH + OSGI_BUILD_FILE_LOCATION + "m2/META-INF/MANIFEST.MF", + BUILD_FILE_PATH + OSGI_BUILD_FILE_LOCATION + "m3/META-INF/MANIFEST.MF", + BUILD_FILE_PATH + OSGI_BUILD_FILE_LOCATION + "plugin.properties"}; + + FreeStyleProject project = createFreeStyleProject(); + copyWorkspaceFiles(project, workspaceFiles, file -> file.replaceFirst("detectors/buildfiles/\\w*/", "")); + var recorder = enableGenericWarnings(project, new Eclipse()); + recorder.setSkipPostProcessing(true); + + createEclipseWarningsReport(workspaceFiles.length - 1, true, + getJenkins().jenkins.getWorkspaceFor(project)); + + Run build = buildSuccessfully(project); + ResultAction result = getResultAction(build); + assertThat(result.getResult().getIssues().getModules()).containsExactly("-"); + + assertThat(getConsoleLog(build)).doesNotContain("Resolving module names from module definitions (build.xml, pom.xml, or Manifest.mf files)"); + assertThat(getConsoleLog(build)).contains("Skipping post processing"); + } + /** * Verifies that the output is correct if there are only Maven modules in the expected HTML output. */ diff --git a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/PackageDetectorsITest.java b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/PackageDetectorsITest.java index 631f937a79..16631fffb8 100644 --- a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/PackageDetectorsITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/PackageDetectorsITest.java @@ -42,7 +42,7 @@ class PackageDetectorsITest extends IntegrationTestWithJenkinsPerSuite { * in the expected HTML output. */ @Test - @org.jvnet.hudson.test.Issue("JENKINS-58538") + @org.junitpioneer.jupiter.Issue("JENKINS-58538") void shouldShowFolderDistributionRatherThanPackageDistribution() { FreeStyleProject project = createFreeStyleProject(); @@ -311,9 +311,6 @@ void shouldDetectVariousNamespacesForCSharpFiles() { assertThat(logOutput).contains(returnExpectedNumberOfResolvedPackageNames(6)); } - /** - * Verifies that various packages (Java) are handled correctly. - */ @Test void shouldDetectVariousPackagesForJavaFiles() { ResultAction action = buildProject( @@ -330,16 +327,39 @@ void shouldDetectVariousPackagesForJavaFiles() { assertThat(result.getIssues().getPackages()).containsExactly( "edu.hm.hafner.analysis._123.int.naming.structure", "-"); - Map totalByPacakgeName = collectPackageNames(result); - assertThat(totalByPacakgeName).hasSize(2); - assertThat(totalByPacakgeName.get("edu.hm.hafner.analysis._123.int.naming.structure")).isEqualTo(1L); - assertThat(totalByPacakgeName.get("-")).isEqualTo(5L); + Map totalByPackageName = collectPackageNames(result); + assertThat(totalByPackageName).hasSize(2); + assertThat(totalByPackageName.get("edu.hm.hafner.analysis._123.int.naming.structure")).isEqualTo(1L); + assertThat(totalByPackageName.get("-")).isEqualTo(5L); String consoleLog = getConsoleLog(result); assertThat(consoleLog).contains(DEFAULT_DEBUG_LOG_LINE); assertThat(consoleLog).contains(returnExpectedNumberOfResolvedPackageNames(6)); } + @Test + void shouldSkipPackageDetection() { + FreeStyleProject project = createJobWithWorkspaceFiles( + PACKAGE_WITH_FILES_JAVA + "eclipseForJavaVariousClasses.txt", + PACKAGE_WITH_FILES_JAVA + "SampleClassWithPackage.java", + PACKAGE_WITH_FILES_JAVA + "SampleClassWithoutPackage.java", + PACKAGE_WITH_FILES_JAVA + "SampleClassWithUnconventionalPackageNaming.java", + PACKAGE_WITH_FILES_JAVA + "SampleClassWithBrokenPackageNaming.java"); + var recorder = enableGenericWarnings(project, new Eclipse()); + recorder.setSkipPostProcessing(true); + + Run build = buildSuccessfully(project); + ResultAction action = getResultAction(build); + + AnalysisResult result = action.getResult(); + assertThat(result.getIssues()).hasSize(6); + assertThat(result.getIssues().getPackages()).containsExactly("-"); + + String consoleLog = getConsoleLog(result); + assertThat(consoleLog).doesNotContain(DEFAULT_DEBUG_LOG_LINE); + assertThat(consoleLog).contains("Skipping post processing"); + } + private String returnExpectedNumberOfResolvedPackageNames(final int expectedNumberOfResolvedPackageNames) { return "-> resolved package names of " + expectedNumberOfResolvedPackageNames + " affected files"; } diff --git a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/StepsITest.java b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/StepsITest.java index f7cd5aa80e..6400d1a312 100644 --- a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/StepsITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/StepsITest.java @@ -112,7 +112,7 @@ void shouldWhitelistScannerApi() { * Runs a pipeline and verifies the {@code recordIssues} step has some allowlisted methods. */ @Test - @org.jvnet.hudson.test.Issue("JENKINS-63109") + @org.junitpioneer.jupiter.Issue("JENKINS-63109") void shouldWhitelistRecorderApi() { WorkflowJob job = createPipelineWithWorkspaceFilesWithSuffix("checkstyle1.xml", "checkstyle2.xml"); @@ -558,7 +558,7 @@ void shouldEnforceQualityGate() { /** Runs the JavaDoc parser and enforces quality gates. */ @Test - @org.jvnet.hudson.test.Issue("JENKINS-58253") + @org.junitpioneer.jupiter.Issue("JENKINS-58253") void shouldFailBuildWhenFailBuildOnErrorsIsSet() { WorkflowJob job = createPipeline(); @@ -575,7 +575,7 @@ void shouldFailBuildWhenFailBuildOnErrorsIsSet() { /** Runs the JavaDoc parser and enforces quality gates. */ @Test - @org.jvnet.hudson.test.Issue("JENKINS-58253") + @org.junitpioneer.jupiter.Issue("JENKINS-58253") void shouldSupportDeprecatedAttributesInRecord() { WorkflowJob job = createPipelineWithWorkspaceFilesWithSuffix("javadoc.txt"); @@ -602,7 +602,7 @@ void shouldSupportDeprecatedAttributesInRecord() { /** Runs the JavaDoc parser and enforces quality gates. */ @Test - @org.jvnet.hudson.test.Issue("JENKINS-58253") + @org.junitpioneer.jupiter.Issue("JENKINS-58253") void shouldSupportDeprecatedAttributesInPublish() { WorkflowJob job = createPipelineWithWorkspaceFilesWithSuffix("javadoc.txt"); @@ -677,7 +677,7 @@ private void assertThatJavaIssuesArePublished(final AnalysisResult result) { * for the origin field as well. */ @Test - @org.jvnet.hudson.test.Issue("JENKINS-57638") + @org.junitpioneer.jupiter.Issue("JENKINS-57638") void shouldUseCustomIdsForOrigin() { verifyCustomIdsForOrigin(asStage( "def java = scanForIssues tool: java(pattern:'**/*issues.txt', reportEncoding:'UTF-8', id:'id1', name:'name1')", @@ -690,7 +690,7 @@ void shouldUseCustomIdsForOrigin() { * for the origin field as well. */ @Test - @org.jvnet.hudson.test.Issue("JENKINS-57638") + @org.junitpioneer.jupiter.Issue("JENKINS-57638") void shouldUseCustomIdsForOriginSimpleStep() { verifyCustomIdsForOrigin(asStage( "recordIssues(\n" @@ -1090,7 +1090,7 @@ void shouldHandleMissingJobBuildIdAsReference() { * @see Issue 39203 */ @Test - @org.jvnet.hudson.test.Issue("JENKINS-39203") + @org.junitpioneer.jupiter.Issue("JENKINS-39203") void publishIssuesShouldMarkStepWithWarningAction() { WorkflowJob job = createPipelineWithWorkspaceFilesWithSuffix("javac.txt"); job.setDefinition(asStage(createScanForIssuesStep(new Java(), "java"), @@ -1112,7 +1112,7 @@ void publishIssuesShouldMarkStepWithWarningAction() { * @see Issue 39203 */ @Test - @org.jvnet.hudson.test.Issue("JENKINS-39203") + @org.junitpioneer.jupiter.Issue("JENKINS-39203") void recordIssuesShouldMarkStepWithWarningAction() { WorkflowJob job = createPipelineWithWorkspaceFilesWithSuffix("javac.txt"); job.setDefinition(asStage("recordIssues(tool: java(pattern:'**/*issues.txt', reportEncoding:'UTF-8')," diff --git a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/StepsOnAgentITest.java b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/StepsOnAgentITest.java index 08044c132f..766f27de2a 100644 --- a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/StepsOnAgentITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/steps/StepsOnAgentITest.java @@ -35,7 +35,7 @@ class StepsOnAgentITest extends IntegrationTestWithJenkinsPerTest { * active, see JENKINS-56007 for details. */ @Test - @org.jvnet.hudson.test.Issue("JENKINS-56007") + @org.junitpioneer.jupiter.Issue("JENKINS-56007") void shouldCopySourcesIfMasterAgentSecurityIsActive() { Slave agent = createAgentWithEnabledSecurity("agent"); @@ -58,7 +58,7 @@ void shouldCopySourcesIfMasterAgentSecurityIsActive() { } private String getSourceCode(final AnalysisResult result, final int rowIndex) { - IssuesDetail target = (IssuesDetail) result.getOwner().getAction(ResultAction.class).getTarget(); + IssuesDetail target = result.getOwner().getAction(ResultAction.class).getTarget(); String sourceCodeUrl = new FileNameRenderer(result.getOwner()).getSourceCodeUrl( result.getIssues().get(rowIndex)); SourceCodeViewModel dynamic = (SourceCodeViewModel) target.getDynamic( diff --git a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/tasks/TaskScannerTest.java b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/tasks/TaskScannerTest.java index 56d7c264c2..7f6a9aec5a 100644 --- a/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/tasks/TaskScannerTest.java +++ b/plugin/src/test/java/io/jenkins/plugins/analysis/warnings/tasks/TaskScannerTest.java @@ -118,7 +118,7 @@ void shouldParseRegularExpressionsIssue17225() { * * @see Issue 64622 */ - @Test @org.jvnet.hudson.test.Issue("JENKINS-64622") + @Test @org.junitpioneer.jupiter.Issue("JENKINS-64622") void shouldHandleEmptyMatchWithRegExp() { Report tasks = new TaskScannerBuilder() .setHighTasks("(a)?(b)?.*") @@ -134,7 +134,7 @@ void shouldHandleEmptyMatchWithRegExp() { * * @see Issue 22744 */ - @Test @org.jvnet.hudson.test.Issue("JENKINS-22744") + @Test @org.junitpioneer.jupiter.Issue("JENKINS-22744") void issue22744() { Report tasks = new TaskScannerBuilder() .setHighTasks("FIXME") diff --git a/ui-tests/src/main/java/io/jenkins/plugins/analysis/warnings/IssuesRecorder.java b/ui-tests/src/main/java/io/jenkins/plugins/analysis/warnings/IssuesRecorder.java index ccb8dbd794..cb7480f7bb 100644 --- a/ui-tests/src/main/java/io/jenkins/plugins/analysis/warnings/IssuesRecorder.java +++ b/ui-tests/src/main/java/io/jenkins/plugins/analysis/warnings/IssuesRecorder.java @@ -37,6 +37,7 @@ public class IssuesRecorder extends AbstractStep implements PostBuildStep { private final Control sourceCodeEncoding = control("sourceCodeEncoding"); private final Control sourceDirectories = findRepeatableAddButtonFor("sourceDirectories"); private final Control skipBlames = control("skipBlames"); + private final Control skipPostProcessing = control("skipPostProcessing"); private final Control ignoreFailedBuilds = control("ignoreFailedBuilds"); private final Control failOnError = control("failOnError"); private final Control skipPublishingChecks = control("skipPublishingChecks"); @@ -188,7 +189,7 @@ public boolean isAggregatingResults() { } /** - * Returns whether the report results is in logger output. + * Returns whether the report results is in logger output. * * @return {@code true} then the report logging of each static analysis tool is muted * {@code false} then reports logging goes to loghandler output @@ -215,15 +216,14 @@ public String getScm() { return scm.get(); } - /** - * Returns whether SCM blaming should be disabled. - * - * @return {@code true} if SCM blaming should be disabled - */ public boolean isSkipBlames() { return isChecked(skipBlames); } + public boolean isSkipPostProcessing() { + return isChecked(skipPostProcessing); + } + public boolean isIgnoringFailedBuilds() { return isChecked(ignoreFailedBuilds); } @@ -375,7 +375,7 @@ public IssuesRecorder setAggregatingResults(final boolean aggregatingResults) { } /** - * Determines whether the report results will go to logger output. + * Determines whether the report results will go to logger output. * * @param quiet * if {@code true} then the report logging of each static analysis tool is muted @@ -418,6 +418,20 @@ public IssuesRecorder setSkipBlames(final boolean blameDisabled) { return this; } + /** + * Determines whether post-processing should be disabled or not. + * + * @param skipPostProcessing + * {@code true} if post-processing should be disabled, {@code false} otherwise + * + * @return this recorder + */ + public IssuesRecorder setSkipPostProcessing(final boolean skipPostProcessing) { + this.skipPostProcessing.check(skipPostProcessing); + + return this; + } + /** * If {@code true}, then only successful or unstable reference builds will be considered. This option is enabled by * default, since analysis results might be inaccurate if the build failed. If {@code false}, every build that diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/warnings/FreeStyleConfigurationUiTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/warnings/FreeStyleConfigurationUiTest.java index 6c70a540a1..08801ae5b5 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/warnings/FreeStyleConfigurationUiTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/warnings/FreeStyleConfigurationUiTest.java @@ -45,6 +45,7 @@ public void shouldSetPropertiesInJobConfiguration() { issuesRecorder.setIgnoreQualityGate(true); issuesRecorder.setIgnoreFailedBuilds(true); issuesRecorder.setSkipPublishingChecks(true); + issuesRecorder.setSkipPostProcessing(true); issuesRecorder.setPublishAllIssues(true); issuesRecorder.setFailOnError(true); issuesRecorder.setQuiet(true); @@ -67,6 +68,7 @@ public void shouldSetPropertiesInJobConfiguration() { assertThat(issuesRecorder).isIgnoringQualityGate(); assertThat(issuesRecorder).isIgnoringFailedBuilds(); assertThat(issuesRecorder).isSkipPublishingChecks(); + assertThat(issuesRecorder).isSkipPostProcessing(); assertThat(issuesRecorder).isPublishAllIssues(); assertThat(issuesRecorder).isFailingOnError(); assertThat(issuesRecorder).isQuiet(); diff --git a/ui-tests/src/test/java/io/jenkins/plugins/analysis/warnings/SnippetGeneratorUiTest.java b/ui-tests/src/test/java/io/jenkins/plugins/analysis/warnings/SnippetGeneratorUiTest.java index f169d577c6..8a69417384 100644 --- a/ui-tests/src/test/java/io/jenkins/plugins/analysis/warnings/SnippetGeneratorUiTest.java +++ b/ui-tests/src/test/java/io/jenkins/plugins/analysis/warnings/SnippetGeneratorUiTest.java @@ -42,6 +42,7 @@ public void defaultConfigurationExplicitTest() { snippetGenerator.selectRecordIssues() .setAggregatingResults(false) .setSkipBlames(false) + .setSkipPostProcessing(false) .setEnabledForFailure(false) .setIgnoreFailedBuilds(true) .setIgnoreQualityGate(false) @@ -75,6 +76,7 @@ public void antiDefaultConfigurationExplicitTest() { assertThat(script).contains("recordIssues"); assertThat(script).contains("aggregatingResults: true"); assertThat(script).contains("skipBlames: true"); + assertThat(script).contains("skipPostProcessing: true"); assertThat(script).contains("enabledForFailure: true"); assertThat(script).contains("ignoreFailedBuilds: false"); assertThat(script).contains("ignoreQualityGate: true"); @@ -126,6 +128,7 @@ public void shouldHandleComplexConfiguration() { assertThat(script).contains("recordIssues"); assertThat(script).contains("aggregatingResults: true"); assertThat(script).contains("skipBlames: true"); + assertThat(script).contains("skipPostProcessing: true"); assertThat(script).contains("enabledForFailure: true"); assertThat(script).contains("filters: [excludeType('*toExclude*')]"); assertThat(script).contains("ignoreFailedBuilds: false");