//Licensed 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.
= Release Management
Apache Incubator PMC
2002-10-16
:jbake-type: guide
:jbake-status: published
:idprefix:
:toc:
:imagesdir: ../images/
:plusone: +1

== What goes into an ASF release

One of the goals of incubation is to teach podling communities how to
build ASF-compliant releases.  As part of the learning process, the podling community needs to be
fully engaged in the review process.  A podling community should begin to familiarize themselves
with the ASF policies for releases.  Those policies can be found at
link:http://www.apache.org/dev/#releases[http://www.apache.org/dev/#releases].

Releases are always produced by an Apache PMC, and for podlings, this PMC is the IPMC.  This is
why it is mandatory to have at least 3 {plusone} votes from
link:/incubation/roles_and_responsibilities.html#incubator_project_management_committee_ipmc[IPMC members].
Usually, your link:/incubation/roles_and_responsibilities.html#mentor[mentors] (who are also IPMC members) will 
vote on your releases, but if needed, other IPMC members will as well.  IPMC members will check for
compliance with the ASF policies and with link:/incubation/Incubation_Policy.html#Releases[Incubator policies].

Anybody reviewing your releases will explain what they checked and what they found.  They will also
rate the severity of any issues.  Some issues may be blockers.
Others issues may be resolved in later releases.  Those voting on the release will base their votes
on this information.

If you do not understand the feedback you receive, or if you believe that it is misguided,
please say so! We are all learning, and discussion is an important part of open source development.

== Requesting feedback on interim non-ASF releases

When existing active communities enter the ASF via incubation, they may already have an established
release rhythm.  It may not be possible to conform to ASF release policies quickly enough to
maintain that release rhythm.  We want to welcome projects with active communities.  To smooth this process,
projects may need to make a few non-ASF releases after incubation begins.

A non-ASF release may or may not be staged on ASF infrastructure for a vote, but it
is distributed via non-ASF infrastructure, *and* is either not linked from a podling's website, or is
linked but clearly marked as a non-ASF release.

Podlings can use non-ASF releases as an opportunity to find ASF policy violations and begin
resolving them.  Podlings can request feedback by starting a "[DISCUSS]" thread on general@incubator.apache.org.
Podlings can decide whether they prefer a "[DISCUSS]" thread or a "[VOTE]" thread.  Only a
release which passes a vote by members of the IPMC is an official ASF release.

Discussion should give podlings feedback on what they would need to do to
bring their release in line with the requirements of an official ASF
release.  Podlings will be responsible for capturing feedback in work items for
their project.  Feedback provided in a discussion thread will not block a non-ASF release.
But the ASF will not take on legal liability for these releases.  A podling will need to
successfully make several ASF releases before it can graduate from the incubator.

Asking for feedback for non-ASF releases is not obligatory.  It is one of the
services that the Apache Incubator offers our podling communities.

== Podling Constraints

The link:/incubation/Incubation_Policy.html#Releases[Incubator policies] applys two additional constraints 
to podlings for their releases.  They are repeated here for clarity only.
- Release artifacts must include #incubating# in the final file name
- Release artifacts must include one of two link:/guides/branding.html#disclaimers[disclaimers]

For a podling to receive full permission from the IPMC to execute the release, the release
vote must be held on the link:/guides/lists.html#general+at+incubator.apache.org[incubator general list]
and pass based on the link:http://apache.org/foundation/voting.html#ReleaseVotes[standard Package Release voting rules].
Only Incubator PMC votes are binding, but everyone is encouraged to vote.

The Incubator PMC expects the source releases to be staged on
#https://dist.apache.org/repos/dist/dev/incubator/$podlingName# so that they can easily be moved
to the release location via #svn mv#.

== Choice of Disclaimers

When making a release, a podling has a choice of using one of two link:/policy/incubation.html#disclaimers[disclaimers],
the standard disclaimer or the work in progress disclaimer.

If it is your first release, it is recommended that you use the work in progress DISCLAIMER. This disclaimer
allows you to list any non-compliance with ASF policy and IPMC members are still be able to give your release
a {plusone} vote. Think of it as training wheels for your release.

Here is a minimal set of requirements, when using the work in progress disclaimer, a podlings release must abide by:

* Include the word incubating in the release file name.
* Include an ASF LICENSE and NOTICE file.
* Have valid checksums or signatures.
* Be placed in the correct place on the ASF's infrastructure.
* Have a KEYS file to validate the release.

Other issues, such as:

* Missing ASF headers.
* Missing license information.
* Included unexpected binary code.
* Including code of unknown origin.

Will be allowed if the issue is listed in the disclaimer or added to the disclaimer shortly after the release is made.

Any releases using the work in progress disclaimer must still be legal and follow the terms of any 3rd party licenses,
even if they are not compatible with the Apache license. 

Please carefully read this link:https://issues.apache.org/jira/browse/LEGAL-469[Legal JIRA] for more details on 
what the IPMC and legal expectations are.

By the time you graduate all issues listed in the disclaimer need to have been corrected,
and you must use the standard disclaimer text.

If a podling chooses uses the standards disclaimer, then the release must comply with all ASF policies.