| --- | |
| layout: website-normal | |
| title: Release Prerequisites | |
| navgroup: developers | |
| --- | |
| Subversion repositories for release artifacts | |
| --------------------------------------------- | |
| Apache releases are posted to dist.apache.org, which is a Subversion repository. | |
| We have two directories here: | |
| - https://dist.apache.org/repos/dist/release/brooklyn - this is where PMC approved releases go. Do not upload | |
| here until we have a vote passed on dev@brooklyn. Check out this folder and name it | |
| `apache-dist-release-brooklyn` | |
| - https://dist.apache.org/repos/dist/dev/brooklyn - this is where releases to be voted on go. Make the release | |
| artifact, and post it here, then post the [VOTE] thread with links here. Check out this folder and name it | |
| `apache-dist-dev-brooklyn`. | |
| Example: | |
| {% highlight bash %} | |
| svn co https://dist.apache.org/repos/dist/release/brooklyn apache-dist-release-brooklyn | |
| svn co https://dist.apache.org/repos/dist/dev/brooklyn apache-dist-dev-brooklyn | |
| {% endhighlight %} | |
| When working with these folders, **make sure you are working with the correct one**, otherwise you may be publishing | |
| pre-release software to the global release mirror network! | |
| Software packages | |
| ----------------- | |
| The following software packages are required during the build. Make sure you have them installed. | |
| - A Java Development Kit, version 1.8 | |
| - `maven` and `git` | |
| - Go Language 1.6 - usually provided by the `golang` package on popular distributions | |
| - The `rpmbuild` command - usually provided by the `rpm` package on popular distributions | |
| - `xmlstarlet` is required by the release script to process version numbers in `pom.xml` files; | |
| on mac, `port install xmlstarlet` should do the trick. | |
| - `zip` and `unzip` | |
| - `gnupg2`, and `gnupg-agent` if it is packaged separately (it is on Ubuntu Linux) | |
| - `pinentry` for secure entry of GPG passphrases. If you are building remotely on a Linux machine, `pinentry-curses` is | |
| recommended; building on a mac, `port install pinentry-mac` is recommended. | |
| - `md5sum` and `sha1sum` - these are often present by default on Linux, but not on Mac; | |
| `port install md5sha1sum` should remedy that. | |
| - if `gpg` does not resolve (it is needed for maven), create an alias or script pointing at `gpg2 "$@"` | |
| - the `mmv` command (usually in a package named `mmv`) will help with the final steps of the release process | |
| GPG keys | |
| -------- | |
| The release manager must have a GPG key to be used to sign the release. See below to install `gpg2` | |
| (with a `gpg` alias). The steps here also assume you have the following set | |
| (not using `whoami` if that's not appropriate): | |
| {% highlight bash %} | |
| ASF_USERNAME=`whoami` | |
| GPG_KEY=$ASF_USERNAME@apache.org | |
| SVN_USERNAME=$ASF_USERNAME | |
| {% endhighlight %} | |
| If you have an existing GPG key, but it does not include your Apache email address, you can add your email address as | |
| described [in this Superuser.com posting](https://superuser.com/a/293283). Otherwise, create a new GPG key giving your | |
| Apache email address, using `gpg2 --gen-key` then `gpg2 --export-key $GPG_KEY > my-apache.key` and | |
| `gpg2 --export-secret-key -a $GPG_KEY > my-apache.private.key` in the right directory (`~/.ssh` is a good one). | |
| Upload your GPG public key (complete with your Apache email address on it) to a public keyserver - e.g. run | |
| `gpg2 --export --armor $GPG_KEY` and paste it into the “submit” box on http://pgp.mit.edu/ | |
| Look up your key fingerprint with `gpg2 --fingerprint $GPG_KEY` - it’s the long sequence of hex numbers | |
| separated by spaces. Log in to [https://id.apache.org/](https://id.apache.org/) then copy-and-paste the fingerprint into | |
| “OpenPGP Public Key Primary Fingerprint”. Submit. | |
| Now add your key to the `apache-dist-release-brooklyn/KEYS` file: | |
| {% highlight bash %} | |
| cd apache-dist-release-brooklyn | |
| (gpg2 --list-sigs $ASF_USERNAME@apache.org && gpg2 --armor --export $ASF_USERNAME@apache.org) >> KEYS | |
| svn --username $SVN_USERNAME --no-auth-cache commit -m "Update brooklyn/KEYS for $GPG_KEY" | |
| {% endhighlight %} | |
| References: | |
| * [Post on the general@incubator list](https://mail-archives.apache.org/mod_mbox/incubator-general/201410.mbox/%3CCAOGo0VawupMYRWJKm%2Bi%2ByMBqDQQtbv-nQkfRud5%2BV9PusZ2wnQ%40mail.gmail.com%3E) | |
| * [GPG cheatsheet](http://irtfweb.ifa.hawaii.edu/~lockhart/gpg/gpg-cs.html) | |
| We recommend the use of the `gpg-agent`, as the release process invokes gpg to sign a large number of artifacts, one at | |
| a time. The agent stores its configuration in `~/.gnupg/gpg-agent.conf`. A sample configuration is shown below; it uses | |
| the Mac OSX `pinentry-mac` program which can be obtained through MacPorts or other sources. For other platforms you will | |
| need to change this; sometimes you can omit it completely and your OS will pick a suitable alternative. The following | |
| two lines cause your passphrase to be cached in memory for a limited period; it will expire from the cache 30 minutes | |
| after it was most recently accessed, or 4 hours after it was first cached. | |
| ~~~ | |
| pinentry-program /Applications/MacPorts/pinentry-mac.app/Contents/MacOS/pinentry-mac | |
| default-cache-ttl 1800 | |
| max-cache-ttl 14400 | |
| ~~~ | |
| If you experience trouble with PGP subsequently (when running maven): | |
| * See [GnuPG/Pinentry Enigmail debugging](https://www.enigmail.net/support/gnupg2_issues.php) for tips on diagnosing gpg-agent communication (from the process to this agent and from this agent to the pinentry program) | |
| * See [GnuPG Agent Options](https://www.gnupg.org/documentation/manuals/gnupg/Agent-Options.html) for extended gpg-agent debug | |
| Maven configuration | |
| ------------------- | |
| The release will involve uploading artifacts to Apache's Nexus instance - therefore you will need to configure your | |
| Maven install with the necessary credentials. | |
| You will need to add something like this to your `~/.m2/settings.xml` file: | |
| {% highlight xml %} | |
| <?xml version="1.0"?> | |
| <settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" | |
| xmlns="http://maven.apache.org/SETTINGS/1.1.0" | |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | |
| <!-- ... --> | |
| <servers> | |
| <!-- ... --> | |
| <!-- Required for uploads to Apache's Nexus instance. These are LDAP credentials - the same credentials you | |
| - would use to log in to Git and Jenkins (but not JIRA) --> | |
| <server> | |
| <id>apache.snapshots.https</id> | |
| <username>xxx</username> | |
| <password>xxx</password> | |
| </server> | |
| <server> | |
| <id>apache.releases.https</id> | |
| <username>xxx</username> | |
| <password>xxx</password> | |
| </server> | |
| <!-- ... --> | |
| </servers> | |
| <!-- ... --> | |
| </settings> | |
| {% endhighlight %} |