Add a tool and environment for building Aurora packages.

Bugs closed: AURORA-1410

Reviewed at https://reviews.apache.org/r/37107/
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..849ddff
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+dist/
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e45f22f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,33 @@
+## Packaging for Apache Aurora
+
+This repository maintains configuration and tooling for building binary
+distributions of [Apache Aurora](https://aurora.apache.org/).
+
+### Building a binary
+
+Binaries are built within Docker containers that provide the appropriate build
+environment for the target platform.  You will need to have a working Docker
+installation before proceeding.
+
+1. Fetch a source distribution, such as an
+   [official one](https://aurora.apache.org/downloads/).
+
+2. Run the builder script, providing the distribution platform and the source
+   distribution archive you downloaded in (1).  The example below will build
+   Aurora 0.9.0 debs for Ubuntu Trusty.
+
+    ```
+    ./build-artifact.sh builder/deb/ubuntu-trusty \
+      ~/Downloads/apache-aurora-0.9.0.tar.gz
+    ```
+
+When this completes, debs will be placed in `dist/builder/deb/ubuntu-trusty/`.
+
+### Adding a new distribution platform
+
+There are only two requirements for a 'builder' to satisfy:
+
+- a `Dockerfile` to provide the repeatable build environment
+- a `build.sh` script that creates artifacts
+
+Please see the makeup of other builders for examples.
\ No newline at end of file
diff --git a/build-artifact.sh b/build-artifact.sh
new file mode 100755
index 0000000..e6ea723
--- /dev/null
+++ b/build-artifact.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+set -eu
+
+print_available_builders() {
+  find builder -name Dockerfile | sed "s/\/Dockerfile$//"
+}
+
+if [[ $# -ne 2 ]]; then
+  echo "usage: $0 BUILDER RELEASE_TAR"
+  echo 'Where BUILDER is a builder directory in:'
+  print_available_builders
+  exit 1
+else
+  BUILDER_DIR=$1
+  RELEASE_TAR=$2
+fi
+
+IMAGE_NAME="aurora-$(basename $BUILDER_DIR)"
+docker build -t "$IMAGE_NAME" "$BUILDER_DIR"
+
+ARTIFACT_DIR="$(pwd)/dist/$BUILDER_DIR"
+mkdir -p $ARTIFACT_DIR
+docker run \
+  --rm \
+  -v "$(pwd)/specs:/specs:ro" \
+  -v "$(realpath $RELEASE_TAR):/src.tar.gz:ro" \
+  -v "$ARTIFACT_DIR:/dist" \
+  -t "$IMAGE_NAME" /build.sh
+
+echo 'Produced artifacts:'
+ls $ARTIFACT_DIR
diff --git a/builder/deb/ubuntu-trusty/Dockerfile b/builder/deb/ubuntu-trusty/Dockerfile
new file mode 100644
index 0000000..73f150b
--- /dev/null
+++ b/builder/deb/ubuntu-trusty/Dockerfile
@@ -0,0 +1,52 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+FROM ubuntu:trusty
+
+WORKDIR /aurora
+ENV HOME /aurora
+ENV DEBIAN_FRONTEND noninteractive
+# TODO(wfarner): Provide external parameterization via env vars for versions.
+ENV THRIFT_DEB thrift-compiler_0.9.1_amd64.deb
+
+RUN apt-get update && apt-get -y install \
+  bison \
+  debhelper \
+  devscripts \
+  dpkg-dev \
+  curl \
+  git \
+  libapr1-dev \
+  libcurl4-openssl-dev \
+  libsvn-dev \
+  python-all-dev \
+  software-properties-common
+
+RUN add-apt-repository ppa:openjdk-r/ppa -y \
+  && apt-get update \
+  && apt-get install -y openjdk-8-jdk \
+  && update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
+
+RUN curl -O http://people.apache.org/~jfarrell/thrift/0.9.1/contrib/deb/ubuntu/12.04/$THRIFT_DEB \
+  && dpkg --install $THRIFT_DEB \
+  && rm $THRIFT_DEB
+
+# Install gradle 2.5.
+RUN git clone --depth 1 https://github.com/benley/gradle-packaging \
+  && cd gradle-packaging \
+  && apt-get install -y ruby ruby-dev unzip wget \
+  && gem install fpm && ./gradle-mkdeb.sh 2.5 \
+  && dpkg -i gradle-2.5_2.5-2_all.deb \
+  && cd .. && rm -rf gradle-packaging
+
+ADD build.sh /build.sh
+ADD pants.ini /pants.ini
diff --git a/builder/deb/ubuntu-trusty/build.sh b/builder/deb/ubuntu-trusty/build.sh
new file mode 100755
index 0000000..6bee0e7
--- /dev/null
+++ b/builder/deb/ubuntu-trusty/build.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+set -ex
+
+mkdir /scratch
+cd /scratch
+
+tar --strip-components 1 -C . -xf /src.tar.gz
+
+cp -R /specs/debian .
+
+dch \
+  -b \
+  -v $(cat .auroraversion)~SNAPSHOT \
+  -u low --maintmaint \
+  "Apache Aurora package builder <dev@aurora.apache.org> $(date -R)"
+
+dpkg-buildpackage -uc -b -tc
+
+mv ../*.deb /dist
diff --git a/specs/debian/pants.ini b/builder/deb/ubuntu-trusty/pants.ini
similarity index 100%
rename from specs/debian/pants.ini
rename to builder/deb/ubuntu-trusty/pants.ini
diff --git a/builder/rpm/centos-7/Dockerfile b/builder/rpm/centos-7/Dockerfile
new file mode 100644
index 0000000..05da048
--- /dev/null
+++ b/builder/rpm/centos-7/Dockerfile
@@ -0,0 +1,37 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+FROM centos:7
+
+RUN yum install -y \
+    make \
+    rpm-build \
+    yum-utils \
+    apr-devel \
+    cyrus-sasl-devel \
+    gcc \
+    gcc-c++ \
+    git \
+    java-1.8.0-openjdk-devel \
+    krb5-devel \
+    libcurl-devel \
+    patch \
+    python \
+    python-devel \
+    subversion-devel \
+    tar \
+    unzip \
+    wget \
+    zlib-devel
+
+ADD build.sh /build.sh
+ADD pants.ini /pants.ini
diff --git a/builder/rpm/centos-7/build.sh b/builder/rpm/centos-7/build.sh
new file mode 100755
index 0000000..9e8eae9
--- /dev/null
+++ b/builder/rpm/centos-7/build.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+set -ex
+
+mkdir -p /scratch/src
+cd /scratch
+
+tar --strip-components 1 -C src -xf /src.tar.gz
+
+cp -R /specs/rpm .
+cd rpm
+
+make srpm
+yum-builddep -y ../../../dist/rpmbuild/SRPMS/*
+make rpm
diff --git a/builder/rpm/centos-7/pants.ini b/builder/rpm/centos-7/pants.ini
new file mode 100644
index 0000000..00074cb
--- /dev/null
+++ b/builder/rpm/centos-7/pants.ini
@@ -0,0 +1,9 @@
+[DEFAULT]
+pants_cachedir: %(homedir)s/.pants.d
+
+[python-setup]
+download_cache: %(pants_cachedir)s/python/downloads
+install_cache: %(pants_cachedir)s/python/eggs
+
+[python-repos]
+repos: ['third_party/', 'https://svn.apache.org/repos/asf/incubator/aurora/3rdparty/centos/7/python/']
diff --git a/specs/debian/rules b/specs/debian/rules
index d981400..ef35a04 100755
--- a/specs/debian/rules
+++ b/specs/debian/rules
@@ -21,7 +21,7 @@
 
 gradle = $(shell which gradle)
 pants = $(CURDIR)/pants
-PANTS_CONFIG_OVERRIDE = $(CURDIR)/debian/pants.ini
+PANTS_CONFIG_OVERRIDE = /pants.ini
 export PANTS_CONFIG_OVERRIDE
 
 override_dh_auto_build: __gradle_build __pants_build
@@ -31,12 +31,12 @@
 
 __pants_build:
 	mkdir -p third_party
-	$(pants) binary src/main/python/apache/aurora/executor:thermos_executor
-	$(pants) binary src/main/python/apache/aurora/kerberos:kaurora
-	$(pants) binary src/main/python/apache/aurora/kerberos:kaurora_admin
+	$(pants) binary src/main/python/apache/aurora/executor/bin:thermos_executor
+	$(pants) binary src/main/python/apache/aurora/client/cli:kaurora
+	$(pants) binary src/main/python/apache/aurora/admin:kaurora_admin
 	$(pants) binary src/main/python/apache/aurora/tools:thermos
 	$(pants) binary src/main/python/apache/aurora/tools:thermos_observer
-	$(pants) binary src/main/python/apache/thermos/runner:thermos_runner
+	$(pants) binary src/main/python/apache/thermos/bin:thermos_runner
 	build-support/embed_runner_in_executor.py
 
 override_dh_installinit:
diff --git a/specs/rpm/Makefile b/specs/rpm/Makefile
index 1833a25..77605fe 100644
--- a/specs/rpm/Makefile
+++ b/specs/rpm/Makefile
@@ -10,20 +10,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-
-GIT_COMMIT ?= HEAD
-
-USING_GIT ?= $(shell git status >/dev/null 2>&1 && echo 'true' || echo 'false')
-ifeq ($(USING_GIT),true)
-	VERSION_SUFFIX := .$(shell git rev-parse --short $(GIT_COMMIT))
-else
-	VERSION_SUFFIX :=
-endif
-
 CURRENT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
 
-TOPDIR ?= $(CURRENT_DIR)/../../..
-DIST_DIR ?= $(TOPDIR)/dist
+TOPDIR ?= /scratch/src
+DIST_DIR ?= /dist
 RPM_TOPDIR ?= $(DIST_DIR)
 
 DATETIME ?= $(shell date +%Y%m%d%H%M)
@@ -39,7 +29,7 @@
 all: release_rpm
 
 nightly_version:
-	$(eval AURORA_VERSION := $(AURORA_VERSION).$(DATETIME)$(VERSION_SUFFIX))
+	$(eval AURORA_VERSION := $(AURORA_VERSION).$(DATETIME))
 
 release_version:
 	$(eval AURORA_VERSION := $(AURORA_VERSION))
@@ -53,20 +43,9 @@
 	mkdir -p $(RPM_TOPDIR)/rpmbuild/RPMS
 	mkdir -p $(RPM_TOPDIR)/rpmbuild/SOURCES
 	mkdir -p $(RPM_TOPDIR)/rpmbuild/SRPMS
+	cp /src.tar.gz $(SOURCE_TARGET)
 
-tar_source: mkdir
-	if [[ "$(USING_GIT)" == 'true' ]]; then \
-		cd `git rev-parse --show-toplevel` && git archive --format=tar --prefix=aurora/ $(GIT_COMMIT) | gzip > $(SOURCE_TARGET); \
-	else \
-		tmp_dir=`mktemp -d '/tmp/aurorabuild.XXXXXX'`; \
-		mkdir $${tmp_dir}/aurora; \
-		cp -r $(TOPDIR)/* $${tmp_dir}/aurora; \
-		cd $${tmp_dir}; \
-		tar cvzf $(SOURCE_TARGET) aurora; \
-		rm -rf $${tmp_dir}; \
-	fi
-
-srpm: tar_source
+srpm: mkdir
 	rpmbuild $(RPM_OPTS) \
 		--define "_topdir $(RPM_TOPDIR)" \
 		--define "_builddir %{_topdir}/rpmbuild/BUILD" \
@@ -79,7 +58,7 @@
 		--define "MESOS_VERSION $(MESOS_VERSION)" \
 		--nodeps -bs aurora.spec
 
-rpm: tar_source
+rpm: mkdir
 	rpmbuild $(RPM_OPTS) \
 		--define "_topdir $(RPM_TOPDIR)" \
 		--define "_builddir %{_topdir}/rpmbuild/BUILD" \
diff --git a/specs/rpm/aurora.spec b/specs/rpm/aurora.spec
index 5ec516f..e6fca4e 100644
--- a/specs/rpm/aurora.spec
+++ b/specs/rpm/aurora.spec
@@ -37,10 +37,6 @@
 %global JAVA_VERSION 1.8.0
 %endif
 
-%if %{?!MESOS_BASEURL:1}0
-%global MESOS_BASEURL https://archive.apache.org/dist/mesos
-%endif
-
 %if %{?!MESOS_VERSION:1}0
 %global MESOS_VERSION 0.22.0
 %endif
@@ -141,7 +137,7 @@
 
 
 %prep
-%setup -n %{name}
+%setup -n apache-%{name}-%{version}
 
 
 %build
@@ -163,40 +159,27 @@
 wget %{GRADLE_BASEURL}/gradle-%{GRADLE_VERSION}-bin.zip
 unzip gradle-%{GRADLE_VERSION}-bin.zip
 
-# Creates Pants directory where we'll store our native Mesos Python eggs.
-mkdir -p .pants.d/python/eggs/
-
-# Builds mesos-native and mesos-interface eggs if not currently packaged.
-wget "%{MESOS_BASEURL}/%{MESOS_VERSION}/mesos-%{MESOS_VERSION}.tar.gz"
-tar xvzf mesos-%{MESOS_VERSION}.tar.gz
-pushd mesos-%{MESOS_VERSION}
-./configure --disable-java
-make
-find . -name '*.egg' -exec cp -v {} ../.pants.d/python/eggs/ \;
-popd
-
 # Builds the Aurora scheduler.
 ./gradle-%{GRADLE_VERSION}/bin/gradle installDist
 
+# Configures pants to use our distributed platform-specific eggs.
+# This avoids building mesos to produce them.
+export PANTS_CONFIG_OVERRIDE=/pants.ini
+
 # Builds Aurora client PEX binaries.
-./pants binary src/main/python/apache/aurora/kerberos:kaurora
-./pants binary src/main/python/apache/aurora/kerberos:kaurora_admin
+./pants binary src/main/python/apache/aurora/client/cli:kaurora
+mv dist/kaurora.pex dist/aurora.pex
+./pants binary src/main/python/apache/aurora/admin:kaurora_admin
+mv dist/kaurora_admin.pex dist/aurora_admin.pex
 
 # Builds Aurora Thermos and GC executor PEX binaries.
-./pants binary src/main/python/apache/aurora/executor:thermos_executor
+./pants binary src/main/python/apache/aurora/executor/bin:thermos_executor
 ./pants binary src/main/python/apache/aurora/tools:thermos
-./pants binary src/main/python/apache/thermos/runner:thermos_runner
+./pants binary src/main/python/apache/thermos/bin:thermos_runner
 ./pants binary src/main/python/apache/aurora/tools:thermos_observer
 
 # Packages the Thermos runner within the Thermos executor.
-python <<EOF
-import contextlib
-import zipfile
-with contextlib.closing(zipfile.ZipFile('dist/thermos_executor.pex', 'a')) as zf:
-  zf.writestr('apache/aurora/executor/resources/__init__.py', '')
-  zf.write('dist/thermos_runner.pex', 'apache/aurora/executor/resources/thermos_runner.pex')
-EOF
-
+build-support/embed_runner_in_executor.py
 
 %install
 rm -rf $RPM_BUILD_ROOT
@@ -224,10 +207,6 @@
   install -m 755 dist/${pex_binary}.pex %{buildroot}%{_bindir}/${pex_binary}
 done
 
-# Strip the "k" from Kerberized client binaries.
-mv %{buildroot}%{_bindir}/kaurora %{buildroot}%{_bindir}/aurora
-mv %{buildroot}%{_bindir}/kaurora_admin %{buildroot}%{_bindir}/aurora_admin
-
 # Installs all support scripting.
 %if 0%{?fedora} || 0%{?rhel} > 6
 install -m 644 build-support/packaging/rpm/%{name}.service %{buildroot}%{_sysconfdir}/systemd/system/%{name}.service