From 2a4cf036c6e2ef1e720d1d37211daabbd2561541 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 25 Jun 2018 10:39:54 +0200 Subject: [PATCH] Added skip project names feature; fixes gh-87 --- README.adoc | 2 ++ .../asciidoc/spring-cloud-release-tools.adoc | 2 ++ .../release/internal/ReleaserProperties.java | 19 +++++++++++++++++++ .../internal/spring/SpringReleaser.java | 19 +++++++++++-------- .../internal/spring/AcceptanceTests.java | 16 ++++++++++++++++ 5 files changed, 50 insertions(+), 8 deletions(-) diff --git a/README.adoc b/README.adoc index 867db0d9..a93a8d2b 100644 --- a/README.adoc +++ b/README.adoc @@ -268,6 +268,8 @@ Use these properties to provide versions for the meta release. - `releaser.meta-release.release-train-project-name` - Name of the project that represents the BOM of the release train. Defaults to `spring-cloud-release` - `releaser.meta-release.git-org-url` - The URL of the Git organization. We'll append each project's name to it. Defaults to `https://github.com/spring-cloud` +- `releaser.meta-release.projects-to-skip` - List of projects that we should not clone and release. Spring Cloud release +train depends on projects that got already released. We default this list to `[spring-cloud-stream, spring-cloud-task]`. - `releaser.git.fetch-versions-from-git` - If `true` then should fill the map of versions from Git. If `false` then picks fixed versions - `releaser.git.clone-destination-dir` - Where should the Spring Cloud Release repo get cloned to. If null defaults to a temporary directory diff --git a/docs/src/main/asciidoc/spring-cloud-release-tools.adoc b/docs/src/main/asciidoc/spring-cloud-release-tools.adoc index 05d524cc..8a626b96 100644 --- a/docs/src/main/asciidoc/spring-cloud-release-tools.adoc +++ b/docs/src/main/asciidoc/spring-cloud-release-tools.adoc @@ -258,6 +258,8 @@ Use these properties to provide versions for the meta release. - `releaser.meta-release.release-train-project-name` - Name of the project that represents the BOM of the release train. Defaults to `spring-cloud-release` - `releaser.meta-release.git-org-url` - The URL of the Git organization. We'll append each project's name to it. Defaults to `https://github.com/spring-cloud` +- `releaser.meta-release.projects-to-skip` - List of projects that we should not clone and release. Spring Cloud release +train depends on projects that got already released. We default this list to `[spring-cloud-stream, spring-cloud-task]`. - `releaser.git.fetch-versions-from-git` - If `true` then should fill the map of versions from Git. If `false` then picks fixed versions - `releaser.git.clone-destination-dir` - Where should the Spring Cloud Release repo get cloned to. If null defaults to a temporary directory diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java index 0b6be61a..6d87b330 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java @@ -15,6 +15,7 @@ */ package org.springframework.cloud.release.internal; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -70,6 +71,16 @@ public class ReleaserProperties { */ private String gitOrgUrl = "https://github.com/spring-cloud"; + /** + * Names of projects to skip deployment for meta-release + */ + private List projectsToSkip = new ArrayList() { + { + this.add("spring-cloud-stream"); + this.add("spring-cloud-task"); + } + }; + public boolean isEnabled() { return this.enabled; } @@ -93,6 +104,14 @@ public class ReleaserProperties { public void setReleaseTrainProjectName(String releaseTrainProjectName) { this.releaseTrainProjectName = releaseTrainProjectName; } + + public List getProjectsToSkip() { + return this.projectsToSkip; + } + + public void setProjectsToSkip(List projectsToSkip) { + this.projectsToSkip = projectsToSkip; + } } public static class Git { diff --git a/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/SpringReleaser.java b/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/SpringReleaser.java index 77081c8a..e3e4c2b0 100644 --- a/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/SpringReleaser.java +++ b/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/SpringReleaser.java @@ -62,9 +62,8 @@ public class SpringReleaser { if (options.metaRelease) { log.info("Meta Release picked. Will iterate over all projects and perform release of each one"); this.properties.getGit().setFetchVersionsFromGit(false); - metaReleaseProjects(options).forEach(project -> { - processProjectForMetaRelease(options, project); - }); + metaReleaseProjects(options) + .forEach(project -> processProjectForMetaRelease(options, project)); } else { log.info("Single project release picked. Will release only the current project"); File projectFolder = projectFolder(); @@ -115,19 +114,23 @@ public class SpringReleaser { private List metaReleaseProjects(Options options) { List projects = new ArrayList<>(this.properties.getFixedVersions().keySet()); + log.info("List of projects that should not be cloned {}", this.properties.getMetaRelease().getProjectsToSkip()); + List filteredProjects = projects.stream() + .filter(project -> !this.properties.getMetaRelease().getProjectsToSkip().contains(project)) + .collect(Collectors.toList()); if (StringUtils.hasText(options.startFrom)) { - int projectIndex = projects.indexOf(options.startFrom); + int projectIndex = filteredProjects.indexOf(options.startFrom); if (projectIndex < 0) throw new IllegalStateException("Project [" + options.startFrom + "] not found"); - projects = projects.subList(projectIndex, projects.size()); + filteredProjects = filteredProjects.subList(projectIndex, projects.size()); options.startFrom = ""; } else if (!options.taskNames.isEmpty()) { - projects = projects.stream() + filteredProjects = filteredProjects.stream() .filter(project -> options.taskNames.contains(project)) .collect(Collectors.toList()); options.taskNames = new ArrayList<>(); } - log.info("\n\n\nFor meta-release, will release the projects {}\n\n\n", projects); - return projects; + log.info("\n\n\nFor meta-release, will release the projects {}\n\n\n", filteredProjects); + return filteredProjects; } private File projectFolder() { diff --git a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java index 7a81162b..d2d54317 100644 --- a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java +++ b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java @@ -203,6 +203,22 @@ public class AcceptanceTests { .updateDocsRepo(BDDMockito.any(ProjectVersion.class), BDDMockito.anyString()); } + @Test + public void should_not_clone_any_projects_when_they_are_on_list_of_projects_to_skip() throws Exception { + Map versions = new HashMap<>(); + versions.put("spring-cloud-release", "Camden.BUILD-SNAPSHOT"); + versions.put("spring-cloud-consul", "1.1.2.BUILD-SNAPSHOT"); + SpringReleaser releaser = metaReleaser(versions); + this.releaserProperties.getMetaRelease().getProjectsToSkip().add("spring-cloud-release"); + this.releaserProperties.getMetaRelease().getProjectsToSkip().add("spring-cloud-consul"); + File temporaryDestination = tmp.newFolder(); + this.releaserProperties.getGit().setCloneDestinationDir(temporaryDestination.getAbsolutePath()); + + releaser.release(new OptionsBuilder().metaRelease(true).options()); + + then(temporaryDestination.list()).isEmpty(); + } + @Test public void should_perform_a_meta_release_of_consul_only_when_run_from_got_passed() throws Exception { // simulates an org