mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 00:22:29 +00:00
174 lines
4.9 KiB
Bash
Executable File
174 lines
4.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -e
|
|
|
|
# Avoid dependency on locale
|
|
LC_ALL=C
|
|
|
|
# Normalize output directory
|
|
if [ -n "$OUTPUT_DIR" ]; then
|
|
OUTPUT_DIR=$(realpath -m "$OUTPUT_DIR")
|
|
fi
|
|
|
|
CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
cd "$CUR_DIR"
|
|
|
|
ROOT_DIR=$(readlink -f "$(git rev-parse --show-cdup)")
|
|
|
|
PKG_ROOT='root'
|
|
|
|
DEB_ARCH=${DEB_ARCH:-amd64}
|
|
OUTPUT_DIR=${OUTPUT_DIR:-$ROOT_DIR}
|
|
[ -d "${OUTPUT_DIR}" ] || mkdir -p "${OUTPUT_DIR}"
|
|
SANITIZER=${SANITIZER:-""}
|
|
SOURCE=${SOURCE:-$PKG_ROOT}
|
|
|
|
HELP="${0} [--test] [--rpm] [-h|--help]
|
|
--test - adds '+test' prefix to version
|
|
--apk - build APK packages
|
|
--archlinux - build archlinux packages
|
|
--rpm - build RPM packages
|
|
--tgz - build tarball package
|
|
--deb - build deb package
|
|
--help - show this help and exit
|
|
|
|
Used envs:
|
|
DEB_ARCH='${DEB_ARCH}'
|
|
OUTPUT_DIR='${OUTPUT_DIR}' - where the artifact will be placed
|
|
SANITIZER='${SANITIZER}' - if any sanitizer is used, affects version string
|
|
SOURCE='${SOURCE}' - directory with sources tree
|
|
VERSION_STRING='${VERSION_STRING}' - the package version to overwrite
|
|
"
|
|
|
|
if [ -z "${VERSION_STRING}" ]; then
|
|
# Get CLICKHOUSE_VERSION_STRING from the current git repo
|
|
eval "$("$ROOT_DIR/tests/ci/version_helper.py" -e)"
|
|
else
|
|
CLICKHOUSE_VERSION_STRING=${VERSION_STRING}
|
|
fi
|
|
export CLICKHOUSE_VERSION_STRING
|
|
|
|
|
|
while [[ $1 == --* ]]
|
|
do
|
|
case "$1" in
|
|
--test )
|
|
VERSION_POSTFIX+='+test'
|
|
shift ;;
|
|
--deb )
|
|
MAKE_DEB=1
|
|
shift ;;
|
|
--apk )
|
|
MAKE_APK=1
|
|
shift ;;
|
|
--archlinux )
|
|
MAKE_ARCHLINUX=1
|
|
shift ;;
|
|
--rpm )
|
|
MAKE_RPM=1
|
|
shift ;;
|
|
--tgz )
|
|
MAKE_TGZ=1
|
|
shift ;;
|
|
--help )
|
|
echo "$HELP"
|
|
exit ;;
|
|
* )
|
|
echo "Unknown option $1"
|
|
exit 2 ;;
|
|
esac
|
|
done
|
|
|
|
function deb2tgz {
|
|
local FILE PKG_NAME PKG_DIR PKG_PATH TARBALL
|
|
FILE=$1
|
|
PKG_NAME=${FILE##*/}; PKG_NAME=${PKG_NAME%%_*}
|
|
PKG_DIR="$PKG_NAME-$CLICKHOUSE_VERSION_STRING"
|
|
PKG_PATH="$OUTPUT_DIR/$PKG_DIR"
|
|
TARBALL="$OUTPUT_DIR/$PKG_DIR-$DEB_ARCH.tgz"
|
|
rm -rf "$PKG_PATH"
|
|
dpkg-deb -R "$FILE" "$PKG_PATH"
|
|
mkdir -p "$PKG_PATH/install"
|
|
cat > "$PKG_PATH/install/doinst.sh" << 'EOF'
|
|
#!/bin/sh
|
|
set -e
|
|
|
|
SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
|
|
for filepath in `find $SCRIPTPATH/.. -type f -or -type l | grep -v "\.\./install/"`; do
|
|
destpath=${filepath##$SCRIPTPATH/..}
|
|
mkdir -p $(dirname "$destpath")
|
|
cp -r "$filepath" "$destpath"
|
|
done
|
|
EOF
|
|
chmod +x "$PKG_PATH/install/doinst.sh"
|
|
if [ -f "$PKG_PATH/DEBIAN/postinst" ]; then
|
|
# we don't need debconf source in doinst in any case
|
|
tail +2 "$PKG_PATH/DEBIAN/postinst" | grep -v debconf/confmodule >> "$PKG_PATH/install/doinst.sh"
|
|
fi
|
|
rm -rf "$PKG_PATH/DEBIAN"
|
|
if [ -f "/usr/bin/pigz" ]; then
|
|
tar --use-compress-program=pigz -cf "$TARBALL" -C "$OUTPUT_DIR" "$PKG_DIR"
|
|
else
|
|
tar -czf "$TARBALL" -C "$OUTPUT_DIR" "$PKG_DIR"
|
|
fi
|
|
|
|
# Cut the $OUTPUT_DIR/ from the sha512sum output to make it universal
|
|
sha512sum "$TARBALL" | sed "s|$OUTPUT_DIR/||" > "$TARBALL".sha512
|
|
|
|
rm -r "$PKG_PATH"
|
|
}
|
|
|
|
# Build options
|
|
if [ -n "$SANITIZER" ]; then
|
|
if [[ "$SANITIZER" == "address" ]]; then VERSION_POSTFIX+="+asan"
|
|
elif [[ "$SANITIZER" == "thread" ]]; then VERSION_POSTFIX+="+tsan"
|
|
elif [[ "$SANITIZER" == "memory" ]]; then VERSION_POSTFIX+="+msan"
|
|
elif [[ "$SANITIZER" == "undefined" ]]; then VERSION_POSTFIX+="+ubsan"
|
|
else
|
|
echo "Unknown value of SANITIZER variable: $SANITIZER"
|
|
exit 3
|
|
fi
|
|
elif [[ $BUILD_TYPE == 'debug' ]]; then
|
|
VERSION_POSTFIX+="+debug"
|
|
fi
|
|
|
|
if [[ "$PKG_ROOT" != "$SOURCE" ]]; then
|
|
# packages are built only from PKG_SOURCE
|
|
rm -rf "./$PKG_ROOT"
|
|
ln -sf "$SOURCE" "$PKG_SOURCE"
|
|
fi
|
|
|
|
CLICKHOUSE_VERSION_STRING+=$VERSION_POSTFIX
|
|
echo -e "\nCurrent version is $CLICKHOUSE_VERSION_STRING"
|
|
|
|
for config in clickhouse*.yaml; do
|
|
if [ -n "$MAKE_DEB" ] || [ -n "$MAKE_TGZ" ]; then
|
|
echo "Building deb package for $config"
|
|
|
|
# Preserve package path
|
|
exec 9>&1
|
|
PKG_PATH=$(nfpm package --target "$OUTPUT_DIR" --config "$config" --packager deb | tee /dev/fd/9)
|
|
PKG_PATH=${PKG_PATH##*created package: }
|
|
exec 9>&-
|
|
fi
|
|
|
|
if [ -n "$MAKE_APK" ]; then
|
|
echo "Building apk package for $config"
|
|
nfpm package --target "$OUTPUT_DIR" --config "$config" --packager apk
|
|
fi
|
|
if [ -n "$MAKE_ARCHLINUX" ]; then
|
|
echo "Building archlinux package for $config"
|
|
nfpm package --target "$OUTPUT_DIR" --config "$config" --packager archlinux
|
|
fi
|
|
if [ -n "$MAKE_RPM" ]; then
|
|
echo "Building rpm package for $config"
|
|
nfpm package --target "$OUTPUT_DIR" --config "$config" --packager rpm
|
|
fi
|
|
if [ -n "$MAKE_TGZ" ]; then
|
|
echo "Building tarball for $config"
|
|
deb2tgz "$PKG_PATH"
|
|
fi
|
|
done
|
|
|
|
# vim: ts=4: sw=4: sts=4: expandtab
|