 -----
 Archiva release process
 -----
 -----
 2012-01-19
 -----

~~ 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.

~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/guides/mini/guide-apt-format.html

Archiva release process

 [[1]] Post to the dev list a few days before you plan to do an Archiva release

 [[2]] Recreate the staging repository on archiva-repository.apache.org - make sure that it is not scanned (so that .index* is not created).
       Your maven setting must contains the entry to be able to deploy.

+-------------
   <server>
     <id>archiva-repository.releases</id>
     <username></username>
     <password></password>
   </server>
+-------------

 [[3]] If there are changes in the parent pom, release parent pom – {{https://gitbox.apache.org/repos/asf/archiva-parent.git}}

   * mvn release:prepare (verify that it has been properly tagged)

   * mvn release:perform (verify that it has been deployed correctly in the staging repo)

 [[4]] Update the parent pom version of archiva – {{https://gitbox.apache.org/repos/asf/archiva.git}}

   * change the parent pom version to the archiva-parent version that has just been released

   * commit the changes made

 [[5]] Update the release notes and the site.xml for version changes in archiva-docs

 [[6]] Verify that the webapp-tests are building successfully. \
     Since it is in a separate profile but inside the Archiva source tree, it will not be released but will still be included in the release tag. If some tests are failing, comment it out first so that only the passing tests are executed when the webapp-tests module are built from the tag.

 [[7]] Release archiva.\
    You should have a GPG agent running (preferred), and confirm it works by running "gpg -ab" (type some text and press Ctrl-D).
    If you do not have a GPG agent running, make sure that you have the "apache-release" profile set in your settings.xml as shown below.

+-------------
<profile>
  <id>apache-release</id>
  <properties>
    <gpg.passphrase>[GPG_PASSWORD]</gpg.passphrase>
  </properties>
</profile>
+-------------

    Set your user credentials for the stage repo in the <servers> section of
    your settings.xml for {{archiva-repository.releases}}.

    Prepare your environment:
    For Archiva 2.x you have to use JDK 7 and set memory settings.

+-------------
export JAVA_HOME=<PATH_TO_JDK7>
export PATH=$JAVA_HOME/bin:$PATH
export MAVEN_OPTS="-Xmx6144m -XX:MaxPermSize=512m" # It may work with less heap, but this is a safe value
export JAVA_OPT="-Xmx6144m -XX:MaxPermSize=512m" 
+-------------

    Execute 

+-------------
mvn release:prepare
+-------------
    Check that it has been properly tagged. The tag name must be.. archiva-[VERSION].

    If all works fine, execute 

+-------------
mvn release:perform
+-------------

    The perform task will push to the repository, if it was successful. After successfully running this task,
    it's not possible to roll back.

    Download the uploaded files via wget:

+-------------
ARCHV="2.2.4" # Enter the new archiva version
RELEASE_URL="http://archiva-repository.apache.org/archiva/repository/archiva-releases-stage"
wget ${RELEASE_URL}/org/apache/archiva/archiva-jetty/${ARCHV}/archiva-jetty-${ARCHV}-bin.tar.gz
# Verify the signatures:
gpg -v archiva-jetty-${ARCHV}-bin.zip.asc
+-------------

    The documentation is deployed as part of the process to the final location for review in the vote:

+-------------
git checkout archiva-${ARCHV} # Checkout the release version of archiva
cd archiva-doc
mvn site:site
mvn site:stage  # Check the content in target/staging
cp -r target/staging/* <web-content-git>/docs/${ARCHV}/ # Copy to the git web content repository
+-------------

    If the vote doesn't pass, the documentation will need to be removed from the server for redeployment.

    Commit the sources and binaries from <<<org/apache/archiva/archiva-jetty>>> and <<<org/apache/archiva/archiva>>> to the svn distribution tree.
    First in dev tree: <<<https://dist.apache.org/repos/dist/dev/archiva/>>>

+-------------
svn co https://dist.apache.org/repos/dist/dev/archiva/ archiva-dev-release
cd archiva-dev-release
sh ./release-script-svn.sh $ARCHV ${RELEASE_URL}/

# For parent pom or redback:
POMV=18  # New Parent POM version
sh ./release-script-parent-pom.sh $POMV ${RELEASE_URL}/
REDBV=2.6 # New redback version
sh ./release-script-redback-svn.sh $REDBV ${RELEASE_URL}/
+-------------

  If the vote pass they will be copied to release tree: <<<https://dist.apache.org/repos/dist/release/archiva>>>


  Call for a vote in the dev list and wait for 72 hrs. for the vote results. 3 binding votes are necessary for the release to be finalized.
  If the vote fails or needs to be canceled, the version number should not be re-used if the version was made available for public download.
  After the vote has passed, move the files from dist dev to dist release:

+-------------
svn mv https://dist.apache.org/repos/dist/dev/archiva/${ARCHV} https://dist.apache.org/repos/dist/release/archiva/

# Move also the POM and Redback and Redback Component releases, if there are new ones.
+-------------

  To sync the jars to Maven Central, you need to merge the repository archiva-releases-stage to "Central Rsync Repository"

  Mark the appropriate release version in JIRA as complete.


  Update the archiva site ({{https://gitbox.apache.org/repos/asf/archiva-site.git}}) for the versions and release notes URL:

  Mostly these properties of the pom.xml should be edited:

+-------------
  <archivaReleaseVersion>2.2.4</archivaReleaseVersion>
  <archivaReleaseDate>16th May 2019</archivaReleaseDate>
  <archivaCurrentDevVersion>3.0.0-SNAPSHOT</archivaCurrentDevVersion>
+-------------

  Run <<deploySite.sh>>. The script will prepare the site locally and provide information how to check the content before pushing to the remote repository.

  Once mirroring done (can be 24H): remove previous versions from {{https://dist.apache.org/repos/dist/release/archiva/}}

  Publish the reference docs (sh ./deploySite.sh in the archiva-modules directory) from the release tag.
  You may have to exclude the archiva-webapp module to do this.

  Send out an announcement of the release to:

  * users@archiva.apache.org

  * users@maven.apache.org

  * announce@apache.org

  [] 

  If there are security incidents that should be published after release, please check the Apache information {{http://www.apache.org/security/committers.html}}
  for further actions.


