blob: 6f1041d49718e39101b21a3dfff193f54f8bd882 [file] [log] [blame]
#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
# This is the master shell script to build Docker containers
# for CouchDB 2.x.
# stop on error
set -e
# This works if we're not called through a symlink
# otherwise, see https://stackoverflow.com/questions/59895/
SCRIPTPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# TODO derive these by interrogating the repo rather than hard coding the list
DEBIANS="debian-stretch debian-buster arm64v8-debian-buster ppc64le-debian-buster"
UBUNTUS="ubuntu-xenial ubuntu-bionic ubuntu-focal"
CENTOSES="centos-6 centos-7 centos-8"
BINTRAY_API="https://api.bintray.com"
ERLANGVERSION=${ERLANGVERSION:-20.3.8.25-1}
build-js() {
# TODO: check if image is built first, if not, complain
# invoke as build-js <plat>
if [[ ${TRAVIS} == "true" ]]; then
docker run \
--mount type=bind,src=${SCRIPTPATH},dst=/home/jenkins/couchdb-pkg \
-u 0 couchdbdev/$1-base \
/home/jenkins/couchdb-pkg/bin/build-js.sh
else
docker run \
--mount type=bind,src=${SCRIPTPATH},dst=/home/jenkins/couchdb-pkg \
couchdbdev/$1-base \
sudo /home/jenkins/couchdb-pkg/bin/build-js.sh
fi
}
build-all-js() {
rm -rf ${SCRIPTPATH}/pkgs/js/*
for plat in $DEBIANS $UBUNTUS $CENTOSES; do
build-js $plat
done
}
bintray-check-credentials() {
if [[ ! ${BINTRAY_USER} || ! ${BINTRAY_API_KEY} ]]; then
echo "Please set your Bintray credentials before using this command:"
echo " export BINTRAY_USER=<username>"
echo " export BINTRAY_API_KEY=<key>"
exit 1
fi
}
bintray-upload() {
echo "Uploading ${PKG}..."
local ret="$(curl \
--request PUT \
--upload-file $PKG \
--user ${BINTRAY_USER}:${BINTRAY_API_KEY} \
--header "X-Bintray-Package: ${PKGNAME}" \
--header "X-Bintray-Version: ${PKGVERSION}" \
--header "X-Bintray-Publish: 1" \
--header "X-Bintray-Override: 1" \
--header "X-Bintray-Explode: 0" \
"${HEADERS[@]}" \
"${BINTRAY_API}/content/apache/${REPO}/${RELPATH}")"
if [[ ${ret} == '{"message":"success"}' ]]; then
echo "Uploaded successfully."
else
echo "Failed to upload $PKG, ${ret}"
exit 1
fi
}
upload-js() {
# invoke with $1 as plat, expect to find the binaries under pkgs/js/$plat/*
bintray-check-credentials
# Debian packages first
PKGNAME="spidermonkey"
PKGVERSION="1.8.5"
for PKG in $(ls pkgs/js/$1/*.deb 2>/dev/null); do
# Example filename: couch-libmozjs185-1.0_1.8.5-1.0.0+couch-2~bionic_amd64.deb
# TODO: pull this stuff from buildinfo / changes files, perhaps? Not sure it matters.
REPO="couchdb-deb"
fname=${PKG##*/}
DIST=$(echo $fname | cut -d~ -f 2 | cut -d_ -f 1)
PKGARCH=$(echo $fname | cut -d_ -f 3 | cut -d. -f 1)
RELPATH="pool/s/spidermonkey/${fname}"
HEADERS=("--header" "X-Bintray-Debian-Distribution: ${DIST}")
HEADERS+=("--header" "X-Bintray-Debian-Component: main")
HEADERS+=("--header" "X-Bintray-Debian-Architecture: ${PKGARCH}")
bintray-upload
done
for PKG in $(ls pkgs/js/$1/*.rpm 2>/dev/null); do
# Example filename: couch-js-1.8.5-21.el7.x86_64.rpm
REPO="couchdb-rpm"
fname=${PKG##*/}
# better not put any extra . in the filename...
DIST=$(echo $fname | cut -d. -f 4)
PKGARCH=$(echo $fname | cut -d. -f 5)
RELPATH="${DIST}/${PKGARCH}/${fname}"
HEADERS=()
bintray-upload
done
}
cannot-find-tarball() {
echo Must supply path to tarball, either:
echo ' - path/to/couchdb-VERSION.tar.gz or'
echo ' - http(s)://url/to/couchdb-VERSION.tar.gz'
echo
exit 1
}
get-couch-tarball() {
if [ $# -ne "1" ]
then
cannot-find-tarball
fi
ARG=$1
if [ -f $ARG ]
then
# file
cp $ARG . 2>/dev/null || true
COUCHTARBALL=$(basename ${ARG})
else
if [[ $ARG =~ ^http.*$ ]]
then
#url
# thank you, advanced bash scripting guide
curl -O $ARG
COUCHTARBALL=${ARG##*/}
else
usage
exit 1
fi
fi
echo Using ${COUCHTARBALL} to build packages...
chmod 777 ${COUCHTARBALL}
}
build-couch() {
# We will be changing user to 'jenkins' - ensure it has write permissions
chmod a+rwx pkgs pkgs/couch pkgs/js
# $1 is plat, $2 is the optional path to a dist tarball
docker run \
--mount type=bind,src=${SCRIPTPATH},dst=/home/jenkins/couchdb-pkg \
-u 0 -w /home/jenkins/couchdb-pkg \
couchdbdev/$1-erlang-${ERLANGVERSION} \
make copy-couch $1 COUCHTARBALL=${COUCHTARBALL}
make clean
}
build-all-couch() {
rm -rf ${SCRIPTPATH}/pkgs/couch/*
for plat in $DEBIANS $UBUNTUS $CENTOSES; do
build-couch $plat $*
done
}
upload-couch() {
# invoke with $1 as plat, expect to find the binaries under pkgs/couch/$plat/*
bintray-check-credentials
# Debian packages first
PKGNAME="CouchDB"
for PKG in $(ls pkgs/couch/$1/*.deb 2>/dev/null); do
# Example filename: couchdb_2.3.0~jessie_amd64.deb
# TODO: pull this stuff from buildinfo / changes files, perhaps? Not sure it matters.
fname=${PKG##*/}
REPO="couchdb-deb"
DIST=$(echo $fname | cut -d~ -f 2 | cut -d_ -f 1)
PKGARCH=$(echo $fname | cut -d_ -f 3 | cut -d. -f 1)
PKGVERSION=$(echo $fname | cut -d_ -f 2 | cut -d~ -f 1)
RELPATH="pool/C/CouchDB/${fname}"
HEADERS=("--header" "X-Bintray-Debian-Distribution: ${DIST}")
HEADERS+=("--header" "X-Bintray-Debian-Component: main")
HEADERS+=("--header" "X-Bintray-Debian-Architecture: ${PKGARCH}")
bintray-upload
done
for PKG in $(ls pkgs/couch/$1/*.rpm 2>/dev/null); do
# Example filename: couchdb-2.3.0-1.el7.x86_64.rpm.asc
fname=${PKG##*/}
REPO="couchdb-rpm"
# better not put any extra . in the filename...
DIST=$(echo $fname | cut -d. -f 4)
PKGARCH=$(echo $fname | cut -d. -f 5)
PKGVERSION=$(echo $fname | cut -d- -f 2)
RELPATH="${DIST}/${PKGARCH}/${fname}"
HEADERS=()
bintray-upload
done
}
usage() {
cat << EOF
$0 <command> [OPTIONS]
Recognized commands:
clean Remove all built package artefacts.
js <plat> Builds the JS packages for <plat>.
js-all Builds the JS packages for all platforms.
*js-upload <plat> Uploads the JS packages for <plat> to bintray.
*js-upload-all Uploads the JS packages for all platforms to bintray.
couch <plat> <src> Builds CouchDB packages for <plat>.
couch-all <src> Builds CouchDB packages for all platforms.
*couch-upload <plat> Uploads the JS packages for <plat> to bintray.
*couch-upload-all Uploads the JS packages for all platforms to bintray.
<src> is either
- a path/to/a/couchdb.tar.gz, or
- a URL to http(s)://domain.com/to/couchdb.tar.gz
Commands marked with * require BINTRAY_USER and BINTRAY_API_KEY env vars.
EOF
}
case "$1" in
clean)
# removes built pkgs for all platforms
shift
rm -rf ${SCRIPTPATH}/pkgs/js/* ${SCRIPTPATH}/pkgs/couch/*
;;
js)
# Build js packages for a given platform
shift
build-js $1
;;
js-all)
# build all supported JS packages
shift
build-all-js
;;
js-upload)
shift
upload-js $1
;;
js-upload-all)
shift
for dir in $(ls pkgs/js); do
upload-js $dir
done
;;
couch)
# build CouchDB pkgs for <plat>
shift
get-couch-tarball $2
build-couch $*
;;
couch-all)
# build CouchDB pkgs for all platforms
shift
get-couch-tarball $1
build-all-couch
;;
couch-upload)
shift
upload-couch $1
;;
couch-upload-all)
shift
for dir in $(ls pkgs/couch); do
upload-couch $dir
done
;;
*)
if [[ $1 ]]; then
echo "Unknown target $1."
echo
fi
usage
if [[ $1 ]]; then
exit 1
fi
;;
esac
exit 0