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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user