diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/DocumentationUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/DocumentationUpdater.java index f47179ab..9d91d48d 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/DocumentationUpdater.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/docs/DocumentationUpdater.java @@ -37,6 +37,7 @@ public class DocumentationUpdater { return null; } File documentationProject = this.gitHandler.cloneDocumentationProject(); + log.debug("Cloning the doc project to [{}]", documentationProject); String pathToIndexHtml = "current/index.html"; File indexHtml = new File(documentationProject, pathToIndexHtml); if (!indexHtml.exists()) { diff --git a/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/Args.java b/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/Args.java index 443ce489..02f09ab9 100644 --- a/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/Args.java +++ b/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/Args.java @@ -60,4 +60,18 @@ class Args { this.interactive = false; this.taskType = taskType; } + + @Override + public String toString() { + return "Args{" + + "releaser=" + this.releaser + + ", project=" + this.project + + ", projects=" + this.projects + + ", originalVersion=" + this.originalVersion + + ", versionFromScRelease=" + this.versionFromScRelease + + ", properties=" + this.properties + + ", interactive=" + this.interactive + + ", taskType=" + this.taskType + + '}'; + } } 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 a9b5b35b..ff30789b 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 @@ -160,7 +160,7 @@ public class SpringReleaser { } else { ProjectVersion originalVersion = new ProjectVersion(project); String fixedVersionForProject = this.properties.getFixedVersions() - .get(this.properties.getMetaRelease().getReleaseTrainProjectName()); + .get(project.getName()); versionFromScRelease = StringUtils.hasText(fixedVersionForProject) ? new ProjectVersion(originalVersion.projectName, fixedVersionForProject) : new ProjectVersion(project); @@ -189,6 +189,7 @@ public class SpringReleaser { final Args defaultArgs = new Args(this.releaser, project, projectsAndVersion.projectVersions, originalVersion, projectsAndVersion.versionFromScRelease, this.properties, options.interactive, taskType); + log.debug("Processing project [{}] with args [{}]", project, defaultArgs); this.optionsProcessor.processOptions(options, defaultArgs); return projectsAndVersion; } diff --git a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/docs/TestDocumentationUpdater.java b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/docs/TestDocumentationUpdater.java new file mode 100644 index 00000000..f902b91c --- /dev/null +++ b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/docs/TestDocumentationUpdater.java @@ -0,0 +1,40 @@ +package org.springframework.cloud.release.internal.docs; + +import java.io.File; +import java.io.IOException; + +import org.springframework.cloud.release.internal.git.ProjectGitHandler; + +/** + * @author Marcin Grzejszczak + */ +public class TestDocumentationUpdater extends DocumentationUpdater { + + private final String version; + + public TestDocumentationUpdater(ProjectGitHandler gitHandler, String version) { + super(gitHandler); + this.version = version; + } + + @Override + String readIndexHtmlContents(File indexHtml) throws IOException { + return response(); + } + + private String response() { + return "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "Page Redirection\n" + + "\n" + + "\n" + + "If you are not redirected automatically, follow the link to latest release\n"; + } +} 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 4c67e71b..e1cb5f44 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 @@ -9,20 +9,20 @@ import java.net.URISyntaxException; import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import javax.swing.*; - import org.apache.maven.model.Model; import org.assertj.core.api.BDDAssertions; +import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -32,6 +32,7 @@ import org.springframework.boot.test.rule.OutputCapture; import org.springframework.cloud.release.internal.Releaser; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.docs.DocumentationUpdater; +import org.springframework.cloud.release.internal.docs.TestDocumentationUpdater; import org.springframework.cloud.release.internal.git.GitTestUtils; import org.springframework.cloud.release.internal.git.ProjectGitHandler; import org.springframework.cloud.release.internal.gradle.GradleUpdater; @@ -193,24 +194,66 @@ public class AcceptanceTests { @Test public void should_perform_a_meta_release_of_sc_release_and_consul() throws Exception { // simulates an org - 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); + SpringReleaser releaser = metaReleaser(edgwareSr5()); releaser.release(new OptionsBuilder().metaRelease(true).options()); - then(this.nonAssertingGitHandler.clonedProjects).hasSize(2); + // consul, release, documentation + then(this.nonAssertingGitHandler.clonedProjects).hasSize(3); + // don't want to verify the docs + thenAllStepsWereExecutedForEachProject(); + thenSaganWasCalled(); + thenDocumentationWasUpdated(); + BDDAssertions.then(clonedProject("spring-cloud-consul").tagList().call()) + .extracting("name").contains("refs/tags/v1.3.5.RELEASE"); + } + + private Map edgwareSr5() { + Map versions = new LinkedHashMap<>(); + versions.put("spring-boot", "1.5.16.RELEASE"); + versions.put("spring-cloud-build", "1.3.11.RELEASE"); + versions.put("spring-cloud-commons", "1.3.5.RELEASE"); + versions.put("spring-cloud-stream", "Ditmars.SR4"); + versions.put("spring-cloud-task", "1.2.3.RELEASE"); + versions.put("spring-cloud-function", "1.0.1.RELEASE"); + versions.put("spring-cloud-aws", "1.2.3.RELEASE"); + versions.put("spring-cloud-bus", "1.3.4.RELEASE"); + versions.put("spring-cloud-config", "1.4.5.RELEASE"); + versions.put("spring-cloud-netflix", "1.4.6.RELEASE"); + versions.put("spring-cloud-cloudfoundry", "1.1.2.RELEASE"); + versions.put("spring-cloud-gateway", "1.0.2.RELEASE"); + versions.put("spring-cloud-security", "1.2.3.RELEASE"); + versions.put("spring-cloud-consul", "1.3.5.RELEASE"); + versions.put("spring-cloud-zookeeper", "1.2.2.RELEASE"); + versions.put("spring-cloud-sleuth", "1.3.5.RELEASE"); + versions.put("spring-cloud-contract", "1.2.6.RELEASE"); + versions.put("spring-cloud-vault", "1.1.2.RELEASE"); + versions.put("spring-cloud-release", "Edgware.SR5"); + return versions; + } + + private Git clonedProject(String name) { + return GitTestUtils + .openGitProject(this.nonAssertingGitHandler.clonedProjects.stream() + .filter(file -> file.getName().contains(name)) + .findFirst().get()); + } + + private void thenSaganWasCalled() { + BDDMockito.then(saganUpdater).should(BDDMockito.atLeastOnce()) + .updateSagan(BDDMockito.anyString(), + BDDMockito.any(ProjectVersion.class), BDDMockito + .any(ProjectVersion.class)); + } + + private void thenAllStepsWereExecutedForEachProject() { this.nonAssertingGitHandler.clonedProjects + .stream().filter(f -> !f.getName().contains("angel")) .forEach(project -> { then(Arrays.asList("spring-cloud-starter-build", "spring-cloud-consul")).contains(pom(project).getArtifactId()); then(capture.toString()).contains("executed_build", "executed_deploy", "executed_docs"); }); - BDDMockito.then(saganUpdater).should(BDDMockito.atLeastOnce()).updateSagan(BDDMockito.anyString(), - BDDMockito.any(ProjectVersion.class), BDDMockito.any(ProjectVersion.class)); - BDDMockito.then(documentationUpdater).should() - .updateDocsRepo(BDDMockito.any(ProjectVersion.class), BDDMockito.anyString()); } @Test @@ -248,14 +291,12 @@ public class AcceptanceTests { then(pom(project).getArtifactId()).isEqualTo("spring-cloud-consul"); then(capture.toString()).contains("executed_build", "executed_deploy", "executed_docs"); }); - BDDMockito.then(saganUpdater).should(BDDMockito.atLeastOnce()).updateSagan(BDDMockito.anyString(), - BDDMockito.any(ProjectVersion.class), BDDMockito.any(ProjectVersion.class)); - BDDMockito.then(documentationUpdater).should() - .updateDocsRepo(BDDMockito.any(ProjectVersion.class), BDDMockito.anyString()); + thenSaganWasCalled(); + thenDocumentationWasUpdated(); } @Test - public void should_perform_a_meta_release_of_build_and_consul_only_when_task_names_got_passed() throws Exception { + public void should_perform_a_meta_release_of_consul_only_when_task_names_got_passed() throws Exception { // simulates an org Map versions = new HashMap<>(); versions.put("spring-cloud-release", "Camden.BUILD-SNAPSHOT"); @@ -264,20 +305,25 @@ public class AcceptanceTests { SpringReleaser releaser = metaReleaser(versions); releaser.release(new OptionsBuilder().metaRelease(true) - .taskNames(Arrays.asList("spring-cloud-build", "spring-cloud-consul")) + .taskNames(Collections.singletonList("spring-cloud-consul")) .options()); - then(this.nonAssertingGitHandler.clonedProjects).hasSize(2); + then(this.nonAssertingGitHandler.clonedProjects).hasSize(1); this.nonAssertingGitHandler.clonedProjects .forEach(project -> { - then(Arrays.asList("spring-cloud-build", - "spring-cloud-consul")).contains(pom(project).getArtifactId()); - then(capture.toString()).contains("executed_build", "executed_deploy", "executed_docs"); + then(Collections.singletonList("spring-cloud-consul")) + .contains(pom(project).getArtifactId()); + then(capture.toString()).contains("executed_build", "executed_deploy", + "executed_docs"); }); - BDDMockito.then(saganUpdater).should(BDDMockito.atLeastOnce()).updateSagan(BDDMockito.anyString(), - BDDMockito.any(ProjectVersion.class), BDDMockito.any(ProjectVersion.class)); + thenSaganWasCalled(); + thenDocumentationWasUpdated(); + } + + private void thenDocumentationWasUpdated() { BDDMockito.then(documentationUpdater).should() - .updateDocsRepo(BDDMockito.any(ProjectVersion.class), BDDMockito.anyString()); + .updateDocsRepo(BDDMockito.any(ProjectVersion.class), BDDMockito + .anyString()); } // issue #74 @@ -546,7 +592,7 @@ public class AcceptanceTests { TemplateGenerator templateGenerator = new TemplateGenerator(properties, handler); GradleUpdater gradleUpdater = new GradleUpdater(properties); SaganUpdater saganUpdater = new SaganUpdater(this.saganClient); - DocumentationUpdater documentationUpdater = new DocumentationUpdater(handler) { + DocumentationUpdater documentationUpdater = new TestDocumentationUpdater(handler, "Brixton.SR1") { @Override public File updateDocsRepo(ProjectVersion currentProject, String springCloudReleaseBranch) { File file = super.updateDocsRepo(currentProject, springCloudReleaseBranch); @@ -599,6 +645,13 @@ public class AcceptanceTests { private ReleaserProperties metaReleaserProperties(Map versions) throws URISyntaxException { ReleaserProperties releaserProperties = new ReleaserProperties(); + Arrays.asList("spring-cloud-build", "spring-cloud-commons", "spring-cloud-stream", + "spring-cloud-task", "spring-cloud-function", "spring-cloud-aws", + "spring-cloud-bus", "spring-cloud-config", "spring-cloud-netflix", + "spring-cloud-cloudfoundry", "spring-cloud-gateway", "spring-cloud-security", + "spring-cloud-zookeeper", "spring-cloud-sleuth", + "spring-cloud-contract", "spring-cloud-vault") + .forEach(s -> releaserProperties.getMetaRelease().getProjectsToSkip().add(s)); releaserProperties.getGit().setDocumentationUrl(file("/projects/spring-cloud-static-angel/").toURI().toString()); releaserProperties.getMaven().setBuildCommand("echo executed_build"); releaserProperties.getMaven().setDeployCommand("echo executed_deploy");