You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kw...@apache.org on 2025/08/05 09:41:01 UTC

(maven-release) 01/01: Add "serverId" and "privateKey" SCM parameters

This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch feature/scm-id-parameter
in repository https://gitbox.apache.org/repos/asf/maven-release.git

commit f63dbfca124a755821e0642d443ad01a3a9e0aa4
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Tue Aug 5 11:40:46 2025 +0200

    Add "serverId" and "privateKey" SCM parameters
    
    Separate abstract classes for read and write SCM operation
    
    This closes #1384
---
 ...seMojo.java => AbstractScmReadReleaseMojo.java} | 114 +++++++--------------
 ...o.java => AbstractScmReadWriteReleaseMojo.java} | 105 +------------------
 .../maven/plugins/release/BranchReleaseMojo.java   |   2 +-
 .../maven/plugins/release/PerformReleaseMojo.java  |  58 +----------
 .../maven/plugins/release/PrepareReleaseMojo.java  |   2 +-
 .../maven/plugins/release/RollbackReleaseMojo.java |   2 +-
 6 files changed, 47 insertions(+), 236 deletions(-)

diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReadReleaseMojo.java
similarity index 60%
copy from maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReleaseMojo.java
copy to maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReadReleaseMojo.java
index d70306fd..0d801782 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReadReleaseMojo.java
@@ -18,8 +18,7 @@
  */
 package org.apache.maven.plugins.release;
 
-import javax.inject.Inject;
-
+import java.io.File;
 import java.util.Map;
 
 import org.apache.maven.artifact.ArtifactUtils;
@@ -33,83 +32,41 @@ import org.apache.maven.shared.release.ReleaseManager;
 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 
 /**
- * Abstract Mojo containing SCM parameters
- *
- * @author Robert Scholte
+ * Abstract Mojo containing SCM parameters for read operations.
  */
