From 008343ff3aee1938e4cfcd809b73dfd6cc5aa090 Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Fri, 31 May 2024 16:41:13 -0400 Subject: [PATCH 1/8] Create tasks to create release bundles --- .../main/java/releaser/internal/Releaser.java | 17 +++++ ...teProjectReleaseBundlePostReleaseTask.java | 71 +++++++++++++++++++ ...easeTrainReleaseBundlePostReleaseTask.java | 71 +++++++++++++++++++ .../PostReleaseTasksConfiguration.java | 14 ++++ 4 files changed, 173 insertions(+) create mode 100644 releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateProjectReleaseBundlePostReleaseTask.java create mode 100644 releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateReleaseTrainReleaseBundlePostReleaseTask.java diff --git a/releaser-core/src/main/java/releaser/internal/Releaser.java b/releaser-core/src/main/java/releaser/internal/Releaser.java index fe8ba8a7..bc5dc372 100644 --- a/releaser-core/src/main/java/releaser/internal/Releaser.java +++ b/releaser-core/src/main/java/releaser/internal/Releaser.java @@ -377,4 +377,21 @@ public class Releaser { return ExecutionResult.skipped(); } + public ExecutionResult createReleaseBundle(boolean commercial, ProjectVersion versionFromBom, Boolean dryRun) { + if (dryRun) { + log.info("\nWon't create a release bundle for a dry run"); + return ExecutionResult.skipped(); + } + if (versionFromBom.isSnapshot()) { + log.info("\nWon't create a release bundle for a SNAPSHOT version"); + return ExecutionResult.skipped(); + } + if (!commercial) { + log.info("\nWon't create a release bundle for a non commercial project"); + return ExecutionResult.skipped(); + } + log.info("\nCreating a release bundle"); + return ExecutionResult.success(); + } + } 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 new file mode 100644 index 00000000..3d4c001e --- /dev/null +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateProjectReleaseBundlePostReleaseTask.java @@ -0,0 +1,71 @@ +/* + * 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 CreateProjectReleaseBundlePostReleaseTask implements ProjectPostReleaseReleaserTask { + + /** + * Order of this task. The higher value, the lower order. + */ + public static final int ORDER = 60; + + private final Releaser releaser; + + public CreateProjectReleaseBundlePostReleaseTask(Releaser releaser) { + this.releaser = releaser; + } + + @Override + public String name() { + return "createReleaseBundle"; + } + + @Override + public String shortName() { + return "b"; + } + + @Override + public String header() { + return "CREATING RELEASE BUNDLE"; + } + + @Override + public String description() { + return "Creates a release bundle for the project"; + } + + @Override + public ExecutionResult runTask(Arguments args) throws BuildUnstableException, RuntimeException { + return this.releaser.createReleaseBundle(args.properties.isCommercial(), args.versionFromBom, args.options.dryRun); + } + + @Override + public int getOrder() { + return ORDER; + } + +} diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateReleaseTrainReleaseBundlePostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateReleaseTrainReleaseBundlePostReleaseTask.java new file mode 100644 index 00000000..7463b505 --- /dev/null +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateReleaseTrainReleaseBundlePostReleaseTask.java @@ -0,0 +1,71 @@ +/* + * 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.TrainPostReleaseReleaserTask; +import releaser.internal.tech.BuildUnstableException; +import releaser.internal.tech.ExecutionResult; + +/** + * @author Ryan Baxter + */ +public class CreateReleaseTrainReleaseBundlePostReleaseTask implements TrainPostReleaseReleaserTask { + + /** + * Order of this task. The higher value, the lower order. + */ + public static final int ORDER = 160; + + private final Releaser releaser; + + public CreateReleaseTrainReleaseBundlePostReleaseTask(Releaser releaser) { + this.releaser = releaser; + } + + @Override + public String name() { + return "createReleaseTrainReleaseBundlePostReleaseTask"; + } + + @Override + public String shortName() { + return "rtb"; + } + + @Override + public String header() { + return "CREATE RELEASE TRAIN RELEASE BUNDLE"; + } + + @Override + public String description() { + return "Creates a release train release bundle"; + } + + @Override + public ExecutionResult runTask(Arguments args) throws BuildUnstableException, RuntimeException { + return releaser.createReleaseBundle(args.properties.isCommercial(), args.versionFromBom, args.options.dryRun); + } + + @Override + public int getOrder() { + return ORDER; + } + +} 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 ce824c13..f7acf615 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 @@ -92,4 +92,18 @@ class PostReleaseTasksConfiguration { return new UpdateStartSpringIoTrainPostReleaseTask(releaser); } + @Bean + @ConditionalOnMissingBean + @ConditionalOnProperty("releaser.bundles.create-release-train-release-bundle") + CreateReleaseTrainReleaseBundlePostReleaseTask createReleaseTrainReleaseBundlePostReleaseTask(Releaser releaser) { + return new CreateReleaseTrainReleaseBundlePostReleaseTask(releaser); + } + + @Bean + @ConditionalOnMissingBean + @ConditionalOnProperty("releaser.bundles.create-project-release-bundle") + CreateProjectReleaseBundlePostReleaseTask createProjectReleaseBundlePostReleaseTask(Releaser releaser) { + return new CreateProjectReleaseBundlePostReleaseTask(releaser); + } + } From f9cfaf7a3bef2907a37c6999f2ead8a46c47c5a1 Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Fri, 31 May 2024 16:54:19 -0400 Subject: [PATCH 2/8] remove meta release option for post release only --- .../java/releaser/internal/spring/SpringBatchFlowRunner.java | 4 +++- .../CreateProjectReleaseBundlePostReleaseTask.java | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) 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 1341beff..f4a92835 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchFlowRunner.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/SpringBatchFlowRunner.java @@ -211,7 +211,9 @@ class SpringBatchFlowRunner implements FlowRunner, Closeable { @Override public ExecutionResult runReleaseTasks(Options options, ReleaserProperties properties, ProjectsToRun projectsToRun, TasksToRun tasksToRun) { - if (properties.isPostReleaseTasksOnly() && options.metaRelease) { + // TODO this seems to not be exclusive to meta releases + if (properties.isPostReleaseTasksOnly()/** && options.metaRelease */ + ) { log.info("Only post release tasks will be executed for the meta release"); return ExecutionResult.skipped(); } 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 3d4c001e..566e23c9 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,8 @@ public class CreateProjectReleaseBundlePostReleaseTask implements ProjectPostRel @Override public ExecutionResult runTask(Arguments args) throws BuildUnstableException, RuntimeException { - return this.releaser.createReleaseBundle(args.properties.isCommercial(), args.versionFromBom, args.options.dryRun); + return this.releaser.createReleaseBundle(args.properties.isCommercial(), args.versionFromBom, + args.options.dryRun); } @Override From c6642a6a7683443395a52e0b38340eebbc18eca3 Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Mon, 3 Jun 2024 16:05:49 -0400 Subject: [PATCH 3/8] Use artifactory client --- pom.xml | 14 +++- .../src/main/resources/application.yml | 54 +++++++++++++ releaser-core/pom.xml | 8 ++ .../main/java/releaser/internal/Releaser.java | 32 +++++++- .../releaser/internal/ReleaserProperties.java | 74 +++++++++++++++++ .../commercial/ReleaseBundleCreator.java | 80 +++++++++++++++++++ .../java/releaser/internal/ReleaserTests.java | 18 ++++- .../spring/ReleaserConfiguration.java | 11 ++- ...teProjectReleaseBundlePostReleaseTask.java | 4 +- ...easeTrainReleaseBundlePostReleaseTask.java | 4 +- 10 files changed, 288 insertions(+), 11 deletions(-) create mode 100644 releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java diff --git a/pom.xml b/pom.xml index 1d4464d4..19d15d77 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.springframework.cloud spring-cloud-build - 4.0.3 + 4.0.6 @@ -47,6 +47,8 @@ 1.1.0 1.12 4.11.0 + 2.17.0 + 4.0.6 @@ -145,6 +147,16 @@ awaitility ${awaitility.version} + + org.jfrog.artifactory.client + artifactory-java-client-services + ${artifactory-client.version} + + + org.apache.groovy + groovy + ${groovy.version} + diff --git a/projects/spring-cloud/src/main/resources/application.yml b/projects/spring-cloud/src/main/resources/application.yml index c840cfdd..95a2acfa 100644 --- a/projects/spring-cloud/src/main/resources/application.yml +++ b/projects/spring-cloud/src/main/resources/application.yml @@ -113,3 +113,57 @@ releaser: projects-to-skip: - spring-boot - spring-cloud-stream + bundles: + repos: + spring-cloud-build: + - "org/springframework/cloud/spring-cloud-build*" + - "org/springframework/cloud/spring-cloud-starter-build*" + - "org/springframework/cloud/spring-cloud-dependencies-parent*" + spring-cloud-config: + - "org/springframework/cloud/spring-cloud-config*" + - "org/springframework/cloud/spring-cloud-starter-config*" + spring-cloud-function: + - "org/springframework/cloud/spring-cloud-function*" + - "org/springframework/cloud/spring-cloud-starter-function*" + spring-cloud-stream: + - "org/springframework/cloud/spring-cloud-stream*" + - "org/springframework/cloud/spring-cloud-starter-stream*" + spring-cloud-task: + - "org/springframework/cloud/spring-cloud-task*" + - "org/springframework/cloud/spring-cloud-starter-task*" + spring-cloud-bus: + - "org/springframework/cloud/spring-cloud-bus*" + - "org/springframework/cloud/spring-cloud-starter-bus*" + spring-cloud-commons: + - "org/springframework/cloud/spring-cloud-commons*" + - "org/springframework/cloud/spring-cloud-starter-commons*" + spring-cloud-netflix: + - "org/springframework/cloud/spring-cloud-netflix*" + - "org/springframework/cloud/spring-cloud-starter-netflix*" + spring-cloud-openfeign: + - "org/springframework/cloud/spring-cloud-openfeign*" + - "org/springframework/cloud/spring-cloud-starter-openfeign*" + spring-cloud-consul: + - "org/springframework/cloud/spring-cloud-consul*" + - "org/springframework/cloud/spring-cloud-starter-consul*" + spring-cloud-circuitbreaker: + - "org/springframework/cloud/spring-cloud-circuitbreaker*" + - "org/springframework/cloud/spring-cloud-starter-circuitbreaker*" + spring-cloud-gateway: + - "org/springframework/cloud/spring-cloud-gateway*" + - "org/springframework/cloud/spring-cloud-starter-gateway*" + spring-cloud-zookeeper: + - "org/springframework/cloud/spring-cloud-zookeeper*" + - "org/springframework/cloud/spring-cloud-starter-zookeeper*" + spring-cloud-contract: + - "org/springframework/cloud/spring-cloud-contract*" + - "org/springframework/cloud/spring-cloud-starter-contract*" + spring-cloud-kubernetes: + - "org/springframework/cloud/spring-cloud-kubernetes*" + - "org/springframework/cloud/spring-cloud-starter-kubernetes*" + spring-cloud-vault: + - "org/springframework/cloud/spring-cloud-vault*" + - "org/springframework/cloud/spring-cloud-starter-vault*" + spring-cloud-release: + - "org/springframework/cloud/spring-cloud-starter*" + - "org/springframework/cloud/spring-cloud-dependencies*" diff --git a/releaser-core/pom.xml b/releaser-core/pom.xml index 968d34e6..b0ee9beb 100644 --- a/releaser-core/pom.xml +++ b/releaser-core/pom.xml @@ -91,6 +91,14 @@ io.spring.initializr initializr-metadata + + org.jfrog.artifactory.client + artifactory-java-client-services + + + org.apache.groovy + groovy + org.springframework.boot spring-boot-starter-test diff --git a/releaser-core/src/main/java/releaser/internal/Releaser.java b/releaser-core/src/main/java/releaser/internal/Releaser.java index bc5dc372..5794678a 100644 --- a/releaser-core/src/main/java/releaser/internal/Releaser.java +++ b/releaser-core/src/main/java/releaser/internal/Releaser.java @@ -18,11 +18,13 @@ package releaser.internal; import java.io.File; import java.util.List; +import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import releaser.internal.buildsystem.GradleUpdater; import releaser.internal.buildsystem.ProjectPomUpdater; +import releaser.internal.commercial.ReleaseBundleCreator; import releaser.internal.docs.DocumentationUpdater; import releaser.internal.git.ProjectGitHandler; import releaser.internal.github.ProjectGitHubHandler; @@ -69,11 +71,13 @@ public class Releaser { private ReleaserProperties releaserProperties; + private ReleaseBundleCreator releaseBundleCreator; + public Releaser(ReleaserProperties releaserProperties, ProjectPomUpdater projectPomUpdater, ProjectCommandExecutor projectCommandExecutor, ProjectGitHandler projectGitHandler, ProjectGitHubHandler projectGitHubHandler, TemplateGenerator templateGenerator, GradleUpdater gradleUpdater, - SaganUpdater saganUpdater, DocumentationUpdater documentationUpdater, - PostReleaseActions postReleaseActions) { + SaganUpdater saganUpdater, DocumentationUpdater documentationUpdater, PostReleaseActions postReleaseActions, + ReleaseBundleCreator releaseBundleCreator) { this.releaserProperties = releaserProperties; this.projectPomUpdater = projectPomUpdater; this.projectCommandExecutor = projectCommandExecutor; @@ -84,6 +88,7 @@ public class Releaser { this.saganUpdater = saganUpdater; this.documentationUpdater = documentationUpdater; this.postReleaseActions = postReleaseActions; + this.releaseBundleCreator = releaseBundleCreator; } public File clonedProjectFromOrg(String projectName) { @@ -377,7 +382,8 @@ public class Releaser { return ExecutionResult.skipped(); } - public ExecutionResult createReleaseBundle(boolean commercial, ProjectVersion versionFromBom, Boolean dryRun) { + public ExecutionResult createReleaseBundle(boolean commercial, ProjectVersion versionFromBom, Boolean dryRun, + Map> commercialRepos, String projectName) { if (dryRun) { log.info("\nWon't create a release bundle for a dry run"); return ExecutionResult.skipped(); @@ -391,7 +397,25 @@ public class Releaser { return ExecutionResult.skipped(); } log.info("\nCreating a release bundle"); - return ExecutionResult.success(); + if (!commercialRepos.containsKey(projectName)) { + log.warn("No commercial repos configured for project [{}], double check releaser.bundles.repos", + projectName); + } + 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); + if (!result) { + log.warn("Failed to create release bundle"); + return ExecutionResult.unstable(new BuildUnstableException("Failed to create a release bundle")); + } + 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)); + } } } diff --git a/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java b/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java index 5176229f..64a125f5 100644 --- a/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java +++ b/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java @@ -80,6 +80,8 @@ public class ReleaserProperties implements Serializable { private boolean commercial = false; + private Bundles bundles = new Bundles(); + /** * Project name to its version - overrides all versions retrieved from a release train * repository like Spring Cloud Release. @@ -208,6 +210,14 @@ public class ReleaserProperties implements Serializable { this.commercial = commercial; } + public Bundles getBundles() { + return bundles; + } + + public void setBundles(Bundles bundles) { + this.bundles = bundles; + } + @Override public String toString() { return "ReleaserProperties{" + "workingDir='" + this.workingDir + '\'' + ", git=" + this.git + ", pom=" @@ -1563,4 +1573,68 @@ public class ReleaserProperties implements Serializable { } + public static class Bundles implements Serializable { + + private boolean createProjectReleaseBundle = false; + + private boolean createReleaseTrainReleaseBundle = false; + + private String repoUrl = "https://usw1.packages.broadcom.com"; + + private String repoUsername; + + private String repoPassword; + + private Map> repos; + + public boolean isCreateProjectReleaseBundle() { + return createProjectReleaseBundle; + } + + public void setCreateProjectReleaseBundle(boolean createProjectReleaseBundle) { + this.createProjectReleaseBundle = createProjectReleaseBundle; + } + + public boolean isCreateReleaseTrainReleaseBundle() { + return createReleaseTrainReleaseBundle; + } + + public void setCreateReleaseTrainReleaseBundle(boolean createReleaseTrainReleaseBundle) { + this.createReleaseTrainReleaseBundle = createReleaseTrainReleaseBundle; + } + + public Map> getRepos() { + return repos; + } + + public void setRepos(Map> repos) { + this.repos = repos; + } + + public String getRepoUrl() { + return repoUrl; + } + + public void setRepoUrl(String repoUrl) { + this.repoUrl = repoUrl; + } + + public String getRepoUsername() { + return repoUsername; + } + + public void setRepoUsername(String repoUsername) { + this.repoUsername = repoUsername; + } + + public String getRepoPassword() { + return repoPassword; + } + + public void setRepoPassword(String repoPassword) { + this.repoPassword = repoPassword; + } + + } + } diff --git a/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java b/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java new file mode 100644 index 00000000..e952f24d --- /dev/null +++ b/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java @@ -0,0 +1,80 @@ +/* + * 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.commercial; + +import java.io.IOException; +import java.util.List; + +import org.jfrog.artifactory.client.Artifactory; +import org.jfrog.artifactory.client.ArtifactoryClientBuilder; +import org.jfrog.artifactory.client.ArtifactoryRequest; +import org.jfrog.artifactory.client.ArtifactoryResponse; +import org.jfrog.artifactory.client.aql.AqlItem; +import org.jfrog.artifactory.client.aql.AqlQueryBuilder; +import org.jfrog.artifactory.client.impl.ArtifactoryRequestImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import releaser.internal.ReleaserProperties; + +/** + * @author Ryan Baxter + */ +public class ReleaseBundleCreator { + + private static final Logger log = LoggerFactory.getLogger(ReleaseBundleCreator.class); + + private ReleaserProperties properties; + + private Artifactory artifactory; + + public ReleaseBundleCreator(ReleaserProperties properties) { + this.properties = properties; + this.artifactory = ArtifactoryClientBuilder.create().setUrl(properties.getBundles().getRepoUrl()) + .setUsername(properties.getBundles().getRepoUsername()) + .setPassword(properties.getBundles().getRepoPassword()).build(); + } + + public boolean createReleaseBundle(List repos, String version) throws IOException { + AqlQueryBuilder builder = new AqlQueryBuilder() + .item(AqlItem.aqlItem("repo", AqlItem.aqlItem("$eq", "spring-enterprise-maven-prod-local"))); + + AqlItem[] items = new AqlItem[repos.size()]; + for (String repo : repos) { + items[repos.indexOf(repo)] = AqlItem.match("path", repo + "/" + version); + } + String aql = builder.or(items).asc("path", "name").build(); + return createReleaseBundle(aql); + } + + public boolean createReleaseBundle(String aql) throws IOException { + log.info("Creating release bundle with AQL [{}]", aql); + + ArtifactoryRequest aqlRequest = new ArtifactoryRequestImpl().method(ArtifactoryRequest.Method.POST) + .apiUrl("lifecycle/api/v2/release_bundle").addQueryParam("project", "spring") + .addHeader("X-JFrog-Signing-Key-Name", "packagesKey").requestType(ArtifactoryRequest.ContentType.JSON) + .responseType(ArtifactoryRequest.ContentType.JSON).requestBody(aql); + ArtifactoryResponse response = artifactory.restCall(aqlRequest); + if (!response.isSuccessResponse()) { + log.warn("Failed to create release bundle {}", response.getRawBody()); + return false; + } + log.info("Created release bundle {}", response.getRawBody()); + return true; + + } + +} diff --git a/releaser-core/src/test/java/releaser/internal/ReleaserTests.java b/releaser-core/src/test/java/releaser/internal/ReleaserTests.java index 513bc71b..00d0e20f 100644 --- a/releaser-core/src/test/java/releaser/internal/ReleaserTests.java +++ b/releaser-core/src/test/java/releaser/internal/ReleaserTests.java @@ -17,6 +17,7 @@ package releaser.internal; import java.io.File; +import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.function.Supplier; @@ -31,6 +32,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import releaser.SpringCloudReleaserProperties; import releaser.internal.buildsystem.GradleUpdater; import releaser.internal.buildsystem.ProjectPomUpdater; +import releaser.internal.commercial.ReleaseBundleCreator; import releaser.internal.docs.DocumentationUpdater; import releaser.internal.git.ProjectGitHandler; import releaser.internal.github.ProjectGitHubHandler; @@ -92,7 +94,13 @@ public class ReleaserTests { Releaser releaser(Supplier originalVersionSupplier) { return new Releaser(SpringCloudReleaserProperties.get(), this.projectPomUpdater, this.projectCommandExecutor, this.projectGitHandler, this.projectGitHubHandler, this.templateGenerator, this.gradleUpdater, - this.saganUpdater, this.documentationUpdater, this.postReleaseActions) { + this.saganUpdater, this.documentationUpdater, this.postReleaseActions, + new ReleaseBundleCreator(SpringCloudReleaserProperties.get()) { + @Override + public boolean createReleaseBundle(String aql) throws IOException { + return true; + } + }) { @Override ProjectVersion originalVersion(File project) { return originalVersionSupplier.get(); @@ -103,7 +111,13 @@ public class ReleaserTests { Releaser releaser() { return new Releaser(new ReleaserProperties(), this.projectPomUpdater, this.projectCommandExecutor, this.projectGitHandler, this.projectGitHubHandler, this.templateGenerator, this.gradleUpdater, - this.saganUpdater, this.documentationUpdater, this.postReleaseActions); + this.saganUpdater, this.documentationUpdater, this.postReleaseActions, + new ReleaseBundleCreator(SpringCloudReleaserProperties.get()) { + @Override + public boolean createReleaseBundle(String aql) throws IOException { + return true; + } + }); } @Test diff --git a/releaser-spring/src/main/java/releaser/internal/spring/ReleaserConfiguration.java b/releaser-spring/src/main/java/releaser/internal/spring/ReleaserConfiguration.java index dd1b20a9..9768a34b 100644 --- a/releaser-spring/src/main/java/releaser/internal/spring/ReleaserConfiguration.java +++ b/releaser-spring/src/main/java/releaser/internal/spring/ReleaserConfiguration.java @@ -24,6 +24,7 @@ import releaser.internal.ReleaserProperties; import releaser.internal.ReleaserPropertiesUpdater; import releaser.internal.buildsystem.GradleUpdater; import releaser.internal.buildsystem.ProjectPomUpdater; +import releaser.internal.commercial.ReleaseBundleCreator; import releaser.internal.docs.CustomProjectDocumentationUpdater; import releaser.internal.docs.DocumentationUpdater; import releaser.internal.git.ProjectGitHandler; @@ -154,10 +155,10 @@ class ReleaserConfiguration { ProjectGitHandler projectGitHandler, ProjectGitHubHandler projectGitHubHandler, TemplateGenerator templateGenerator, GradleUpdater gradleUpdater, SaganUpdater saganUpdater, DocumentationUpdater documentationUpdater, PostReleaseActions postReleaseActions, - ReleaserProperties releaserProperties) { + ReleaserProperties releaserProperties, ReleaseBundleCreator releaseBundleCreator) { return new Releaser(releaserProperties, projectPomUpdater, projectCommandExecutor, projectGitHandler, projectGitHubHandler, templateGenerator, gradleUpdater, saganUpdater, documentationUpdater, - postReleaseActions); + postReleaseActions, releaseBundleCreator); } @Bean @@ -173,4 +174,10 @@ class ReleaserConfiguration { return new OptionsParser(allTasks, singleProjectReleaserTasks, context); } + @Bean + @ConditionalOnMissingBean + ReleaseBundleCreator releaseBundleCreator(ReleaserProperties properties) { + return new ReleaseBundleCreator(properties); + } + } 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 566e23c9..53a7ccfc 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 @@ -17,6 +17,7 @@ package releaser.internal.tasks.postrelease; import releaser.internal.Releaser; +import releaser.internal.project.ProjectVersion; import releaser.internal.spring.Arguments; import releaser.internal.tasks.ProjectPostReleaseReleaserTask; import releaser.internal.tech.BuildUnstableException; @@ -61,7 +62,8 @@ public class CreateProjectReleaseBundlePostReleaseTask implements ProjectPostRel @Override public ExecutionResult runTask(Arguments args) throws BuildUnstableException, RuntimeException { return this.releaser.createReleaseBundle(args.properties.isCommercial(), args.versionFromBom, - args.options.dryRun); + args.options.dryRun, args.properties.getBundles().getRepos(), + new ProjectVersion(args.project).projectName); } @Override diff --git a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateReleaseTrainReleaseBundlePostReleaseTask.java b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateReleaseTrainReleaseBundlePostReleaseTask.java index 7463b505..779c9c49 100644 --- a/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateReleaseTrainReleaseBundlePostReleaseTask.java +++ b/releaser-spring/src/main/java/releaser/internal/tasks/postrelease/CreateReleaseTrainReleaseBundlePostReleaseTask.java @@ -17,6 +17,7 @@ package releaser.internal.tasks.postrelease; import releaser.internal.Releaser; +import releaser.internal.project.ProjectVersion; import releaser.internal.spring.Arguments; import releaser.internal.tasks.TrainPostReleaseReleaserTask; import releaser.internal.tech.BuildUnstableException; @@ -60,7 +61,8 @@ public class CreateReleaseTrainReleaseBundlePostReleaseTask implements TrainPost @Override public ExecutionResult runTask(Arguments args) throws BuildUnstableException, RuntimeException { - return releaser.createReleaseBundle(args.properties.isCommercial(), args.versionFromBom, args.options.dryRun); + return releaser.createReleaseBundle(args.properties.isCommercial(), args.versionFromBom, args.options.dryRun, + args.properties.getBundles().getRepos(), new ProjectVersion(args.project).projectName); } @Override From cfafc20a634ba37cbbdbf424b319cbc4dcaccf30 Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Mon, 3 Jun 2024 19:19:51 -0400 Subject: [PATCH 4/8] Adding some logging --- .../releaser/internal/commercial/ReleaseBundleCreator.java | 3 +++ 1 file changed, 3 insertions(+) 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 e952f24d..3c15e2c2 100644 --- a/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java +++ b/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java @@ -43,6 +43,9 @@ public class ReleaseBundleCreator { public ReleaseBundleCreator(ReleaserProperties properties) { this.properties = properties; + log.info("Creating Artifactory client with URL [{}]", properties.getBundles().getRepoUrl()); + log.info("Creating Artifactory client with username [{}]", properties.getBundles().getRepoUsername()); + log.info("Creating Artifactory client with password [{}]", properties.getBundles().getRepoPassword()); this.artifactory = ArtifactoryClientBuilder.create().setUrl(properties.getBundles().getRepoUrl()) .setUsername(properties.getBundles().getRepoUsername()) .setPassword(properties.getBundles().getRepoPassword()).build(); From 9d4f6db7b4046e2094913bd71d7e7da0ad300c4d Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Mon, 3 Jun 2024 19:54:33 -0400 Subject: [PATCH 5/8] Use access token instead --- .../java/releaser/internal/commercial/ReleaseBundleCreator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3c15e2c2..b6e2d3b5 100644 --- a/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java +++ b/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java @@ -48,7 +48,7 @@ public class ReleaseBundleCreator { log.info("Creating Artifactory client with password [{}]", properties.getBundles().getRepoPassword()); this.artifactory = ArtifactoryClientBuilder.create().setUrl(properties.getBundles().getRepoUrl()) .setUsername(properties.getBundles().getRepoUsername()) - .setPassword(properties.getBundles().getRepoPassword()).build(); + .setAccessToken(properties.getBundles().getRepoPassword()).build(); } public boolean createReleaseBundle(List repos, String version) throws IOException { From af59858ca85c910c747db1cf5e6aadd30e6b2e77 Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Mon, 3 Jun 2024 20:10:27 -0400 Subject: [PATCH 6/8] Posting JSON --- .../commercial/ReleaseBundleCreator.java | 20 +++++++++++++++---- .../java/releaser/internal/ReleaserTests.java | 4 ++-- 2 files changed, 18 insertions(+), 6 deletions(-) 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 b6e2d3b5..3ed1c371 100644 --- a/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java +++ b/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java @@ -17,8 +17,11 @@ package releaser.internal.commercial; import java.io.IOException; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import com.fasterxml.jackson.databind.ObjectMapper; import org.jfrog.artifactory.client.Artifactory; import org.jfrog.artifactory.client.ArtifactoryClientBuilder; import org.jfrog.artifactory.client.ArtifactoryRequest; @@ -52,6 +55,12 @@ public class ReleaseBundleCreator { } public boolean createReleaseBundle(List repos, String version) throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + Map json = new HashMap<>(); + json.put("release_bundle_name", "TNZ-spring-cloud-netflix-commercial"); + json.put("release_bundle_version", version); + json.put( "source_type", "aql"); + AqlQueryBuilder builder = new AqlQueryBuilder() .item(AqlItem.aqlItem("repo", AqlItem.aqlItem("$eq", "spring-enterprise-maven-prod-local"))); @@ -60,16 +69,19 @@ public class ReleaseBundleCreator { items[repos.indexOf(repo)] = AqlItem.match("path", repo + "/" + version); } String aql = builder.or(items).asc("path", "name").build(); - return createReleaseBundle(aql); + Map aqlObject = new HashMap<>(); + aqlObject.put("aql", aql); + json.put("source", aqlObject); + return createReleaseBundle(objectMapper.writeValueAsString(json)); } - public boolean createReleaseBundle(String aql) throws IOException { - log.info("Creating release bundle with AQL [{}]", aql); + public boolean createReleaseBundle(String json) throws IOException { + log.info("Creating release bundle with JSON [{}]", json); ArtifactoryRequest aqlRequest = new ArtifactoryRequestImpl().method(ArtifactoryRequest.Method.POST) .apiUrl("lifecycle/api/v2/release_bundle").addQueryParam("project", "spring") .addHeader("X-JFrog-Signing-Key-Name", "packagesKey").requestType(ArtifactoryRequest.ContentType.JSON) - .responseType(ArtifactoryRequest.ContentType.JSON).requestBody(aql); + .responseType(ArtifactoryRequest.ContentType.JSON).requestBody(json); ArtifactoryResponse response = artifactory.restCall(aqlRequest); if (!response.isSuccessResponse()) { log.warn("Failed to create release bundle {}", response.getRawBody()); diff --git a/releaser-core/src/test/java/releaser/internal/ReleaserTests.java b/releaser-core/src/test/java/releaser/internal/ReleaserTests.java index 00d0e20f..432e22db 100644 --- a/releaser-core/src/test/java/releaser/internal/ReleaserTests.java +++ b/releaser-core/src/test/java/releaser/internal/ReleaserTests.java @@ -97,7 +97,7 @@ public class ReleaserTests { this.saganUpdater, this.documentationUpdater, this.postReleaseActions, new ReleaseBundleCreator(SpringCloudReleaserProperties.get()) { @Override - public boolean createReleaseBundle(String aql) throws IOException { + public boolean createReleaseBundle(String json) throws IOException { return true; } }) { @@ -114,7 +114,7 @@ public class ReleaserTests { this.saganUpdater, this.documentationUpdater, this.postReleaseActions, new ReleaseBundleCreator(SpringCloudReleaserProperties.get()) { @Override - public boolean createReleaseBundle(String aql) throws IOException { + public boolean createReleaseBundle(String json) throws IOException { return true; } }); From 19e070d2f126c579ea6f81d475959b65848e1f13 Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Tue, 4 Jun 2024 10:47:23 -0400 Subject: [PATCH 7/8] Update password parameter to access token --- .../main/java/releaser/internal/Releaser.java | 3 +- .../releaser/internal/ReleaserProperties.java | 10 +++--- .../commercial/ReleaseBundleCreator.java | 32 +++++++++++-------- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/releaser-core/src/main/java/releaser/internal/Releaser.java b/releaser-core/src/main/java/releaser/internal/Releaser.java index 5794678a..4c1dae2c 100644 --- a/releaser-core/src/main/java/releaser/internal/Releaser.java +++ b/releaser-core/src/main/java/releaser/internal/Releaser.java @@ -404,7 +404,8 @@ 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); + 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")); diff --git a/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java b/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java index 64a125f5..d6484235 100644 --- a/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java +++ b/releaser-core/src/main/java/releaser/internal/ReleaserProperties.java @@ -1583,7 +1583,7 @@ public class ReleaserProperties implements Serializable { private String repoUsername; - private String repoPassword; + private String repoAccessToken; private Map> repos; @@ -1627,12 +1627,12 @@ public class ReleaserProperties implements Serializable { this.repoUsername = repoUsername; } - public String getRepoPassword() { - return repoPassword; + public String getRepoAccessToken() { + return repoAccessToken; } - public void setRepoPassword(String repoPassword) { - this.repoPassword = repoPassword; + public void setRepoAccessToken(String repoAccessToken) { + this.repoAccessToken = repoAccessToken; } } 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 3ed1c371..66bc96d6 100644 --- a/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java +++ b/releaser-core/src/main/java/releaser/internal/commercial/ReleaseBundleCreator.java @@ -40,27 +40,37 @@ public class ReleaseBundleCreator { private static final Logger log = LoggerFactory.getLogger(ReleaseBundleCreator.class); - private ReleaserProperties properties; - private Artifactory artifactory; + private ObjectMapper objectMapper; + public ReleaseBundleCreator(ReleaserProperties properties) { - this.properties = properties; log.info("Creating Artifactory client with URL [{}]", properties.getBundles().getRepoUrl()); log.info("Creating Artifactory client with username [{}]", properties.getBundles().getRepoUsername()); - log.info("Creating Artifactory client with password [{}]", properties.getBundles().getRepoPassword()); + log.info("Creating Artifactory client with access token [{}]", properties.getBundles().getRepoAccessToken()); this.artifactory = ArtifactoryClientBuilder.create().setUrl(properties.getBundles().getRepoUrl()) .setUsername(properties.getBundles().getRepoUsername()) - .setAccessToken(properties.getBundles().getRepoPassword()).build(); + .setAccessToken(properties.getBundles().getRepoAccessToken()).build(); + this.objectMapper = new ObjectMapper(); } - public boolean createReleaseBundle(List repos, String version) throws IOException { - ObjectMapper objectMapper = new ObjectMapper(); + public boolean createReleaseBundle(List repos, String version, String releaseBundleName) throws IOException { Map json = new HashMap<>(); - json.put("release_bundle_name", "TNZ-spring-cloud-netflix-commercial"); + json.put("release_bundle_name", releaseBundleName); json.put("release_bundle_version", version); json.put( "source_type", "aql"); + json.put("source", createAqlMap(repos, version)); + return createReleaseBundle(objectMapper.writeValueAsString(json)); + } + private Map createAqlMap(List repos, String version) { + String aql = createAql(repos, version); + Map aqlObject = new HashMap<>(); + aqlObject.put("aql", aql); + return aqlObject; + } + + private String createAql(List repos, String version) { AqlQueryBuilder builder = new AqlQueryBuilder() .item(AqlItem.aqlItem("repo", AqlItem.aqlItem("$eq", "spring-enterprise-maven-prod-local"))); @@ -68,11 +78,7 @@ public class ReleaseBundleCreator { for (String repo : repos) { items[repos.indexOf(repo)] = AqlItem.match("path", repo + "/" + version); } - String aql = builder.or(items).asc("path", "name").build(); - Map aqlObject = new HashMap<>(); - aqlObject.put("aql", aql); - json.put("source", aqlObject); - return createReleaseBundle(objectMapper.writeValueAsString(json)); + return builder.or(items).asc("path", "name").build(); } public boolean createReleaseBundle(String json) throws IOException { From 70c114a160a362b30b105ce7700f8b5877dc7cca Mon Sep 17 00:00:00 2001 From: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> Date: Tue, 4 Jun 2024 11:18:50 -0400 Subject: [PATCH 8/8] Adjusting application.yaml with correct bundle names --- projects/spring-cloud/src/main/resources/application.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/projects/spring-cloud/src/main/resources/application.yml b/projects/spring-cloud/src/main/resources/application.yml index 95a2acfa..320d1de6 100644 --- a/projects/spring-cloud/src/main/resources/application.yml +++ b/projects/spring-cloud/src/main/resources/application.yml @@ -164,6 +164,7 @@ releaser: spring-cloud-vault: - "org/springframework/cloud/spring-cloud-vault*" - "org/springframework/cloud/spring-cloud-starter-vault*" - spring-cloud-release: + # This is Spring Cloud Release, the POM id is spring-cloud-starter-build + spring-cloud-starter-build: - "org/springframework/cloud/spring-cloud-starter*" - "org/springframework/cloud/spring-cloud-dependencies*"