This is an automated email from the ASF dual-hosted git repository. wohali pushed a commit to branch scripty-fun in repository https://gitbox.apache.org/repos/asf/couchdb-pkg.git
commit d5a437c332da4f72f0c41d7309b91b3aed611fa3 Author: Joan Touzet <[email protected]> AuthorDate: Wed Dec 5 19:24:30 2018 -0800 Refactor pkg build process to not rely on couchdb-ci --- .gitignore | 6 +- .travis.yml | 41 +++++++ Makefile | 32 ++++-- README.md | 94 ++++++++++++++-- bin/build-couchdb-pkg.sh | 65 +++++++++++ bin/build-js.sh | 60 ++++++++++ bin/detect-os.sh | 137 +++++++++++++++++++++++ build.sh | 286 +++++++++++++++++++++++++++++++++++++++++++++++ make-releases.sh | 59 ---------- pkgs/couch/.gitignore | 2 + pkgs/js/.gitignore | 2 + 11 files changed, 703 insertions(+), 81 deletions(-) diff --git a/.gitignore b/.gitignore index 30fd9cf..8d7d35c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,6 @@ debian/*.substvars debian/files debian/couchdb debian/tmp -js/couch-* -js/couch-* js/build rpm/BUILD rpm/BUILDROOT @@ -14,11 +12,9 @@ rpm/SRPMS repo/db repo/dists repo/pool -pkgs/ -couchdb/ couchdb_*.snap parts/ prime/ snap/.snapcraft/ stage/ -apache-couchdb*.tar.gz +*.tar.gz diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..c6abcf6 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,41 @@ +dist: xenial + +language: minimal + +services: + - docker + +# Avoid double build on PRs (See https://github.com/travis-ci/travis-ci/issues/1147) +branches: + only: + - master + +env: + global: + - ERLANGVER=19.3.6 + - TARBALL_URL=https://dist.apache.org/repos/dist/release/couchdb/source/2.3.0/apache-couchdb-2.3.0.tar.gz + - TARBALL=apache-couchdb-2.3.0.tar.gz + matrix: + - TARGET="js debian-jessie" + - TARGET="couch debian-jessie ${TARBALL_URL}" + - TARGET="js debian-stretch" + - TARGET="couch debian-stretch ${TARBALL_URL}" + - TARGET="js ubuntu-trusty" + - TARGET="couch ubuntu-trusty ${TARBALL_URL}" + - TARGET="js ubuntu-xenial" + - TARGET="couch ubuntu-xenial ${TARBALL_URL}" + - TARGET="js ubuntu-bionic" + - TARGET="couch ubuntu-bionic ${TARBALL_URL}" + - TARGET="js centos-6" + - TARGET="couch centos-6 ${TARBALL_URL}" + - TARGET="js centos-7" + - TARGET="couch centos-7 ${TARBALL_URL}" + +before_install: + - docker --version + +script: + - ./build.sh ${TARGET} + +after_script: + - ls -laR pkgs/ diff --git a/Makefile b/Makefile index f4f425b..d41f77d 100644 --- a/Makefile +++ b/Makefile @@ -20,19 +20,25 @@ export DEBFULLNAME="CouchDB Developers" export DEBEMAIL="[email protected]" # Debian default -debian: find-couch-dist copy-debian update-changelog dpkg lintian +debian: find-couch-dist copy-debian update-changelog dpkg lintian copy-pkgs # Debian 8 +debian-jessie: PLATFORM=jessie +debian-jessie: DIST=debian-jessie debian-jessie: jessie jessie: debian # Debian 9 +debian-stretch: PLATFORM=stretch +debian-stretch: DIST=debian-stretch debian-stretch: stretch stretch: debian # Ubuntu 12.04 +ubuntu-precise: PLATFORM=precise +ubuntu-precise: DIST=ubuntu-precise ubuntu-precise: precise -precise: find-couch-dist copy-debian precise-prep update-changelog dpkg +precise: find-couch-dist copy-debian precise-prep update-changelog dpkg copy-pkgs precise-prep: sed -i '/dh-systemd/d' $(DISTDIR)/debian/control @@ -44,8 +50,10 @@ precise-prep: # No lintian run because of bogus failure on # postrm-does-not-call-updaterc.d-for-init.d-script # See Ubuntu ufw changelog for why they disabled this check +ubuntu-trusty: PLATFORM=trusty +ubuntu-trusty: DIST=ubuntu-trusty ubuntu-trusty: trusty -trusty: find-couch-dist copy-debian trusty-prep update-changelog dpkg +trusty: find-couch-dist copy-debian trusty-prep update-changelog dpkg copy-pkgs # see changelog for ubuntu ufw package, this is safe trusty-prep: @@ -53,19 +61,25 @@ trusty-prep: sed -i '/erlang-*/d' $(DISTDIR)/debian/control # Ubuntu 16.04 +ubuntu-xenial: PLATFORM=xenial +ubuntu-xenial: DIST=ubuntu-xenial ubuntu-xenial: xenial xenial: debian # Ubuntu 18.04 +ubuntu-bionic: PLATFORM=bionic +ubuntu-bionic: DIST=ubuntu-bioniC ubuntu-bionic: bionic bionic: debian # RPM default -centos: find-couch-dist link-couch-dist build-rpm +centos: find-couch-dist link-couch-dist build-rpm copy-pkgs +centos-6: DIST=centos-6 centos-6: centos6 centos6: make-rpmbuild centos +centos-7: DIST=centos-7 centos-7: centos7 centos7: make-rpmbuild centos @@ -140,13 +154,13 @@ build-rpm: # ###################################### copy-pkgs: - mkdir -p pkgs/$(PLATFORM) - -cp ../rpmbuild/RPMS/x86_64/*.rpm pkgs/$(PLATFORM) - -cp ../couchdb/*deb pkgs/$(PLATFORM) - -chmod -R a+rwx pkgs/$(PLATFORM) + -chmod a+rwx ../rpmbuild/RPMS/x86_64/couchdb-* ../couchdb/couchdb_* 2>/dev/null + -mkdir -p pkgs/couch/$(DIST) && chmod 777 pkgs/couch/$(DIST) + -cp ../rpmbuild/RPMS/x86_64/couchdb-* pkgs/couch/$(DIST) 2>/dev/null + -cp ../couchdb/couchdb_* pkgs/couch/$(DIST) 2>/dev/null clean: - rm -rf couchdb_2.0_amd64.snap parts prime snap/.snapcraft stage js/build + rm -rf parts prime stage js/build # ###################################### couch-js-clean: diff --git a/README.md b/README.md index 71df666..9ec06d3 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,76 @@ -# CouchDB Packaging support files +# CouchDB Packaging support repo -Quickstart: +The main purpose of this repository is to provide packaging support files for Apache CouchDB and its SpiderMoneky 1.8.5 dependency, for a number of well-known and used packaging formats, namely: + +* `.deb` files, as used by Debian, Ubuntu, and derivatives +* `.rpm` files, as used by CentOS, RedHat, and derivatives +* `snapcraft` files, as used by the Ubuntu Snappy package manager + +# Usage + +## On a system with all necessary build-time dependencies: + +### SpiderMonkey 1.8.5 + +#### rpms + +```shell +make couch-js-rpms +``` + +#### debs ```shell -$ cd .. && git clone https://github.com/apache/couchdb -$ cd couchdb-pkg && make build-couch $(lsb_release -cs) PLATFORM=$(lsb_release -cs) +make couch-js-debs PLATFORM=$(lsb_release -cs) ``` +### CouchDB + +#### rpms or debs from `master` branch: + +```shell +cd .. && git clone https://github.com/apache/couchdb +cd couchdb-pkg && make build-couch $(lsb_release -cs) PLATFORM=$(lsb_release -cs) +``` + +#### rpms or debs from a release tarball: + +```shell +make copy-couch $(lsb_release -cs) COUCHTARBALL=path/to/couchdb-#.#.#.tar.gz PLATFORM=$(lsb_release -cs) +``` + +----- + +## Building inside the `couchdbdev` docker containers + +You must first pull down the image or images you need from Docker Hub, or build the images using the [apache/couchdb-ci](https://github.com/apache/couchdb-ci) repository. Example: + +```shell +docker pull couchdbdev/<osname>-<codename>-erlang-<erlang-version> +``` + +A full list of supported environments is at https://hub.docker.com/u/couchdbdev/ . + +### SpiderMonkey 1.8.5 + +```shell +./build.sh js <os>-<codename> # for example, debian-stretch, ubuntu-bionic or centos-7. +``` + +### CouchDB + +```shell +./build.sh couch <os>-<codename> path/to/couchdb-#.#.#.tar.gz +``` + +or, if you want to build directly from the Apache distribution repository, + +```shell +./build.sh couch <os>-<codename> https://dist.apache.org/repos/dist/release/couchdb/source/#.#.#/apache-couchdb-#.#.#.tar.gz +``` + +----- + # Building packages for a release ## Prerequisites @@ -25,13 +89,27 @@ will be derived from the filename of the CouchDB dist tarball. Run: - $ ./make-packages path/to/apache-couchdb-VERSION.tar.gz + $ ./build.sh couch-all path/to/apache-couchdb-VERSION.tar.gz or - $ ./make-packages http://url/to/apache-couchdb-VERSION.tar.gz + $ ./build.sh couch-all http://url/to/apache-couchdb-VERSION.tar.gz + +Packages will be placed in the `pkgs/couch` subdirectory. + +A similar `js-all` target exists, should the SpiderMonkey packages need to be regenerated. + +## Uploading the packages + +If you have Apache Bintray credentials (set your `BINTRAY_USER` and `BINTRAY_API_KEY` environment variables appropriately), after building all CouchDB packages above, simply run: + + ./build.sh couch-upload-all + +Or, for the SpiderMonkey packages: + + ./build.sh js-upload-all -Packages will be placed in the `pkgs/` subdirectory. +----- # Building snaps @@ -42,7 +120,7 @@ Packages will be placed in the `pkgs/` subdirectory. ## How to do it -1. Edit `snap/snapcraft.yaml` to point to the correct tag (e.g. `2.1.0`) +1. Edit `snap/snapcraft.yaml` to point to the correct tag (e.g. `2.3.0`) 1. `snapcraft` # Feedback, Issues, Contributing diff --git a/bin/build-couchdb-pkg.sh b/bin/build-couchdb-pkg.sh new file mode 100755 index 0000000..e7a30e8 --- /dev/null +++ b/bin/build-couchdb-pkg.sh @@ -0,0 +1,65 @@ +#!/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 shell script builds and tests CouchDB on the current host. +# It assumes the build environment is already set up correctly. +# It needs no special privileges. + +# stop on error +set -e + +SCRIPTPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +. ${SCRIPTPATH}/detect-os.sh + +redhats='(rhel|centos|fedora)' +debians='(debian|ubuntu)' + +cd /home/jenkins + +if [[ $1 ]]; then + # use copied package + mkdir couchdb + tar -xf ${SCRIPTPATH}/../$1 -C couchdb + cp ${SCRIPTPATH}/../$1 couchdb +else + # use master branch + git clone https://github.com/apache/couchdb + cd couchdb + ./configure -c + make dist + cd .. +fi + +# now, build the package +cd couchdb-pkg +platform=${ID}-${VERSION_CODENAME} +make $platform PLATFORM=${VERSION_CODENAME} + +# and save the output +if [[ ${ID} =~ ${redhats} ]]; then + mv ../rpmbuild/RPMS/* ${SCRIPTPATH}/../couch/$platform +elif [[ ${ID} =~ ${debians} ]]; then + mv ../couchdb/*.deb ${SCRIPTPATH}/../couch/$platform +else + echo "Sorry, we don't support this Linux (${ID}) yet." + exit 1 +fi +# and make sure we can delete it if necessary +chmod -R a+rwx ${SCRIPTPATH}/../couch/$platform/* diff --git a/bin/build-js.sh b/bin/build-js.sh new file mode 100755 index 0000000..5eb7e57 --- /dev/null +++ b/bin/build-js.sh @@ -0,0 +1,60 @@ +#!/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 shell script builds a CouchDB-compatible SpiderMonkey 1.8.5 +# and assumes the build environment is already set up correctly. +# It expects to be run as root. + +# 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 )" +ARCH=$(arch) + +# Check if running as root +if [[ ${EUID} -ne 0 ]]; then + echo "Sorry, this script must be run as root." + echo "Try: sudo $0 $*" + exit 1 +fi + +. ${SCRIPTPATH}/detect-os.sh + +cd ${SCRIPTPATH}/.. + +redhats='(rhel|centos|fedora)' +debians='(debian|ubuntu)' +if [[ ${ID} =~ ${redhats} ]]; then + # it will always place the build path at /root/rpmbuild :( + cp -r ${SCRIPTPATH}/.. /root/couchdb-pkg + cd /root/couchdb-pkg + make couch-js-rpms + mkdir -p ${SCRIPTPATH}/../pkgs/js/${ID}-${VERSION_CODENAME} + mv /root/rpmbuild/RPMS/${ARCH}/couch-js-* ${SCRIPTPATH}/../pkgs/js/${ID}-${VERSION_CODENAME} +elif [[ ${ID} =~ ${debians} ]]; then + make couch-js-debs PLATFORM=${VERSION_CODENAME} + mkdir -p pkgs/js/${ID}-${VERSION_CODENAME} + mv js/couch-lib* pkgs/js/${ID}-${VERSION_CODENAME} +else + echo "Sorry, we don't support this Linux (${ID}) yet." + exit 1 +fi +chmod a+rw pkgs/js/* diff --git a/bin/detect-os.sh b/bin/detect-os.sh new file mode 100755 index 0000000..f664f33 --- /dev/null +++ b/bin/detect-os.sh @@ -0,0 +1,137 @@ +#!/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 shell script detects the OS we're on, and sets a number +# of environment variables the calling script can use. + +# It uses the systemd standard of variables, and attempts to +# populate some of the variables manually if systemd is not +# present on the underlying OS. + +# Example systemd /etc/os-release file: +# NAME="Ubuntu" +# VERSION="16.04.4 LTS (Xenial Xerus)" +# ID=ubuntu +# ID_LIKE=debian +# PRETTY_NAME="Ubuntu 16.04.4 LTS" +# VERSION_ID="16.04" +# HOME_URL="http://www.ubuntu.com/" +# SUPPORT_URL="http://help.ubuntu.com/" +# BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" +# VERSION_CODENAME=xenial +# UBUNTU_CODENAME=xenial + +# While these scripts are primarily written to support building CI +# Docker images, they can be used on any workstation to install a +# suitable build environment. + +# stop on error +set -e + +case "${OSTYPE}" in + linux*) + echo "Detected OS: Linux" + # Try the new, systemd-based way first + . /etc/os-release 2>/dev/null || true + # then try lsb_release, which might be installed + # os-release doesn't actually give us everything we want... + lsb_plat=$(lsb_release -d 2>/dev/null | awk -F"\t" '{print $2}' 2>/dev/null) + if [[ ${lsb_plat} ]]; then + if [[ ${lsb_plat} =~ "^Debian" ]]; then + ID=${ID:-debian} + VERSION_ID=${VERSION_ID:-$(echo ${lsb_plat} | awk '{print $3}' | awk -F'.' '{print $1}')} + VERSION_CODENAME=${VERSION_CODENAME:-$(echo ${lsb_plat} | awk '{print $4}' | sed 's/[\(\)]//g')} + DISTRIB_CODENAME=${DISTRIB_CODENAME:-${VERSION_CODENAME}} + elif [[ ${lsb_plat} =~ "^Ubuntu" ]]; then + ID=${ID:-ubuntu} + VERSION_ID=${VERSION_ID:-$(echo ${lsb_plat} | awk '{print $2}' | awk -F'.' '{print $1}')} + VERSION_CODENAME=${VERSION_CODENAME:-$(lsb_release -cs)} + DISTRIB_CODENAME=${DISTRIB_CODENAME:-${VERSION_CODENAME}} + fi + fi + # and finally some rough heuristics + if [[ -f /etc/redhat-release ]]; then + # /etc/redhat-release is so inconsistent, we use rpm instead + rhelish=$(rpm -qa '(redhat|sl|slf|centos|oraclelinux)-release(|-server|-workstation|-client|-computenode)' 2>/dev/null | head -1) + if [[ $rhelish ]]; then + ID=${ID:-$(echo ${rhelish} | awk -F'-' '{print tolower($1)}')} + VERSION_ID=${VERSION_ID:-$(echo ${rhelish} | sed -E 's/([^[:digit:]]+)([[:digit:]]+)(.*)/\2/' )} + VERSION_CODENAME=${VERSION_CODENAME:-${VERSION_ID}} + DISTRIB_CODENAME=${VERSION_CODENAME:-${VERSION_ID}} + fi + elif [[ -f /etc/debian_version ]]; then + # Ubuntu keeps changing the format of /etc/os-release's VERSION, and + # it's numeric, not the codename. Boo. + # Also, Debian doesn't supply VERSION_CODENAME. Double Boo. + if [[ ${PRETTY_NAME} =~ "Ubuntu" ]]; then + # Ubuntu keeps changing the format of /etc/os-release's VERSION, and + # the codename is buried. Boo. Let's use a fancy regex. + VERSION_CODENAME=${VERSION_CODENAME:-$(echo ${VERSION} | sed -E 's/([0-9.]+)\W+([A-Za-z\,]+)\W+\(?(\w+)(.*)/\L\3/')} + DISTRIB_CODENAME=${DISTRIB_CODENAME:-${VERSION_CODENAME}} + elif [[ ${PRETTY_NAME} =~ "Debian" ]]; then + VERSION_CODENAME=${VERSION_CODENAME:-$(echo ${VERSION} | sed -E 's/(.*)\(([^\]+)\)/\2/')} + DISTRIB_CODENAME=${DISTRIB_CODENAME:-${VERSION_CODENAME}} + else + echo "Unknown Debian-like OS ${PRETTY_NAME}, aborting..." + exit 1 + fi + fi + if [[ ${ID} && ${VERSION_ID} && ${VERSION_CODENAME} ]]; then + echo "Detected distribution: ${ID}, version ${VERSION_ID} (${VERSION_CODENAME})" + else + echo "Unable to determine Linux distribution! Aborting." + exit 1 + fi + ;; + + freebsd*) + echo "Detected OS: FreeBSD" + # use userland version + VERSION=$(freebsd-version -u | cut -d '-' -f1) + ;; + *bsd*) + # TODO: detect netbsd vs. freebsd vs. openbsd? + echo "Detected OS: BSD - UNSUPPORTED" + exit 1 + ;; + darwin*) + # TODO + echo "Detected OS: macOS (OSX) - UNSUPPORTED" + exit 1 + ;; + solaris*) + # TODO + echo "Detected OS: Solaris-like" + exit 1 + ;; + msys*) + # TODO + echo "Detected OS: Windows (msys)" + exit 1 + ;; + cygwin*) + # TODO + echo "Detected OS: Windows (cygwin)" + exit 1 + ;; + *) + echo "Unknown OS detected: ${OSTYPE}" + exit 1 + ;; +esac diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..6a08f2c --- /dev/null +++ b/build.sh @@ -0,0 +1,286 @@ +#!/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 Docker repo rather tha +# hard coding the list +DEBIANS="debian-jessie debian-stretch" +UBUNTUS="ubuntu-trusty ubuntu-xenial ubuntu-bionic" +debs="(debian-jessie|debian-stretch|ubuntu-trusty|ubuntu-xenial|ubuntu-bionic)" + +CENTOSES="centos-6 centos-7" +rpms="(centos-6|centos-7)" + +BINTRAY_API="https://api.bintray.com" +ERLANGVERSION=${ERLANGVERSION:-19.3.6} + + +build-js() { + # TODO: check if image is built first, if not, complain + # invoke as build-js <plat> + docker run \ + --mount type=bind,src=${SCRIPTPATH},dst=/home/jenkins/couchdb-pkg \ + couchdbdev/$1-base \ + sudo /home/jenkins/couchdb-pkg/bin/build-js.sh +} + +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: 0" \ + --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 + fi + fi + echo Using ${COUCHTARBALL} to build packages... + chmod 777 ${COUCHTARBALL} +} + +build-couch() { + # $1 is plat, $2 is the optional path to a dist tarball + docker run \ + --mount type=bind,src=${SCRIPTPATH},dst=/home/jenkins/couchdb-pkg \ + -w /home/jenkins/couchdb-pkg \ + couchdbdev/$1-erlang-${ERLANGVERSION} \ + make copy-couch $1 COUCHTARBALL=${COUCHTARBALL} +} + +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 +} + + +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 + 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 + if [[ $1 ]]; then + exit 1 + fi + ;; +esac + +exit 0 diff --git a/make-releases.sh b/make-releases.sh deleted file mode 100755 index 71798dd..0000000 --- a/make-releases.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash -IMAGES=( - centos-6-erlang-19.3.6 centos6 \ - centos-7-erlang-19.3.6 centos7 \ - debian-jessie-erlang-19.3.6 jessie \ - debian-stretch-erlang-19.3.6 stretch \ - ubuntu-trusty-erlang-19.3.6 trusty \ - ubuntu-xenial-erlang-19.3.6 xenial \ - ubuntu-bionic-erlang-19.3.6 bionic -) - -usage() { - echo $0 takes exactly one argument, either: - echo ' - path/to/couchdb-VERSION.tar.gz or' - echo ' - http://url/to/couchdb-VERSION.tar.gz' - echo - exit -} - -if [ $# -ne "1" ] -then - usage -fi - -ARG=$1 - -if [ -f ${ARG} ] -then - # file - cp ${ARG} . 2>/dev/null || true - FILE=$(basename ${ARG}) -else - if [[ ${ARG} =~ ^http.*$ ]] - then - # url - # thank you, advanced bash scripting guide - curl -O ${ARG} - FILE=${ARG##*/} - else - usage - fi -fi - -echo Using ${FILE} to build packages... -chmod 777 ${FILE} - -mkdir -p pkgs && chmod 777 pkgs - -image_count=${#IMAGES[@]} -index=0 - -while [ "$index" -lt "$image_count" ] -do - img=${IMAGES[$index]} - ((index++)) - plat=${IMAGES[$index]} - ((index++)) - docker run -it -w /tmp/couchdb-pkg -v $(readlink -f .):/tmp/couchdb-pkg couchdbdev/$img make copy-couch $plat copy-pkgs PLATFORM=$plat COUCHTARBALL=${FILE} -done diff --git a/pkgs/couch/.gitignore b/pkgs/couch/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/pkgs/couch/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/pkgs/js/.gitignore b/pkgs/js/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/pkgs/js/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore
