diff options
Diffstat (limited to '')
-rwxr-xr-x | debian/autobake-deb.sh | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/debian/autobake-deb.sh b/debian/autobake-deb.sh new file mode 100755 index 00000000..afe7181f --- /dev/null +++ b/debian/autobake-deb.sh @@ -0,0 +1,251 @@ +#!/bin/bash +# +# Build MariaDB .deb packages for test and release at mariadb.org +# +# Purpose of this script: +# Always keep the actual packaging as up-to-date as possible following the latest +# Debian policy and targeting Debian Sid. Then case-by-case run in autobake-deb.sh +# tests for backwards compatibility and strip away parts on older builders or +# specific build environments. + +# Exit immediately on any error +set -e + +# On Buildbot, don't run the mysql-test-run test suite as part of build. +# It takes a lot of time, and we will do a better test anyway in +# Buildbot, running the test suite from installed .debs on a clean VM. +export DEB_BUILD_OPTIONS="nocheck $DEB_BUILD_OPTIONS" + +# shellcheck source=/dev/null +source ./VERSION + +# General CI optimizations to keep build output smaller +if [[ $GITLAB_CI ]] +then + # On Gitlab the output log must stay under 4MB so make the + # build less verbose + sed '/Add support for verbose builds/,/^$/d' -i debian/rules +elif [ -d storage/columnstore/columnstore/debian ] +then + # ColumnStore is explicitly disabled in the native Debian build. Enable it + # now when build is triggered by autobake-deb.sh (MariaDB.org) and when the + # build is not running on Gitlab-CI. + sed '/-DPLUGIN_COLUMNSTORE=NO/d' -i debian/rules + # Take the files and part of control from MCS directory + if [ ! -f debian/mariadb-plugin-columnstore.install ] + then + cp -v storage/columnstore/columnstore/debian/mariadb-plugin-columnstore.* debian/ + echo >> debian/control + sed "s/-10.6//" <storage/columnstore/columnstore/debian/control >> debian/control + fi +fi + +# Look up distro-version specific stuff +# +# Always keep the actual packaging as up-to-date as possible following the latest +# Debian policy and targeting Debian Sid. Then case-by-case run in autobake-deb.sh +# tests for backwards compatibility and strip away parts on older builders. + +remove_rocksdb_tools() +{ + sed '/rocksdb-tools/d' -i debian/control + sed '/sst_dump/d' -i debian/not-installed + if ! grep -q sst_dump debian/mariadb-plugin-rocksdb.install + then + echo "usr/bin/sst_dump" >> debian/mariadb-plugin-rocksdb.install + fi +} + +add_lsb_base_depends() +{ + # Make sure one can run this multiple times remove + # lines 'sysvinit-utils' and 'lsb-base'. + sed -e '/sysvinit-utils/d' -e '/lsb-base/d' -i debian/control + # Add back lsb-base before lsof + sed -e 's#lsof #lsb-base (>= 3.0-10),\n lsof #' -i debian/control +} + +replace_uring_with_aio() +{ + sed 's/liburing-dev/libaio-dev/g' -i debian/control + sed -e '/-DIGNORE_AIO_CHECK=ON/d' \ + -e '/-DWITH_URING=ON/d' -i debian/rules +} + +disable_pmem() +{ + sed '/libpmem-dev/d' -i debian/control + sed '/-DWITH_PMEM=ON/d' -i debian/rules +} + +disable_libfmt() +{ + # 7.0+ required + sed '/libfmt-dev/d' -i debian/control +} + +architecture=$(dpkg-architecture -q DEB_BUILD_ARCH) + +# Parse release name and number from Linux standard base release +# Example: +# $ lsb_release -a +# No LSB modules are available. +# Distributor ID: Debian +# Description: Debian GNU/Linux bookworm/sid +# Release: n/a +# Codename: n/a +LSBID="$(lsb_release -si | tr '[:upper:]' '[:lower:]')" +LSBVERSION="$(lsb_release -sr | sed -e "s#\.##g")" +LSBNAME="$(lsb_release -sc)" + +# If 'n/a', assume 'sid' +if [ "${LSBVERSION}" == "n/a" ] || [ "${LSBNAME}" == "n/a" ] +then + LSBVERSION="sid" + LSBNAME="sid" +fi + +# If not known, use 'unknown' in .deb version identifier +if [ -z "${LSBID}" ] +then + LSBID="unknown" +fi + +case "${LSBNAME}" +in + # Debian + "buster") + disable_libfmt + replace_uring_with_aio + if [ ! "$architecture" = amd64 ] + then + disable_pmem + fi + ;& + "bullseye") + add_lsb_base_depends + ;& + "bookworm") + # mariadb-plugin-rocksdb in control is 4 arches covered by the distro rocksdb-tools + # so no removal is necessary. + if [[ ! "$architecture" =~ amd64|arm64|ppc64el ]] + then + disable_pmem + fi + if [[ ! "$architecture" =~ amd64|arm64|armel|armhf|i386|mips64el|mipsel|ppc64el|s390x ]] + then + replace_uring_with_aio + fi + ;& + "trixie"|"sid") + # The default packaging should always target Debian Sid, so in this case + # there is intentionally no customizations whatsoever. + ;; + # Ubuntu + "bionic") + remove_rocksdb_tools + [ "$architecture" != amd64 ] && disable_pmem + ;& + "focal") + replace_uring_with_aio + disable_libfmt + ;& + "jammy"|"kinetic") + add_lsb_base_depends + ;& + "lunar"|"mantic") + # mariadb-plugin-rocksdb s390x not supported by us (yet) + # ubuntu doesn't support mips64el yet, so keep this just + # in case something changes. + if [[ ! "$architecture" =~ amd64|arm64|ppc64el|s390x ]] + then + remove_rocksdb_tools + fi + if [[ ! "$architecture" =~ amd64|arm64|ppc64el ]] + then + disable_pmem + fi + if [[ ! "$architecture" =~ amd64|arm64|armhf|ppc64el|s390x ]] + then + replace_uring_with_aio + fi + ;; + *) + echo "Error: Unknown release '$LSBNAME'" >&2 + exit 1 +esac + +if [ -n "${AUTOBAKE_PREP_CONTROL_RULES_ONLY:-}" ] +then + exit 0 +fi + +# Adjust changelog, add new version +echo "Incrementing changelog and starting build scripts" + +# Find major.minor version +UPSTREAM="${MYSQL_VERSION_MAJOR}.${MYSQL_VERSION_MINOR}.${MYSQL_VERSION_PATCH}${MYSQL_VERSION_EXTRA}" +PATCHLEVEL="+maria" +LOGSTRING="MariaDB build" +EPOCH="1:" +VERSION="${EPOCH}${UPSTREAM}${PATCHLEVEL}~${LSBID:0:3}${LSBVERSION}" + +dch -b -D "${LSBNAME}" -v "${VERSION}" "Automatic build with ${LOGSTRING}." --controlmaint + +echo "Creating package version ${VERSION} ... " + +BUILDPACKAGE_DPKGCMD=() + +# Fakeroot test +if fakeroot true; then + BUILDPACKAGE_DPKGCMD+=( "fakeroot" "--" ) +fi + +# Use eatmydata is available to build faster with less I/O, skipping fsync() +# during the entire build process (safe because a build can always be restarted) +if command -v eatmydata > /dev/null +then + BUILDPACKAGE_DPKGCMD+=("eatmydata") +fi + +BUILDPACKAGE_DPKGCMD+=("dpkg-buildpackage") + +# Using dpkg-buildpackage args +# -us Allow unsigned sources +# -uc Allow unsigned changes +# -I Tar ignore +BUILDPACKAGE_DPKGCMD+=(-us -uc -I) + +# There can be also extra flags that are appended to args +if [ -n "$BUILDPACKAGE_FLAGS" ] +then + read -ra BUILDPACKAGE_TMP_ARGS <<< "$BUILDPACKAGE_FLAGS" + BUILDPACKAGE_DPKGCMD+=( "${BUILDPACKAGE_TMP_ARGS[@]}" ) +fi + +# Build the package +# Pass -I so that .git and other unnecessary temporary and source control files +# will be ignored by dpkg-source when creating the tar.gz source package. +"${BUILDPACKAGE_DPKGCMD[@]}" + +# If the step above fails due to missing dependencies, you can manually run +# sudo mk-build-deps debian/control -r -i + +# Don't log package contents on Gitlab-CI to save time and log size +if [[ ! $GITLAB_CI ]] +then + echo "List package contents ..." + cd .. + for package in *.deb + do + echo "$package" | cut -d '_' -f 1 + # shellcheck disable=SC2034 + dpkg-deb -c "$package" | while IFS=" " read -r col1 col2 col3 col4 col5 col6 col7 col8 + do + echo "$col1 $col2 $col6 $col7 $col8" | sort -k 3 + done + echo "------------------------------------------------" + done +fi + +echo "Build complete" |