Updates guides as a post action

fixes gh-147
This commit is contained in:
Marcin Grzejszczak
2019-05-07 16:50:10 +02:00
parent 05f911e0ae
commit 0b937a8331
22 changed files with 553 additions and 116 deletions

View File

@@ -17,12 +17,15 @@
package org.springframework.cloud.release.internal.spring;
import java.io.File;
import java.util.Collections;
import java.util.List;
import org.slf4j.Logger;
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.ProcessedProject;
import org.springframework.cloud.release.internal.pom.ProjectVersion;
import org.springframework.cloud.release.internal.pom.Projects;
import org.springframework.context.ApplicationEvent;
@@ -47,6 +50,8 @@ class Args {
final ReleaserProperties properties;
final List<ProcessedProject> processedProjects;
final boolean interactive;
final TaskType taskType;
@@ -63,6 +68,8 @@ class Args {
this.originalVersion = originalVersion;
this.versionFromScRelease = versionFromScRelease;
this.properties = properties;
this.processedProjects = Collections
.singletonList(new ProcessedProject(properties, versionFromScRelease));
this.interactive = interactive;
this.taskType = taskType;
this.applicationEventPublisher = applicationEventPublisher;
@@ -70,14 +77,15 @@ class Args {
// Used by meta-release task
Args(Releaser releaser, Projects projects, ProjectVersion versionFromScRelease,
ReleaserProperties properties, boolean interactive,
ApplicationEventPublisher applicationEventPublisher) {
ReleaserProperties properties, List<ProcessedProject> processedProjects,
boolean interactive, ApplicationEventPublisher applicationEventPublisher) {
this.releaser = releaser;
this.project = null;
this.projects = projects;
this.originalVersion = null;
this.versionFromScRelease = versionFromScRelease;
this.properties = properties;
this.processedProjects = processedProjects;
this.interactive = interactive;
this.taskType = TaskType.POST_RELEASE;
this.applicationEventPublisher = applicationEventPublisher;
@@ -91,6 +99,7 @@ class Args {
this.originalVersion = null;
this.versionFromScRelease = null;
this.properties = null;
this.processedProjects = Collections.emptyList();
this.interactive = false;
this.taskType = taskType;
this.applicationEventPublisher = null;
@@ -112,10 +121,9 @@ class Args {
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
+ '}';
+ this.originalVersion + ", versionFromBom=" + this.versionFromScRelease
+ ", properties=" + this.properties + ", interactive=" + this.interactive
+ ", taskType=" + this.taskType + '}';
}
}

View File

@@ -56,8 +56,8 @@ class ReleaserConfiguration {
}
@Bean
ProjectBuilder projectBuilder(VersionsFetcher versionsFetcher) {
return new ProjectBuilder(this.properties, versionsFetcher);
ProjectBuilder projectBuilder() {
return new ProjectBuilder(this.properties);
}
@Bean
@@ -94,9 +94,10 @@ class ReleaserConfiguration {
@Bean
PostReleaseActions postReleaseActions(ProjectGitHandler handler,
ProjectPomUpdater pomUpdater, GradleUpdater gradleUpdater,
ProjectBuilder projectBuilder, ReleaserProperties releaserProperties) {
ProjectBuilder projectBuilder, ReleaserProperties releaserProperties,
VersionsFetcher versionsFetcher) {
return new PostReleaseActions(handler, pomUpdater, gradleUpdater, projectBuilder,
releaserProperties);
releaserProperties, versionsFetcher);
}
@Bean

View File

@@ -50,6 +50,7 @@ class ReleaserPropertiesUpdater {
File clonedProjectFromOrg) {
ReleaserProperties props = updatePropertiesFromFile(properties,
clonedProjectFromOrg);
props.setWorkingDir(clonedProjectFromOrg.getAbsolutePath());
log.info("Updated properties [\n\n{}\n\n]", props);
updateProperties(props);
return props;

View File

@@ -19,6 +19,8 @@ package org.springframework.cloud.release.internal.spring;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import org.slf4j.Logger;
@@ -28,6 +30,7 @@ import org.springframework.cloud.release.internal.Releaser;
import org.springframework.cloud.release.internal.ReleaserProperties;
import org.springframework.cloud.release.internal.options.Options;
import org.springframework.cloud.release.internal.options.OptionsBuilder;
import org.springframework.cloud.release.internal.pom.ProcessedProject;
import org.springframework.cloud.release.internal.pom.ProjectVersion;
import org.springframework.cloud.release.internal.pom.Projects;
import org.springframework.context.ApplicationEventPublisher;
@@ -40,6 +43,8 @@ import org.springframework.util.StringUtils;
*/
public class SpringReleaser {
private static final Map<File, ProjectsAndVersion> CACHE = new ConcurrentHashMap<>();
private static final Logger log = LoggerFactory.getLogger(SpringReleaser.class);
private final Releaser releaser;
@@ -81,33 +86,46 @@ public class SpringReleaser {
}
public void release(Options options) {
ProjectsAndVersion projectsAndVersion = null;
if (options.metaRelease) {
prepareForMetaRelease(options);
}
if (this.properties.isPostReleaseTasksOnly()) {
log.info("Skipping release process and moving only to post release");
this.optionsProcessor.postReleaseOptions(options,
postReleaseOptionsAgs(options, projectsAndVersion));
this.optionsProcessor.postReleaseOptions(options, postReleaseOptionsAgs(
options, null, postReleaseTaskOnlyProcessedProjects(options)));
buildCompleted();
return;
}
performReleaseAndPostRelease(options, projectsAndVersion);
performReleaseAndPostRelease(options, null);
buildCompleted();
}
private List<ProcessedProject> postReleaseTaskOnlyProcessedProjects(Options options) {
return metaReleaseProjects(options).stream().map(project -> {
File clonedProjectFromOrg = this.releaser.clonedProjectFromOrg(project);
ReleaserProperties properties = updatePropertiesIfCustomConfigPresent(
this.properties.copy(), clonedProjectFromOrg);
log.info("Successfully cloned the project [{}] to [{}]", project,
clonedProjectFromOrg);
ProjectsAndVersion projects = projects(clonedProjectFromOrg);
return new ProcessedProject(properties, projects.versionFromBom);
}).collect(Collectors.toList());
}
private void buildCompleted() {
this.applicationEventPublisher.publishEvent(new BuildCompleted(this));
}
private void performReleaseAndPostRelease(Options options,
ProjectsAndVersion projectsAndVersion) {
List<ProcessedProject> processedProjects = new ArrayList<>();
if (options.metaRelease) {
ReleaserProperties original = this.properties.copy();
log.debug("The following properties were found [{}]", original);
metaReleaseProjects(options)
.forEach(project -> processProjectForMetaRelease(original.copy(),
options, project));
processedProjects = metaReleaseProjects(options).stream()
.map(project -> processProjectForMetaRelease(original.copy(), options,
project))
.collect(Collectors.toList());
}
else {
log.info(
@@ -116,7 +134,7 @@ public class SpringReleaser {
projectsAndVersion = processProject(options, projectFolder, TaskType.RELEASE);
}
this.optionsProcessor.postReleaseOptions(options,
postReleaseOptionsAgs(options, projectsAndVersion));
postReleaseOptionsAgs(options, projectsAndVersion, processedProjects));
}
private void prepareForMetaRelease(Options options) {
@@ -126,15 +144,18 @@ public class SpringReleaser {
this.properties.getMetaRelease().setEnabled(options.metaRelease);
}
void processProjectForMetaRelease(ReleaserProperties copy, Options options,
String project) {
ProcessedProject processProjectForMetaRelease(ReleaserProperties copy,
Options options, String project) {
log.info("Original properties [\n\n{}\n\n]", copy);
File clonedProjectFromOrg = this.releaser.clonedProjectFromOrg(project);
updatePropertiesIfCustomConfigPresent(copy, clonedProjectFromOrg);
copy = updatePropertiesIfCustomConfigPresent(copy, clonedProjectFromOrg);
log.info("Successfully cloned the project [{}] to [{}]", project,
clonedProjectFromOrg);
ProjectsAndVersion projectsAndVersion;
try {
processProject(options, clonedProjectFromOrg, TaskType.RELEASE);
projectsAndVersion = processProject(options, clonedProjectFromOrg,
TaskType.RELEASE);
return new ProcessedProject(copy, projectsAndVersion.versionFromBom);
}
catch (Exception e) {
log.error("\n\n\nBUILD FAILED!!!\n\nException occurred for project <"
@@ -196,7 +217,8 @@ public class SpringReleaser {
return new File(workingDir);
}
Args postReleaseOptionsAgs(Options options, ProjectsAndVersion projectsAndVersion) {
Args postReleaseOptionsAgs(Options options, ProjectsAndVersion projectsAndVersion,
List<ProcessedProject> processedProjects) {
Projects projects = projectsAndVersion == null
? projectsToUpdateForFixedVersions() : projectsAndVersion.projectVersions;
ProjectVersion version = projects.containsProject(
@@ -206,7 +228,7 @@ public class SpringReleaser {
this.properties.getPom().setBranch(version.version);
}
return new Args(this.releaser, projects, version, this.properties,
options.interactive, this.applicationEventPublisher);
processedProjects, options.interactive, this.applicationEventPublisher);
}
private ProjectVersion versionFromBranch() {
@@ -216,7 +238,13 @@ public class SpringReleaser {
}
private ProjectsAndVersion projects(File project) {
ProjectVersion versionFromScRelease;
ProjectsAndVersion projectsAndVersion = CACHE.get(project);
if (projectsAndVersion != null) {
log.info("Found cached version of projects and version [{}]",
projectsAndVersion);
return projectsAndVersion;
}
ProjectVersion versionFromBom;
Projects projectsToUpdate;
log.info("Fetch from git [{}], meta release [{}]",
this.properties.getGit().isFetchVersionsFromGit(),
@@ -225,25 +253,34 @@ public class SpringReleaser {
&& !this.properties.getMetaRelease().isEnabled()) {
printVersionRetrieval();
projectsToUpdate = this.releaser.retrieveVersionsFromSCRelease();
versionFromScRelease = projectsToUpdate.forFile(project);
assertNoSnapshotsForANonSnapshotProject(projectsToUpdate,
versionFromScRelease);
versionFromBom = assertNoSnapshotsForANonSnapshotProject(project,
projectsToUpdate);
}
else {
ProjectVersion originalVersion = new ProjectVersion(project);
String fixedVersionForProject = this.properties.getFixedVersions()
.get(project.getName());
versionFromScRelease = StringUtils.hasText(fixedVersionForProject)
versionFromBom = StringUtils.hasText(fixedVersionForProject)
? new ProjectVersion(originalVersion.projectName,
fixedVersionForProject)
: new ProjectVersion(project);
projectsToUpdate = this.properties.getFixedVersions().entrySet().stream()
.map(entry -> new ProjectVersion(entry.getKey(), entry.getValue()))
.collect(Collectors.toCollection(Projects::new));
projectsToUpdate.add(versionFromScRelease);
projectsToUpdate.add(versionFromBom);
printSettingVersionFromFixedVersions(projectsToUpdate);
}
return new ProjectsAndVersion(projectsToUpdate, versionFromScRelease);
projectsAndVersion = new ProjectsAndVersion(projectsToUpdate, versionFromBom);
CACHE.put(project, projectsAndVersion);
return projectsAndVersion;
}
ProjectVersion assertNoSnapshotsForANonSnapshotProject(File project,
Projects projectsToUpdate) {
ProjectVersion versionFromBom;
versionFromBom = projectsToUpdate.forFile(project);
assertNoSnapshotsForANonSnapshotProject(projectsToUpdate, versionFromBom);
return versionFromBom;
}
ProjectsAndVersion processProject(Options options, File project, TaskType taskType) {
@@ -251,8 +288,8 @@ public class SpringReleaser {
ProjectVersion originalVersion = new ProjectVersion(project);
final Args defaultArgs = new Args(this.releaser, project,
projectsAndVersion.projectVersions, originalVersion,
projectsAndVersion.versionFromScRelease, this.properties,
options.interactive, taskType, this.applicationEventPublisher);
projectsAndVersion.versionFromBom, this.properties, options.interactive,
taskType, this.applicationEventPublisher);
log.debug("Processing project [{}] with args [{}]", project, defaultArgs);
this.optionsProcessor.processOptions(options, defaultArgs);
return projectsAndVersion;
@@ -293,12 +330,11 @@ public class SpringReleaser {
final Projects projectVersions;
final ProjectVersion versionFromScRelease;
final ProjectVersion versionFromBom;
ProjectsAndVersion(Projects projectVersions,
ProjectVersion versionFromScRelease) {
ProjectsAndVersion(Projects projectVersions, ProjectVersion versionFromBom) {
this.projectVersions = projectVersions;
this.versionFromScRelease = versionFromScRelease;
this.versionFromBom = versionFromBom;
}
}

View File

@@ -68,8 +68,8 @@ final class Tasks {
}, TaskType.POST_RELEASE);
static Task UPDATE_GUIDES = task("updateGuides", "ug", "UPDATE GUIDES",
"Updating Spring Guides", args -> {
args.releaser.updateSpringGuides(args.versionFromScRelease,
args.projects);
args.releaser.updateSpringGuides(args.versionFromScRelease, args.projects,
args.processedProjects);
}, TaskType.POST_RELEASE);
static Task UPDATE_SAGAN = task("updateSagan", "g", "UPDATE SAGAN",
"Updating Sagan with release info", args -> {

View File

@@ -65,7 +65,6 @@ import org.springframework.cloud.release.internal.sagan.Release;
import org.springframework.cloud.release.internal.sagan.SaganClient;
import org.springframework.cloud.release.internal.sagan.SaganUpdater;
import org.springframework.cloud.release.internal.template.TemplateGenerator;
import org.springframework.cloud.release.internal.versions.VersionsFetcher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.util.FileSystemUtils;
@@ -696,8 +695,7 @@ public class AcceptanceTests {
private Releaser defaultReleaser(String expectedVersion, String projectName,
ReleaserProperties properties) {
ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties);
VersionsFetcher versionsFetcher = new VersionsFetcher(properties, pomUpdater);
ProjectBuilder projectBuilder = new ProjectBuilder(properties, versionsFetcher);
ProjectBuilder projectBuilder = new ProjectBuilder(properties);
TestProjectGitHandler handler = new TestProjectGitHandler(properties,
expectedVersion, projectName);
TemplateGenerator templateGenerator = new TemplateGenerator(properties, handler);
@@ -727,8 +725,7 @@ public class AcceptanceTests {
private Releaser defaultMetaReleaser(ReleaserProperties properties) {
ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties);
VersionsFetcher versionsFetcher = new VersionsFetcher(properties, pomUpdater);
ProjectBuilder projectBuilder = new ProjectBuilder(properties, versionsFetcher);
ProjectBuilder projectBuilder = new ProjectBuilder(properties);
NonAssertingTestProjectGitHandler handler = new NonAssertingTestProjectGitHandler(
properties);
TemplateGenerator templateGenerator = Mockito

View File

@@ -40,6 +40,9 @@ import org.springframework.cloud.release.internal.ReleaserProperties;
import org.springframework.cloud.release.internal.ReleaserPropertiesAware;
import org.springframework.cloud.release.internal.options.Options;
import org.springframework.cloud.release.internal.options.OptionsBuilder;
import org.springframework.cloud.release.internal.pom.ProcessedProject;
import org.springframework.cloud.release.internal.pom.ProjectVersion;
import org.springframework.cloud.release.internal.pom.Projects;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEventPublisher;
@@ -147,7 +150,8 @@ public class SpringReleaserTests {
@Override
Args postReleaseOptionsAgs(Options options,
ProjectsAndVersion projectsAndVersion) {
ProjectsAndVersion projectsAndVersion,
List<ProcessedProject> processedProjects) {
return new Args(TaskType.RELEASE);
}
@@ -159,11 +163,26 @@ public class SpringReleaserTests {
@Override
ProjectsAndVersion processProject(Options options, File project,
TaskType taskType) {
return null;
return new ProjectsAndVersion(sampleProjects(),
new ProjectVersion("spring-cloud-foo", "1.0.0.BUILD-SNAPSHOT"));
}
@Override
ProjectVersion assertNoSnapshotsForANonSnapshotProject(File project,
Projects projectsToUpdate) {
return sampleVersion();
}
};
}
private Projects sampleProjects() {
return new Projects(sampleVersion());
}
private ProjectVersion sampleVersion() {
return new ProjectVersion("spring-cloud-foo", "1.0.0.RELEASE");
}
private ReleaserProperties properties() {
ReleaserProperties properties = new ReleaserProperties();
properties.getMaven().setBuildCommand("build");