-// Extra layer since 2.4. Don't use @since doclet, these would be inherited by the subclasses
-public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
-    /**
-     * The SCM username to use.
-     */
-    @Parameter(property = "username")
-    private String username;
-
-    /**
-     * The SCM password to use.
-     */
-    @Parameter(property = "password")
-    private String password;
-
-    /**
-     * The SCM tag to use.
-     */
-    @Parameter(alias = "releaseLabel", property = "tag")
-    private String tag;
-
-    /**
-     * Format to use when generating the tag name if none is specified. Property interpolation is performed on the
-     * tag, but in order to ensure that the interpolation occurs during release, you must use <code>@{...}</code>
-     * to reference the properties rather than <code>${...}</code>. The following properties are available:
-     * <ul>
-     *     <li><code>groupId</code> or <code>project.groupId</code> - The groupId of the root project.
-     *     <li><code>artifactId</code> or <code>project.artifactId</code> - The artifactId of the root project.
-     *     <li><code>version</code> or <code>project.version</code> - The release version of the root project.
-     * </ul>
-     *
-     * @since 2.2.0
-     */
-    @Parameter(defaultValue = "@{project.artifactId}-@{project.version}", property = "tagNameFormat")
-    private String tagNameFormat;
-
-    /**
-     * The tag base directory in SVN, you must define it if you don't use the standard svn layout (trunk/tags/branches).
-     * For example, <code>http://svn.apache.org/repos/asf/maven/plugins/tags</code>. The URL is an SVN URL and does not
-     * include the SCM provider and protocol.
-     */
-    @Parameter(property = "tagBase")
-    private String tagBase;
+public abstract class AbstractScmReadReleaseMojo extends AbstractReleaseMojo {
 
     /**
-     * The message prefix to use for all SCM changes.
-     *
-     * @since 2.0-beta-5
+     * The server id of the server which provides the credentials for the SCM in the <a href="https://maven.apache.org/settings.html">settings.xml</a> file.
+     * If not set the default lookup uses the SCM URL to construct the server id like this:
+     * {@code server-id=scm-host[":"scm-port]}.
+     * <p>
+     * Currently the POM does not allow to specify a server id for the SCM section.
+     * <p>
+     * Explicit authentication information provided via {@link #username}, {@link #password} or {@link #privateKey} will take precedence.
+     * @since 3.2.0
      */
-    @Parameter(defaultValue = "[maven-release-plugin] ", property = "scmCommentPrefix")
-    private String scmCommentPrefix;
+    @Parameter(property = "project.scm.id", defaultValue = "${project.scm.id}")
+    private String serverId;
 
     /**
-     * When cloning a repository if it should be a shallow clone or a full clone.
+     * The username to use for authentication with the SCM.
      */
-    @Parameter(defaultValue = "true", property = "scmShallowClone")
-    private boolean scmShallowClone = true;
+    @Parameter(property = "username")
+    private String username;
 
     /**
-     * Implemented with git will or not push changes to the upstream repository.
-     * <code>true</code> by default to preserve backward compatibility.
-     * @since 2.1
+     * The password to use for authentication with the SCM.
      */
-    @Parameter(defaultValue = "true", property = "pushChanges")
-    private boolean pushChanges = true;
+    @Parameter(property = "password")
+    private String password;
 
     /**
-     * A workItem for SCMs like RTC, TFS etc, that may require additional
-     * information to perform a pushChange operation.
-     *
-     * @since 3.0.0-M5
+     * The path to the SSH private key to use for authentication with the SCM.
+     * @since 3.2.0
      */
-    @Parameter(property = "workItem")
-    private String workItem;
+    @Parameter(property = "privateKey")
+    private File privateKey;
 
     /**
      * Add a new or overwrite the default implementation per provider.
@@ -122,13 +79,18 @@ public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
     @Parameter
     private Map<String, String> providerImplementations;
 
+    /**
+     * When cloning a repository if it should be a shallow clone or a full clone.
+     */
+    @Parameter(defaultValue = "true", property = "scmShallowClone")
+    private boolean scmShallowClone = true;
+
     /**
      * The SCM manager.
      */
     private final ScmManager scmManager;
 
-    @Inject
-    protected AbstractScmReleaseMojo(ReleaseManager releaseManager, ScmManager scmManager) {
+    protected AbstractScmReadReleaseMojo(ReleaseManager releaseManager, ScmManager scmManager) {
         super(releaseManager);
         this.scmManager = scmManager;
     }
@@ -148,17 +110,13 @@ public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
     protected ReleaseDescriptorBuilder createReleaseDescriptor() {
         ReleaseDescriptorBuilder descriptor = super.createReleaseDescriptor();
 
+        if (privateKey != null) {
+            descriptor.setScmPrivateKey(privateKey.getAbsolutePath());
+        }
         descriptor.setScmPassword(password);
-        descriptor.setScmReleaseLabel(tag);
-        descriptor.setScmTagNameFormat(tagNameFormat);
-        descriptor.setScmTagBase(tagBase);
         descriptor.setScmUsername(username);
-        descriptor.setScmCommentPrefix(scmCommentPrefix);
         descriptor.setScmShallowClone(scmShallowClone);
 
-        descriptor.setPushChanges(pushChanges);
-        descriptor.setWorkItem(workItem);
-
         if (project.getScm() != null) {
             if (project.getScm().getDeveloperConnection() != null) {
                 descriptor.setScmSourceUrl(project.getScm().getDeveloperConnection());
@@ -167,11 +125,11 @@ public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
             }
         }
 
-        // As long as Scm.getId() does not exist, read it as a property
-        descriptor.setScmId(project.getProperties().getProperty("project.scm.id"));
+        descriptor.setScmId(serverId);
 
         for (MavenProject reactorProject : session.getProjects()) {
-            if (reactorProject.getScm() != null) {
+            if (reactorProject.getOriginalModel() != null
+                    && reactorProject.getOriginalModel().getScm() != null) {
                 String projectId =
                         ArtifactUtils.versionlessKey(reactorProject.getGroupId(), reactorProject.getArtifactId());
 
diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReadWriteReleaseMojo.java
similarity index 50%
rename from maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReleaseMojo.java
rename to maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReadWriteReleaseMojo.java
index d70306fd..402f14c1 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractScmReadWriteReleaseMojo.java
@@ -20,37 +20,18 @@ package org.apache.maven.plugins.release;
 
 import javax.inject.Inject;
 
-import java.util.Map;
-
-import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.model.Scm;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.project.MavenProject;
 import org.apache.maven.scm.manager.ScmManager;
 import org.apache.maven.shared.release.ReleaseManager;
 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
 
 /**
- * Abstract Mojo containing SCM parameters
+ * Abstract Mojo containing SCM parameters for read/write operations.
  *
  * @author Robert Scholte
  */
 // Extra layer since 2.4. Don't use @since doclet, these would be inherited by the subclasses
-public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
-    /**
-     * The SCM username to use.
-     */
-    @Parameter(property = "username")
-    private String username;
-
-    /**
-     * The SCM password to use.
-     */
-    @Parameter(property = "password")
-    private String password;
-
+public abstract class AbstractScmReadWriteReleaseMojo extends AbstractScmReadReleaseMojo {
     /**
      * The SCM tag to use.
      */
@@ -88,12 +69,6 @@ public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
     @Parameter(defaultValue = "[maven-release-plugin] ", property = "scmCommentPrefix")
     private String scmCommentPrefix;
 
-    /**
-     * When cloning a repository if it should be a shallow clone or a full clone.
-     */
-    @Parameter(defaultValue = "true", property = "scmShallowClone")
-    private boolean scmShallowClone = true;
-
     /**
      * Implemented with git will or not push changes to the upstream repository.
      * <code>true</code> by default to preserve backward compatibility.
@@ -111,94 +86,24 @@ public abstract class AbstractScmReleaseMojo extends AbstractReleaseMojo {
     @Parameter(property = "workItem")
     private String workItem;
 
-    /**
-     * Add a new or overwrite the default implementation per provider.
-     * The key is the scm prefix and the value is the role hint of the
-     * {@link org.apache.maven.scm.provider.ScmProvider}.
-     *
-     * @since 2.0-beta-6
-     * @see ScmManager#setScmProviderImplementation(String, String)
-     */
-    @Parameter
-    private Map<String, String> providerImplementations;
-
-    /**
-     * The SCM manager.
-     */
-    private final ScmManager scmManager;
-
     @Inject
-    protected AbstractScmReleaseMojo(ReleaseManager releaseManager, ScmManager scmManager) {
-        super(releaseManager);
-        this.scmManager = scmManager;
-    }
-
-    @Override
-    public void execute() throws MojoExecutionException, MojoFailureException {
-        if (providerImplementations != null) {
-            for (Map.Entry<String, String> providerEntry : providerImplementations.entrySet()) {
-                getLog().info("Change the default '" + providerEntry.getKey() + "' provider implementation to '"
-                        + providerEntry.getValue() + "'.");
-                scmManager.setScmProviderImplementation(providerEntry.getKey(), providerEntry.getValue());
-            }
-        }
+    protected AbstractScmReadWriteReleaseMojo(ReleaseManager releaseManager, ScmManager scmManager) {
+        super(releaseManager, scmManager);
     }
 
     @Override
     protected ReleaseDescriptorBuilder createReleaseDescriptor() {
         ReleaseDescriptorBuilder descriptor = super.createReleaseDescriptor();
 
-        descriptor.setScmPassword(password);
+        // extend the descriptor with SCM parameter relevant for write operations
         descriptor.setScmReleaseLabel(tag);
         descriptor.setScmTagNameFormat(tagNameFormat);
         descriptor.setScmTagBase(tagBase);
-        descriptor.setScmUsername(username);
         descriptor.setScmCommentPrefix(scmCommentPrefix);
-        descriptor.setScmShallowClone(scmShallowClone);
 
         descriptor.setPushChanges(pushChanges);
         descriptor.setWorkItem(workItem);
 
-        if (project.getScm() != null) {
-            if (project.getScm().getDeveloperConnection() != null) {
-                descriptor.setScmSourceUrl(project.getScm().getDeveloperConnection());
-            } else if (project.getScm().getConnection() != null) {
-                descriptor.setScmSourceUrl(project.getScm().getConnection());
-            }
-        }
-
-        // As long as Scm.getId() does not exist, read it as a property
-        descriptor.setScmId(project.getProperties().getProperty("project.scm.id"));
-
-        for (MavenProject reactorProject : session.getProjects()) {
-            if (reactorProject.getScm() != null) {
-                String projectId =
-                        ArtifactUtils.versionlessKey(reactorProject.getGroupId(), reactorProject.getArtifactId());
-
-                descriptor.addOriginalScmInfo(projectId, buildScm(reactorProject));
-            }
-        }
-
         return descriptor;
     }
-
-    /**
-     * <p>buildScm.</p>
-     *
-     * @param project a {@link org.apache.maven.project.MavenProject} object
-     * @return a {@link org.apache.maven.model.Scm} object
-     */
-    protected Scm buildScm(MavenProject project) {
-        Scm scm;
-        if (project.getOriginalModel().getScm() == null) {
-            scm = null;
-        } else {
-            scm = new Scm();
-            scm.setConnection(project.getOriginalModel().getScm().getConnection());
-            scm.setDeveloperConnection(project.getOriginalModel().getScm().getDeveloperConnection());
-            scm.setTag(project.getOriginalModel().getScm().getTag());
-            scm.setUrl(project.getOriginalModel().getScm().getUrl());
-        }
-        return scm;
-    }
 }
diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java
index 01124b3c..f0af488f 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/BranchReleaseMojo.java
@@ -44,7 +44,7 @@ import org.codehaus.plexus.configuration.PlexusConfiguration;
  * @since 2.0-beta-6
  */
 @Mojo(name = "branch", aggregator = true)
-public class BranchReleaseMojo extends AbstractScmReleaseMojo {
+public class BranchReleaseMojo extends AbstractScmReadWriteReleaseMojo {
     /**
      * The branch name to use.
      *
diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PerformReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PerformReleaseMojo.java
index 9bb00d23..dc4076f8 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PerformReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PerformReleaseMojo.java
@@ -21,7 +21,6 @@ package org.apache.maven.plugins.release;
 import javax.inject.Inject;
 
 import java.io.File;
-import java.util.Map;
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -46,7 +45,7 @@ import org.codehaus.plexus.util.StringUtils;
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  */
 @Mojo(name = "perform", aggregator = true, requiresProject = false)
-public class PerformReleaseMojo extends AbstractReleaseMojo {
+public class PerformReleaseMojo extends AbstractScmReadReleaseMojo {
     /**
      * A space separated list of goals to execute on release perform. Default value is either <code>deploy</code> or
      * <code>deploy site-deploy</code>, if the project has a &lt;distributionManagement&gt;/&lt;site&gt; element.
@@ -87,24 +86,6 @@ public class PerformReleaseMojo extends AbstractReleaseMojo {
     @Parameter(defaultValue = "false", property = "localCheckout")
     private boolean localCheckout;
 
-    /**
-     * The SCM username to use.
-     */
-    @Parameter(property = "username")
-    private String username;
-
-    /**
-     * The SCM password to use.
-     */
-    @Parameter(property = "password")
-    private String password;
-
-    /**
-     * When cloning a repository if it should be a shallow clone or a full clone.
-     */
-    @Parameter(defaultValue = "true", property = "scmShallowClone")
-    private boolean scmShallowClone = true;
-
     /**
      * Whether to use the default release profile (Maven 2 and 3) that adds sources and javadocs to the released
      * artifact, if appropriate. If set to true, the release plugin sets the property "<code>performRelease</code>" to
@@ -124,26 +105,9 @@ public class PerformReleaseMojo extends AbstractReleaseMojo {
     @Parameter(defaultValue = "false", property = "dryRun")
     private boolean dryRun;
 
-    /**
-     * Add a new or overwrite the default implementation per provider.
-     * The key is the scm prefix and the value is the role hint of the
-     * {@link org.apache.maven.scm.provider.ScmProvider}.
-     *
-     * @since 2.5.3
-     * @see ScmManager#setScmProviderImplementation(String, String)
-     */
-    @Parameter
-    private Map<String, String> providerImplementations;
-
-    /**
-     * The SCM manager.
-     */
-    private final ScmManager scmManager;
-
     @Inject
     public PerformReleaseMojo(ReleaseManager releaseManager, ScmManager scmManager) {
-        super(releaseManager);
-        this.scmManager = scmManager;
+        super(releaseManager, scmManager);
     }
 
     @Override
@@ -153,13 +117,7 @@ public class PerformReleaseMojo extends AbstractReleaseMojo {
 
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
-        if (providerImplementations != null) {
-            for (Map.Entry<String, String> providerEntry : providerImplementations.entrySet()) {
-                getLog().info("Change the default '" + providerEntry.getKey() + "' provider implementation to '"
-                        + providerEntry.getValue() + "'.");
-                scmManager.setScmProviderImplementation(providerEntry.getKey(), providerEntry.getValue());
-            }
-        }
+        super.execute();
 
         // goals may be split into multiple lines in configuration.
         // Let's build a single line command
@@ -175,16 +133,6 @@ public class PerformReleaseMojo extends AbstractReleaseMojo {
                 releaseDescriptor.setScmSourceUrl(connectionUrl);
             }
 
-            if (username != null) {
-                releaseDescriptor.setScmUsername(username);
-            }
-
-            if (password != null) {
-                releaseDescriptor.setScmPassword(password);
-            }
-
-            releaseDescriptor.setScmShallowClone(scmShallowClone);
-
             releaseDescriptor.setLocalCheckout(localCheckout);
 
             releaseDescriptor.setCheckoutDirectory(workingDirectory.getAbsolutePath());
diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java
index eef995f6..5e21da6e 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/PrepareReleaseMojo.java
@@ -53,7 +53,7 @@ import org.codehaus.plexus.configuration.PlexusConfiguration;
  */
 // TODO [!] check how this works with version ranges
 @Mojo(name = "prepare", aggregator = true, requiresDependencyCollection = ResolutionScope.TEST)
-public class PrepareReleaseMojo extends AbstractScmReleaseMojo {
+public class PrepareReleaseMojo extends AbstractScmReadWriteReleaseMojo {
 
     /**
      * Resume a previous release attempt from the point where it was stopped.
diff --git a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/RollbackReleaseMojo.java b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/RollbackReleaseMojo.java
index 2eb609f4..8e3586ab 100644
--- a/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/RollbackReleaseMojo.java
+++ b/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/RollbackReleaseMojo.java
@@ -42,7 +42,7 @@ import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
  * @author Edwin Punzalan
  */
 @Mojo(name = "rollback", aggregator = true)
-public class RollbackReleaseMojo extends AbstractScmReleaseMojo {
+public class RollbackReleaseMojo extends AbstractScmReadWriteReleaseMojo {
 
     /**
      * The SCM commit comment when rolling back.