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

How to prepare a release
========================

This is a guide for the release preparing process in SINGA.

Select a release manager
------------------------

The release manager (RM) is the coordinator for the release process. It is the RM's signature (.asc) that is uploaded together with the release. The RM generates KEY (RSA 4096-bit) and uploads it to a public key server. The RM needs to get his key endorsed (signed) by other Apache user, to be connected to the web of trust. http://www.apache.org/dev/release-signing.html
 
Check:
        + The codebase does not include third-party code which is not compatible to APL
        + The dependencies are compatible with APL. GNU-like licenses are NOT compatible
        + All source files written by us MUST include the Apache license header: http://www.apache.org/legal/src-headers.html. There's a script in there which helps propagating the header to all files.
        + The build process is error-free. 
        + Unit tests are included (as much as possible)
        + The Jupyter notebooks are working with the new release
        + The online documentation on the Apache website is up to date. 
        
Prepare LICENSE file
--------------------

copy and paste this http://apache.org/licenses/LICENSE-2.0.txt

Prepare NOTICE file
-------------------

        + Use this template: http://apache.org/legal/src-headers.html#notice
        + If we include any third party code  in the release package which is not APL, must state it at the end of the NOTICE file.
        + Example: http://apache.org/licenses/example-NOTICE.txt

Prepare RELEASE_NOTES file
--------------------------

        + Introduction, Features, Bugs (link to JIRA), Changes (N/A for first erlease), Dependency list, Incompatibility issues.
        + Follow this example:  http://commons.apache.org/proper/commons-digester/commons-digester-3.0/RELEASE-NOTES.txt

Prepare README file
-------------------
        + How to build, run test, run examples
        + List of dependencies.
        + Mail list, website, etc. Any information useful for user to start.

Package the release
-------------------

The release should be packaged into : apache-singa-xx.xx.xx.tar.gz
         + src/
         + README
         + LICENSE
         + NOTICE
         + RELEASE_NOTES
         + ...

Upload the release
-------------------

The release is uploaded to the RM’s Apache page: people.apache.org/~ID/...
        + apache-singa-xx.xx.xx.tar.gz
        + KEY
        + XX.acs
        + XX.md5

Roll out artifacts to mirrors 
-----------------------------

svn add to “dist/release/singa”

Delete old artifacts (automatically archived)

Update the Download page
------------------------

The tar.gz file MUST be downloaded from mirror, using closer.cgi script
other artifacts MUST be downloaded from main Apache site
Good idea to update EC2 image and make it available for download as well

Make the internal announcements
-------------------------------

Template for singa-dev@ voting:

To: dev@singa.apache.org
Subject: [VOTE] Release apache-singa-X.Y.Z (release candidate N)

Hi all,

I have created a build for Apache SINGA X.Y.Z, release candidate N.

The artifacts to be voted on are located here:
https://dist.apache.org/repos/dist/dev/singa/apache-singa-X.Y.Z-rcN/

The hashes of the artifacts are as follows:
apache-singa-X.Y.Z.tar.gz.md5 XXXX
apache-singa-X.Y.Z.tar.gz.sha256 XXXX

Release artifacts are signed with the following key:
https://people.apache.org/keys/committer/{Apache ID of the Release Manager}.asc

and the signature file is:
apache-singa-X.Y.Z.tar.gz.asc

Please vote on releasing this package. The vote is open for at least 72 hours and passes if a majority of at least three +1 votes are cast.

[ ] +1 Release this package as Apache SINGA X.Y.Z
[ ]  0 I don't feel strongly about it, but I'm okay with the release
[ ] -1 Do not release this package because...

Here is my vote:

+1 

{SINGA Team Member Name} 

Wait at least 48 hours for test responses

Any PMC, committer or contributor can test features for releasing, and feedback. Based on that, PMC will decide whether start a vote.

Call a vote in dev
------------------

Call a vote in dev@singa.apache.org

Vote Check
----------

All PMC members and committers should check these before vote +1 :

Vote result mail
----------------

Template for singa-dev@ voting (results):


Subject: [RESULT] [VOTE] Release apache-singa-X.Y.Z (release candidate N)
To: dev@singa.apache.org

Thanks to everyone who has voted and given their comments. The tally is as follows.

N binding +1s:
<names>

N non-binding +1s:
<names>

No 0s or -1s.

I am delighted to announce that the proposal to release
Apache SINGA X.Y.Z has passed.

I'll now start a vote on the general list. Those of you in the IPMC, please recast your vote on the new thread.

{SINGA Team Member Name} 

Template for general@ voting - results

Publish release
---------------

Template for ANNOUNCING the release

To: announce@apache.org, dev@singa.apache.org
Subject: [ANNOUNCE] Apache SINGA X.Y.Z released

We are pleased to announce that SINGA X.Y.Z is released. 

SINGA is a general distributed deep learning platform for training big deep learning models over large datasets. It is designed with an intuitive programming model based on the layer abstraction. SINGA supports a wide variety of popular deep learning models.

The release is available at:
http://singa.apache.org/downloads.html

The main features of this release include XXX

We look forward to hearing your feedbacks, suggestions, and contributions to the project. 

On behalf of the SINGA team, 
{SINGA Team Member Name} 