Separated steps for version retrieval and updating poms

without this step you could skip version retrieval. Due to this the application behaved in a bizarre way in later steps
    with this change the version retrieval is mandatory. Actually without this step the whole application makes no sense to even execute

    fixes #23
This commit is contained in:
Marcin Grzejszczak
2017-04-19 11:02:11 +02:00
parent 082e2209c3
commit 0ffa75c0ee
7 changed files with 127 additions and 14 deletions

View File

@@ -5,10 +5,11 @@ import java.lang.invoke.MethodHandles;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.release.internal.project.ProjectBuilder;
import org.springframework.cloud.release.internal.git.ProjectGitUpdater;
import org.springframework.cloud.release.internal.pom.ProjectPomUpdater;
import org.springframework.cloud.release.internal.pom.ProjectVersion;
import org.springframework.cloud.release.internal.pom.Projects;
import org.springframework.cloud.release.internal.project.ProjectBuilder;
/**
* @author Marcin Grzejszczak
@@ -27,8 +28,12 @@ public class Releaser {
this.projectGitUpdater = projectGitUpdater;
}
public ProjectVersion updateProjectFromScRelease(File project) {
this.projectPomUpdater.updateProjectFromSCRelease(project);
public Projects retrieveVersionsFromSCRelease() {
return this.projectPomUpdater.retrieveVersionsFromSCRelease();
}
public ProjectVersion updateProjectFromScRelease(File project, Projects versions) {
this.projectPomUpdater.updateProjectFromSCRelease(project, versions);
ProjectVersion changedVersion = new ProjectVersion(project);
log.info("\n\nProject was successfully updated to [{}]", changedVersion);
return changedVersion;

View File

@@ -49,17 +49,27 @@ public class ProjectPomUpdater {
}
/**
* For the given root folder (typically the working directory) performs the whole
* flow of updating {@code pom.xml} with values from Spring Cloud Release project.
*
* @param projectRoot - root folder with project to update
* For the given root folder (typically the working directory) retrieves list of versions
* for a given release version.
*/
public void updateProjectFromSCRelease(File projectRoot) {
public Projects retrieveVersionsFromSCRelease() {
File clonedScRelease = this.gitRepo.cloneScReleaseProject();
this.gitRepo.checkout(clonedScRelease, this.properties.getPom().getBranch());
SCReleasePomParser sCReleasePomParser = new SCReleasePomParser(clonedScRelease);
Versions versions = sCReleasePomParser.allVersions();
log.info("Retrieved the following versions\n{}", versions);
return versions.toProjectVersions();
}
/**
* For the given root folder (typically the working directory) performs the whole
* flow of updating {@code pom.xml} with values from Spring Cloud Release project.
*
* @param projectRoot - root folder with project to update
* @param projects - versions of projects used to update poms
*/
public void updateProjectFromSCRelease(File projectRoot, Projects projects) {
Versions versions = new Versions(projects);
if (!this.pomUpdater.shouldProjectBeUpdated(projectRoot, versions)) {
log.info("Skipping project updating");
return;

View File

@@ -0,0 +1,24 @@
package org.springframework.cloud.release.internal.pom;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
/**
* Abstraction over collection of projects
*
* @author Marcin Grzejszczak
*/
public class Projects extends HashSet<ProjectVersion> {
public Projects(Set<ProjectVersion> versions) {
addAll(versions);
}
public ProjectVersion forFile(File projectRoot) {
final ProjectVersion thisProject = new ProjectVersion(projectRoot);
return this.stream().filter(projectVersion -> projectVersion.projectName.equals(thisProject.projectName))
.findFirst()
.orElseThrow(() -> new IllegalStateException("Project with name [" + thisProject.projectName + "] is not present"));
}
}

View File

@@ -54,11 +54,23 @@ class Versions {
Versions(String bootVersion, String scBuildVersion, Set<Project> projects) {
this.bootVersion = bootVersion;
this.scBuildVersion = scBuildVersion;
this.projects.add(new Project(SPRING_BOOT_PROJECT_NAME, bootVersion));
this.projects.add(new Project(BOOT_STARTER_ARTIFACT_ID, bootVersion));
this.projects.add(new Project(BUILD_ARTIFACT_ID, scBuildVersion));
this.projects.add(new Project(CLOUD_DEPENDENCIES_ARTIFACT_ID, scBuildVersion));
this.projects.addAll(projects);
}
Versions(Set<ProjectVersion> versions) {
this.bootVersion = versions.stream().filter(projectVersion -> SPRING_BOOT_PROJECT_NAME.equals(projectVersion.projectName))
.findFirst().orElseThrow(() -> new IllegalStateException("Boot Version is Missing")).version;
this.scBuildVersion = versions.stream().filter(projectVersion -> BUILD_ARTIFACT_ID.equals(projectVersion.projectName))
.findFirst().orElseThrow(() -> new IllegalStateException("Spring Cloud Build Version is Missing")).version;
this.projects = versions.stream()
.map(projectVersion -> new Project(projectVersion.projectName, projectVersion.version))
.collect(Collectors.toSet());
}
String versionForProject(String projectName) {
return this.projects.stream()
.filter(project -> nameMatches(projectName, project))
@@ -77,6 +89,11 @@ class Versions {
.anyMatch(project -> properties.containsKey(project.name + ".version"));
}
Projects toProjectVersions() {
return new Projects(this.projects.stream().map(project -> new ProjectVersion(project.name, project.version))
.collect(Collectors.toSet()));
}
private boolean nameMatches(String projectName, Project project) {
if (project.name.equals(projectName)) {
return true;

View File

@@ -12,6 +12,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.springframework.cloud.release.internal.pom.ProjectPomUpdater;
import org.springframework.cloud.release.internal.pom.Projects;
import org.springframework.cloud.release.internal.pom.TestPomReader;
import org.springframework.cloud.release.internal.pom.TestUtils;
import org.springframework.util.FileSystemUtils;
@@ -38,9 +39,10 @@ public class PomUpdateAcceptanceTests {
public void should_update_all_versions_for_a_release_train() throws Exception {
ReleaserProperties releaserProperties = releaserProperties();
ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties);
Projects projects = projectPomUpdater.retrieveVersionsFromSCRelease();
projectPomUpdater
.updateProjectFromSCRelease(new File(this.temporaryFolder, "/spring-cloud-sleuth"));
.updateProjectFromSCRelease(new File(this.temporaryFolder, "/spring-cloud-sleuth"), projects);
then(this.temporaryFolder).exists();
Model rootPom = this.testPomReader.readPom(tmpFile("/spring-cloud-sleuth/pom.xml"));
@@ -63,10 +65,11 @@ public class PomUpdateAcceptanceTests {
public void should_update_fail_when_after_updating_a_release_version_there_still_is_a_snapshot_version() throws Exception {
ReleaserProperties releaserProperties = branchReleaserProperties();
ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties);
Projects projects = projectPomUpdater.retrieveVersionsFromSCRelease();
BDDAssertions.thenThrownBy(() ->
projectPomUpdater
.updateProjectFromSCRelease(new File(this.temporaryFolder, "/spring-cloud-sleuth-with-unmatched-property"))
.updateProjectFromSCRelease(new File(this.temporaryFolder, "/spring-cloud-sleuth-with-unmatched-property"), projects)
).hasMessageContaining("<spring-cloud-unmatched.version>0.6.0.BUILD-SNAPSHOT</spring-cloud-unmatched.version>");
}
@@ -75,8 +78,9 @@ public class PomUpdateAcceptanceTests {
ReleaserProperties releaserProperties = releaserProperties();
ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties);
File beforeProcessing = pom("/projects/project/");
Projects projects = projectPomUpdater.retrieveVersionsFromSCRelease();
projectPomUpdater.updateProjectFromSCRelease(tmpFile("/project/"));
projectPomUpdater.updateProjectFromSCRelease(tmpFile("/project/"), projects);
then(this.temporaryFolder).exists();
File afterProcessing = tmpFile("/project/pom.xml");

View File

@@ -0,0 +1,49 @@
package org.springframework.cloud.release.internal.pom;
import java.io.File;
import java.net.URISyntaxException;
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
import static org.assertj.core.api.BDDAssertions.then;
import static org.assertj.core.api.BDDAssertions.thenThrownBy;
/**
* @author Marcin Grzejszczak
*/
public class ProjectsTests {
File springCloudReleasePom = file("/projects/spring-cloud-release");
@Test
public void should_find_a_project_by_name_from_file() {
Set<ProjectVersion> projectVersions = new HashSet<>();
projectVersions.add(new ProjectVersion("spring-cloud-starter-build", "1.0.0"));
Projects projects = new Projects(projectVersions);
then(projects.forFile(springCloudReleasePom).version).isEqualTo("1.0.0");
}
@Test
public void should_throw_exception_when_project_is_not_present() {
Set<ProjectVersion> projectVersions = new HashSet<>();
projectVersions.add(new ProjectVersion("foo", "1.0.0"));
Projects projects = new Projects(projectVersions);
thenThrownBy(() -> projects.forFile(springCloudReleasePom))
.isInstanceOf(IllegalStateException.class)
.hasMessageContaining("Project with name [spring-cloud-starter-build] is not present");
}
private File file(String relativePath) {
try {
return new File(ProjectsTests.class.getResource(relativePath).toURI());
}
catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
}

View File

@@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.cloud.release.internal.Releaser;
import org.springframework.cloud.release.internal.ReleaserProperties;
import org.springframework.cloud.release.internal.pom.ProjectVersion;
import org.springframework.cloud.release.internal.pom.Projects;
/**
* Releaser that gets input from console
@@ -30,15 +31,18 @@ public class SpringReleaser {
}
public void release() {
log.info("\n\n\n=== RETRIEVING VERSIONS ===\n\nWill clone Spring Cloud Release"
+ " to retrieve all versions for the branch [{}]", this.properties.getPom().getBranch());
String workingDir = this.properties.getWorkingDir();
File project = new File(workingDir);
ProjectVersion originalVersion = new ProjectVersion(project);
Projects projects = this.releaser.retrieveVersionsFromSCRelease();
ProjectVersion changedVersion = projects.forFile(project);
log.info("\n\n\n=== UPDATING POMS ===\n\nWill run the application "
+ "for root folder [{}]. \n\nPress ENTER to continue {}", workingDir, MSG);
boolean skipPoms = skipStep();
ProjectVersion originalVersion = new ProjectVersion(project);
ProjectVersion changedVersion = new ProjectVersion(project);
if (!skipPoms) {
changedVersion = this.releaser.updateProjectFromScRelease(project);
changedVersion = this.releaser.updateProjectFromScRelease(project, projects);
}
log.info("\n\n\n=== BUILD PROJECT ===\n\nPress ENTER to build the project {}", MSG);
boolean skipBuild = skipStep();