The Apache HTTP Server Project

Alexei Kosut <akosut@apache.org>
Ralf S. Engelschall <rse@apache.org>
Jim Jagielski <jim@apache.org>
Ken Coar <coar@apache.org>
Martin Kraemer <martin@apache.org>

This document has been obsoleted in httpd-2.0 by the build/httpd_roll_release script. It does everything for you. At some point, we may come back and update this document. So, in the meantime, ignore this and use that script for Apache 2.0 rolls.

This document describes the typical release cycle the release manager has to step through when creating a new Apache release. It is written down as a step-by-step instruction list and should be followed exactly as specified to avoid problems or inconsistencies both in the created tarballs and the source repository.

Note: The below assumes that you are using ssh to login to your httpd.apache.org account. If you are "rolling the tarball" remotely, the differences will be noted.

Important: Once tagged and the tarball is rolled, there is no going back. If there are problems with the tarball, the version number (either the rev-level or beta-level) must be bumped resulting in a new tag, tarball and release.


  1. Checkout the Apache source if needed into a scratch directory:
    $ cvs checkout -P apache-1.X
    Note that the current httpd-docs-1.3/htdocs documentation tree is automatically extracted into apache-1.X/htdocs/ (two macros in the cvs configuration file /home/cvs/CVSROOT/modules do that for you).

    For Apache 2.X:
    $ cvs checkout -r APACHE_2_X_BRANCH -Pd httpd-2.X httpd-2.0
    $ cd httpd-2.X/srclib
    $ cvs checkout apr apr-util
    Omit the -r APACHE_2_X_BRANCH flag for the current development branch (e.g. 2.1-dev.) The current development branch always sits at cvs HEAD.

  2. cd into the apache CVS tree.
    $ cd apache-1.X
    or
    $ cd httpd-2.X
  3. Adjust Announcement to taste.

    A prototype Announcement is included in the main CVS source tree. This file should be updated to reflect the current state of affairs concerning the release. For example, the Release Version should reflect what is actually being announced. Also, the key enhancements of the Release should be noted.
    $ vi Announcement
    $ cvs commit Announcement

    Note: This document is also present in the httpd-dist cvs module, both in HTML and plain text form. You may want to create one version out of the other.

  4. Change the version number to indicate a release.

    For Apache 1.3
    Change SERVER_BASEREVISION in src/include/httpd.h from ``Apache/1.X.Y-dev'' to ``Apache/1.X.Y''. Then also change APACHE_RELEASE in the same file from ``1XXYY000'' to ``1XXYY100''. The format is something like printf("%d%02d%02d%d%02d", major, minor, bugfix, final, beta).
    $ vi src/include/httpd.h
    $ cvs commit src/include/httpd.h

    For Apache 2.0:
    Change SERVER_BASEREVISION in include/httpd.h from ``2.X-dev'' to ``2.X''. Then also change APACHE_RELEASE in the same file from ``2XXYY000'' to ``2XXYY100''.

    Note: until Apache 2.0 is of general release quality, module magic numbers are not enforced. You must edit include/ap_mmn.h and bump the MODULE_MAGIC_NUMBER_MAJOR prior to rolling the tarball, to assure beta testers are testing the corresponding .so modules. This policy will be retracted, and coders will be reponsible for mmn bumps, once Apache 2.0 is officially released.

  5. Make sure your PGP keys are already present in the KEYS file. If they are not, extract your public key using the ``pgp -kxa'' command, add them to the KEYS file and commit it before tagging.
  6. Tag the sources for this release:
    (note: be sure to tag the whole thing, not just src!)
    $ cvs tag APACHE_1_X_Y
    For Apache 2.0:
    $ cvs tag APACHE_2_X_Y
  7. Make an export version of the distribution: (this creates a second subdirectory apache-Z.X.Y for the exported version beside the existing CVS tree in apache-Z.X)

    For Apache 1.3:
    $ cd ..
    $ umask 022
    $ cvs export -r APACHE_1_X_Y -d apache_1.X.Y apache-1.X
    $ cd apache_1.X.Y
    Again, the current httpd-docs-1.3/htdocs documentation tree is automatically extracted into apache-1.X.Y/htdocs/ for you.

    • Note: There is a known problem using cvs export remotely with cvs-1.9 and later. If this affects you, you will need to do a checkout instead:
      $ umask 022
      $ cvs checkout -r APACHE_1_X_Y -d apache_1.X.Y apache-1.X
      $ cd apache_1.X.Y
      $ cvs checkout -r APACHE_1X_Y -d htdocs httpd-docs-1.3/htdocs

    For Apache 2.0:
    $ cd ..
    $ umask 022
    $ cvs export -r APACHE_2_X_Y -d apache_2.X.Y httpd-2.X
    $ cd apache_2.X.Y/srclib
    $ cvs export -r APACHE_2_X_Y apr apr-util

    • Note: There is a known problem using cvs export remotely with cvs-1.9 and later. If this affects you, you will need to do a checkout instead:
      $ umask 022
      $ cvs checkout -r APACHE_2_X_Y -d apache_2.X.Y httpd-2.X
      $ cd apache_2.X.Y/srclib
      $ cvs checkout -r APACHE_2X_Y apr apr-util

  8. Make sure the master site's FAQ is up-to-date:
    $ (cd /www/httpd.apache.org/docs/misc ; cvs update)
  9. Extract the FAQ as a single file, as it appears on the Web:
    $ links -source http://httpd.apache.org/docs/misc/FAQ.html > htdocs/manual/misc/FAQ.html
  10. Create the configuration files:

    For Apache 1.3:
    Create src/Configuration file:
    $ cp src/Configuration.tmpl src/Configuration

    For Apache 2.0:
    Create ./configure file, and remove all symlinks
    $ ./buildconf
    $ rm -f ltconfig ltmain.sh config.sub config.guess
    $ cp /usr/local/share/libtool/ltconfig .
    $ cp /usr/local/share/libtool/ltmain.sh .
    $ cp /usr/local/share/libtool/config.sub .
    $ cp /usr/local/share/libtool/config.guess .

  11. Remove STATUS, RULES.CVS, src/INDENT, the multi-part FAQ, various .cvsignore and the developer's test subdirectories. Depending on which version you are releasing, not all of these files will be in the repository:
    $ rm STATUS RULES.CVS src/INDENT htdocs/manual/misc/FAQ-*.html
    $ find . -name ".cvsignore" -exec rm {} \;
    $ find . -type d -name "test" -exec rm -Rf {} \;
    • Note: If you needed to do a checkout instead of a export, you will also need to remove the CVS administrative files:
      $ find . -type d -name "CVS" -exec rm -rf {} \;
  12. Expand the Server-Side-Include directives in the manual:
    $ cd htdocs/manual
    $ ./expand.pl
    $ rm ./expand.pl
    $ cd ../../..
  13. Roll the distribution tarball:
    $ tar cvf apache_Z.X.Y.tar apache_Z.X.Y
  14. Make the final packed distribution files:
    $ cp -p apache_Z.X.Y.tar xapache_Z.X.Y.tar
    $ gzip -9 apache_Z.X.Y.tar
    $ mv xapache_Z.X.Y.tar apache_Z.X.Y.tar
    $ compress apache_Z.X.Y.tar
  15. Test the packed tar files and check for errors:
    $ gunzip -c apache_Z.X.Y.tar.gz | tar tvf -
    (or simply: $ tar tvzf apache_Z.X.Y.tar.gz)
    $ uncompress <apache_Z.X.Y.tar.Z | tar tvf -
  16. Sign the distribution files:
    $ pgp -sba apache_Z.X.Y.tar.gz
    $ pgp -sba apache_Z.X.Y.tar.Z
    • Note: Be sure your PGP key is already in the KEYS file!
  17. Test the tarball signatures:
    $ pgp apache_Z.X.Y.tar.gz.asc apache_Z.X.Y.tar.gz
    $ pgp apache_Z.X.Y.tar.Z.asc apache_Z.X.Y.tar.Z
  18. Remember the CHANGES file:
    $ cp apache_Z.X.Y/src/CHANGES ./CHANGES_Z.X
  19. Cleanup:
    (this deletes the export tree: it is now no longer required. We still need the CVS tree, see below)
    $ rm -fr apache_Z.X.Y
  20. Make the tarball available for testing purposes (in http://httpd.apache.org/dev/dist/):
    $ chmod 664 CHANGES_Z.X apache_Z.X.Y.tar.*
    $ cp -pv apache_Z.X.Y.tar.gz /www/httpd.apache.org/dev/dist/
    $ cp -pv apache_Z.X.Y.tar.gz.asc /www/httpd.apache.org/dev/dist/
    $ cp -pv apache_Z.X.Y.tar.Z /www/httpd.apache.org/dev/dist/
    $ cp -pv apache_Z.X.Y.tar.Z.asc /www/httpd.apache.org/dev/dist/
    $ chmod g+w /www/httpd.apache.org/dev/dist/apache_Z.X.Y.tar.*
    • Note: If rolling the tarball remotely, you should use scp to place them in httpd.apache.org in the /www/httpd.apache.org/dev/dist/ directory.
  21. Bump the version number to the next version and indicate we are in development.
    cd back into the CVS tree location.
    $ cd apache-Z.X

    For Apache 1.3:
    Change SERVER_BASEREVISION in src/include/httpd.h from ``Apache/1.X.Y'' to ``Apache/1.X.(Y+1)-dev'' and change APACHE_RELEASE to 1XX(YY+1)000.
    (1.3.x only) Additionally make sure that the Configure script's version knowledge for the SHARED_CORE reflects the new version.revision.patchlevel triple. Look for the line ``V=1 R=X P=Y'' inside src/Configure and adjust it accordingly.
    Finally, add a new line ``Changes with Apache 1.X.(Y+1):'' to the head of the src/CHANGES file for the forthcoming fixes in the new version.
    $ vi src/include/httpd.h \
    src/Configure \
    src/CHANGES

    $ cvs commit src/include/httpd.h \
    src/Configure \
    src/CHANGES


    Edit the STATUS file and update the status for the tagged apache_1.X.Y version, and add a header line for the new apache_1.X.(Y+1) version
    $ vi STATUS
    $ cvs commit STATUS

    $ cd ..

    For Apache 2.0:
    Change SERVER_BASEREVERSION in include/httpd.h from ``2.X.Y'' to ``2.X.(Y+1)-dev'' and change APACHE_RELEASE to 1XX(YY+1)000.
    Finally, add a new line ``Changes with Apache 1.X.(Y+1):'' to the head of the CHANGES file for the forthcoming fixes in the new version.
    $ vi include/httpd.h \
    CHANGES

    $ cvs commit include/httpd.h \
    CHANGES

    $ cd ..

  22. Cleanup:
    (delete the CVS tree, after verification that it does not contain any uncommitted changes)
    $ cvs release -d apache-Z.X

Now wait for the group to test and approve the tarball.

Note: Do not continue with the rest of these instructions until the group really approves the tarball!

  1. Make the distribution available (in http://www.apache.org/dist/httpd/) Z is either 1 or 2:
    $ cp CHANGES_Z.X /www/www.apache.org/dist/httpd/CHANGES_Z.X
    $ cp apache_Z.X.Y.tar.gz /www/www.apache.org/dist/httpd/
    $ cp apache_Z.X.Y.tar.gz.asc /www/www.apache.org/dist/httpd/
    $ cp apache_Z.X.Y.tar.Z /www/www.apache.org/dist/httpd/
    $ cp apache_Z.X.Y.tar.Z.asc /www/www.apache.org/dist/httpd/
    • Note: If rolling the tarball remotely, you should use scp to place them in www.apache.org in the /www/www.apache.org/dist/httpd/ directory.

    If the Win32 binary is already built and tested at this point, you can add it to the dist directory as well as to the binaries/win32/ directory.

  2. Checkout the httpd-dist site, if needed, into a scratch directory:
    $ cvs -d cvs.apache.org:/home/cvs checkout -P httpd-dist
  3. Change directory into httpd-dist
    $ cd httpd-dist/
  4. Edit the files README.html and HEADER.html as well as Announcement.html and its plaintext equivalent Announcement.txt plus the .htaccess file (which defines the AddDescription comments) from the httpd-dist CVS tree as required (all in the . subdirectory). The Announcement.* files should be based on the Announcement file in the tagged CVS tree. For Apache 2.0, Announcement should be replaced with Announcement2:
    $ vi README.html HEADER.html Announcement.html Announcement.txt .htaccess
  5. Commit the changes:
    $ cvs commit README.html HEADER.html Announcement.html Announcement.txt .htaccess
    $ cd ../..
  6. Checkout the httpd site if needed into a scratch directory:
    $ cvs -d cvs.apache.org:/home/cvs checkout httpd-site
  7. cd into the httpd-site xdocs tree.
    $ cd httpd-site/xdocs/
  8. Edit the index.xml page from the httpd-site CVS tree as required:
    $ vi index.xml
  9. Commit the changes:
    $ cd ..
    $ ./build.sh # Check result before continuing
    $ cvs commit
  10. Update the checked-out versions of the httpd-dist documents for the web server:
    $ umask 002
    $ cd /www/www.apache.org/dist/httpd/
    $ cvs update -dP
  11. Create an empty directory for future patches:
    $ mkdir patches/apply_to_1.X.Y
  12. Update the checked-out version of the httpd-site index.html page for the web server:
    $ umask 002
    $ cd /www/httpd.apache.org/
    $ cvs update -dP

At this point, the web-sites reflect the existance of the new release.

As it is going to be some 24hrs before any announcement goes out (to make sure that the mirror's have at least a chance of grabbing a copy) this is also the right time to mail dev@httpd.apache.org and ask people to upload and move into position any binaries they have build and vetted.

See how to build a release of Apache for Windows.

Once a release is built and released, it is time to announce it to the world.

  1. Grab the prepared Announcement:

    You can grab either the Announcement file in the tagged tree, or the Announcement.txt file from the web-site.

  2. Post the Announcement:

    Once the tarball is built, give the mirrors a good 24 hours to get up to sync. This is really important if this this a final (i.e.: non-beta) release.

  3. Now, Announcement should be posted to the following places (please note that a mail send to announce@apache.org must have your apache.org address set as its 'From' address, otherwise it won't pass the anti-spam filter):
    • Unmoderated UseNet newsgroups (should be crossposted)
      • comp.infosystems.www.servers.unix
      • comp.infosystems.www.servers.ms-windows
      • comp.infosystems.www.servers.misc
      • de.comm.infosystems.www.servers
    • Moderated UseNet newsgroups (do not crosspost)
      • comp.infosystems.www.announce
    • Mailing Lists
      • announce@apache.org
      • announce@httpd.apache.org
      • users@httpd.apache.org
      • users-de@httpd.apache.org
  4. Make sure that Announcement.txt and Announcement.html in httpd-dist are updated to include these changes.
  5. Bask in the glow

Copyright © 1999-2004, The Apache Software Foundation