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


             ==============================
                   XMLBeans Release Guide
             ==============================


(I) Prerequisites

   1. You should read the <a href="https://www.apache.org/dev/release.html">Apache Release FAQ</a>
   2a. You must have shell access to people.apache.org; and you should
       have key-based authentication set up
       1. Generate ssh key with ssh-keygen -t rsa -b 4096
       (e.g. <a href="http://www.linuxproblem.org/art_9.html">how to</a>.)
       2. Add contents of id_rsa.pub to SSH Key (authorized_keys) line on https://id.apache.org/
       3. ssh -v username@people.apache.org
          Verify authenticity of host: https://www.apache.org/dev/machines
       4. Only sftp access is necessary
   2b. You must be a member of the committee group
   3. Release manager must have their public key appended to the KEYS file checked in to SVN and the key published on one of the public key servers.
      More info can be found here: <a href="https://www.apache.org/dev/release-signing.html">https://www.apache.org/dev/release-signing.html</a>
   4. You must have Java JDK 8 installed and active.
   5. You must have the following utilities installed on your local machine and available in your path:
          * <a href="www.openssh.com">ssh</a>
          * <a href="www.gnupg.org">gnupg</a>
          * <a href="www.openssl.org">openssl</a>
      For Windows users, install Cygwin and make sure you have the above utilities
   6a. The POI build system requires two components to perform a build
          * <a href="https://ant.apache.org">Ant</a> 1.9.x or higher
          * <a href="https://forrest.apache.org/">Forrest</a> 0.90.
      Make sure ANT_HOME and FORREST_HOME are set.

   6b. Ensure you can log in to https://repository.apache.org/ with your Apache
        credentials, and that you can see the "Staging Repositories" area on
        the left hand side.

   6c. It's a good idea to check at 
       https://builds.apache.org/view/P/view/POI/job/POI-XMLBeans-DSL-1.8/
       that Jenkins is in a good state (i.e. most recent build passed
       and is up to date with SVN). You probably also want to e-mail
       the dev list with a note to say you're building a release.

   7. Before building, you should run the "rat-check" build task, which
      uses <a href="https://incubator.apache.org/rat/">Apache Rat</a>
      to check the source tree for files lacking license headers. Files
      without headers should be either fixed, or added to the exclude list

   8. Check file permissions are correct in SVN.
      There can be  files in the SVN tree marked executable (have the
      svn:executable property set), but which should not be. Checking them
      out will cause the executable bit to be set for them on filesystems
      which support it. The flag can be removed in batch using

{code:sh}
svn pd 'svn:executable' $(find -name .svn -prune -or -type f ! -name \*.sh \
 -print0 | xargs -0 svn pg 'svn:executable' | cut -d ' ' -f 1)
{code}

   9. Before building, review any new or updated dependencies to ensure that
      if they required LICENSE or NOTICE updates then these were done.

  10. Ensure that CHANGES.txt is up to date

  11. Ensure that the KEYS files in the dist areas are up-to-date with the
      latest ones in POI svn:
      https://dist.apache.org/repos/dist/dev/poi/KEYS
      https://dist.apache.org/repos/dist/release/poi/KEYS
      Dist is a regular svn repo that can be checked out and committed to.
      To upload to dist: https://www.apache.org/dev/release-distribution


