From 0506113ee7b2be65683175fc28eeb9a039c607d4 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 21 Jan 2020 13:39:11 +0100 Subject: [PATCH] Fixed - not breaking the build when a release task has failed - added skipped state of task --- .../RestartSiteProjectPostReleaseTask.java | 2 +- ...estartSiteProjectPostReleaseTaskTests.java | 2 +- .../SpringMetaReleaseAcceptanceTests.java | 219 +++++++++++++++--- .../SpringSingleProjectAcceptanceTests.java | 2 +- .../main/java/releaser/internal/Releaser.java | 167 ++++++++----- .../postrelease/PostReleaseActions.java | 25 +- .../releaser/internal/sagan/SaganUpdater.java | 7 +- .../internal/tech}/ExecutionResult.java | 35 ++- .../releaser/ReleaserCommandLineRunner.java | 2 +- .../spring/DefaultSpringReleaser.java | 1 + .../spring/ExecutionResultHandler.java | 2 + .../releaser/internal/spring/FlowRunner.java | 1 + .../SpringBatchExecutionResultHandler.java | 11 +- .../spring/SpringBatchFlowRunner.java | 60 +++-- .../internal/spring/SpringReleaser.java | 1 + .../tasks/PostReleaseReleaserTask.java | 2 +- .../releaser/internal/tasks/ReleaserTask.java | 2 +- .../tasks/composite/DryRunCompositeTask.java | 2 +- .../composite/MetaReleaseCompositeTask.java | 2 +- .../MetaReleaseDryRunCompositeTask.java | 2 +- .../tasks/composite/ReleaseCompositeTask.java | 2 +- .../ReleaseVerboseCompositeTask.java | 2 +- .../TrainPostReleaseCompositeTask.java | 2 +- ...CloseMilestonesProjectPostReleaseTask.java | 5 +- .../CreateTemplatesTrainPostReleaseTask.java | 12 +- ...RunUpdatedSamplesTrainPostReleaseTask.java | 5 +- ...ateAllTestSamplesTrainPostReleaseTask.java | 5 +- ...eDocsRepositoryProjectPostReleaseTask.java | 5 +- ...ateDocsRepositoryTrainPostReleaseTask.java | 5 +- .../UpdateGuidesTrainPostReleaseTask.java | 5 +- ...eReleaseTrainDocsTrainPostReleaseTask.java | 5 +- ...eReleaseTrainWikiTrainPostReleaseTask.java | 5 +- .../UpdateSaganProjectPostReleaseTask.java | 6 +- ...dateStartSpringIoTrainPostReleaseTask.java | 5 +- .../release/BuildProjectReleaseTask.java | 5 +- .../BumpBackToSnapshotReleaseTask.java | 5 +- .../tasks/release/CommitReleaseTask.java | 5 +- .../release/DeployArtifactsReleaseTask.java | 5 +- .../tasks/release/PublishDocsReleaseTask.java | 5 +- .../tasks/release/PushChangesReleaseTask.java | 5 +- .../release/UpdatingPomsReleaseTask.java | 5 +- ...java => ProjectsToReleaseGroupsTests.java} | 2 +- 42 files changed, 452 insertions(+), 201 deletions(-) rename {releaser-spring/src/main/java/releaser/internal/spring => releaser-core/src/main/java/releaser/internal/tech}/ExecutionResult.java (82%) rename releaser-spring/src/test/java/releaser/internal/spring/{SpringBatchFlowRunnerTests.java => ProjectsToReleaseGroupsTests.java} (98%) diff --git a/projects/reactor/src/main/java/releaser/reactor/RestartSiteProjectPostReleaseTask.java b/projects/reactor/src/main/java/releaser/reactor/RestartSiteProjectPostReleaseTask.java index cc75607c..dc3f6199 100644 --- a/projects/reactor/src/main/java/releaser/reactor/RestartSiteProjectPostReleaseTask.java +++ b/projects/reactor/src/main/java/releaser/reactor/RestartSiteProjectPostReleaseTask.java @@ -20,9 +20,9 @@ import org.cloudfoundry.operations.CloudFoundryOperations; import org.cloudfoundry.operations.applications.RestartApplicationRequest; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.DryRunReleaseReleaserTask; import releaser.internal.tasks.release.PublishDocsReleaseTask; +import releaser.internal.tech.ExecutionResult; public class RestartSiteProjectPostReleaseTask extends PublishDocsReleaseTask implements DryRunReleaseReleaserTask { diff --git a/projects/reactor/src/test/java/releaser/reactor/RestartSiteProjectPostReleaseTaskTests.java b/projects/reactor/src/test/java/releaser/reactor/RestartSiteProjectPostReleaseTaskTests.java index 0b17573f..e71af351 100644 --- a/projects/reactor/src/test/java/releaser/reactor/RestartSiteProjectPostReleaseTaskTests.java +++ b/projects/reactor/src/test/java/releaser/reactor/RestartSiteProjectPostReleaseTaskTests.java @@ -26,9 +26,9 @@ import releaser.internal.options.Options; import releaser.internal.project.ProjectVersion; import releaser.internal.project.Projects; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.spring.ProjectToRun; import releaser.internal.spring.ProjectsFromBom; +import releaser.internal.tech.ExecutionResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/spring/meta/SpringMetaReleaseAcceptanceTests.java b/projects/spring-cloud/src/test/java/releaser/cloud/spring/meta/SpringMetaReleaseAcceptanceTests.java index 54d42046..4b14ada7 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/spring/meta/SpringMetaReleaseAcceptanceTests.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/spring/meta/SpringMetaReleaseAcceptanceTests.java @@ -35,9 +35,14 @@ import releaser.internal.postrelease.PostReleaseActions; import releaser.internal.project.Projects; import releaser.internal.sagan.SaganClient; import releaser.internal.sagan.SaganUpdater; -import releaser.internal.spring.ExecutionResult; +import releaser.internal.spring.Arguments; import releaser.internal.spring.SpringReleaser; +import releaser.internal.tasks.ReleaseReleaserTask; +import releaser.internal.tasks.composite.MetaReleaseCompositeTask; +import releaser.internal.tasks.composite.ReleaseCompositeTask; import releaser.internal.tasks.release.BuildProjectReleaseTask; +import releaser.internal.tech.BuildUnstableException; +import releaser.internal.tech.ExecutionResult; import releaser.internal.template.TemplateGenerator; import org.springframework.beans.factory.annotation.Autowired; @@ -46,6 +51,7 @@ import org.springframework.boot.WebApplicationType; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -61,11 +67,6 @@ import static org.mockito.ArgumentMatchers.argThat; public class SpringMetaReleaseAcceptanceTests extends AbstractSpringCloudMetaAcceptanceTests { - SpringApplicationBuilder runner = new SpringApplicationBuilder( - SpringMetaReleaseAcceptanceTests.MetaReleaseConfig.class, - SpringMetaReleaseAcceptanceTests.MetaReleaseScanningConfiguration.class) - .web(WebApplicationType.NONE).properties("spring.jmx.enabled=false"); - @Test public void should_perform_a_meta_release_of_sc_release_and_consul() throws Exception { @@ -75,7 +76,7 @@ public class SpringMetaReleaseAcceptanceTests File project = cloneToTemporaryDirectory(tmpFile("spring-cloud-consul")); GitTestUtils.setOriginOnProjectToTmp(origin, project); - run(this.runner, + run(defaultRunner(), properties("debug=true").properties("test.metarelease=true") .properties(metaReleaseArgs(project).bomBranch("vGreenwich.SR2") .addFixedVersions(edgwareSr10()).build()), @@ -94,6 +95,10 @@ public class SpringMetaReleaseAcceptanceTests ExecutionResult result = releaser .release(new OptionsBuilder().metaRelease(true).options()); + // print results + testExecutionResultHandler.accept(result); + then(testExecutionResultHandler.exitedSuccessOrUnstable).isTrue(); + then(result.isFailureOrUnstable()).isFalse(); // consul, release, documentation then(nonAssertingTestProjectGitHandler.clonedProjects).hasSize(3); @@ -107,10 +112,6 @@ public class SpringMetaReleaseAcceptanceTests .contains("refs/tags/v5.3.5.RELEASE"); thenRunUpdatedTestsWereCalled(postReleaseActions); thenUpdateReleaseTrainDocsWasCalled(postReleaseActions); - - // print results - testExecutionResultHandler.accept(result); - then(testExecutionResultHandler.exitedSuccessOrUnstable).isTrue(); }); } @@ -123,7 +124,7 @@ public class SpringMetaReleaseAcceptanceTests File project = cloneToTemporaryDirectory(tmpFile("spring-cloud-consul")); GitTestUtils.setOriginOnProjectToTmp(origin, project); - run(this.runner, properties("debug=true").properties("test.metarelease=true") + run(defaultRunner(), properties("debug=true").properties("test.metarelease=true") .properties(metaReleaseArgsForParallel(project) .bomBranch("vGreenwich.SR2").addFixedVersions(edgwareSr10()) .metaReleaseGroups("example1,example2", @@ -174,7 +175,7 @@ public class SpringMetaReleaseAcceptanceTests File project = cloneToTemporaryDirectory(tmpFile("spring-cloud-consul")); GitTestUtils.setOriginOnProjectToTmp(origin, project); - run(this.runner, + run(defaultRunner(), properties("debug=true").properties("test.metarelease=true") .properties(metaReleaseArgs(project).bomBranch("vGreenwich.SR2") .addFixedVersions(edgwareSr10()).build()), @@ -193,6 +194,10 @@ public class SpringMetaReleaseAcceptanceTests ExecutionResult result = releaser.release(new OptionsBuilder() .metaRelease(true).dryRun(true).options()); + // print results + testExecutionResultHandler.accept(result); + then(testExecutionResultHandler.exitedSuccessOrUnstable).isTrue(); + then(result.isFailureOrUnstable()).isFalse(); // consul, release then(nonAssertingTestProjectGitHandler.clonedProjects).hasSize(2); @@ -206,10 +211,6 @@ public class SpringMetaReleaseAcceptanceTests .doesNotContain("refs/tags/v5.3.5.RELEASE"); thenRunUpdatedTestsWereNotCalled(postReleaseActions); thenUpdateReleaseTrainDocsWasNotCalled(postReleaseActions); - - // print results - testExecutionResultHandler.accept(result); - then(testExecutionResultHandler.exitedSuccessOrUnstable).isTrue(); }); } @@ -223,7 +224,7 @@ public class SpringMetaReleaseAcceptanceTests GitTestUtils.setOriginOnProjectToTmp(origin, project); File temporaryDestination = this.tmp.newFolder(); - run(this.runner, + run(defaultRunner(), properties("debug=true") .properties("test.metarelease=true", "test.mockBuild=true") .properties(metaReleaseArgs(project).bomBranch("Greenwich") @@ -241,13 +242,13 @@ public class SpringMetaReleaseAcceptanceTests ExecutionResult result = releaser .release(new OptionsBuilder().metaRelease(true).options()); - then(result.isFailureOrUnstable()).isFalse(); - thenBuildWasNeverCalledFor(build, "spring-cloud-consul"); - thenBuildWasCalledFor(build, "spring-cloud-release"); - // print results testExecutionResultHandler.accept(result); then(testExecutionResultHandler.exitedSuccessOrUnstable).isTrue(); + + then(result.isFailureOrUnstable()).isFalse(); + thenBuildWasNeverCalledFor(build, "spring-cloud-consul"); + thenBuildWasCalledFor(build, "spring-cloud-release"); }); } @@ -261,7 +262,7 @@ public class SpringMetaReleaseAcceptanceTests GitTestUtils.setOriginOnProjectToTmp(origin, project); File temporaryDestination = this.tmp.newFolder(); - run(this.runner, + run(defaultRunner(), properties("debug=true") .properties("test.metarelease=true", "test.mockBuild=true") .properties(metaReleaseArgs(project).bomBranch("Greenwich") @@ -281,6 +282,10 @@ public class SpringMetaReleaseAcceptanceTests .release(new OptionsBuilder().startFrom("spring-cloud-consul") .metaRelease(true).options()); + // print results + testExecutionResultHandler.accept(result); + then(testExecutionResultHandler.exitedSuccessOrUnstable).isTrue(); + // release then(result.isFailureOrUnstable()).isFalse(); thenBuildWasNeverCalledFor(build, "spring-cloud-build"); @@ -291,10 +296,6 @@ public class SpringMetaReleaseAcceptanceTests thenSaganWasCalled(saganUpdater); thenDocumentationWasUpdated(testDocumentationUpdater); thenWikiPageWasUpdated(testDocumentationUpdater); - - // print results - testExecutionResultHandler.accept(result); - then(testExecutionResultHandler.exitedSuccessOrUnstable).isTrue(); }); } @@ -308,7 +309,7 @@ public class SpringMetaReleaseAcceptanceTests GitTestUtils.setOriginOnProjectToTmp(origin, project); File temporaryDestination = this.tmp.newFolder(); - run(this.runner, + run(defaultRunner(), properties("debug=true") .properties("test.metarelease=true", "test.mockBuild=true") .properties(metaReleaseArgs(project).bomBranch("Greenwich") @@ -328,6 +329,10 @@ public class SpringMetaReleaseAcceptanceTests .taskNames(Collections.singletonList("spring-cloud-consul")) .metaRelease(true).options()); + // print results + testExecutionResultHandler.accept(result); + then(testExecutionResultHandler.exitedSuccessOrUnstable).isTrue(); + // release then(result.isFailureOrUnstable()).isFalse(); thenBuildWasNeverCalledFor(build, "spring-cloud-release"); @@ -338,13 +343,66 @@ public class SpringMetaReleaseAcceptanceTests thenSaganWasCalled(saganUpdater); thenDocumentationWasUpdated(testDocumentationUpdater); thenWikiPageWasUpdated(testDocumentationUpdater); + }); + } + + @Test + public void should_not_execute_any_subsequent_task_when_first_one_fails() + throws Exception { + checkoutReleaseTrainBranch("/projects/spring-cloud-release/", "Greenwich"); + File origin = cloneToTemporaryDirectory(this.springCloudConsulProject); + assertThatClonedConsulProjectIsInSnapshots(origin); + File project = cloneToTemporaryDirectory(tmpFile("spring-cloud-consul")); + GitTestUtils.setOriginOnProjectToTmp(origin, project); + + run(failingBuildRunner(), properties("debug=true") + .properties("test.metarelease=true", "test.metarelease.failing=true", + "releaser.flow.default-enabled=false") + .properties(metaReleaseArgs(project).bomBranch("vGreenwich.SR2") + .addFixedVersions(edgwareSr10()).build()), + context -> { + SpringReleaser releaser = context.getBean(SpringReleaser.class); + NonAssertingTestProjectGitHandler nonAssertingTestProjectGitHandler = context + .getBean(NonAssertingTestProjectGitHandler.class); + TestExecutionResultHandler testExecutionResultHandler = context + .getBean(TestExecutionResultHandler.class); + FirstTask firstTask = context.getBean(FirstTask.class); + SecondTask secondTask = context.getBean(SecondTask.class); + + ExecutionResult result = releaser + .release(new OptionsBuilder().metaRelease(true).options()); // print results testExecutionResultHandler.accept(result); - then(testExecutionResultHandler.exitedSuccessOrUnstable).isTrue(); + then(testExecutionResultHandler.exitedWithException).isTrue(); + + then(result.isFailureOrUnstable()).isTrue(); + // consul + then(nonAssertingTestProjectGitHandler.clonedProjects).hasSize(1); + BDDMockito.then(firstTask).should().runTask(BDDMockito.argThat( + arg -> arg.project.getName().equals("spring-cloud-consul"))); + BDDMockito.then(firstTask).should(BDDMockito.never()) + .runTask(BDDMockito.argThat(arg -> arg.project.getName() + .equals("spring-cloud-release"))); + BDDMockito.then(secondTask).should(BDDMockito.never()) + .runTask(BDDMockito.any(Arguments.class)); }); } + private SpringApplicationBuilder defaultRunner() { + return new SpringApplicationBuilder(MetaReleaseConfig.class, + MetaReleaseScanningConfiguration.class).web(WebApplicationType.NONE) + .properties("spring.jmx.enabled=false"); + } + + private SpringApplicationBuilder failingBuildRunner() { + return new SpringApplicationBuilder( + SpringMetaReleaseAcceptanceTests.MetaReleaseConfig.class, + SpringMetaReleaseAcceptanceTests.MetaReleaseFailingTasksScanningConfiguration.class) + .web(WebApplicationType.NONE) + .properties("spring.jmx.enabled=false"); + } + private void thenWikiPageWasUpdated(DocumentationUpdater documentationUpdater) { BDDMockito.then(documentationUpdater).should() .updateReleaseTrainWiki(BDDMockito.any(Projects.class)); @@ -406,7 +464,11 @@ public class SpringMetaReleaseAcceptanceTests @Bean PostReleaseActions myPostReleaseActions() { - return BDDMockito.mock(PostReleaseActions.class); + return BDDMockito + .mock(PostReleaseActions.class, + invocation -> invocation.getMethod().getReturnType() + .equals(ExecutionResult.class) + ? ExecutionResult.success() : null); } @Bean @@ -444,4 +506,101 @@ public class SpringMetaReleaseAcceptanceTests } + @Configuration + @ConditionalOnProperty(value = "test.metarelease.failing", havingValue = "true") + @ComponentScan({ "releaser.internal", "releaser.cloud" }) + static class MetaReleaseFailingTasksScanningConfiguration { + + @Bean + FirstTask firstTask() { + return BDDMockito.spy(new FirstTask()); + } + + @Bean + SecondTask secondTask() { + return BDDMockito.spy(new SecondTask()); + } + + @Bean + MetaReleaseCompositeTask metaReleaseCompositeTask(ApplicationContext context) { + return new MetaReleaseCompositeTask(context); + } + + @Bean + ReleaseCompositeTask releaseCompositeTask(ApplicationContext context) { + return new ReleaseCompositeTask(context); + } + + } + +} + +class FirstTask implements ReleaseReleaserTask { + + @Override + public String name() { + return "first"; + } + + @Override + public String shortName() { + return "1"; + } + + @Override + public String header() { + return "FIRST"; + } + + @Override + public String description() { + return name(); + } + + @Override + public ExecutionResult runTask(Arguments args) + throws BuildUnstableException, RuntimeException { + return ExecutionResult.failure(new IllegalStateException("Failure")); + } + + @Override + public int getOrder() { + return 0; + } + +} + +class SecondTask implements ReleaseReleaserTask { + + @Override + public String name() { + return "second"; + } + + @Override + public String shortName() { + return "2"; + } + + @Override + public String header() { + return "SECOND"; + } + + @Override + public String description() { + return name(); + } + + @Override + public ExecutionResult runTask(Arguments args) + throws BuildUnstableException, RuntimeException { + return ExecutionResult.success(); + } + + @Override + public int getOrder() { + return 1; + } + } diff --git a/projects/spring-cloud/src/test/java/releaser/cloud/spring/single/SpringSingleProjectAcceptanceTests.java b/projects/spring-cloud/src/test/java/releaser/cloud/spring/single/SpringSingleProjectAcceptanceTests.java index 57f4455d..d8f33802 100644 --- a/projects/spring-cloud/src/test/java/releaser/cloud/spring/single/SpringSingleProjectAcceptanceTests.java +++ b/projects/spring-cloud/src/test/java/releaser/cloud/spring/single/SpringSingleProjectAcceptanceTests.java @@ -38,8 +38,8 @@ import releaser.internal.project.ProjectVersion; import releaser.internal.project.Projects; import releaser.internal.sagan.SaganClient; import releaser.internal.spring.ArgsBuilder; -import releaser.internal.spring.ExecutionResult; import releaser.internal.spring.SpringReleaser; +import releaser.internal.tech.ExecutionResult; import releaser.internal.template.TemplateGenerator; import org.springframework.beans.factory.annotation.Autowired; diff --git a/releaser-core/src/main/java/releaser/internal/Releaser.java b/releaser-core/src/main/java/releaser/internal/Releaser.java index d0d2fc38..eb8ed962 100644 --- a/releaser-core/src/main/java/releaser/internal/Releaser.java +++ b/releaser-core/src/main/java/releaser/internal/Releaser.java @@ -33,6 +33,7 @@ import releaser.internal.project.ProjectVersion; import releaser.internal.project.Projects; import releaser.internal.sagan.SaganUpdater; import releaser.internal.tech.BuildUnstableException; +import releaser.internal.tech.ExecutionResult; import releaser.internal.template.TemplateGenerator; import org.springframework.util.Assert; @@ -100,12 +101,12 @@ public class Releaser implements ReleaserPropertiesAware { return this.projectPomUpdater.fixedVersions(); } - public void updateProjectFromBom(File project, Projects versions, + public ExecutionResult updateProjectFromBom(File project, Projects versions, ProjectVersion versionFromBom) { - updateProjectFromBom(project, versions, versionFromBom, ASSERT_SNAPSHOTS); + return updateProjectFromBom(project, versions, versionFromBom, ASSERT_SNAPSHOTS); } - private void updateProjectFromBom(File project, Projects versions, + private ExecutionResult updateProjectFromBom(File project, Projects versions, ProjectVersion versionFromBom, boolean assertSnapshots) { log.info("Will update the project with versions [{}]", versions); this.projectPomUpdater.updateProjectFromReleaseTrain(project, versions, @@ -114,35 +115,42 @@ public class Releaser implements ReleaserPropertiesAware { versionFromBom, assertSnapshots); ProjectVersion changedVersion = new ProjectVersion(project); log.info("\n\nProject was successfully updated to [{}]", changedVersion.version); + return ExecutionResult.success(); } - public void buildProject(ProjectVersion originalVersion, + public ExecutionResult buildProject(ProjectVersion originalVersion, ProjectVersion versionFromBom) { this.projectCommandExecutor.build(originalVersion, versionFromBom); log.info("\nProject was successfully built"); + return ExecutionResult.success(); } - public void commitAndPushTags(File project, ProjectVersion changedVersion) { + public ExecutionResult commitAndPushTags(File project, + ProjectVersion changedVersion) { this.projectGitHandler.commitAndTagIfApplicable(project, changedVersion); log.info("\nCommit was made and tag was pushed successfully"); + return ExecutionResult.success(); } - public void deploy(ProjectVersion originalVersion, ProjectVersion versionFromBom) { + public ExecutionResult deploy(ProjectVersion originalVersion, + ProjectVersion versionFromBom) { this.projectCommandExecutor.deploy(originalVersion, versionFromBom); log.info("\nThe artifact was deployed successfully"); + return ExecutionResult.success(); } - public void publishDocs(ProjectVersion originalVersion, + public ExecutionResult publishDocs(ProjectVersion originalVersion, ProjectVersion changedVersion) { this.projectCommandExecutor.publishDocs(originalVersion, changedVersion); log.info("\nThe docs were published successfully"); + return ExecutionResult.success(); } - public void rollbackReleaseVersion(File project, Projects projects, + public ExecutionResult rollbackReleaseVersion(File project, Projects projects, ProjectVersion scReleaseVersion) { if (scReleaseVersion.isSnapshot()) { log.info("\nWon't rollback a snapshot version"); - return; + return ExecutionResult.skipped(); } this.projectGitHandler.revertChangesIfApplicable(project, scReleaseVersion); ProjectVersion originalVersion = originalVersion(project); @@ -155,9 +163,10 @@ public class Releaser implements ReleaserPropertiesAware { log.info( "\nSuccessfully reverted the commit and came back to snapshot versions"); } + return ExecutionResult.success(); } - private void updateBumpedVersions(File project, Projects projects, + private ExecutionResult updateBumpedVersions(File project, Projects projects, ProjectVersion originalVersion) { Projects newProjects = Projects.forRollback(releaserProperties, projects); ProjectVersion bumpedProject = bumpProject(originalVersion, newProjects); @@ -166,6 +175,7 @@ public class Releaser implements ReleaserPropertiesAware { SKIP_SNAPSHOT_ASSERTION); this.projectGitHandler.commitAfterBumpingVersions(project, bumpedProject); log.info("\nSuccessfully reverted the commit and bumped snapshot versions"); + return ExecutionResult.success(); } private ProjectVersion bumpProject(ProjectVersion originalVersion, @@ -179,96 +189,108 @@ public class Releaser implements ReleaserPropertiesAware { return new ProjectVersion(project); } - public void pushCurrentBranch(File project) { + public ExecutionResult pushCurrentBranch(File project) { this.projectGitHandler.pushCurrentBranch(project); log.info("\nSuccessfully pushed current branch"); + return ExecutionResult.success(); } - public void closeMilestone(ProjectVersion releaseVersion) { + public ExecutionResult closeMilestone(ProjectVersion releaseVersion) { if (releaseVersion.isSnapshot()) { log.info("\nWon't close a milestone for a SNAPSHOT version"); - return; + return ExecutionResult.skipped(); } try { this.projectGitHubHandler.closeMilestone(releaseVersion); log.info("\nSuccessfully closed milestone"); + return ExecutionResult.success(); } catch (Exception ex) { - throw new BuildUnstableException("Failed to create an email template"); + return ExecutionResult.unstable(ex); } } - public void createEmail(ProjectVersion releaseVersion, Projects projects) { + public ExecutionResult createEmail(ProjectVersion releaseVersion, Projects projects) { Assert.notNull(releaseVersion, "You must provide a release version for your project"); Assert.notNull(releaseVersion.version, "You must provide a release version for your project"); if (releaseVersion.isSnapshot()) { log.info("\nWon't create email template for a SNAPSHOT version"); - return; + return ExecutionResult.skipped(); } try { File email = this.templateGenerator.email(projects); if (email != null) { log.info("\nSuccessfully created email template at location [{}]", email); + return ExecutionResult.success(); } else { - throw new BuildUnstableException("Failed to create an email template"); + return ExecutionResult.unstable( + new BuildUnstableException("Failed to create an email template")); } } catch (Exception ex) { - throw new BuildUnstableException("Failed to create an email template", ex); + return ExecutionResult.unstable( + new BuildUnstableException("Failed to create an email template", ex)); } } - public void createBlog(ProjectVersion releaseVersion, Projects projects) { + public ExecutionResult createBlog(ProjectVersion releaseVersion, Projects projects) { if (releaseVersion.isSnapshot()) { log.info("\nWon't create blog template for a SNAPSHOT version"); - return; + return ExecutionResult.skipped(); } try { File blog = this.templateGenerator.blog(projects); if (blog != null) { log.info("\nSuccessfully created blog template at location [{}]", blog); + return ExecutionResult.success(); } else { - throw new BuildUnstableException("Failed to create a blog template"); + return ExecutionResult.unstable( + new BuildUnstableException("Failed to create a blog template")); } } catch (Exception ex) { - throw new BuildUnstableException("Failed to create a blog template", ex); + return ExecutionResult.unstable( + new BuildUnstableException("Failed to create a blog template", ex)); } } - public void updateSpringGuides(ProjectVersion releaseVersion, Projects projects, - List processedProjects) { + public ExecutionResult updateSpringGuides(ProjectVersion releaseVersion, + Projects projects, List processedProjects) { if (!(releaseVersion.isRelease() || releaseVersion.isServiceRelease())) { log.info( "\nWon't update Spring Guides for a non Release / Service Release version"); - return; + return ExecutionResult.skipped(); } Exception springGuidesException = createIssueInSpringGuides(releaseVersion, projects); Exception deployGuidesException = deployGuides(processedProjects); if (springGuidesException != null || deployGuidesException != null) { - throw new BuildUnstableException( + return ExecutionResult.unstable(new BuildUnstableException( "Failed to update Spring Guides. Spring Guides updated successfully [" + (springGuidesException != null) + "] deployed guides successfully [" - + (deployGuidesException != null) + "]"); + + (deployGuidesException != null) + "]")); } + return ExecutionResult.success(); } - public void updateStartSpringIo(ProjectVersion releaseVersion, Projects projects) { + public ExecutionResult updateStartSpringIo(ProjectVersion releaseVersion, + Projects projects) { if (!(releaseVersion.isRelease() || releaseVersion.isServiceRelease())) { log.info( "\nWon't update start.spring.io for a non Release / Service Release version"); - return; + return ExecutionResult.skipped(); } Exception exception = createIssueInStartSpringIo(releaseVersion, projects); if (exception != null) { - throw new BuildUnstableException("Failed to update start.spring.io"); + return ExecutionResult.unstable( + new BuildUnstableException("Failed to update start.spring.io")); } + return ExecutionResult.success(); } private Exception createIssueInSpringGuides(ProjectVersion releaseVersion, @@ -311,93 +333,110 @@ public class Releaser implements ReleaserPropertiesAware { } } - public void createTweet(ProjectVersion releaseVersion, Projects projects) { + public ExecutionResult createTweet(ProjectVersion releaseVersion, Projects projects) { if (releaseVersion.isSnapshot()) { log.info("\nWon't create tweet template for a SNAPSHOT version"); - return; + return ExecutionResult.skipped(); } try { File tweet = this.templateGenerator.tweet(projects); if (tweet != null) { log.info("\nSuccessfully created tweet template at location [{}]", tweet); + return ExecutionResult.success(); } else { - throw new BuildUnstableException("Failed to create a tweet template"); + return ExecutionResult.unstable( + new BuildUnstableException("Failed to create a tweet template")); } } catch (Exception ex) { - throw new BuildUnstableException("Failed to create a tweet template", ex); + return ExecutionResult.unstable( + new BuildUnstableException("Failed to create a tweet template", ex)); } } - public void createReleaseNotes(ProjectVersion releaseVersion, Projects projects) { + public ExecutionResult createReleaseNotes(ProjectVersion releaseVersion, + Projects projects) { if (releaseVersion.isSnapshot()) { log.info("\nWon't create release notes for a SNAPSHOT version"); - return; + return ExecutionResult.skipped(); } try { File output = this.templateGenerator.releaseNotes(projects); log.info("\nSuccessfully created release notes at location [{}]", output); + return ExecutionResult.success(); } catch (Exception ex) { - throw new BuildUnstableException("Failed to create release notes", ex); + return ExecutionResult.unstable( + new BuildUnstableException("Failed to create release notes", ex)); } } - public void updateSagan(File project, ProjectVersion releaseVersion, + public ExecutionResult updateSagan(File project, ProjectVersion releaseVersion, Projects projects) { String currentBranch = this.projectGitHandler.currentBranch(project); ProjectVersion originalVersion = new ProjectVersion(project); try { - this.saganUpdater.updateSagan(project, currentBranch, originalVersion, + return this.saganUpdater.updateSagan(project, currentBranch, originalVersion, releaseVersion, projects); - log.info("\nSuccessfully updated Sagan for branch [{}]", currentBranch); } catch (Exception ex) { - throw new BuildUnstableException(ex); + return ExecutionResult.unstable(new BuildUnstableException(ex)); } } - public void updateDocumentationRepositoryForTrain(ReleaserProperties properties, - Projects projects, ProjectVersion releaseVersion) { + public ExecutionResult updateDocumentationRepositoryForTrain( + ReleaserProperties properties, Projects projects, + ProjectVersion releaseVersion) { String releaseBranch = properties.getPom().getBranch(); - this.documentationUpdater.updateDocsRepo(projects, releaseVersion, releaseBranch); - log.info("\nSuccessfully updated documentation repository for train branch [{}]", + File file = this.documentationUpdater.updateDocsRepo(projects, releaseVersion, releaseBranch); + if (file != null) { + log.info( + "\nSuccessfully updated documentation repository for train branch [{}]", + releaseBranch); + return ExecutionResult.success(); + } + return ExecutionResult.skipped(); } - public void updateDocumentationRepositoryForSingleProject(Projects projects, - ProjectVersion releaseVersion) { + public ExecutionResult updateDocumentationRepositoryForSingleProject( + Projects projects, ProjectVersion releaseVersion) { if (releaseVersion.projectName.equals( this.releaserProperties.getMetaRelease().getReleaseTrainProjectName())) { log.info("Will not update documentation for project that is a BOM project"); - return; + return ExecutionResult.skipped(); } - this.documentationUpdater.updateDocsRepoForSingleProject(projects, + File file = this.documentationUpdater.updateDocsRepoForSingleProject(projects, releaseVersion); - log.info( - "\nSuccessfully updated documentation repository for a project with name [{}]", - releaseVersion.projectName); + if (file != null) { + log.info( + "\nSuccessfully updated documentation repository for a project with name [{}]", + releaseVersion.projectName); + return ExecutionResult.success(); + } + return ExecutionResult.skipped(); } - public void runUpdatedSamples(Projects projects) { - this.postReleaseActions.runUpdatedTests(projects); - log.info("\nSuccessfully updated and ran samples"); + public ExecutionResult runUpdatedSamples(Projects projects) { + return this.postReleaseActions.runUpdatedTests(projects); } - public void generateReleaseTrainDocumentation(Projects projects) { - this.postReleaseActions.generateReleaseTrainDocumentation(projects); - log.info("\nSuccessfully updated and generated release train documentation"); + public ExecutionResult generateReleaseTrainDocumentation(Projects projects) { + return this.postReleaseActions.generateReleaseTrainDocumentation(projects); } - public void updateAllSamples(Projects projects) { - this.postReleaseActions.updateAllTestSamples(projects); - log.info("\nSuccessfully updated all samples"); + public ExecutionResult updateAllSamples(Projects projects) { + return this.postReleaseActions.updateAllTestSamples(projects); } - public void updateReleaseTrainWiki(Projects projects) { - this.documentationUpdater.updateReleaseTrainWiki(projects); - log.info("\nSuccessfully updated project wiki"); + public ExecutionResult updateReleaseTrainWiki(Projects projects) { + File file = this.documentationUpdater.updateReleaseTrainWiki(projects); + if (file != null) { + log.info("\nSuccessfully updated project wiki"); + return ExecutionResult.success(); + } + return ExecutionResult.skipped(); } @Override diff --git a/releaser-core/src/main/java/releaser/internal/postrelease/PostReleaseActions.java b/releaser-core/src/main/java/releaser/internal/postrelease/PostReleaseActions.java index ba053fbd..706bd3ef 100644 --- a/releaser-core/src/main/java/releaser/internal/postrelease/PostReleaseActions.java +++ b/releaser-core/src/main/java/releaser/internal/postrelease/PostReleaseActions.java @@ -38,6 +38,7 @@ import releaser.internal.project.ProcessedProject; import releaser.internal.project.ProjectCommandExecutor; import releaser.internal.project.ProjectVersion; import releaser.internal.project.Projects; +import releaser.internal.tech.ExecutionResult; import releaser.internal.versions.VersionsFetcher; import org.springframework.core.NestedExceptionUtils; @@ -80,13 +81,14 @@ public class PostReleaseActions implements Closeable { * Clones the projects, checks out the proper branch and runs guides building and * deployment. * @param processedProjects - set of project with versions to assert against + * @return result of the execution */ - public void deployGuides(List processedProjects) { + public ExecutionResult deployGuides(List processedProjects) { if (!this.properties.getGit().isUpdateSpringGuides()) { log.info( "Will not build and deploy latest Spring Guides, since the switch to do so " + "is off. Set [releaser.git.update-spring-guides] to [true] to change that"); - return; + return ExecutionResult.skipped(); } List latestGaProcessedProjects = processedProjects.stream() .filter(processedProject -> this.versionsFetcher @@ -98,18 +100,20 @@ public class PostReleaseActions implements Closeable { latestGaProcessedProjects); log.info("Deployed all guides!"); assertExceptions(projectUrlAndExceptions); + return ExecutionResult.success(); } /** * Clones the test project, updates it and runs tests. * @param projects - set of project with versions to assert against + * @return result of the execution */ - public void runUpdatedTests(Projects projects) { + public ExecutionResult runUpdatedTests(Projects projects) { if (!this.properties.getGit().isRunUpdatedSamples() || !this.properties.getMetaRelease().isEnabled()) { log.info("Will not update and run test samples, since the switch to do so " + "is off. Set [releaser.git.run-updated-samples] to [true] to change that"); - return; + return ExecutionResult.skipped(); } File file = this.projectGitHandler.cloneTestSamplesProject(); ProjectVersion projectVersion = newProjectVersion(file); @@ -119,6 +123,7 @@ public class PostReleaseActions implements Closeable { updateWithVersions(file, newProjects); this.projectCommandExecutor.build(projectVersion, projectVersion, file.getAbsolutePath()); + return ExecutionResult.success(); } /** @@ -126,13 +131,14 @@ public class PostReleaseActions implements Closeable { * branch, updates all the poms with the new, bumped versions of release train * projects, commits the changes and pushes them. * @param projects - set of project with versions to assert against + * @return result of the execution */ - public void updateAllTestSamples(Projects projects) { + public ExecutionResult updateAllTestSamples(Projects projects) { if (!this.properties.getGit().isUpdateAllTestSamples() || !this.properties.getMetaRelease().isEnabled()) { log.info("Will not update all test samples, since the switch to do so " + "is off. Set [releaser.git.update-all-test-samples] to [true] to change that"); - return; + return ExecutionResult.skipped(); } List projectUrlAndExceptions = this.properties.getGit() .getAllTestSampleUrls().entrySet().stream() @@ -140,6 +146,7 @@ public class PostReleaseActions implements Closeable { .flatMap(Collection::stream).collect(Collectors.toList()); log.info("Updated all samples!"); assertExceptions(projectUrlAndExceptions); + return ExecutionResult.success(); } private void assertExceptions(List projectUrlAndExceptions) { @@ -283,14 +290,15 @@ public class PostReleaseActions implements Closeable { /** * Clones the release train documentation project. * @param projects - set of project with versions to assert against + * @return result of the execution */ - public void generateReleaseTrainDocumentation(Projects projects) { + public ExecutionResult generateReleaseTrainDocumentation(Projects projects) { if (!this.properties.getGit().isUpdateReleaseTrainDocs() || !this.properties.getMetaRelease().isEnabled()) { log.info( "Will not update the release train documentation, since the switch to do so " + "is off. Set [releaser.git.update-release-train-docs] to [true] to change that"); - return; + return ExecutionResult.skipped(); } File file = this.projectGitHandler.cloneReleaseTrainDocumentationProject(); ProjectVersion projectVersion = newProjectVersion(file); @@ -300,6 +308,7 @@ public class PostReleaseActions implements Closeable { updateWithVersions(file, newProjects); this.projectCommandExecutor.generateReleaseTrainDocs(releaseTrainVersion, file.getAbsolutePath()); + return ExecutionResult.success(); } private Projects addVersionForTestsProject(Projects projects, diff --git a/releaser-core/src/main/java/releaser/internal/sagan/SaganUpdater.java b/releaser-core/src/main/java/releaser/internal/sagan/SaganUpdater.java index d5cdc14c..3890fbfa 100644 --- a/releaser-core/src/main/java/releaser/internal/sagan/SaganUpdater.java +++ b/releaser-core/src/main/java/releaser/internal/sagan/SaganUpdater.java @@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory; import releaser.internal.ReleaserProperties; import releaser.internal.project.ProjectVersion; import releaser.internal.project.Projects; +import releaser.internal.tech.ExecutionResult; import org.springframework.util.StringUtils; @@ -48,13 +49,13 @@ public class SaganUpdater { this.releaserProperties = releaserProperties; } - public void updateSagan(File projectFile, String branch, + public ExecutionResult updateSagan(File projectFile, String branch, ProjectVersion originalVersion, ProjectVersion currentVersion, Projects projects) { if (!this.releaserProperties.getSagan().isUpdateSagan()) { log.info("Will not update sagan, since the switch to do so " + "is off. Set [releaser.sagan.update-sagan] to [true] to change that"); - return; + return ExecutionResult.skipped(); } ReleaseUpdate update = releaseUpdate(branch, originalVersion, currentVersion, projects); @@ -74,7 +75,9 @@ public class SaganUpdater { + "the current version [" + currentVersion + "] is older than that one. " + "Will do nothing." : "No latest version found. Will do nothing."); + return ExecutionResult.skipped(); } + return ExecutionResult.success(); } private void updateDocumentationIfNecessary(File projectFile, Project project) { diff --git a/releaser-spring/src/main/java/releaser/internal/spring/ExecutionResult.java b/releaser-core/src/main/java/releaser/internal/tech/ExecutionResult.java similarity index 82% rename from releaser-spring/src/main/java/releaser/internal/spring/ExecutionResult.java rename to releaser-core/src/main/java/releaser/internal/tech/ExecutionResult.java index 43331eba..1368448d 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/ExecutionResult.java +++ b/releaser-core/src/main/java/releaser/internal/tech/ExecutionResult.java @@ -14,14 +14,13 @@ * limitations under the License. */ -package releaser.internal.spring; +package releaser.internal.tech; import java.io.Serializable; import java.util.LinkedList; import java.util.List; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import releaser.internal.tech.BuildUnstableException; /** * Task execution result. Contains a list of exceptions thrown while running the task. @@ -31,15 +30,26 @@ public class ExecutionResult implements Serializable { private List exceptions = new LinkedList<>(); + /** + * Consider an enum in the future. + */ + private boolean skipped; + public ExecutionResult() { } public ExecutionResult(Exception throwable) { this.exceptions.add(throwable); + this.skipped = false; } public ExecutionResult(List throwables) { this.exceptions.addAll(throwables); + this.skipped = false; + } + + public ExecutionResult(boolean skipped) { + this.skipped = skipped; } public static ExecutionResult success() { @@ -50,11 +60,19 @@ public class ExecutionResult implements Serializable { return new ExecutionResult(throwable); } + public static ExecutionResult failure(List throwables) { + return new ExecutionResult(throwables); + } + public static ExecutionResult unstable(Exception ex) { return new ExecutionResult(ex instanceof BuildUnstableException ? ex : new BuildUnstableException(ex)); } + public static ExecutionResult skipped() { + return new ExecutionResult(true); + } + public RuntimeException foundExceptions() { if (this.exceptions.isEmpty()) { return null; @@ -81,6 +99,11 @@ public class ExecutionResult implements Serializable { .allMatch(t -> t instanceof BuildUnstableException); } + public String toStringResult() { + return isUnstable() ? "UNSTABLE" + : isFailure() ? "FAILURE" : isSkipped() ? "SKIPPED" : "SUCCESS"; + } + public boolean isFailure() { return !this.exceptions.isEmpty() && this.exceptions.stream() .anyMatch(t -> !(t instanceof BuildUnstableException)); @@ -102,6 +125,14 @@ public class ExecutionResult implements Serializable { this.exceptions = exceptions; } + public boolean isSkipped() { + return this.skipped; + } + + public void setSkipped(boolean skipped) { + this.skipped = skipped; + } + private static final class MergedThrowable extends RuntimeException implements Serializable { diff --git a/releaser-spring/src/main/java/releaser/ReleaserCommandLineRunner.java b/releaser-spring/src/main/java/releaser/ReleaserCommandLineRunner.java index 174ad5a9..bb68dbc3 100644 --- a/releaser-spring/src/main/java/releaser/ReleaserCommandLineRunner.java +++ b/releaser-spring/src/main/java/releaser/ReleaserCommandLineRunner.java @@ -18,9 +18,9 @@ package releaser; import releaser.internal.options.Options; import releaser.internal.options.Parser; -import releaser.internal.spring.ExecutionResult; import releaser.internal.spring.ExecutionResultHandler; import releaser.internal.spring.SpringReleaser; +import releaser.internal.tech.ExecutionResult; import org.springframework.boot.CommandLineRunner; diff --git a/releaser-spring/src/main/java/releaser/internal/spring/DefaultSpringReleaser.java b/releaser-spring/src/main/java/releaser/internal/spring/DefaultSpringReleaser.java index 628434ed..36111485 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/DefaultSpringReleaser.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/DefaultSpringReleaser.java @@ -19,6 +19,7 @@ package releaser.internal.spring; import releaser.internal.ReleaserProperties; import releaser.internal.options.Options; import releaser.internal.options.OptionsBuilder; +import releaser.internal.tech.ExecutionResult; /** * Releaser that gets input from console. diff --git a/releaser-spring/src/main/java/releaser/internal/spring/ExecutionResultHandler.java b/releaser-spring/src/main/java/releaser/internal/spring/ExecutionResultHandler.java index 8a7d5db3..2d21e467 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/ExecutionResultHandler.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/ExecutionResultHandler.java @@ -18,6 +18,8 @@ package releaser.internal.spring; import java.util.function.Consumer; +import releaser.internal.tech.ExecutionResult; + /** * Handles the result of the execution of the train or project release. Example: You can * print the results in a table, throw exceptions when the build was faulty or just log diff --git a/releaser-spring/src/main/java/releaser/internal/spring/FlowRunner.java b/releaser-spring/src/main/java/releaser/internal/spring/FlowRunner.java index a92850dc..9f685ca9 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/FlowRunner.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/FlowRunner.java @@ -19,6 +19,7 @@ package releaser.internal.spring; import releaser.internal.ReleaserProperties; import releaser.internal.options.Options; import releaser.internal.tasks.ReleaserTask; +import releaser.internal.tech.ExecutionResult; /** * Knows how to run a flow of tasks. diff --git a/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchExecutionResultHandler.java b/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchExecutionResultHandler.java index 3e79b8aa..aeab0345 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchExecutionResultHandler.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchExecutionResultHandler.java @@ -32,6 +32,7 @@ import com.jakewharton.fliptables.FlipTableConverters; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import releaser.internal.tasks.TrainPostReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.StepExecution; @@ -145,12 +146,10 @@ class SpringBatchExecutionResultHandler implements ExecutionResultHandler { "***** Project / Task : <%s/%s> ***** \nTask Description <%s>\nException Stacktrace \n\n%s", table1.projectName, table1.taskCaption, table1.taskDescription, - table1.exceptions + "\n" - + table1.exceptions.stream() - .map(Throwable::getStackTrace) - .flatMap(e -> Arrays.stream(e)) - .map(StackTraceElement::toString) - .collect(Collectors.joining("\n")))) + table1.exceptions + "\n" + table1.exceptions.stream() + .map(Throwable::getStackTrace).flatMap(Arrays::stream) + .map(StackTraceElement::toString) + .collect(Collectors.joining("\n")))) .collect(Collectors.joining("\n\n")); log.warn(string + brokenBuilds); } diff --git a/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchFlowRunner.java b/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchFlowRunner.java index 94fcef79..23fd3bc9 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchFlowRunner.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchFlowRunner.java @@ -28,7 +28,6 @@ import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; import java.util.stream.Collectors; -import java.util.stream.Stream; import edu.emory.mathcs.backport.java.util.Collections; import org.slf4j.Logger; @@ -40,6 +39,7 @@ import releaser.internal.tasks.PostReleaseReleaserTask; import releaser.internal.tasks.ReleaseReleaserTask; import releaser.internal.tasks.ReleaserTask; import releaser.internal.tech.BuildUnstableException; +import releaser.internal.tech.ExecutionResult; import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.Job; @@ -128,13 +128,14 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { .getStepExecution().getExecutionContext().get("errors"); RuntimeException exception = result.foundExceptions(); errors = addExceptionToErrors(errors, exception); - String status = result.isUnstable() ? "UNSTABLE" - : result.isFailure() ? "FAILURE" : "SUCCESS"; + String status = result.toStringResult(); ExecutionResultReport entity = buildEntity(releaserTask, args, status, errors); contribution.getStepExecution().getExecutionContext() .put("entity", entity); if (result.isFailureOrUnstable()) { + log.warn("The execution of [{}] failed or was unstable", + entity.getReleaserTaskType().getSimpleName()); contribution.getStepExecution().getExecutionContext() .put("errors", errors); } @@ -252,9 +253,7 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { List results = new LinkedList<>(); for (StuffToRun flow : flows) { log.info("Releasing group [{}]", flow.releaseGroup); - ExecutionResult executionResult = runInParallel(flow, flow.task).stream() - .map(this::result) - .reduce(new ExecutionResult(), ExecutionResult::merge); + ExecutionResult executionResult = runInParallel(flow); log.info("Group [{}] execution result is [{}]", flow.releaseGroup, executionResult); if (executionResult.isFailure()) { @@ -267,8 +266,7 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { return results.stream().reduce(new ExecutionResult(), ExecutionResult::merge); } // will run in sequence - return flows.stream().map(s -> runInSequence(s, s.task)).flatMap(s -> s) - .reduce(new ExecutionResult(), ExecutionResult::merge); + return runInSequence(flows); } private ExecutionResult result(Future future) { @@ -280,23 +278,47 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { } } - private List> runInParallel(StuffToRun stuffToRun, - CompositeReleaserTask releaserTask) { + private ExecutionResult runInParallel(StuffToRun stuffToRun) { + ExecutionResult results = ExecutionResult.success(); log.info("Running composite tasks in parallel for {}", stuffToRun.releaseGroup); - return stuffToRun.releaseGroup.projectsToRun.stream().map(s -> { + for (ProjectToRun.ProjectToRunSupplier s : stuffToRun.releaseGroup.projectsToRun) { + CompositeReleaserTask releaserTask = stuffToRun.task; log.info("Scheduling a build for project [{}]", s.projectName()); - return this.executorService.submit(() -> { + List> futures = new LinkedList<>(); + futures.add(this.executorService.submit(() -> { log.info("Running a composite task [{}] in parallel", releaserTask.name()); return releaserTask.apply(Arguments.forProject(s.get())); - }); - }).collect(Collectors.toCollection(LinkedList::new)); + })); + boolean atLeastOneFailure = false; + for (Future future : futures) { + ExecutionResult result = result(future); + results = results.merge(result); + if (result.isFailure()) { + atLeastOneFailure = true; + } + } + if (atLeastOneFailure) { + log.warn( + "At least one project failed within the group, will NOT continue with subsequent groups"); + break; + } + } + return results; } - private Stream runInSequence(StuffToRun stuffToRun, - CompositeReleaserTask releaserTask) { - return stuffToRun.releaseGroup.projectsToRun.stream() - .map(s -> releaserTask.apply(Arguments.forProject(s.get()))); + private ExecutionResult runInSequence(List stuffToRunList) { + ExecutionResult result = ExecutionResult.success(); + for (StuffToRun stuffToRun : stuffToRunList) { + for (ProjectToRun.ProjectToRunSupplier s : stuffToRun.releaseGroup.projectsToRun) { + result = result + .merge(stuffToRun.task.apply(Arguments.forProject(s.get()))); + if (result.isFailure()) { + return result; + } + } + } + return result; } private Job buildJobForFlows(Iterator flowsIterator) { @@ -397,7 +419,7 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { if (thrownExceptions.isEmpty()) { return ExecutionResult.success(); } - return new ExecutionResult(thrownExceptions); + return ExecutionResult.failure(thrownExceptions); } catch (JobExecutionException ex) { return ExecutionResult.failure(ex); diff --git a/releaser-spring/src/main/java/releaser/internal/spring/SpringReleaser.java b/releaser-spring/src/main/java/releaser/internal/spring/SpringReleaser.java index 27656293..cc4db8df 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/SpringReleaser.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/SpringReleaser.java @@ -17,6 +17,7 @@ package releaser.internal.spring; import releaser.internal.options.Options; +import releaser.internal.tech.ExecutionResult; /** * Contract for releasing a project or train . diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/PostReleaseReleaserTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/PostReleaseReleaserTask.java index dfdc270c..df47ecfc 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/PostReleaseReleaserTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/PostReleaseReleaserTask.java @@ -17,7 +17,7 @@ package releaser.internal.tasks; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; +import releaser.internal.tech.ExecutionResult; /** * Marker interface for running post release tasks. diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/ReleaserTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/ReleaserTask.java index a2e1ccca..1ca5716c 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/ReleaserTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/ReleaserTask.java @@ -21,8 +21,8 @@ import java.util.function.Function; import releaser.internal.ReleaserProperties; import releaser.internal.options.Options; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tech.BuildUnstableException; +import releaser.internal.tech.ExecutionResult; import org.springframework.core.Ordered; diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/composite/DryRunCompositeTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/composite/DryRunCompositeTask.java index 98f57e75..0ae48668 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/composite/DryRunCompositeTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/composite/DryRunCompositeTask.java @@ -26,13 +26,13 @@ import org.slf4j.LoggerFactory; import releaser.internal.ReleaserProperties; import releaser.internal.options.Options; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.spring.FlowRunner; import releaser.internal.spring.ProjectToRun; import releaser.internal.spring.ProjectsToRun; import releaser.internal.spring.TasksToRun; import releaser.internal.tasks.CompositeReleaserTask; import releaser.internal.tasks.DryRunReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; import org.springframework.context.ApplicationContext; import org.springframework.core.annotation.AnnotationAwareOrderComparator; diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseCompositeTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseCompositeTask.java index 9342191c..89aeb60a 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseCompositeTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseCompositeTask.java @@ -21,8 +21,8 @@ import org.slf4j.LoggerFactory; import releaser.internal.ReleaserProperties; import releaser.internal.options.Options; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.CompositeReleaserTask; +import releaser.internal.tech.ExecutionResult; import org.springframework.context.ApplicationContext; diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseDryRunCompositeTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseDryRunCompositeTask.java index eb83dbcd..533697e6 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseDryRunCompositeTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/composite/MetaReleaseDryRunCompositeTask.java @@ -21,8 +21,8 @@ import org.slf4j.LoggerFactory; import releaser.internal.ReleaserProperties; import releaser.internal.options.Options; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.CompositeReleaserTask; +import releaser.internal.tech.ExecutionResult; import org.springframework.context.ApplicationContext; diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseCompositeTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseCompositeTask.java index 57b9fe46..01b3b8dd 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseCompositeTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseCompositeTask.java @@ -27,7 +27,6 @@ import org.slf4j.LoggerFactory; import releaser.internal.ReleaserProperties; import releaser.internal.options.Options; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.spring.FlowRunner; import releaser.internal.spring.ProjectToRun; import releaser.internal.spring.ProjectsToRun; @@ -36,6 +35,7 @@ import releaser.internal.tasks.CompositeReleaserTask; import releaser.internal.tasks.ProjectPostReleaseReleaserTask; import releaser.internal.tasks.ReleaseReleaserTask; import releaser.internal.tasks.ReleaserTask; +import releaser.internal.tech.ExecutionResult; import org.springframework.context.ApplicationContext; import org.springframework.core.annotation.AnnotationAwareOrderComparator; diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseVerboseCompositeTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseVerboseCompositeTask.java index b1616a3f..49986272 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseVerboseCompositeTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/composite/ReleaseVerboseCompositeTask.java @@ -21,8 +21,8 @@ import org.slf4j.LoggerFactory; import releaser.internal.ReleaserProperties; import releaser.internal.options.Options; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.CompositeReleaserTask; +import releaser.internal.tech.ExecutionResult; import org.springframework.context.ApplicationContext; diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/composite/TrainPostReleaseCompositeTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/composite/TrainPostReleaseCompositeTask.java index 00d05467..4769cbe9 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/composite/TrainPostReleaseCompositeTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/composite/TrainPostReleaseCompositeTask.java @@ -25,12 +25,12 @@ import org.slf4j.LoggerFactory; import releaser.internal.ReleaserProperties; import releaser.internal.options.Options; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.spring.FlowRunner; import releaser.internal.spring.TasksToRun; import releaser.internal.tasks.CompositeReleaserTask; import releaser.internal.tasks.ReleaserTask; import releaser.internal.tasks.TrainPostReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; import org.springframework.context.ApplicationContext; import org.springframework.core.annotation.AnnotationAwareOrderComparator; diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CloseMilestonesProjectPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CloseMilestonesProjectPostReleaseTask.java index 29aefbb8..fcabdfca 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CloseMilestonesProjectPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CloseMilestonesProjectPostReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.postrelease; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.ProjectPostReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class CloseMilestonesProjectPostReleaseTask implements ProjectPostReleaseReleaserTask { @@ -57,8 +57,7 @@ public class CloseMilestonesProjectPostReleaseTask @Override public ExecutionResult runTask(Arguments args) { - this.releaser.closeMilestone(args.versionFromBom); - return ExecutionResult.success(); + return this.releaser.closeMilestone(args.versionFromBom); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateTemplatesTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateTemplatesTrainPostReleaseTask.java index 70f3d077..10b4de09 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateTemplatesTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateTemplatesTrainPostReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.postrelease; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.TrainPostReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class CreateTemplatesTrainPostReleaseTask implements TrainPostReleaseReleaserTask { @@ -56,11 +56,11 @@ public class CreateTemplatesTrainPostReleaseTask implements TrainPostReleaseRele @Override public ExecutionResult runTask(Arguments args) { - this.releaser.createEmail(args.versionFromBom, args.projects); - this.releaser.createBlog(args.versionFromBom, args.projects); - this.releaser.createTweet(args.versionFromBom, args.projects); - this.releaser.createReleaseNotes(args.versionFromBom, args.projects); - return ExecutionResult.success(); + return this.releaser.createEmail(args.versionFromBom, args.projects) + .merge(this.releaser.createBlog(args.versionFromBom, args.projects)) + .merge(this.releaser.createTweet(args.versionFromBom, args.projects)) + .merge(this.releaser.createReleaseNotes(args.versionFromBom, + args.projects)); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/RunUpdatedSamplesTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/RunUpdatedSamplesTrainPostReleaseTask.java index 73aae005..5e2c0080 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/RunUpdatedSamplesTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/RunUpdatedSamplesTrainPostReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.postrelease; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.TrainPostReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class RunUpdatedSamplesTrainPostReleaseTask implements TrainPostReleaseReleaserTask { @@ -57,8 +57,7 @@ public class RunUpdatedSamplesTrainPostReleaseTask @Override public ExecutionResult runTask(Arguments args) { - this.releaser.runUpdatedSamples(args.projects); - return ExecutionResult.success(); + return this.releaser.runUpdatedSamples(args.projects); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateAllTestSamplesTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateAllTestSamplesTrainPostReleaseTask.java index 716c8cae..d280dde3 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateAllTestSamplesTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateAllTestSamplesTrainPostReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.postrelease; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.TrainPostReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class UpdateAllTestSamplesTrainPostReleaseTask implements TrainPostReleaseReleaserTask { @@ -57,8 +57,7 @@ public class UpdateAllTestSamplesTrainPostReleaseTask @Override public ExecutionResult runTask(Arguments args) { - this.releaser.updateAllSamples(args.projects); - return ExecutionResult.success(); + return this.releaser.updateAllSamples(args.projects); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateDocsRepositoryProjectPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateDocsRepositoryProjectPostReleaseTask.java index 973bd577..eb430797 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateDocsRepositoryProjectPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateDocsRepositoryProjectPostReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.postrelease; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.ProjectPostReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class UpdateDocsRepositoryProjectPostReleaseTask implements ProjectPostReleaseReleaserTask { @@ -57,9 +57,8 @@ public class UpdateDocsRepositoryProjectPostReleaseTask @Override public ExecutionResult runTask(Arguments args) { - this.releaser.updateDocumentationRepositoryForSingleProject(args.projects, + return this.releaser.updateDocumentationRepositoryForSingleProject(args.projects, args.versionFromBom); - return ExecutionResult.success(); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateDocsRepositoryTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateDocsRepositoryTrainPostReleaseTask.java index 92307bc9..26881121 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateDocsRepositoryTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateDocsRepositoryTrainPostReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.postrelease; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.TrainPostReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class UpdateDocsRepositoryTrainPostReleaseTask implements TrainPostReleaseReleaserTask { @@ -57,9 +57,8 @@ public class UpdateDocsRepositoryTrainPostReleaseTask @Override public ExecutionResult runTask(Arguments args) { - this.releaser.updateDocumentationRepositoryForTrain(args.properties, + return this.releaser.updateDocumentationRepositoryForTrain(args.properties, args.projects, args.versionFromBom); - return ExecutionResult.success(); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateGuidesTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateGuidesTrainPostReleaseTask.java index 706854e1..b9c451bc 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateGuidesTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateGuidesTrainPostReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.postrelease; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.TrainPostReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class UpdateGuidesTrainPostReleaseTask implements TrainPostReleaseReleaserTask { @@ -56,9 +56,8 @@ public class UpdateGuidesTrainPostReleaseTask implements TrainPostReleaseRelease @Override public ExecutionResult runTask(Arguments args) { - this.releaser.updateSpringGuides(args.versionFromBom, args.projects, + return this.releaser.updateSpringGuides(args.versionFromBom, args.projects, args.processedProjects); - return ExecutionResult.success(); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainDocsTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainDocsTrainPostReleaseTask.java index a270e80e..dfa75c3d 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainDocsTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainDocsTrainPostReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.postrelease; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.TrainPostReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class UpdateReleaseTrainDocsTrainPostReleaseTask implements TrainPostReleaseReleaserTask { @@ -57,8 +57,7 @@ public class UpdateReleaseTrainDocsTrainPostReleaseTask @Override public ExecutionResult runTask(Arguments args) { - this.releaser.generateReleaseTrainDocumentation(args.projects); - return ExecutionResult.success(); + return this.releaser.generateReleaseTrainDocumentation(args.projects); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainWikiTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainWikiTrainPostReleaseTask.java index 5558e690..d4ffaca3 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainWikiTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateReleaseTrainWikiTrainPostReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.postrelease; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.TrainPostReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class UpdateReleaseTrainWikiTrainPostReleaseTask implements TrainPostReleaseReleaserTask { @@ -57,8 +57,7 @@ public class UpdateReleaseTrainWikiTrainPostReleaseTask @Override public ExecutionResult runTask(Arguments args) { - this.releaser.updateReleaseTrainWiki(args.projects); - return ExecutionResult.success(); + return this.releaser.updateReleaseTrainWiki(args.projects); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateSaganProjectPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateSaganProjectPostReleaseTask.java index 5ae194c3..b0e2c8f0 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateSaganProjectPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateSaganProjectPostReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.postrelease; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.ProjectPostReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class UpdateSaganProjectPostReleaseTask implements ProjectPostReleaseReleaserTask { @@ -56,8 +56,8 @@ public class UpdateSaganProjectPostReleaseTask implements ProjectPostReleaseRele @Override public ExecutionResult runTask(Arguments args) { - this.releaser.updateSagan(args.project, args.versionFromBom, args.projects); - return ExecutionResult.success(); + return this.releaser.updateSagan(args.project, args.versionFromBom, + args.projects); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateStartSpringIoTrainPostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateStartSpringIoTrainPostReleaseTask.java index bfdfbe60..08269344 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateStartSpringIoTrainPostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/UpdateStartSpringIoTrainPostReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.postrelease; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.TrainPostReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class UpdateStartSpringIoTrainPostReleaseTask implements TrainPostReleaseReleaserTask { @@ -57,8 +57,7 @@ public class UpdateStartSpringIoTrainPostReleaseTask @Override public ExecutionResult runTask(Arguments args) { - this.releaser.updateStartSpringIo(args.versionFromBom, args.projects); - return ExecutionResult.success(); + return this.releaser.updateStartSpringIo(args.versionFromBom, args.projects); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/release/BuildProjectReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/release/BuildProjectReleaseTask.java index d92167e6..0bfb2fc3 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/release/BuildProjectReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/release/BuildProjectReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.release; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.DryRunReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class BuildProjectReleaseTask implements DryRunReleaseReleaserTask { @@ -56,8 +56,7 @@ public class BuildProjectReleaseTask implements DryRunReleaseReleaserTask { @Override public ExecutionResult runTask(Arguments args) { - this.releaser.buildProject(args.originalVersion, args.versionFromBom); - return ExecutionResult.success(); + return this.releaser.buildProject(args.originalVersion, args.versionFromBom); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/release/BumpBackToSnapshotReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/release/BumpBackToSnapshotReleaseTask.java index 08e3d81b..c9e67ffe 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/release/BumpBackToSnapshotReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/release/BumpBackToSnapshotReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.release; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.ReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class BumpBackToSnapshotReleaseTask implements ReleaseReleaserTask { @@ -56,9 +56,8 @@ public class BumpBackToSnapshotReleaseTask implements ReleaseReleaserTask { @Override public ExecutionResult runTask(Arguments args) { - this.releaser.rollbackReleaseVersion(args.project, args.projects, + return this.releaser.rollbackReleaseVersion(args.project, args.projects, args.versionFromBom); - return ExecutionResult.success(); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/release/CommitReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/release/CommitReleaseTask.java index 2e74ee61..485738ed 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/release/CommitReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/release/CommitReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.release; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.ReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class CommitReleaseTask implements ReleaseReleaserTask { @@ -56,8 +56,7 @@ public class CommitReleaseTask implements ReleaseReleaserTask { @Override public ExecutionResult runTask(Arguments args) { - this.releaser.commitAndPushTags(args.project, args.versionFromBom); - return ExecutionResult.success(); + return this.releaser.commitAndPushTags(args.project, args.versionFromBom); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/release/DeployArtifactsReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/release/DeployArtifactsReleaseTask.java index d3b8484d..eec5ed75 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/release/DeployArtifactsReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/release/DeployArtifactsReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.release; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.ReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class DeployArtifactsReleaseTask implements ReleaseReleaserTask { @@ -56,8 +56,7 @@ public class DeployArtifactsReleaseTask implements ReleaseReleaserTask { @Override public ExecutionResult runTask(Arguments args) { - this.releaser.deploy(args.originalVersion, args.versionFromBom); - return ExecutionResult.success(); + return this.releaser.deploy(args.originalVersion, args.versionFromBom); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/release/PublishDocsReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/release/PublishDocsReleaseTask.java index c4126b29..f4efc053 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/release/PublishDocsReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/release/PublishDocsReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.release; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.ReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class PublishDocsReleaseTask implements ReleaseReleaserTask { @@ -56,8 +56,7 @@ public class PublishDocsReleaseTask implements ReleaseReleaserTask { @Override public ExecutionResult runTask(Arguments args) { - this.releaser.publishDocs(args.originalVersion, args.versionFromBom); - return ExecutionResult.success(); + return this.releaser.publishDocs(args.originalVersion, args.versionFromBom); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/release/PushChangesReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/release/PushChangesReleaseTask.java index d78615b2..be1f4e1a 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/release/PushChangesReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/release/PushChangesReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.release; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.ReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class PushChangesReleaseTask implements ReleaseReleaserTask { @@ -56,8 +56,7 @@ public class PushChangesReleaseTask implements ReleaseReleaserTask { @Override public ExecutionResult runTask(Arguments args) { - this.releaser.pushCurrentBranch(args.project); - return ExecutionResult.success(); + return this.releaser.pushCurrentBranch(args.project); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/release/UpdatingPomsReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/release/UpdatingPomsReleaseTask.java index 024c3c9d..978c18d0 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/release/UpdatingPomsReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/release/UpdatingPomsReleaseTask.java @@ -18,8 +18,8 @@ package releaser.internal.tasks.release; import releaser.internal.Releaser; import releaser.internal.spring.Arguments; -import releaser.internal.spring.ExecutionResult; import releaser.internal.tasks.DryRunReleaseReleaserTask; +import releaser.internal.tech.ExecutionResult; public class UpdatingPomsReleaseTask implements DryRunReleaseReleaserTask { @@ -56,9 +56,8 @@ public class UpdatingPomsReleaseTask implements DryRunReleaseReleaserTask { @Override public ExecutionResult runTask(Arguments args) { - this.releaser.updateProjectFromBom(args.project, args.projects, + return this.releaser.updateProjectFromBom(args.project, args.projects, args.versionFromBom); - return ExecutionResult.success(); } @Override diff --git a/releaser-spring/src/test/java/releaser/internal/spring/SpringBatchFlowRunnerTests.java b/releaser-spring/src/test/java/releaser/internal/spring/ProjectsToReleaseGroupsTests.java similarity index 98% rename from releaser-spring/src/test/java/releaser/internal/spring/SpringBatchFlowRunnerTests.java rename to releaser-spring/src/test/java/releaser/internal/spring/ProjectsToReleaseGroupsTests.java index 7a30be82..718f7fb0 100644 --- a/releaser-spring/src/test/java/releaser/internal/spring/SpringBatchFlowRunnerTests.java +++ b/releaser-spring/src/test/java/releaser/internal/spring/ProjectsToReleaseGroupsTests.java @@ -25,7 +25,7 @@ import org.assertj.core.api.BDDAssertions; import org.junit.jupiter.api.Test; import releaser.internal.ReleaserProperties; -class SpringBatchFlowRunnerTests { +class ProjectsToReleaseGroupsTests { @Test void releaseGroup() {