#63 - Additional guards against snapshots in release train BOM.

We now inspect the BOM pom.xml for references to -SNAPSHOT in declared dependencies. This is to work around the limitation of the Maven Enforcer plugin which only verifies actual project dependencies, not ones declared in a <dependencyManagement /> block.

#63 - Additional guards against snapshots in release train BOM.

We now inspect the BOM pom.xml for references to -SNAPSHOT in declared dependencies. This is to work around the limitation of the Maven Enforcer plugin which only verifies actual project dependencies, not ones declared in a <dependencyManagement /> block.
This commit is contained in:
Oliver Gierke
2017-07-26 19:23:51 +02:00
parent 9f1d846606
commit fec910564d
4 changed files with 27 additions and 4 deletions

View File

@@ -24,11 +24,13 @@ import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
import java.io.File; import java.io.File;
import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.data.release.build.CommandLine.Argument; import org.springframework.data.release.build.CommandLine.Argument;
import org.springframework.data.release.build.CommandLine.Goal; import org.springframework.data.release.build.CommandLine.Goal;
import org.springframework.data.release.build.Pom.Artifact;
import org.springframework.data.release.deployment.DefaultDeploymentInformation; import org.springframework.data.release.deployment.DefaultDeploymentInformation;
import org.springframework.data.release.deployment.DeploymentInformation; import org.springframework.data.release.deployment.DeploymentInformation;
import org.springframework.data.release.deployment.DeploymentProperties; import org.springframework.data.release.deployment.DeploymentProperties;
@@ -138,6 +140,16 @@ class MavenBuildSystem implements BuildSystem {
module.getProject().doWithAdditionalArtifacts( module.getProject().doWithAdditionalArtifacts(
additionalArtifact -> pom.setDependencyManagementVersion(additionalArtifact.getArtifactId(), version)); additionalArtifact -> pom.setDependencyManagementVersion(additionalArtifact.getArtifactId(), version));
} }
if (updateInformation.getPhase().equals(Phase.PREPARE)) {
// Make sure we have no snapshot leftovers
List<Artifact> snapshotDependencies = pom.getSnapshotDependencies();
if (!snapshotDependencies.isEmpty()) {
throw new IllegalStateException(String.format("Found snapshot dependencies %s!", snapshotDependencies));
}
}
}); });
} }
@@ -301,8 +313,8 @@ class MavenBuildSystem implements BuildSystem {
} }
/** /**
* Triggers Maven commands to deploy to Sonatypes OSS Nexus if the given {@link ModuleIteration} refers to a version * Triggers Maven commands to deploy to Sonatype's OSS Nexus if the given {@link ModuleIteration} refers to a version
* that has to be publically released. * that has to be publicly released.
* *
* @param module must not be {@literal null}. * @param module must not be {@literal null}.
*/ */

View File

@@ -24,7 +24,6 @@ import org.apache.maven.shared.invoker.DefaultInvoker;
import org.apache.maven.shared.invoker.InvocationResult; import org.apache.maven.shared.invoker.InvocationResult;
import org.apache.maven.shared.invoker.Invoker; import org.apache.maven.shared.invoker.Invoker;
import org.apache.maven.shared.invoker.MavenInvocationException; import org.apache.maven.shared.invoker.MavenInvocationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.release.io.OsOperations; import org.springframework.data.release.io.OsOperations;
import org.springframework.data.release.io.Workspace; import org.springframework.data.release.io.Workspace;
import org.springframework.data.release.model.Project; import org.springframework.data.release.model.Project;
@@ -52,7 +51,6 @@ class MavenRuntime {
* @param logger must not be {@literal null}. * @param logger must not be {@literal null}.
* @param properties must not be {@literal null}. * @param properties must not be {@literal null}.
*/ */
@Autowired
public MavenRuntime(Workspace workspace, OsOperations os, Logger logger, MavenProperties properties) { public MavenRuntime(Workspace workspace, OsOperations os, Logger logger, MavenProperties properties) {
this.workspace = workspace; this.workspace = workspace;

View File

@@ -15,6 +15,8 @@
*/ */
package org.springframework.data.release.build; package org.springframework.data.release.build;
import java.util.List;
import org.springframework.data.release.model.ArtifactVersion; import org.springframework.data.release.model.ArtifactVersion;
import org.xmlbeam.annotation.XBRead; import org.xmlbeam.annotation.XBRead;
import org.xmlbeam.annotation.XBValue; import org.xmlbeam.annotation.XBValue;
@@ -64,6 +66,9 @@ public interface Pom {
@XBWrite("/project/dependencyManagement/dependencies/dependency[artifactId=\"{0}\"]/version") @XBWrite("/project/dependencyManagement/dependencies/dependency[artifactId=\"{0}\"]/version")
Pom setDependencyManagementVersion(String artifactId, @XBValue ArtifactVersion version); Pom setDependencyManagementVersion(String artifactId, @XBValue ArtifactVersion version);
@XBRead("//dependency[substring(version, string-length(version) - string-length('-SNAPSHOT') + 1) = '-SNAPSHOT']")
List<Artifact> getSnapshotDependencies();
public interface Repository { public interface Repository {
@XBRead("child::id") @XBRead("child::id")

View File

@@ -79,4 +79,12 @@ public class MavenIntegrationTests extends AbstractIntegrationTests {
maven.updateProjectDescriptors(build, information); maven.updateProjectDescriptors(build, information);
maven.prepareVersion(build, Phase.PREPARE); maven.prepareVersion(build, Phase.PREPARE);
} }
@Test
public void findsSnapshotDependencies() throws Exception {
Pom pom = projection.io().file(workspace.getFile("bom/pom.xml", Projects.BUILD)).read(Pom.class);
System.out.println(pom.getSnapshotDependencies());
}
} }