(II) Making release artifacts

  1. Grab the output from a successful Jenkins build for the desired revision:
     https://builds.apache.org/view/P/view/POI/job/POI-XMLBeans-DSL-1.8/lastBuild/artifact/build/
     - xmlbeans-VERSION.jar
     - xmlbeans-VERSION-javadoc.jar
     - xmlbeans-VERSION-sources.jar
     - xmlbeans-bin-VERSION-DATE.zip
     - xmlbeans-bin-VERSION-DATE.tgz
     - xmlbeans-src-VERSION-DATE.zip
     - xmlbeans-src-VERSION-DATE.tgz

  2. Grab the current deployed POM, and edit the version # and anything else that has changed:
     https://repository.apache.org/service/local/repo_groups/public/content/org/apache/xmlbeans/xmlbeans/VERSION/xmlbeans-VERSION.pom

  3. Sign the jars, zip, tgz, and pom with your key (gpg doesn't sign via --multifile yet):
     for f in *.jar *.zip *.tgz *.pom; do gpg --default-key 1556F3A4 -ab $f; done

  4. Build the nexus bundle.jar to upload to 
     repository.apache.org:
     jar -cvf bundle.jar *.pom *.pom.asc *.jar *.jar.asc

  5. Upload the bundle to https://repository.apache.org/

  6. Generate checksums (sha256sum, sha512sum) for the *.zip and *.tgz files

     for f in *.zip *.tgz
     do 
         for b in 256 512
         do 
             sha${b}sum $f > $f.sha$b
         done
     done

  7. Commit the *.tgz and *.zip files, their signatures, and sha256 and sha512
     checksums to the release candidate repo at
     https://dist.apache.org/repos/dist/dev/poi/xmlbeans/


 (III) Calling the vote:

   1. The release manager should call the vote
   2. Include the URL of the release artifacts
   3. Include the time for the vote to run (3 day minimum, can be longer)
   4. Provide guidance on what needs to be checked
   5. Complete a tally, and send a result once the time has passed

 (IV) After the vote:

Deploy the artifacts from the staging area (https://dist.apache.org/repos/dist/dev/poi/xmlbeans)
to the release area of the dist repo:
    https://dist.apache.org/repos/dist/release/poi/xmlbeans/release/

Perform a sparse checkout of the dist repo to move artifacts in the staging area to the release area
In the following example, replace FIXME3.0.2 or FIXME3.1.0 with the version you are releasing

{code:sh}
svn checkout https://dist.apache.org/repos/dist/ --depth immediates
svn update --set-depth immediates dist/dev/poi/
svn update --set-depth infinity   dist/dev/poi/xmlbeans/
svn update --set-depth infinity   dist/release/poi/xmlbeans/
svn rm dist/release/poi/xmlbeans/release/src/* dist/release/poi/xmlbeans/release/bin/*
svn mv dist/dev/poi/xmlbeans/src/* dist/release/poi/xmlbeans/release/src/
svn mv dist/dev/poi/xmlbeans/bin/* dist/release/poi/xmlbeans/release/bin/
svn mv dist/release/poi/xmlbeans/release/dev/RELEASE-NOTES-FIXME3.0.2.txt dist/release/poi/xmlbeans/dev/
# non-SVN copy to create a new artifact with its own history
cp dist/release/poi/xmlbeans/dev/RELEASE-NOTES-FIXME3.0.2.txt dist/release/poi/xmlbeans/release/dev/RELEASE-NOTES-FIXME3.1.0.txt
# edit the RELEASE-NOTES file to reflect the current version
svn add dist/release/poi/xmlbeans/release/dev/RELEASE-NOTES-FIXME3.1.0.txt
svn ci dist/ -m "deploy FIXME3.1.0 release artifacts from staging area"
{code}


You should get an email from the Apache Reporter Service (no-reply@reporter.apache.org)
at your Apache email address.
The email instructions will ask you to log on to https://reporter.apache.org/addrelease.html?poi
and add your release data (version and date) to the database.

Log into https://repository.apache.org/ and go to the "Staging Repositories" area.
Find the "orgapachexmlbeans" entry, check it has the right content, then Close the repository
Select all artifacts and Release (and Automatically Drop) them.
Refresh to verify that the artifacts are no longer in the Staging Repositories area.

2. Wait for the distributions to appear on your favourite mirror (anywhere from 3-24 hours)
  https://www.apache.org/dyn/closer.lua/xmlbeans/dev/

3. Wait for the maven artifacts to appear on Maven Central, and ensure they work:
  Maven Central: https://search.maven.org/#search|ga|1|g%3A%22org.apache.xmlbeans%22

4. Edit the website homepage and list the new release there.
   https://xmlbeans.apache.org/index.html
   https://xmlbeans.apache.org/changes.html
   remove older releases.

5. Edit the website, in particular the download page, listing the new release there. 
   This should reference the checksums, so take care when updating

   site/src/documentation/content/xdocs/index.xml
   site/src/documentation/content/xdocs/news.xml
   site/src/documentation/content/xdocs/site.xml
   site/src/documentation/content/xdocs/status.xml
   site/src/documentation/content/xdocs/download/index.xml
   
6. Build site using a recent version of Java 1.8
   Generating with Forrest may result in line ending changes, making change diffs
   hard to read.  That may be fixed eventually, but for now dos2linux and linux2dos
   are your friend to minimize these.
   
   Or, you can follow this process to only replace generated files where you know
   the source changed:
   
   forrest run
   * inspect the generated changed pages in a local browser
   * save the generated HTML, replacing originals in the site/build/ directory
   * compare new HTML with SVN source, and pass files through dos2unix or unix2dos as needed
   ** some files generate with line endings different than stored in SVN, making diffs annoying
   
6a.Commit the site changes to svn, and publish live

7. Don't forget to upload the latest version of the site and javadocs

8. Send announcements:
From: your @apache.org e-mail address
To: user@poi.apache.org, dev@poi.apache.org, general@poi.apache.org, and announce@apache.org
Subject: [ANNOUNCE] Apache XMLBeans FIXME3.1.0 released
Body: 
"""
The Apache POI PMC is pleased to announce the release of Apache XMLBeans FIXME3.1.0.

Apache XMLBeans is a technology for accessing XML by binding it to Java types.

For detailed changes in this release, refer to the release notes [1] and the changelog [2].

Thank you to all our contributors for making this release possible.

On behalf of the Apache POI PMC,
Your Name

[1] Release notes: https://www.apache.org/dyn/closer.lua/poi/xmlbeans/release/dev/RELEASE-NOTES-FIXME3.1.0.txt
[2] Changelog: https://xmlbeans.apache.org/status.html#rel_FIXME310
"""

Note, announcements should be sent from your @apache.org e-mail address.

9. Add the version to the DOAP file too
  https://svn.apache.org/repos/asf/xmlbeans/trunk/xkit/doap_XMLBeans.rdf

11. Delete directory that held RC, if any.
