You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafu.apache.org by mh...@apache.org on 2015/06/04 06:11:27 UTC

incubator-datafu git commit: DATAFU-72 Update releasing.md for Apache

Repository: incubator-datafu
Updated Branches:
  refs/heads/master 1f6586877 -> 394ab0b90


DATAFU-72 Update releasing.md for Apache

This includes a number of changes that prepares Apache DataFu for a source release.

* Added a KEYS file that includes public keys for release managers.
* Updated README.md and RELEASE.md with instructions on how to use source release and how to release.
* -SNAPSHOT is still appended to the version by default, but this can be overridden with a "release" config.
* If a source release is created with release=true, then building from the source release uses release=true as well by default.
* Exluded test files from being considered in Rat.
* Appended "-incubating" to the artifact names.
* Upgraded to Gradle 2.4.


Project: http://git-wip-us.apache.org/repos/asf/incubator-datafu/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-datafu/commit/394ab0b9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-datafu/tree/394ab0b9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-datafu/diff/394ab0b9

Branch: refs/heads/master
Commit: 394ab0b909c93896319f54bb1aadae4f17c1ba3a
Parents: 1f65868
Author: Matthew Hayes <ma...@gmail.com>
Authored: Wed May 27 21:14:31 2015 -0700
Committer: Matthew Hayes <ma...@gmail.com>
Committed: Wed Jun 3 21:10:27 2015 -0700

----------------------------------------------------------------------
 .gitignore                               |  1 +
 KEYS                                     | 79 ++++++++++++++++++++++++++
 README.md                                | 31 +++++++++--
 RELEASE.md                               | 80 ++++++++++++++++-----------
 build.gradle                             | 15 ++++-
 datafu-hourglass/build.gradle            |  3 +
 datafu-pig/build.gradle                  |  9 ++-
 gradle.properties                        |  5 +-
 gradle/release.gradle                    | 50 +++++++++++++++--
 gradle/wrapper/gradle-wrapper.properties |  2 +-
 10 files changed, 226 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-datafu/blob/394ab0b9/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index 5eba6c0..dc69125 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 /dist/
+*.release
 /.gradle/
 build/
 annotation-plugin.jar

http://git-wip-us.apache.org/repos/asf/incubator-datafu/blob/394ab0b9/KEYS
----------------------------------------------------------------------
diff --git a/KEYS b/KEYS
new file mode 100644
index 0000000..5348450
--- /dev/null
+++ b/KEYS
@@ -0,0 +1,79 @@
+This file contains the PGP keys of various developers.
+
+Users: 
+
+    pgp < KEYS
+
+    -or-
+
+    gpg --import KEYS
+
+Developers: 
+
+    (gpg --list-sigs <Key ID> \
+     && gpg --armor --export <Key ID>) >> KEYS
+
+    -or-
+
+    (gpg2 --list-sigs <Key ID> \
+     && gpg2 --armor --export <Key ID>) >> KEYS
+
+
+pub   4096R/01D3DE61 2015-05-27
+uid       [ultimate] Matthew Terence Hayes (Code Signing Key) <ma...@gmail.com>
+sig 3        01D3DE61 2015-05-27  Matthew Terence Hayes (Code Signing Key) <ma...@gmail.com>
+sub   4096R/F98368D2 2015-05-27
+sig          01D3DE61 2015-05-27  Matthew Terence Hayes (Code Signing Key) <ma...@gmail.com>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2
+
+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
+=A90w
+-----END PGP PUBLIC KEY BLOCK-----

