Author: nicolas Date: Wed May 7 08:14:36 2008 New Revision: 654145 URL: http://svn.apache.org/viewvc?rev=654145&view=rev Log: MRELEASE-341 : new release:stage mojo to deploy to a staging repository, and still support release:rollback
Added: maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java (with props) maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java (with props) maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/ maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml (with props) Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java maven/release/trunk/maven-release-plugin/src/site/apt/usage.apt Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java?rev=654145&r1=654144&r2=654145&view=diff ============================================================================== --- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java (original) +++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java Wed May 7 08:14:36 2008 @@ -257,14 +257,27 @@ public void perform( ReleaseDescriptor releaseDescriptor, Settings settings, List reactorProjects ) throws ReleaseExecutionException, ReleaseFailureException { - perform( releaseDescriptor, settings, reactorProjects, null ); + perform( releaseDescriptor, settings, reactorProjects, null, true ); + } + + public void perform( ReleaseDescriptor releaseDescriptor, Settings settings, List reactorProjects, boolean clean ) + throws ReleaseExecutionException, ReleaseFailureException + { + perform( releaseDescriptor, settings, reactorProjects, null, false ); } public void perform( ReleaseDescriptor releaseDescriptor, Settings settings, List reactorProjects, ReleaseManagerListener listener ) throws ReleaseExecutionException, ReleaseFailureException { - perform( releaseDescriptor, settings, reactorProjects, listener, new ReleaseResult() ); + perform( releaseDescriptor, settings, reactorProjects, listener, true ); + } + + public void perform( ReleaseDescriptor releaseDescriptor, Settings settings, List reactorProjects, + ReleaseManagerListener listener, boolean clean ) + throws ReleaseExecutionException, ReleaseFailureException + { + perform( releaseDescriptor, settings, reactorProjects, listener, new ReleaseResult(), clean ); } public ReleaseResult performWithResult( ReleaseDescriptor releaseDescriptor, Settings settings, @@ -276,7 +289,7 @@ { result.setStartTime( System.currentTimeMillis() ); - perform( releaseDescriptor, settings, reactorProjects, listener, result ); + perform( releaseDescriptor, settings, reactorProjects, listener, result, true ); result.setResultCode( ReleaseResult.SUCCESS ); } @@ -297,7 +310,7 @@ } private void perform( ReleaseDescriptor releaseDescriptor, Settings settings, List reactorProjects, - ReleaseManagerListener listener, ReleaseResult result ) + ReleaseManagerListener listener, ReleaseResult result, boolean clean ) throws ReleaseExecutionException, ReleaseFailureException { updateListener( listener, "perform", GOAL_START ); @@ -320,8 +333,11 @@ updateListener( listener, name, PHASE_END ); } - //call release:clean so that resume will not be possible anymore after a perform - clean( releaseDescriptor, listener, reactorProjects ); + if ( clean ) + { + // call release:clean so that resume will not be possible anymore after a perform + clean( releaseDescriptor, listener, reactorProjects ); + } updateListener( listener, "perform", GOAL_END ); } Modified: maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java?rev=654145&r1=654144&r2=654145&view=diff ============================================================================== --- maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java (original) +++ maven/release/trunk/maven-release-manager/src/main/java/org/apache/maven/shared/release/ReleaseManager.java Wed May 7 08:14:36 2008 @@ -111,6 +111,20 @@ ReleaseResult performWithResult( ReleaseDescriptor releaseDescriptor, Settings settings, List reactorProjects, ReleaseManagerListener listener ); + + /** + * Perform a release, and optionnaly cleanup. + * + * @param releaseDescriptor the configuration to use for release + * @param settings the settings.xml configuration + * @param reactorProjects the reactor projects + * @param clean flag to clean the release after perform + * @throws ReleaseExecutionException if there is a problem performing the release + * @throws ReleaseFailureException if there is a problem performing the release + */ + void perform( ReleaseDescriptor releaseDescriptor, Settings settings, List reactorProjects, boolean clean ) + throws ReleaseExecutionException, ReleaseFailureException; + /** * Clean a release. * Modified: maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java?rev=654145&r1=654144&r2=654145&view=diff ============================================================================== --- maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java (original) +++ maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/AbstractReleaseMojo.java Wed May 7 08:14:36 2008 @@ -105,8 +105,8 @@ * @parameter expression="${arguments}" alias="prepareVerifyArgs" */ private String arguments; - - + + /** * The file name of the POM to execute any goals against. * @@ -173,7 +173,7 @@ descriptor.setWorkingDirectory( basedir.getAbsolutePath() ); descriptor.setPomFileName( pomFileName ); - + List profiles = project.getActiveProfiles(); String arguments = this.arguments; @@ -213,14 +213,14 @@ return descriptor; } - + /** * @return additional profiles to enable during release */ protected String getAdditionalProfiles() { return null; - } + } void setReleaseManager( ReleaseManager releaseManager ) { @@ -241,4 +241,20 @@ { return reactorProjects; } + + /** + * Add additional arguments + * @param argument + */ + protected void addArgument( String argument ) + { + if (this.arguments != null) + { + this.arguments += " " + argument; + } + else + { + this.arguments = argument; + } + } } Added: maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java?rev=654145&view=auto ============================================================================== --- maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java (added) +++ maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java Wed May 7 08:14:36 2008 @@ -0,0 +1,154 @@ +package org.apache.maven.plugins.release; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.shared.release.ReleaseExecutionException; +import org.apache.maven.shared.release.ReleaseFailureException; +import org.apache.maven.shared.release.config.ReleaseDescriptor; + +import org.codehaus.plexus.util.StringUtils; + +import java.io.File; + +/** + * Perform a release from SCM to a staging repository. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Nicolas De Loof</a> + * @aggregator + * @requiresProject false + * @goal stage + */ +public class StageReleaseMojo + extends AbstractReleaseMojo +{ + /** + * A comma or space separated list of goals to execute on deployment. + * + * Default value is either <code>deploy</code> or + * <code>deploy site-deploy</code>, if the project has a + * <distributionManagement>/<site> element. + * + * @parameter expression="${goals}" + */ + private String goals; + + /** + * Comma separated profiles to enable on deployment, in addition to active profiles + * for project execution. + * + * @parameter + */ + private String releaseProfiles; + + /** + * The checkout directory. + * + * @parameter default-value="${project.build.directory}/checkout" + * @required + */ + private File workingDirectory; + + /** + * The SCM URL to checkout from. If omitted, the one from the + * <code>release.properties</code> file is used, followed by the URL + * from the current POM. + * + * @parameter expression="${connectionUrl}" + */ + private String connectionUrl; + + /** + * Whether to use the release profile that adds sources and javadocs to the + * released artifact, if appropriate. + * + * @parameter expression="${useReleaseProfile}" default-value="true" + */ + private boolean useReleaseProfile; + + + /** + * URL of the staging repository to use. + * + * @parameter expression="${stagingRepository}" + * @required + */ + private String stagingRepository; + + protected String getAdditionalProfiles() + { + return releaseProfiles; + } + + public void execute() + throws MojoExecutionException, MojoFailureException + { + super.execute(); + + // goals may be splitted into multiple line in configuration. + // Let's build a single line command + if ( goals != null ) + { + goals = StringUtils.join( StringUtils.split( goals ), " " ); + } + + try + { + addArgument( "-DaltDeploymentRepository=\"" + stagingRepository + "\"" ); + + // Note that the working directory here is not the same as in the release configuration, so don't reuse that + ReleaseDescriptor releaseDescriptor = createReleaseDescriptor(); + if ( connectionUrl != null ) + { + releaseDescriptor.setScmSourceUrl( connectionUrl ); + } + + releaseDescriptor.setCheckoutDirectory( workingDirectory.getAbsolutePath() ); + releaseDescriptor.setUseReleaseProfile( useReleaseProfile ); + + if ( goals == null ) + { + // set default + goals = "deploy"; + if ( project.getDistributionManagement() != null && + project.getDistributionManagement().getSite() != null ) + { + goals += " site:stage-deploy"; + } + } + + goals = StringUtils.replace( goals, "site-deploy", "site:stage-deploy" ); + goals = StringUtils.replace( goals, "site:deploy", "site:stage-deploy" ); + + releaseDescriptor.setPerformGoals( goals ); + + releaseManager.perform( releaseDescriptor, settings, reactorProjects, false ); + } + catch ( ReleaseExecutionException e ) + { + throw new MojoExecutionException( e.getMessage(), e ); + } + catch ( ReleaseFailureException e ) + { + throw new MojoFailureException( e.getMessage() ); + } + } +} Propchange: maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: maven/release/trunk/maven-release-plugin/src/main/java/org/apache/maven/plugins/release/StageReleaseMojo.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: maven/release/trunk/maven-release-plugin/src/site/apt/usage.apt URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/site/apt/usage.apt?rev=654145&r1=654144&r2=654145&view=diff ============================================================================== --- maven/release/trunk/maven-release-plugin/src/site/apt/usage.apt (original) +++ maven/release/trunk/maven-release-plugin/src/site/apt/usage.apt Wed May 7 08:14:36 2008 @@ -92,3 +92,22 @@ ------ mvn --batch-mode release:prepare ------ + +* Use a staging repository + + Sometimes it is desirable to deploy a pre-release to be approved before made publicly available. One option is to + create release candidates versions using the <<<release:perform>>> goal, but the final deployed artifact will NOT + be the exact one that has been approved as RCx. + + A common solution is to use a staging repository, where a test-version is deployed with it's documentation for + review. If all is fine, it is then copied to the public repository. Using this strategy, the artifact that has + been tested IS the one that is deployed. + + The <<<release:stage>>> goal uses this strategy. It replaces the <<<release:perform>>> goal and does the same + tasks, but requires a <<<stagingRepository>>> parameter. It will automatically re-configure the deploy and + site-deploy goals to use the staging strategy. + + After the release is complete, the <<<release.properties>>> and other release files will NOT be removed, so that + you can still execute a <<<release:rollback>>> if something wrong has been detected and a new candidate must + be created after some fixes. You just need to use a distinct tag in SCM, or rename the one that has been created + if the SCM provider supports renaming tag. Added: maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java?rev=654145&view=auto ============================================================================== --- maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java (added) +++ maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java Wed May 7 08:14:36 2008 @@ -0,0 +1,98 @@ +package org.apache.maven.plugins.release; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.model.DistributionManagement; +import org.apache.maven.model.Profile; +import org.apache.maven.model.Site; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugin.testing.AbstractMojoTestCase; +import org.apache.maven.project.MavenProject; +import org.apache.maven.settings.Settings; +import org.apache.maven.shared.release.ReleaseExecutionException; +import org.apache.maven.shared.release.ReleaseFailureException; +import org.apache.maven.shared.release.ReleaseManager; +import org.apache.maven.shared.release.config.ReleaseDescriptor; +import org.jmock.Mock; +import org.jmock.core.Constraint; +import org.jmock.core.constraint.IsEqual; +import org.jmock.core.constraint.IsNull; +import org.jmock.core.matcher.InvokeOnceMatcher; +import org.jmock.core.stub.ThrowStub; + +import java.io.File; +import java.util.Arrays; + +/** + * Test release:perform. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Brett Porter</a> + */ +public class StageReleaseMojoTest + extends AbstractMojoTestCase +{ + private File workingDirectory; + + public void testStage() + throws Exception + { + StageReleaseMojo mojo = getMojoWithProjectSite( "stage.xml" ); + + ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor(); + releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() ); + File checkoutDirectory = getTestFile( "target/checkout" ); + releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() ); + releaseDescriptor.setPerformGoals( "deploy site:stage-deploy" ); + releaseDescriptor.setAdditionalArguments( "-DaltDeploymentRepository=\"staging\"" ); + Settings settings = mojo.getSettings(); + + Mock mock = new Mock( ReleaseManager.class ); + Constraint[] constraints = + new Constraint[]{new IsEqual( releaseDescriptor ), new IsEqual( settings ), new IsNull(), new IsEqual( Boolean.FALSE ) }; + mock.expects( new InvokeOnceMatcher() ).method( "perform" ).with( constraints ); + mojo.setReleaseManager( (ReleaseManager) mock.proxy() ); + + mojo.execute(); + + assertTrue( true ); + } + + private StageReleaseMojo getMojoWithProjectSite( String fileName ) + throws Exception + { + StageReleaseMojo mojo = (StageReleaseMojo) lookupMojo( "stage", new File( workingDirectory, fileName ) ); + mojo.setBasedir( workingDirectory ); + + MavenProject project = (MavenProject) getVariableValueFromObject( mojo, "project" ); + DistributionManagement distributionManagement = new DistributionManagement(); + distributionManagement.setSite( new Site() ); + project.setDistributionManagement( distributionManagement ); + + return mojo; + } + + protected void setUp() + throws Exception + { + super.setUp(); + workingDirectory = getTestFile( "target/test-classes/mojos/stage" ); + } +} Propchange: maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: maven/release/trunk/maven-release-plugin/src/test/java/org/apache/maven/plugins/release/StageReleaseMojoTest.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml URL: http://svn.apache.org/viewvc/maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml?rev=654145&view=auto ============================================================================== --- maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml (added) +++ maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml Wed May 7 08:14:36 2008 @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> + +<project> + <build> + <plugins> + <plugin> + <artifactId>maven-release-plugin</artifactId> + <configuration> + <settings implementation="org.apache.maven.settings.Settings"/> + <project implementation="org.apache.maven.plugins.release.stubs.MavenProjectStub"/> + <workingDirectory>${basedir}/target/checkout</workingDirectory> + <stagingRepository>staging</stagingRepository> + <goals>deploy site-deploy</goals> + <useReleaseProfile>true</useReleaseProfile> + </configuration> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file Propchange: maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: maven/release/trunk/maven-release-plugin/src/test/resources/mojos/stage/stage.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml