From dbe6a29244dd81afc0a8dc62a2bb3ce500ab7ef7 Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Fri, 7 Jun 2024 09:29:29 -0400 Subject: [PATCH] Add support to distribute an individual project release bundle --- .../main/java/releaser/internal/Releaser.java | 63 +++++++++-------- .../releaser/internal/ReleaserProperties.java | 33 +++++++-- .../commercial/ReleaseBundleCreator.java | 10 ++- ...teProjectReleaseBundlePostReleaseTask.java | 2 +- .../DistributeProjectReleaseBundleTask.java | 69 +++++++++++++++++++ ...stributeReleaseTrainSourceBundleTask.java} | 4 +- .../PostReleaseTasksConfiguration.java | 13 +++- 7 files changed, 154 insertions(+), 40 deletions(-) create mode 100644 releaser-spring/src/main/java/releaser/internal/tasks/postrelease/DistributeProjectReleaseBundleTask.java rename releaser-spring/src/main/java/releaser/internal/tasks/postrelease/{DistributeReleaseBundleTask.java => DistributeReleaseTrainSourceBundleTask.java} (91%) diff --git a/releaser-core/src/main/java/releaser/internal/Releaser.java b/releaser-core/src/main/java/releaser/internal/Releaser.java index c37e588a..77fadc81 100644 --- a/releaser-core/src/main/java/releaser/internal/Releaser.java +++ b/releaser-core/src/main/java/releaser/internal/Releaser.java @@ -40,6 +40,8 @@ import releaser.internal.template.TemplateGenerator; import org.springframework.util.Assert; +import static releaser.internal.commercial.ReleaseBundleCreator.createReleaseBundleName; + /** * @author Marcin Grzejszczak */ @@ -395,19 +397,16 @@ public class Releaser { List repos = commercialRepos.get(projectName); log.info("Creating release bundles for project [{}] in repos [{}]", projectName, repos); try { - boolean result = this.releaseBundleCreator.createReleaseBundle(repos, versionFromBom.version, - "TNZ-" + projectName + "-commercial"); - if (!result) { - log.warn("Failed to create release bundle"); - return ExecutionResult.unstable(new BuildUnstableException("Failed to create a release bundle")); + if (this.releaseBundleCreator.createReleaseBundle(repos, versionFromBom.version, + createReleaseBundleName(projectName))) { + log.info("\nSuccessfully created a release bundle"); + return ExecutionResult.success(); } - log.info("\nSuccessfully created a release bundle"); - return ExecutionResult.success(); } catch (Exception ex) { log.error("Failed to create a release bundle", ex); - return ExecutionResult.unstable(new BuildUnstableException("Failed to create a release bundle", ex)); } + return ExecutionResult.unstable(new BuildUnstableException("Failed to create a release bundle")); } private boolean shouldCreateReleaseBundle(boolean dryRun, boolean isSnapshot, boolean commercial) { @@ -432,21 +431,34 @@ public class Releaser { return ExecutionResult.skipped(); } try { - boolean result = this.releaseBundleCreator.createReleaseTrainSourceBundle(projectsWithNewRelease, - projectVersion.version); - if (!result) { - log.warn("Failed to create release train source bundle"); - return ExecutionResult - .unstable(new BuildUnstableException("Failed to create a release train source bundle")); + if (this.releaseBundleCreator.createReleaseTrainSourceBundle(projectsWithNewRelease, + projectVersion.version)) { + log.info("\nSuccessfully created a release train source bundle"); + return ExecutionResult.success(); } - log.info("\nSuccessfully created a release train source bundle"); - return ExecutionResult.success(); } catch (Exception ex) { log.error("Failed to create a release train source bundle", ex); - return ExecutionResult - .unstable(new BuildUnstableException("Failed to create a release train source bundle", ex)); } + return ExecutionResult.unstable(new BuildUnstableException("Failed to create a release train source bundle")); + } + + public ExecutionResult distributeProjectReleaseBundle(boolean isCommercial, boolean dryRun, + ProjectVersion projectVersion) { + if (!shouldCreateReleaseBundle(dryRun, projectVersion.isSnapshot(), isCommercial)) { + return ExecutionResult.skipped(); + } + try { + if (this.releaseBundleCreator.distributeProjectReleaseBundle( + createReleaseBundleName(projectVersion.projectName), projectVersion.version)) { + log.info("\nSuccessfully distributed a project release bundle"); + return ExecutionResult.success(); + } + } + catch (Exception ex) { + log.error("Failed to distribute a project release bundle", ex); + } + return ExecutionResult.unstable(new BuildUnstableException("Failed to distribute a project release bundle")); } public ExecutionResult distributeReleaseTrainSourceBundle(boolean isCommercial, boolean dryRun, @@ -455,20 +467,17 @@ public class Releaser { return ExecutionResult.skipped(); } try { - boolean result = this.releaseBundleCreator.distributeReleaseTrainSourceBundle(projectVersion.version); - if (!result) { - log.warn("Failed to distribute release train source bundle"); - return ExecutionResult - .unstable(new BuildUnstableException("Failed to distribute a release train source bundle")); + if (this.releaseBundleCreator.distributeReleaseTrainSourceBundle(projectVersion.version)) { + log.info("\nSuccessfully distributed a release train source bundle"); + return ExecutionResult.success(); } - log.info("\nSuccessfully distributed a release train source bundle"); - return ExecutionResult.success(); } catch (Exception ex) { log.error("Failed to distribute a release train source bundle", ex); - return ExecutionResult - .unstable(new BuildUnstableException("Failed to distribute a release train source bundle", ex)); + } + return ExecutionResult + .unstable(new BuildUnstableException("Failed to distribute a release train source bundle")); } } diff --git a/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java b/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java index cd3181e9..aff6b89f 100644 --- a/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java +++ b/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java @@ -223,7 +223,8 @@ public class ReleaserProperties implements Serializable { return "ReleaserProperties{" + "workingDir='" + this.workingDir + '\'' + ", git=" + this.git + ", pom=" + this.pom + ", maven=" + this.maven + ", gradle=" + this.gradle + ", sagan=" + this.sagan + ", fixedVersions=" + this.fixedVersions + ", metaRelease=" + this.metaRelease + ", template=" - + this.template + ", versions=" + this.versions + ", commercial=" + this.commercial + '}'; + + this.template + ", versions=" + this.versions + ", commercial=" + this.commercial + ", bundles=" + + this.bundles + '}'; } public ReleaserProperties copy() { @@ -1579,7 +1580,9 @@ public class ReleaserProperties implements Serializable { private boolean createReleaseTrainReleaseBundle = false; - private boolean distributeReleaseBundle = false; + private boolean distributeReleaseTrainSourceBundle = false; + + private boolean distributeProjectReleaseBundle = false; private String repoUrl = "https://usw1.packages.broadcom.com"; @@ -1605,12 +1608,20 @@ public class ReleaserProperties implements Serializable { this.createReleaseTrainReleaseBundle = createReleaseTrainReleaseBundle; } - public boolean isDistributeReleaseBundle() { - return distributeReleaseBundle; + public boolean isDistributeReleaseTrainSourceBundle() { + return distributeReleaseTrainSourceBundle; } - public void setDistributeReleaseBundle(boolean distributeReleaseBundle) { - this.distributeReleaseBundle = distributeReleaseBundle; + public void setDistributeReleaseTrainSourceBundle(boolean distributeReleaseTrainSourceBundle) { + this.distributeReleaseTrainSourceBundle = distributeReleaseTrainSourceBundle; + } + + public boolean isDistributeProjectReleaseBundle() { + return distributeProjectReleaseBundle; + } + + public void setDistributeProjectReleaseBundle(boolean distributeProjectReleaseBundle) { + this.distributeProjectReleaseBundle = distributeProjectReleaseBundle; } public Map> getRepos() { @@ -1645,6 +1656,16 @@ public class ReleaserProperties implements Serializable { this.repoAccessToken = repoAccessToken; } + @Override + public String toString() { + return "Bundles{" + "createProjectReleaseBundle=" + createProjectReleaseBundle + + ", createReleaseTrainReleaseBundle=" + createReleaseTrainReleaseBundle + + ", distributeReleaseTrainSourceBundle=" + distributeReleaseTrainSourceBundle + + ", distributeProjectReleaseBundle=" + distributeProjectReleaseBundle + ", repoUrl='" + repoUrl + + '\'' + ", repoUsername='" + repoUsername + '\'' + ", repoAccessToken='" + repoAccessToken + '\'' + + ", repos=" + repos + '}'; + } + } } diff --git a/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java b/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java index 13180ac8..48a161e4 100644 --- a/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java +++ b/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java @@ -121,11 +121,15 @@ public class ReleaseBundleCreator { Map json = new HashMap<>(); json.put("project_key", "spring"); json.put("repository_key", "spring-release-bundles-v2"); - json.put("release_bundle_name", "TNZ-" + project.projectName + "-commercial"); + json.put("release_bundle_name", createReleaseBundleName(project.projectName)); json.put("release_bundle_version", project.version); return json; } + public static String createReleaseBundleName(String projectName) { + return "TNZ-" + projectName + "-commercial"; + } + public boolean distributeReleaseTrainSourceBundle(String version) throws IOException { return distributeReleaseBundle(RELEASE_TRAIN_BUNDLE_NAME, version, objectMapper.writeValueAsString(createDistributionJson())); @@ -168,4 +172,8 @@ public class ReleaseBundleCreator { return Collections.singletonMap("mappings", mappingsArray); } + public boolean distributeProjectReleaseBundle(String projectName, String version) throws IOException { + return distributeReleaseBundle(projectName, version, objectMapper.writeValueAsString(createDistributionJson())); + } + } diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateProjectReleaseBundlePostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateProjectReleaseBundlePostReleaseTask.java index 53a7ccfc..005d6b58 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateProjectReleaseBundlePostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateProjectReleaseBundlePostReleaseTask.java @@ -60,7 +60,7 @@ public class CreateProjectReleaseBundlePostReleaseTask implements ProjectPostRel } @Override - public ExecutionResult runTask(Arguments args) throws BuildUnstableException, RuntimeException { + public ExecutionResult runTask(Arguments args) throws BuildUnstableException { return this.releaser.createReleaseBundle(args.properties.isCommercial(), args.versionFromBom, args.options.dryRun, args.properties.getBundles().getRepos(), new ProjectVersion(args.project).projectName); diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/DistributeProjectReleaseBundleTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/DistributeProjectReleaseBundleTask.java new file mode 100644 index 00000000..c3e63e26 --- /dev/null +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/DistributeProjectReleaseBundleTask.java @@ -0,0 +1,69 @@ +/* + * Copyright 2013-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package releaser.internal.tasks.postrelease; + +import releaser.internal.Releaser; +import releaser.internal.spring.Arguments; +import releaser.internal.tasks.ProjectPostReleaseReleaserTask; +import releaser.internal.tech.BuildUnstableException; +import releaser.internal.tech.ExecutionResult; + +/** + * @author Ryan Baxter + */ +public class DistributeProjectReleaseBundleTask implements ProjectPostReleaseReleaserTask { + + public int ORDER = CreateProjectReleaseBundlePostReleaseTask.ORDER + 10; + + private Releaser releaser; + + public DistributeProjectReleaseBundleTask(Releaser releaser) { + this.releaser = releaser; + } + + @Override + public String name() { + return "Distribute Project Release Bundle Task"; + } + + @Override + public String shortName() { + return "dprbt"; + } + + @Override + public String header() { + return "DISTRIBUTE PROJECT RELEASE BUNDLE TASK"; + } + + @Override + public String description() { + return "Distributes a release bundle for an individual project."; + } + + @Override + public ExecutionResult runTask(Arguments args) throws BuildUnstableException { + return releaser.distributeProjectReleaseBundle(args.properties.isCommercial(), args.options.dryRun, + args.versionFromBom); + } + + @Override + public int getOrder() { + return ORDER; + } + +} diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/DistributeReleaseBundleTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/DistributeReleaseTrainSourceBundleTask.java similarity index 91% rename from releaser-spring/src/main/java/releaser/internal/tasks/postrelease/DistributeReleaseBundleTask.java rename to releaser-spring/src/main/java/releaser/internal/tasks/postrelease/DistributeReleaseTrainSourceBundleTask.java index ed002883..25c0179f 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/DistributeReleaseBundleTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/DistributeReleaseTrainSourceBundleTask.java @@ -25,7 +25,7 @@ import releaser.internal.tech.ExecutionResult; /** * @author Ryan Baxter */ -public class DistributeReleaseBundleTask implements TrainPostReleaseReleaserTask { +public class DistributeReleaseTrainSourceBundleTask implements TrainPostReleaseReleaserTask { /** * Order of this task. The higher value, the lower order. @@ -34,7 +34,7 @@ public class DistributeReleaseBundleTask implements TrainPostReleaseReleaserTask private final Releaser releaser; - public DistributeReleaseBundleTask(Releaser releaser) { + public DistributeReleaseTrainSourceBundleTask(Releaser releaser) { this.releaser = releaser; } diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/PostReleaseTasksConfiguration.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/PostReleaseTasksConfiguration.java index 72359fb8..6275cac3 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/PostReleaseTasksConfiguration.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/PostReleaseTasksConfiguration.java @@ -108,9 +108,16 @@ class PostReleaseTasksConfiguration { @Bean @ConditionalOnMissingBean - @ConditionalOnProperty("releaser.bundles.distribute-release-bundle") - DistributeReleaseBundleTask distributeReleaseBundleTask(Releaser releaser) { - return new DistributeReleaseBundleTask(releaser); + @ConditionalOnProperty("releaser.bundles.distribute-release-train-source-bundle") + DistributeReleaseTrainSourceBundleTask distributeReleaseBundleTask(Releaser releaser) { + return new DistributeReleaseTrainSourceBundleTask(releaser); + } + + @Bean + @ConditionalOnMissingBean + @ConditionalOnProperty("releaser.bundles.distribute-project-release-bundle") + DistributeProjectReleaseBundleTask distributeProjectReleaseBundleTask(Releaser releaser) { + return new DistributeProjectReleaseBundleTask(releaser); } }