<?xml version="1.0"?>
<document url="./release-checlist.xml">
    <!--
    // ======================================================================== 78
    -->
    <properties>
        <title>Release Checklist - Apache Struts Project</title>
    </properties>
    <body>
        <pre>
            = Struts x.x.x Release =

            == Info ==

            1. Struts [http://struts.apache.org/releases.html#Releases
            Release Guidelines]

            2. [http://wiki.apache.org/incubator/SigningReleases
            Signing Releases]

            3. Apache [http://apache.org/dev/mirrors.html Mirroring
            Guidelines]

            == Release Manager ==

            The release manager is '''${RELEASE_MANAGER}'''

            == Special Issues ==

            1. ${ISSUES}

            == Outstanding Bug Review ==

            || '''ID''' || '''Summary''' || '''Component''' || '''Status''' ||
            || ${ID} || ${SUMMARY} || $COMPONENT} || ${STATUS} ||

            == Preparation Checklist ==

            || '''#''' || '''Description''' || '''Status''' ||
            || 1. || ${DESCRIPTION} || ${STATUS} ||

            The Commons
            [http://jakarta.apache.org/commons/releases/prepare.html
            Preparation Guide] is a helpful preparation backgrounder, but
            Commons
            uses the "beta/release-candidate/final" process.

            Likewise, the [http://httpd.apache.org/dev/release.html
            HTTPD Release Guidelines] is a helpful "overall process"
            backgrounder,
            but HTTPD does not use a test-build stage.

            Dependency versions for this release:

            || '''Dependency''' || '''Version''' || '''Status''' ||
            || ${DEPENDENCY} || ${VERSION} || ${STATUS} ||

            == Testing Checklist ==

            === Testing Summary ===

            || '''#''' || '''Description''' || '''Completed''' ||
            || 1. || Run Unit Test targets || ${STATUS} ||
            || 2. || Run Cactus Tests (see below) || ${STATUS} ||
            || 3. || Play test bundled applications (TC 4.x) || ${STATUS} ||

            TODO: A Canoo WebTest for the applications would be great!

            === Cactus Tests ===

            || '''#''' || '''J2SE Version''' || '''Tomcat Version''' ||
            '''Status''' ||
            || 1. || J2SE 1.3.x || Tomcat 4.x || ${STATUS} ||
            || 2. || J2SE 1.4.x || Tomcat 4.x || ${STATUS} ||
            || 3. || J2SE 1.3.x || Tomcat 5.x || ${STATUS} ||
            || 4. || J2SE 1.4.x || Tomcat 5.x || ${STATUS} ||

            == Test Build Checklist (A) ==

            See also Commons
            [http://jakarta.apache.org/commons/releases/release.html
            Step-by-Step Guide]

            || '''#''' || '''Description''' || '''Completed''' ||
            || A1. || Tag release in cvs: ${STRUTS_x_x_x} || ${STATUS} ||
            || A2. || Run Distribution Target || ${STATUS} ||
            || A3. || Upload Distribution to
            cvs.apache.org:/www/cvs.apache.org/dist/struts/x.x.x || ${STATUS}
            ||
            || A4. || Post release-quality vote on dev@ and user@ lists || ${STATUS ||

      == Vote (A) ==

      || ${PMC_MEMBER} || ${GRADE} ||

            If release vote fails, including for a lack of quorum, remove from
            dist
            folder.

            == Point Release Checklist (B) ==

            || B1. || Create Sums and Sign Distributions [2] || ${STATUS} ||
            || B2. || Request new Bugzilla version level (x.x.x) || ${STATUS}
            ||
            || B3. || Update "Acquiring" page on website and Test Downloads ||
            ${STATUS} ||

            == Vote (B) ==

            || ${PMC_MEMBER} || ${GRADE} ||

            Voting continues until a GA or "withdraw" vote passes, or there is
            a
            subsequent release.

            == General Availability Checklist (C) ==

            || '''#''' || '''Description''' || '''Completed''' ||
            || C1. || Copy Distribution to Mirrored Directories [3] ||
            ${STATUS} ||
            || C2. || Deploy JAR to Apache Java-Repository || ${STATUS} ||
            || C3. || After 24 hours, update "Acquiring" page on website ||
            ${STATUS} ||
            || C4. || Post an announcement to lists and website || ${STATUS}
            ||
            ----
        </pre>
    </body>
</document>