You need to be added to the ContributorsGroup to edit the wiki. But don't worry! Just email any Mailing List or grab us on IRC and let us know your user name.
Making a Source Release
Any Apache CouchDB committer is free to make a source release, but they are usually made by the release team.
If you'd like to help out with making a release, lets us know on the couchdb-dev mailing list.
Contents
Checklist
Update the README file with important information.
Update the NEWS and CHANGES files with important information.
Add note about breaking changes to the NEWS file if necessary.
Remove "version has not been released" warnings from NEWS and CHANGES if present.
If working on a branch, make sure NEWS and CHANGES are synced with master.
Update the acinclude.m4.in file with version information.
- LOCAL_VERSION_MAJOR should be the X in X.Y.Y
- LOCAL_VERSION_MINOR should be the X in Y.X.Y
- LOCAL_VERSION_REVISION should be the X in Y.Y.X
- LOCAL_VERSION_STAGE must always be empty on a release tag.
- When this is set, it indicates a development version. It is set on branches or on master so that the release number includes the source code revision number, which can be useful for development builds.
Update the Breaking_changes document.
Preparing the Community
Call a vote on the couchdb-dev mailing list asking for a request for comments on the release. Ask all developers to specifically check the NEWS and CHANGES file for anything that has been added in this release.
Preparing the Release
First make sure your local repository has everything from the public repository:
git fetch origin
Find a list of branches:
git branch -a
Checkout the branch you're releasing from:
git checkout -b Y.Y.x origin/Y.Y.x
You should make sure your branch matches whats on the remote repository. First check that you don't have any work that you're willing to lose:
git status
When you have your work saved, forcefully update your branch to the version in the remote repository:
git reset --hard HEAD git clean -qfxd git rebase origin/Y.Y.x
Grab the current tree-ish:
git show HEAD | head -n 1 | cut -d " " -f 2
It is generally a good idea to work under a clean temporary directory.
You can then run the following commands:
git archive --prefix=Y.Y.Y/ -o Y.Y.Y.tar <tree-ish> tar -xf Y.Y.Y.tar
You must then use the Y.Y.Y directory to prepare the release:
cd Y.Y.Y
Release Signing
You will need a GPG key pair to sign the release.
If you do not have one already, see the Useful Resources section for more help.
It is generally better if your key is also signed by other people.
Your public key must be added to:
You should also upload your key to a public key server for good measure.
The build system will invoke GnuPG in a way that defaults to your first secret key.
If this is not the key you wish to sign the release with, run this command:
export GPG_ARGS="--default-key=DEADBEAF"
Replace DEADBEAF with your key ID, which you can find by running:
gpg --list-keys
Creating the Release Artefacts
To build the source for distribution you should then run the following command:
./bootstrap && ./configure && make distsign
If everything was successful you should see the following files in the working directory ready for distribution:
- apache-couchdb-Y.Y.Y.tar.gz
- apache-couchdb-Y.Y.Y.tar.gz.asc
- apache-couchdb-Y.Y.Y.tar.gz.md5
- apache-couchdb-Y.Y.Y.tar.gz.sha
Checking the Release Contents
Remove any existing temporary directory:
rm -rf /tmp/couchdb
Obviously, don't run this command if you're already using this directory for something else.
The location isn't important, but this is a sensible default.
Create a new temporary directory to work in:
mkdir /tmp/couchdb
You can safely remove this directory and all of its contents when you're done.
Move the release files to the temporary directory:
mv apache-couchdb* /tmp/couchdb
Move the source tarball to the temporary directory:
mv ../Y.Y.Y.tar /tmp/couchdb
Change to the temporary directory:
cd /tmp/couchdb
Unpack the release tarball:
tar -xvzf apache-couchdb-Y.Y.Y.tar.gz
Then unpack another copy of the source tarball:
tar -xvf Y.Y.Y.tar
Then compare the tarball with the source directory:
diff -r apache-couchdb-Y.Y.Y Y.Y.Y
Use your judgment here to figure out if anything is missing, or has been included by mistake.
Upload the release files to your public_html directory on people.apache.org and make sure they are world readable.
Do not upload the exported tag directory, of course. That was only for testing.
Calling a Vote
Before you call the vote, you should now download your own release artefacts and run the test procedure with them.
Update the test procedure to use the correct values so that copying and pasting the commands will work.
If they pass your own tests:
Call a vote on the couchdb-dev mailing list.
Make sure to link to the test procedure page.
When the vote passes, send a summary of the vote to the couchdb-dev mailing list.
The vote email must include the full tree-ish used to prepare the release.
The release manager has the power to abort a vote at any point and for any reason.
Please try to make it a good one though!
A vote can only pass if there are at least three +1 votes. These votes can come from anyone, including non-committers, and in fact, everyone is encouraged to partake in and vote on each release. However, it is preferable that at least three +1 votes come from the committers, or better yet, the PMC. Once three +1 votes have been counted, the vote can pass. However, if anyone votes -1 or expresses any serious concern, that should be addressed. Usually, this will be cause to abort the vote. A vote can only be closed after three working days. This allows most people a chance to test and vote on the release.
Preparing the Release Notes
Go through the NEWS file and expand each bullet point as appropriate.
Format this document as HTML, and call it something like:
apache-couchdb-Y.Y.Y.html
Check that this HTML looks good when used for a draft blog post.
Then generate a text only version by running:
elinks -dump -no-numbering -no-references apache-couchdb-Y.Y.Y.html > apache-couchdb-Y.Y.Y.txt
Check the text only version to make sure that any important links are not lost.
For example, a JIRA ticket that is not referenced by number.
Upload these files to /www/www.apache.org/dist/couchdb/notes/Y.Y.Y on people.apache.org.
Making the Release
Create a signed tag:
git tag -u DEADBEAF Y.Y.Y <tree-ish>
Use a tag message like this:
CouchDB Y.Y.Y Vote results: <URL>
Use the Apache URL shortener to produce the URL:
The URL should point to the vote results email you previously sent.
Now, push the tag:
git push origin Y.Y.Y
Now, follow these steps:
Copy the release directory to /www/www.apache.org/dist/couchdb on people.apache.org.
Make sure that the release directory and all the files within it are owned by the couchdb group and are group writable.
- Wait for all changes to be synced to public mirrors.
Update http://couchdb.apache.org/ to point to the new files.
Send a pre-announcement email to couchdb-dev mailing list, so that downstream distributors can prepare their own announcements.
Update the wiki with the new release information.
- Wait for all changes to be synced to the public site.
- Publish a blog post using the HTML version of the release notes.
Send the release notes to the announce, couchdb-user, and couchdb-dev mailing lists.
At each stage of the actual release, it is expected that a person can follow the trail of changes back to the source. Because most of these systems are slow, things must be done in the correct order. It would be unfortunate if the website listed a release that was not available on a local mirror, or that was missing a corresponding tag in the Git repository. The changes should always propagate from the source, to the dist directory, to the mirrors, to downloads.html, and finally to the actual release announcement.
Doing Housekeeping
Add a new release section to NEWS and CHANGES on master if not already present.
Add a new release section to NEWS and CHANGES on Y.Y.x the branch if not already present.
- Add "version has not been released" warnings to these release sections if not already present.
Update versions in JIRA.
- If the currently released version is 0.1.0, JIRA should have options for 0.1.1, 0.2.0, and 0.3.0.
- The released version should be marked as released in JIRA.
- Archived releases should be marked as archived.
- Every current release should have one unreleased maintenance release open.
- Update the links on this page to most recent email archives.
- Update branches, master, and site with security changes not documented in the released.
Call a discussion on the couchdb-dev mailing list about archiving old releases.
To archive an old release, remove it from the wiki and then delete the corresponding directory from the dist directory. Do not worry about the release artefacts no longer being available, they are automatically mirrored to the Apache archive site and will remain there even after they are deleted from the main dist directory.