 -----
 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" 
+-------------

    Execut mvn release:prepare (check that it has been properly tagged. the
    tag name must be.. archiva-[VERSION]).

    Next, execute mvn release:perform

    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.


