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*"