Fixed version bump

This commit is contained in:
Marcin Grzejszczak
2017-03-10 12:16:24 +01:00
parent 23b014ebce
commit 3265732818
11 changed files with 103 additions and 81 deletions

View File

@@ -41,7 +41,7 @@ public class Releaser {
ProjectVersion originalVersion = new ProjectVersion(project);
ProjectVersion changedVersion = new ProjectVersion(project);
if (!skipPoms) {
this.projectPomUpdater.updateProject(project);
this.projectPomUpdater.updateProjectFromSCRelease(project);
changedVersion = new ProjectVersion(project);
log.info("\n\nProject was successfully updated to [{}]", originalVersion);
}

View File

@@ -129,11 +129,6 @@ public class ReleaserProperties {
*/
private String deployCommand = "./mvnw deploy -DskipTests -Pfast";
/**
* Command to be executed to bump versions. The new version will be passed under %s param
*/
private String bumpVersionsCommand = "./mvnw versions:set -DgenerateBackupPoms=false -DnewVersion=%s";
/**
* Command to be executed to deploy a built project. If present "{{version}}" will be replaced by the
* provided version
@@ -180,14 +175,6 @@ public class ReleaserProperties {
public void setPublishDocsCommands(String[] publishDocsCommands) {
this.publishDocsCommands = publishDocsCommands;
}
public String getBumpVersionsCommand() {
return this.bumpVersionsCommand;
}
public void setBumpVersionsCommand(String bumpVersionsCommand) {
this.bumpVersionsCommand = bumpVersionsCommand;
}
}
public String getWorkingDir() {

View File

@@ -23,6 +23,8 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.HashSet;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -51,7 +53,7 @@ public class ProjectPomUpdater {
*
* @param projectRoot - root folder with project to update
*/
public void updateProject(File projectRoot) {
public void updateProjectFromSCRelease(File projectRoot) {
File clonedScRelease = this.gitRepo.cloneScReleaseProject();
this.gitRepo.checkout(clonedScRelease, this.properties.getPom().getBranch());
SCReleasePomParser sCReleasePomParser = new SCReleasePomParser(clonedScRelease);
@@ -61,10 +63,27 @@ public class ProjectPomUpdater {
log.info("Skipping project updating");
return;
}
updatePoms(projectRoot, versions);
}
private void updatePoms(File projectRoot, Versions versions) {
File rootPom = new File(projectRoot, "pom.xml");
ModelWrapper rootPomModel = this.pomUpdater.readModel(rootPom);
processAllPoms(projectRoot, new PomWalker(rootPomModel, versions, this.pomUpdater,
properties));
this.properties));
}
public void updatePomsForRootVersion(File directory, String version) {
File pom = new File(directory, "pom.xml");
Versions versions = versions(version, pom);
updatePoms(directory, versions);
}
private Versions versions(String version, File pom) {
ModelWrapper model = this.pomUpdater.readModel(pom);
Set<Project> projects = new HashSet<>();
projects.add(new Project(model.projectName(), version));
return new Versions("", "", projects);
}
private void processAllPoms(File projectRoot, PomWalker pomWalker) {

View File

@@ -13,6 +13,7 @@ import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.release.internal.ReleaserProperties;
import org.springframework.cloud.release.internal.pom.ProjectPomUpdater;
/**
* @author Marcin Grzejszczak
@@ -24,15 +25,18 @@ public class Project {
private final ReleaserProperties properties;
private final ProcessExecutor executor;
private final ProjectPomUpdater pomUpdater;
public Project(ReleaserProperties properties) {
public Project(ReleaserProperties properties, ProjectPomUpdater pomUpdater) {
this.properties = properties;
this.executor = new ProcessExecutor(properties);
this.pomUpdater = pomUpdater;
}
Project(ReleaserProperties properties, ProcessExecutor executor) {
this.properties = properties;
this.executor = executor;
this.pomUpdater = new ProjectPomUpdater(properties);
}
public void build() {
@@ -85,18 +89,9 @@ public class Project {
}
public void bumpVersions(String version) {
try {
log.info("Bumping versions to [{}]", version);
String[] commands = String.format(bumpVersionsCommand(), version).split(" ");
runCommand(commands);
log.info("Versions successfully bumped");
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
String bumpVersionsCommand() {
return this.properties.getMaven().getBumpVersionsCommand();
String workingDir = this.properties.getWorkingDir();
File dir = new File(workingDir);
this.pomUpdater.updatePomsForRootVersion(dir, version);
}
}

View File

@@ -1,11 +1,11 @@
package org.springframework.cloud.release.internal;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.util.Iterator;
import org.apache.maven.model.Model;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Before;
import org.junit.Rule;
@@ -45,24 +45,49 @@ public class AcceptanceTests {
@Test
public void should_perform_a_release_of_consul() throws Exception {
File origin = clonedProject(this.tmp.newFolder(), this.springCloudConsulProject);
pomVersionIsEqualTo(origin, "1.2.0.BUILD-SNAPSHOT");
pomParentVersionIsEqualTo(origin, "1.2.0.BUILD-SNAPSHOT");
File project = clonedProject(this.tmp.newFolder(), tmpFile("spring-cloud-consul"));
setOriginOnProjectToTmp(origin, project);
Releaser releaser = releaser(project);
releaser.release();
then(this.temporaryFolder).exists();
File afterProcessing = new File(project, "bumped");
then(afterProcessing).exists();
Iterable<RevCommit> commits = openGitProject(project).log().call();
Iterable<RevCommit> commits = listOfCommits(project);
Iterator<RevCommit> iterator = commits.iterator();
RevCommit afterRelease = iterator.next();
RevCommit goingBackToSnapshots = iterator.next();
RevCommit bumping = iterator.next();
tagIsPresentInOrigin(origin);
commitIsPresent(iterator, "Bumping versions after release");
commitIsPresent(iterator, "Going back to snapshots");
commitIsPresent(iterator, "Bumping versions before release");
pomVersionIsEqualTo(project, "1.2.1.BUILD-SNAPSHOT");
pomParentVersionIsEqualTo(project, "1.2.1.BUILD-SNAPSHOT");
}
private Iterable<RevCommit> listOfCommits(File project) throws GitAPIException {
return openGitProject(project).log().call();
}
private void pomParentVersionIsEqualTo(File project, String expected) {
then(pom(new File(project, "spring-cloud-starter-consul")).getParent()
.getVersion()).isEqualTo(expected);
}
private void pomVersionIsEqualTo(File project, String expected) {
then(pom(project).getVersion()).isEqualTo(expected);
}
private void commitIsPresent(Iterator<RevCommit> iterator,
String expected) {
RevCommit commit = iterator.next();
then(commit.getShortMessage()).isEqualTo(expected);
}
private void tagIsPresentInOrigin(File origin) throws GitAPIException {
then(openGitProject(origin).tagList().call().iterator().next().getName()).endsWith("v1.1.2.RELEASE");
then(afterRelease.getShortMessage()).isEqualTo("Bumping versions after release");
then(goingBackToSnapshots.getShortMessage()).isEqualTo("Going back to snapshots");
then(bumping.getShortMessage()).isEqualTo("Bumping versions before release");
}
private Model pom(File dir) {
return this.testPomReader.readPom(new File(dir, "pom.xml"));
}
private ReleaserProperties releaserProperties(File project) throws URISyntaxException {
@@ -73,14 +98,13 @@ public class AcceptanceTests {
releaserProperties.getMaven().setBuildCommand("touch build");
releaserProperties.getMaven().setDeployCommand("touch deploy");
releaserProperties.getMaven().setPublishDocsCommands(new String[] { "touch docs"} );
releaserProperties.getMaven().setBumpVersionsCommand("touch bumped");
return releaserProperties;
}
private Releaser releaser(File projectFile) throws Exception {
ReleaserProperties properties = releaserProperties(projectFile);
ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties);
Project project = new Project(properties);
Project project = new Project(properties, pomUpdater);
ProjectGitUpdater gitUpdater = new ProjectGitUpdater(properties);
return new Releaser(properties, pomUpdater, project, gitUpdater) {
@Override boolean skipStep() {
@@ -96,12 +120,4 @@ public class AcceptanceTests {
private File file(String relativePath) throws URISyntaxException {
return new File(AcceptanceTests.class.getResource(relativePath).toURI());
}
private File pom(String relativePath) throws URISyntaxException {
return new File(new File(AcceptanceTests.class.getResource(relativePath).toURI()), "pom.xml");
}
private String asString(File file) throws IOException {
return new String(Files.readAllBytes(file.toPath()));
}
}

View File

@@ -39,7 +39,7 @@ public class PomUpdateAcceptanceTests {
ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties);
projectPomUpdater
.updateProject(new File(this.temporaryFolder, "/spring-cloud-sleuth"));
.updateProjectFromSCRelease(new File(this.temporaryFolder, "/spring-cloud-sleuth"));
then(this.temporaryFolder).exists();
Model rootPom = this.testPomReader.readPom(tmpFile("/spring-cloud-sleuth/pom.xml"));
@@ -64,7 +64,7 @@ public class PomUpdateAcceptanceTests {
ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties);
File beforeProcessing = pom("/projects/project/");
projectPomUpdater.updateProject(tmpFile("/project/"));
projectPomUpdater.updateProjectFromSCRelease(tmpFile("/project/"));
then(this.temporaryFolder).exists();
File afterProcessing = tmpFile("/project/pom.xml");

View File

@@ -36,7 +36,7 @@ import org.springframework.util.FileSystemUtils;
/**
* @author Marcin Grzejszczak
*/
public class PomUpdaterTests {
public class ProjectPomUpdaterTests {
Versions versions = new Versions("0.0.1", "0.0.2", projects());
PomUpdater pomUpdater = new PomUpdater();
@@ -263,6 +263,21 @@ public class PomUpdaterTests {
.contains("Won't update the version of module");
}
@Test
public void should_return_a_change_version() throws Exception {
File originalPom = pom("/projects/project/", "pom_matching_artifact_same_version.xml");
File pomInTemp = tmpFile("/project/pom_matching_artifact_same_version.xml");
ModelWrapper rootPom = model("spring-cloud-sleuth");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versions);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, pomInTemp);
BDDAssertions.then(asString(storedPom)).isEqualTo(asString(originalPom));
BDDAssertions.then(this.capture.toString())
.contains("Won't update the version of parent")
.contains("Won't update the version of module");
}
Set<Project> projects() {
Set<Project> projects = new HashSet<>();
projects.add(new Project("spring-cloud-contract", "0.0.2.BUILD-SNAPSHOT"));

View File

@@ -9,6 +9,7 @@ import org.junit.Assume;
import org.junit.Before;
import org.junit.Test;
import org.springframework.cloud.release.internal.ReleaserProperties;
import org.springframework.cloud.release.internal.pom.TestPomReader;
import static org.assertj.core.api.BDDAssertions.then;
import static org.assertj.core.api.BDDAssertions.thenThrownBy;
@@ -18,6 +19,8 @@ import static org.assertj.core.api.BDDAssertions.thenThrownBy;
*/
public class ProjectTests {
TestPomReader reader = new TestPomReader();
@Before
public void checkOs() {
Assume.assumeFalse(System.getProperty("os.name").toLowerCase().startsWith("win"));
@@ -124,31 +127,17 @@ public class ProjectTests {
@Test
public void should_successfully_execute_a_bump_versions_command() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.setWorkingDir(file("/projects/builder/resolved").getPath());
Project builder = new Project(properties, executor(properties)) {
@Override String bumpVersionsCommand() {
return "%s";
}
};
properties.setWorkingDir(file("/projects/spring-cloud-contract").getPath());
Project builder = new Project(properties, executor(properties));
builder.bumpVersions("ls -al");
builder.bumpVersions("2.3.4.BUILD-SNAPSHOT");
then(asString(file("/projects/builder/resolved/resolved.log")))
.contains("file.txt");
}
@Test
public void should_throw_exception_when_bump_command_took_too_long_to_execute() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getMaven().setWaitTimeInMinutes(0);
properties.setWorkingDir(file("/projects/builder/unresolved").getPath());
Project builder = new Project(properties, executor(properties)) {
@Override String bumpVersionsCommand() {
return "echo '%s'";
}
};
thenThrownBy(() -> builder.bumpVersions("1.0.0")).hasMessageContaining("Process waiting time of [0] minutes exceeded");
File rootPom = file("/projects/spring-cloud-contract/pom.xml");
File tools = file("/projects/spring-cloud-contract/spring-cloud-contract-tools/pom.xml");
File converters = file("/projects/spring-cloud-contract/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml");
then(this.reader.readPom(rootPom).getVersion()).isEqualTo("2.3.4.BUILD-SNAPSHOT");
then(this.reader.readPom(tools).getParent().getVersion()).isEqualTo("2.3.4.BUILD-SNAPSHOT");
then(this.reader.readPom(converters).getParent().getVersion()).isEqualTo("2.3.4.BUILD-SNAPSHOT");
}
private TestProcessExecutor executor(ReleaserProperties properties) {

View File

@@ -7,7 +7,7 @@
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-parent</artifactId>
<version></version>
<version>1.1.0.BUILD-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>

View File

@@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-tools</artifactId>
<version></version>
<version>1.1.0.BUILD-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<artifactId>spring-cloud-contract-converters</artifactId>

View File

@@ -29,7 +29,8 @@ import org.springframework.context.annotation.Configuration;
class ReleaserConfiguration {
@Bean Releaser releaser(ReleaserProperties properties) {
return new Releaser(properties, new ProjectPomUpdater(properties),
new Project(properties), new ProjectGitUpdater(properties));
ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties);
return new Releaser(properties, pomUpdater,
new Project(properties, pomUpdater), new ProjectGitUpdater(properties));
}
}