blob: 3f5ab3973208fc9e0c56288ca9ba32b851598dfb [file] [log] [blame]
#!/bin/bash
# Dependencies: vagrant >= 1.5.0 (for vagrantcloud support), VirtualBox
# System Requirements: 4 GiB of RAM free.
set -u -e
MESOS_BASEURL=https://archive.apache.org/dist/mesos
BOX_RAM_MB=$((8 * 1024)) # at least 4 GiB, needed to link libmesos
BOX_CPUS=4
usage() {
cat <<EOF
Usage: make-mesos-native-egg.sh TARGET_DISTRIBUTION MESOS_VERSION AURORA_3RDPARTY_ROOT
Build a mesos Python egg in a pristine Vagrant environment.
TARGET_DISTRIBUTION is one of (centos6, centos7, jessie64, trusty64, xenial64).
MESOS_VERSION is a released version of mesos available on archive.apache.org.
AURORA_3RDPARTY_ROOT is the path to a sparse checkout of the Aurora 3rdparty repo.
EOF
exit ${1:-1}
}
setup_tempdir() {
TMPDIR=$(mktemp -d -t make-mesos-eggs.XXXXX)
cleanup() {
cd "$TMPDIR"
if [[ -f Vagrantfile ]]; then
vagrant destroy -f
fi
cd /
rm -frv "$TMPDIR"
}
# TODO(ksweeney): Use atexit.sh from mesos and its superior handling of this cleanup idiom.
trap cleanup EXIT
}
# Create a new vagrant box
init_vagrant_box() {
local box_name=$1
cat > Vagrantfile <<EOF
Vagrant.require_version ">= 1.5.0"
Vagrant.configure("2") do |config|
config.vm.box = "$box_name"
config.vm.provider "virtualbox" do |vb|
vb.memory = "$BOX_RAM_MB"
vb.cpus = "$BOX_CPUS"
end
end
EOF
}
fetch_and_build_mesos() {
local mesos_version=$1
cat <<EOF
wget --progress=dot "$MESOS_BASEURL/$mesos_version/mesos-${mesos_version}.tar.gz"
tar zxvf mesos-${mesos_version}.tar.gz
cd mesos-$mesos_version
./configure --disable-java --enable-optimize
export MAKEFLAGS="-j$BOX_CPUS"
make
find . -name '*.egg' -exec cp -v {} /vagrant \\;
EOF
}
DEBIAN_JESSIE64_DEPENDENCIES=(
g++
make
libapr1-dev
libcurl4-nss-dev
libsasl2-dev
libsvn-dev
python-dev
python-virtualenv
zlib1g-dev
)
build_debian_jessie64() {
local mesos_version=$1 output_basedir=$2
local python_outdir=$output_basedir/debian/jessie64/python
pushd "$TMPDIR"
# Using bento debian box due to debian/jessie64 not having
# guest additions installed. No guest additions = no /vagrant.
init_vagrant_box bento/debian-8.6
vagrant up
vagrant ssh <<EOF
set -e -u
sudo apt-get update
sudo apt-get -y install ${DEBIAN_JESSIE64_DEPENDENCIES[*]}
$(fetch_and_build_mesos "$mesos_version")
EOF
mkdir -pv "$python_outdir"
cp -v mesos.executor*.egg "$python_outdir"
popd
}
UBUNTU_TRUSTY64_DEPENDENCIES=(
g++-4.8
libapr1-dev
libcurl4-nss-dev
libsasl2-dev
libsvn-dev
python-dev
python-virtualenv
zlib1g-dev
)
build_ubuntu_trusty64() {
local mesos_version=$1 output_basedir=$2
local python_outdir=$output_basedir/ubuntu/trusty64/python
pushd "$TMPDIR"
init_vagrant_box ubuntu/trusty64
vagrant up
vagrant ssh <<EOF
set -e -u
sudo apt-get update
sudo apt-get -y install ${UBUNTU_TRUSTY64_DEPENDENCIES[*]}
$(fetch_and_build_mesos "$mesos_version")
EOF
mkdir -pv "$python_outdir"
cp -v mesos.executor*.egg "$python_outdir"
popd
}
UBUNTU_XENIAL64_DEPENDENCIES=(
g++
libapr1-dev
libcurl4-nss-dev
libsasl2-dev
libsvn-dev
python-dev
python-virtualenv
zlib1g-dev
)
build_ubuntu_xenial64() {
local mesos_version=$1 output_basedir=$2
local python_outdir=$output_basedir/ubuntu/xenial64/python
pushd "$TMPDIR"
# Using bento box due to ubuntu/xenial64
# not being configured properly for Vagrant
init_vagrant_box bento/ubuntu-16.04
vagrant up
vagrant ssh <<EOF
set -e -u
sudo apt-get update
sudo apt-get -y install ${UBUNTU_XENIAL64_DEPENDENCIES[*]}
$(fetch_and_build_mesos "$mesos_version")
EOF
mkdir -pv "$python_outdir"
cp -v mesos.executor*.egg "$python_outdir"
popd
}
CENTOS6_X86_64_DEPENDENCIES=(
apr-devel
cyrus-sasl-devel
cyrus-sasl-md5
devtoolset-2-binutils
devtoolset-2-gcc
devtoolset-2-gcc-c++
libcurl-devel
patch
python27-python-devel
subversion-devel
zlib-devel
)
build_centos6() {
local mesos_version=$1 output_basedir=$2
local python_outdir=$output_basedir/centos/6/python
pushd "$TMPDIR"
init_vagrant_box bento/centos-6.7
vagrant up
vagrant ssh <<EOF
set -e -u
# We need Software Collections for Python 2.7 (we dropped support for 2.6).
sudo yum -y install centos-release-SCL
# Mesos requires gcc 4.8, which is available in devtools-2 on centos 6.
# TODO(maxim): Consider using signed packages when/if available.
sudo wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo
sudo yum -y install ${CENTOS6_X86_64_DEPENDENCIES[*]}
scl enable devtoolset-2 bash
scl enable python27 - <<EOS
$(fetch_and_build_mesos "$mesos_version")
EOS
EOF
mkdir -pv "$python_outdir"
cp -v mesos.executor*.egg "$python_outdir"
popd
}
CENTOS7_X86_64_DEPENDENCIES=(
apr-devel
cyrus-sasl-devel
cyrus-sasl-md5
gcc-c++
libcurl-devel
patch
python-devel
subversion-devel
zlib-devel
)
build_centos7() {
local mesos_version=$1 output_basedir=$2
local python_outdir=$output_basedir/centos/7/python
mkdir -pv "$python_outdir"
pushd "$TMPDIR"
init_vagrant_box bento/centos-7.1
vagrant up
vagrant ssh <<EOF
set -e -u
sudo yum -y install ${CENTOS7_X86_64_DEPENDENCIES[*]}
$(fetch_and_build_mesos "$mesos_version")
EOF
cp -v mesos.executor*.egg "$python_outdir"
popd
}
main() {
local target_distribution=$1
local mesos_version=$2
local output_basedir=$3
if [[ ! -d "$output_basedir" ]]; then
echo "'$output_basedir' is not a directory."
echo
usage 1
fi
setup_tempdir
pushd "$TMPDIR"
case "$target_distribution" in
jessie64)
build_debian_jessie64 "$mesos_version" "$output_basedir"
;;
trusty64)
build_ubuntu_trusty64 "$mesos_version" "$output_basedir"
;;
xenial64)
build_ubuntu_xenial64 "$mesos_version" "$output_basedir"
;;
centos6)
build_centos6 "$mesos_version" "$output_basedir"
;;
centos7)
build_centos7 "$mesos_version" "$output_basedir"
;;
*)
echo "Invalid distribution '$target_distribution'."
echo
usage 1
;;
esac
popd
}
if [[ ${1:-""} = -h ]]; then usage 0; elif [[ $# -ne 3 ]]; then usage 1; fi
main "$@"