http://git-wip-us.apache.org/repos/asf/incubator-datafu/blob/394ab0b9/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
index 7e73093..0fa5112 100644
--- a/README.md
+++ b/README.md
@@ -40,19 +40,38 @@ Bugs and feature requests can be filed [here](https://issues.apache.org/jira/bro
 
 ## Developers
 
-### Building the Code
+### Source release
 
-To build DataFu from a git checkout or binary release, run:
+If you are starting from a source release, then you'll want to verify the release is valid and bootstrap the build environment.
 
-    ./gradlew clean assemble
+To verify that the archive has the correct MD5 checksum, the following two commands can be run.  These should produce the same output.
+
+  openssl md5 < apache-datafu-sources-x.y.z-incubating.tgz
+  cat apache-datafu-sources-x.y.z-incubating.tgz.MD5
 
-To build DataFu from a source release, it is first necessary to download the gradle wrapper script above. This bootstrapping process requires Gradle to be installed on the source machine.  Gradle is available through most package managers or directly from [its website](http://www.gradle.org/).  To bootstrap the wrapper, run:
+To verify the archive against its signature, you can run:
+
+  gpg2 --verify apache-datafu-sources-x.y.z-incubating.tgz.asc
+
+The command above will assume you are verifying `apache-datafu-sources-x.y.z-incubating.tgz` and produce "Good signature" if the archive is valid.
+
+To build DataFu from a source release, it is first necessary to download a gradle wrapper script.  This bootstrapping process requires Gradle to be installed on the source machine.  Gradle is available through most package managers or directly from [its website](http://www.gradle.org/).  Once you have installed Gradle and have ensured that the `gradle` is available in your path, you can bootstrap the wrapper with:
 
     gradle -b bootstrap.gradle
 
-After the bootstrap script has completed, the regular gradlew instructions are available.
+After the bootstrap script has completed, you should find a `gradlew` script in the root of the project.  The regular gradlew instructions below should then be available.
+
+When building from a source release, the version for all generated artifacts will be of the form `x.y.z`.  If you were to clone the git repo and build you would find `-SNAPSHOT` appended to the version.  This helps to distinguish official releases from those generated from the code repository for testing purposes.
+
+### Building the Code
+
+To build DataFu from a git checkout or binary release, run:
+
+    ./gradlew clean assemble
+
+The datafu-pig JAR can be found under `datafu-pig/build/libs`.  The artifact name will be of the form `datafu-pig-incubating-x.y.z.jar` if this is a source release and `datafu-pig-incubating-x.y.z-SNAPSHOT.jar` if this is being built from the code repository.
 
-The datafu-pig JAR can be found under `datafu-pig/build/libs` by the name `datafu-pig-x.y.z.jar`, where x.y.z is the version.  Similarly, the datafu-hourglass can be found in the `datafu-hourglass/build/libs` directory.
+The datafu-hourglass can be found in the `datafu-hourglass/build/libs` directory.
 
 ### Generating Eclipse Files
 

http://git-wip-us.apache.org/repos/asf/incubator-datafu/blob/394ab0b9/RELEASE.md
----------------------------------------------------------------------
diff --git a/RELEASE.md b/RELEASE.md
index 39fbba3..08d590e 100644
--- a/RELEASE.md
+++ b/RELEASE.md
@@ -1,56 +1,74 @@
-Auto-generate all missing headers in files:
+# Apache DataFu Release Guide
 
-    ./gradlew licenseFormatMain
-    ./gradlew licenseFormatTest
+This will guide you through the source release process for Apache DataFu.
 
-Check to see if any files were modified to add the missing headers.  If so be sure to commit the changes before proceeding.
+For general information on the Apache Incubator release process, see the [Release Management](http://incubator.apache.org/guides/releasemanagement.html) page.  
 
-Build the code, run the tests, and perform any other required checks:
+## Prerequisites
 
-    ./gradlew check
+If this is your first time doing an Apache release, then there is some initial setup involved.  To perform a release, you will need to be able to sign the source tarball.  See the [Signing Releases](http://www.apache.org/dev/release-signing.html) page for information on how to do this.  You should read this page before proceeding.   In a nutshell, you'll need to follow the instructions at [How To OpenPGP](http://www.apache.org/dev/openpgp.html#generate-key) to generate a new code signing key and publish the public key in various places.  
 
-Edit `$HOME/.gradle/gradle.properties` and add your GPG key information:
+Once you have followed these instructions, you should have:
 
-    signing.keyId=01234567                          # Your GPG key ID, as 8 hex digits
-    signing.secretKeyRingFile=/path/to/secring.gpg  # Normally in $HOME/.gnupg/secring.gpg
-    signing.password=YourSuperSecretPassphrase      # Plaintext passphrase to decrypt key
-    nexusUsername=yourname                          # Your username on Apache's LDAP
-    nexusPassword=password                          # Your password on Apache's LDAP
+* Your public key uploaded to a public keyserver using the `gpg --send-keys` command
+* Your public key listed in the `KEYS` file in this repo
+* Your public key viewable at https://people.apache.org/keys/committer/your-alias.asc
+* Your public key also viewable at https://people.apache.org/keys/group/datafu.asc
 
-Putting your passwords there in plaintext is unfortunately unavoidable. The
-[nexus plugin](https://github.com/bmuschko/gradle-nexus-plugin) supports asking
-for them interactively, but unfortunately there's a
-[Gradle issue](http://issues.gradle.org/browse/GRADLE-2357) which prevents us
-from reading keyboard input (because we need `org.gradle.jvmargs` set).
+## Code Validation
 
-To release to a local Maven repository:
+Before releasing, we must run various checks to ensure that files have the proper license headers and that all automated tests pass.  These checks can be run with:
 
-    ./gradlew install
+    ./gradlew check
 
-You should be able to see all the installed artifacts in the local repository now:
+If this builds successfully then it means the tests pass and the report was successfully generated.  But, it doesn't mean that all license headers are in place.  You should open the report at `build/rat/rat-report.html` to validate that all files that are in scope (i.e. not excluded) have the appopriate headers.  Use the `rat` task to generate this report without running tests.  See `HEADER` for the contents of the license header.  These contents should appear at the top of the file as a comment.  If a file or set of files needs to be excluded from Rat validation, you can update the Rat exclusion list in `build.gradle`.
 
-    find ~/.m2/repository/org/apache/datafu/
+## Create a Source Release
 
-To build a tarball suitable for an ASF source release (and its accompanying MD5 file):
+The following steps will build a tarball suitable for an ASF source release.  This also generates accompanying MD5 and ASC files.
 
-First, clean any non-checked-in files from git (this removes all such files without prompting):
+First, clean any files unknown to git (WARNING: this removes all untracked files, including those listed in .gitignore, without prompting):
 
     git clean -fdx
 
 Alternatively, you can make a fresh clone of the repository to a separate directory:
 
-    git clone https://git-wip-us.apache.org/repos/asf/incubator-datafu.git datafu-release
-    cd datafu-release
+    git clone https://git-wip-us.apache.org/repos/asf/incubator-datafu.git incubator-datafu-release
+    cd incubator-datafu-release
+
+The source tarball needs to be signed.  You can do this either manually or automatically.  To have it signed automatically you'll need to perform a one-time configuration step.  Edit `$HOME/.gradle/gradle.properties` and add your GPG key information:
+
+    signing.keyId=01234567                          # Your GPG key ID, as 8 hex digits
+    signing.secretKeyRingFile=/path/to/secring.gpg  # Normally in $HOME/.gnupg/secring.gpg
+    signing.password=YourSuperSecretPassphrase      # Plaintext passphrase to decrypt key
+
+The GPG key ID can be found by running `gpg --list-keys`.
+
+To generate the source release, run:
+
+    ./gradlew clean release -Prelease=true
+
+This generates a source tarball.  The `-Prelease=true` setting prevents `-SNAPSHOT` from being appended to the version,
+which is the default behavior.  It also prevents any builds from the extracted source tarball from including `-SNAPSHOT` in the version.  It achieves this by modifying `gradle.properties` within the generated archive.
+
+If you have configured your key information in your `gradle.properties` then you the archive should automatically be signed.  There should now be a corresponding ASC file alongside the tarball and MD5 file.  Otherwise you'll need to sign it manually by running:
 
-To build a signed tarball:
+    gpg --sign --armor --detach-sig build/distribution/source/apache-datafu-sources-*.tgz
 
-    ./gradlew clean signSourceRelease
+If you have GPG v2 installed then you'll need to use `gpg2` instead.  
 
-Alternatively, to build the tarball without the signatures:
+## Testing the source release
 
-    ./gradlew clean sourceRelease
+Once you have built the source tarball, you should verify that it can be used.  Follow the instructions in the `README.md` file assuming you are someone who has just downloaded the source tarball and want to use it.
 
-The tarball can also be signed manually:
+## Releasing to your local Maven repository
 
-    gpg --sign --armor --detach-sig build/distribution/source/datafu-sources-*.tgz
+You may want to release binaries to your local Maven repository under your home directory to do additional testing.  To do so, run:
+
+    ./gradlew install -Prelease=true
+
+You should be able to see all the installed artifacts in the local repository now:
+
+    find ~/.m2/repository/org/apache/datafu/
 
+Again, setting `release=true` prevents `-SNAPSHOT` from being appended to the version.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-datafu/blob/394ab0b9/build.gradle
----------------------------------------------------------------------
diff --git a/build.gradle b/build.gradle
index 7b30ead..89a9d33 100644
--- a/build.gradle
+++ b/build.gradle
@@ -29,6 +29,13 @@ allprojects {
   repositories {
     mavenCentral()
   }
+
+  // by default append "-SNAPSHOT" to all versions, unless explicitly overriden
+  beforeEvaluate { project ->
+    if (!ext.release.toBoolean()) {
+      project.version += "-SNAPSHOT"
+    }
+  }
 }
 
 apply from: file("gradle/dependency-versions.gradle")
@@ -73,7 +80,13 @@ rat {
     'build-plugin/**/JavacMultilineProcessor.java',
     'build-plugin/**/Multiline.java',
     'build-plugin/**/MultilineProcessor.java',
-    'build-plugin/**/javax.annotation.processing.Processor'
+    'build-plugin/**/javax.annotation.processing.Processor',
+    // test data
+    'datafu-hourglass/data/**',
+    'datafu-pig/input*',
+    'datafu-pig/docs',
+    'datafu-pig/queries',
+    'datafu-pig/query'
   ]
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-datafu/blob/394ab0b9/datafu-hourglass/build.gradle
----------------------------------------------------------------------
diff --git a/datafu-hourglass/build.gradle b/datafu-hourglass/build.gradle
index e89388f..867cc6d 100644
--- a/datafu-hourglass/build.gradle
+++ b/datafu-hourglass/build.gradle
@@ -19,6 +19,9 @@
 
 apply plugin: 'java'
 
+// append "-incubating" while still in the incubating process
+archivesBaseName = 'datafu-hourglass-incubating'
+
 import groovy.xml.MarkupBuilder
 
 buildscript {

http://git-wip-us.apache.org/repos/asf/incubator-datafu/blob/394ab0b9/datafu-pig/build.gradle
----------------------------------------------------------------------
diff --git a/datafu-pig/build.gradle b/datafu-pig/build.gradle
index b5652a9..8bcb13c 100644
--- a/datafu-pig/build.gradle
+++ b/datafu-pig/build.gradle
@@ -21,6 +21,9 @@ apply plugin: 'java'
 apply plugin: 'gradle-autojar'
 apply plugin: 'download-task'
 
+// append "-incubating" while still in the incubating process
+archivesBaseName = 'datafu-pig-incubating'
+
 import groovy.xml.MarkupBuilder
 
 buildscript {
@@ -108,11 +111,11 @@ task jarWithDependencies(type: Autojar) {
   autojarExtra = '-baeq'
 }
 
+def outputFile = file(tasks.jar.getArchivePath().absoluteFile.toString().replace("-core","-jarjar"))
+
 task jarWithDependenciesNamespaced(dependsOn: jarWithDependencies) {
   description 'Creates the jar that includes dependencies (under a datafu namespace)'
 
-  outputFile = file(tasks.jar.getArchivePath().absoluteFile.toString().replace("-core","-jarjar"))
-
   doLast {
     project.ant {
       taskdef name: "jarjar", classname: "com.tonicsystems.jarjar.JarJarTask", classpath: configurations.jarjar.asPath
@@ -131,7 +134,7 @@ task jarWithDependenciesNamespaced(dependsOn: jarWithDependencies) {
 task finalJar(type: Jar, dependsOn: jarWithDependenciesNamespaced) {
   description 'Creates the final jar'
 
-  from(zipTree(jarWithDependenciesNamespaced.outputFile))
+  from(zipTree(outputFile))
 }
 
 // don't publish the core archive, as this doesn't have the dependencies

http://git-wip-us.apache.org/repos/asf/incubator-datafu/blob/394ab0b9/gradle.properties
----------------------------------------------------------------------
diff --git a/gradle.properties b/gradle.properties
index 2b10352..9e3bd2f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -16,6 +16,7 @@
 # under the License.
 
 group=org.apache.datafu
-version=1.3.0-SNAPSHOT
-gradleVersion=1.12
+version=1.3.0
+gradleVersion=2.4
 org.gradle.jvmargs="-XX:MaxPermSize=512m"
+release=false
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-datafu/blob/394ab0b9/gradle/release.gradle
----------------------------------------------------------------------
diff --git a/gradle/release.gradle b/gradle/release.gradle
index 023b546..d900994 100644
--- a/gradle/release.gradle
+++ b/gradle/release.gradle
@@ -22,13 +22,40 @@ project(':') {
   apply plugin: 'signing'
 }
 
-task sourceRelease(type: Tar) {
+def isRelease = ext.release.toBoolean()
+
+def releaseVersion = project.version
+if (!isRelease) {
+  releaseVersion += "-SNAPSHOT"
+}
+
+// Modify the gradle.properties to indicate whether this is a release.  This results in the
+// source releases generating artifacts without -SNAPSHOT appended to the version when they are
+// built.
+task prepare_release_config(type: Copy) {
+  from "$rootDir/gradle.properties"
+  into "$rootDir"
+  rename { filename -> 
+    filename + ".release" }
+  filter { line ->
+    if (isRelease && line.startsWith("release=")) {
+      "release=true"
+    }
+    else {
+      line
+    }
+  }
+}
+
+task sourceRelease(type: Tar, dependsOn: prepare_release_config) {
   description = "Build a source release, specifically excluding the build directories and gradle wrapper files"
   compression = Compression.GZIP
 
-  baseName = "datafu-sources-${project.version}-incubating"
+  baseName "apache-datafu-incubating-sources-${releaseVersion}"
 
   from(project.rootDir) {
+    // don't include gradle.properties because we use a modified version
+    exclude "gradle.properties"
     exclude '**/build'
     exclude 'build'
     exclude '.gradle'
@@ -38,6 +65,16 @@ task sourceRelease(type: Tar) {
     exclude 'gradle/wrapper/gradle-wrapper.properties'
   }
 
+  // rename gradle.properties.release to gradle.properties
+  rename { filename ->
+    if (filename.equals("gradle.properties.release")) {
+      "gradle.properties"
+    }
+    else {
+      filename
+    }
+  }
+
   into(baseName)
 
   // Set destination directory.
@@ -52,12 +89,15 @@ task sourceRelease(type: Tar) {
 // Signing requires a user ~/.gradle/gradle.properties file with signing information.
 // See: http://www.gradle.org/docs/current/userguide/signing_plugin.html
 signing {
-  // TODO: this doesn't show up in the 'tasks' for some reason, need to figure out why.
-  // This creates a task 'signSourceRelease' that builds the source release and signs it.
-  required { !version.endsWith("SNAPSHOT") }
+  // Sign the source archive if the proper configuration is in place to do so.  Otherwise
+  // skip the signing process (it isn't required).  This archive can be manually signed if
+  // needed.
+  required false
   sign sourceRelease
 }
 
+task release(dependsOn: signSourceRelease)
+
 // Publishing to Apache's Maven repository (Nexus). To install the archives in the
 // local repository, run the 'install' task.
 subprojects {

http://git-wip-us.apache.org/repos/asf/incubator-datafu/blob/394ab0b9/gradle/wrapper/gradle-wrapper.properties
----------------------------------------------------------------------
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 8c71aad..4bb5cab 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-bin.zip
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.4-bin.zip