Issue - (#14): PG-80 packaging for pg_stat_monitor

This commit is contained in:
Oleksandr Miroshnychenko
2019-12-24 14:51:58 +02:00
parent 1d7eee9571
commit b7c97cadf9
11 changed files with 635 additions and 0 deletions

View File

@@ -0,0 +1,487 @@
#!/usr/bin/env bash
shell_quote_string() {
echo "$1" | sed -e 's,\([^a-zA-Z0-9/_.=-]\),\\\1,g'
}
usage () {
cat <<EOF
Usage: $0 [OPTIONS]
The following options may be given :
--builddir=DIR Absolute path to the dir where all actions will be performed
--get_sources Source will be downloaded from github
--build_src_rpm If it is set - src rpm will be built
--build_src_deb If it is set - source deb package will be built
--build_rpm If it is set - rpm will be built
--build_deb If it is set - deb will be built
--install_deps Install build dependencies(root privilages are required)
--branch Branch for build
--repo Repo for build
--help) usage ;;
Example $0 --builddir=/tmp/BUILD --get_sources=1 --build_src_rpm=1 --build_rpm=1
EOF
exit 1
}
append_arg_to_args () {
args="$args "$(shell_quote_string "$1")
}
parse_arguments() {
pick_args=
if test "$1" = PICK-ARGS-FROM-ARGV
then
pick_args=1
shift
fi
for arg do
val=$(echo "$arg" | sed -e 's;^--[^=]*=;;')
case "$arg" in
--builddir=*) WORKDIR="$val" ;;
--build_src_rpm=*) SRPM="$val" ;;
--build_src_deb=*) SDEB="$val" ;;
--build_rpm=*) RPM="$val" ;;
--build_deb=*) DEB="$val" ;;
--get_sources=*) SOURCE="$val" ;;
--branch=*) BRANCH="$val" ;;
--repo=*) REPO="$val" ;;
--install_deps=*) INSTALL="$val" ;;
--help) usage ;;
*)
if test -n "$pick_args"
then
append_arg_to_args "$arg"
fi
;;
esac
done
}
check_workdir(){
if [ "x$WORKDIR" = "x$CURDIR" ]
then
echo >&2 "Current directory cannot be used for building!"
exit 1
else
if ! test -d "$WORKDIR"
then
echo >&2 "$WORKDIR is not a directory."
exit 1
fi
fi
return
}
add_percona_yum_repo(){
if [ ! -f /etc/yum.repos.d/percona-dev.repo ]
then
wget http://jenkins.percona.com/yum-repo/percona-dev.repo
mv -f percona-dev.repo /etc/yum.repos.d/
fi
yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release disable all
percona-release enable ppg-11 release
return
}
add_percona_apt_repo(){
if [ ! -f /etc/apt/sources.list.d/percona-dev.list ]; then
cat >/etc/apt/sources.list.d/percona-dev.list <<EOL
deb http://jenkins.percona.com/apt-repo/ @@DIST@@ main
deb-src http://jenkins.percona.com/apt-repo/ @@DIST@@ main
EOL
sed -i "s:@@DIST@@:$OS_NAME:g" /etc/apt/sources.list.d/percona-dev.list
fi
wget -qO - http://jenkins.percona.com/apt-repo/8507EFA5.pub | apt-key add -
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
dpkg -i percona-release_latest.generic_all.deb
percona-release disable all
rm -f percona-release_latest.generic_all.deb
percona-release enable ppg-11 release
return
}
get_sources(){
cd "${WORKDIR}"
if [ "${SOURCE}" = 0 ]
then
echo "Sources will not be downloaded"
return 0
fi
PRODUCT=percona-pg-stat-monitor
echo "PRODUCT=${PRODUCT}" > pg-stat-monitor.properties
PRODUCT_FULL=${PRODUCT}-${VERSION}
echo "PRODUCT_FULL=${PRODUCT_FULL}" >> pg-stat-monitor.properties
echo "VERSION=${PSM_VER}" >> pg-stat-monitor.properties
echo "BUILD_NUMBER=${BUILD_NUMBER}" >> pg-stat-monitor.properties
echo "BUILD_ID=${BUILD_ID}" >> pg-stat-monitor.properties
git clone "$REPO" ${PRODUCT_FULL}
retval=$?
if [ $retval != 0 ]
then
echo "There were some issues during repo cloning from github. Please retry one more time"
exit 1
fi
cd ${PRODUCT_FULL}
if [ ! -z "$BRANCH" ]
then
git reset --hard
git clean -xdf
git checkout "$BRANCH"
fi
REVISION=$(git rev-parse --short HEAD)
echo "REVISION=${REVISION}" >> ${WORKDIR}/pg-stat-monitor.properties
rm -rf rpm debian
cp -r percona-packaging/rpm ./
cp -r percona-packaging/debian ./
cd ${WORKDIR}
#
source pg-stat-monitor.properties
#
tar --owner=0 --group=0 --exclude=.* -czf ${PRODUCT_FULL}.tar.gz ${PRODUCT_FULL}
echo "UPLOAD=UPLOAD/experimental/BUILDS/${PRODUCT}/${PRODUCT_FULL}/${PSM_BRANCH}/${REVISION}/${BUILD_ID}" >> pg-stat-monitor.properties
mkdir $WORKDIR/source_tarball
mkdir $CURDIR/source_tarball
cp ${PRODUCT_FULL}.tar.gz $WORKDIR/source_tarball
cp ${PRODUCT_FULL}.tar.gz $CURDIR/source_tarball
cd $CURDIR
rm -rf percona-pg-stat-monitor*
return
}
get_system(){
if [ -f /etc/redhat-release ]; then
RHEL=$(rpm --eval %rhel)
ARCH=$(echo $(uname -m) | sed -e 's:i686:i386:g')
OS_NAME="el$RHEL"
OS="rpm"
else
ARCH=$(uname -m)
OS_NAME="$(lsb_release -sc)"
OS="deb"
fi
return
}
install_deps() {
if [ $INSTALL = 0 ]
then
echo "Dependencies will not be installed"
return;
fi
if [ $( id -u ) -ne 0 ]
then
echo "It is not possible to instal dependencies. Please run as root"
exit 1
fi
CURPLACE=$(pwd)
if [ "x$OS" = "xrpm" ]; then
yum -y install wget
add_percona_yum_repo
wget http://jenkins.percona.com/yum-repo/percona-dev.repo
mv -f percona-dev.repo /etc/yum.repos.d/
yum clean all
RHEL=$(rpm --eval %rhel)
if [ ${RHEL} = 8 ]; then
dnf -y module disable postgresql
dnf config-manager --set-enabled codeready-builder-for-rhel-8-x86_64-rpms
dnf clean all
rm -r /var/cache/dnf
dnf -y upgrade
yum -y install perl
else
until yum -y install centos-release-scl; do
echo "waiting"
sleep 1
done
yum -y install epel-release
INSTALL_LIST="llvm-toolset-7-clang llvm5.0-devel"
yum -y install ${INSTALL_LIST}
source /opt/rh/devtoolset-7/enable
source /opt/rh/llvm-toolset-7/enable
INSTALL_LIST="clang-devel git clang llvm-devel rpmdevtools vim wget"
yum -y install ${INSTALL_LIST}
yum -y install binutils gcc gcc-c++
fi
INSTALL_LIST="percona-postgresql-common clang-devel llvm-devel percona-postgresql11-devel git rpm-build rpmdevtools wget gcc make autoconf"
yum -y install ${INSTALL_LIST}
else
export DEBIAN=$(lsb_release -sc)
export ARCH=$(echo $(uname -m) | sed -e 's:i686:i386:g')
apt-get -y install gnupg2
add_percona_apt_repo
apt-get update || true
LLVM_EXISTS=$(grep -c "apt.llvm.org" /etc/apt/sources.list)
if [ ${LLVM_EXISTS} = 0 ]; then
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add -
echo "deb http://apt.llvm.org/${DEBIAN}/ llvm-toolchain-${DEBIAN}-7 main" >> /etc/apt/sources.list
echo "deb-src http://apt.llvm.org/${DEBIAN}/ llvm-toolchain-${DEBIAN}-7 main" >> /etc/apt/sources.list
apt-get --allow-unauthenticated update
fi
apt-get update || true
INSTALL_LIST="build-essential percona-postgresql-11 debconf debhelper clang-7 devscripts dh-exec dh-systemd git wget libkrb5-dev libssl-dev percona-postgresql-common percona-postgresql-server-dev-all"
DEBIAN_FRONTEND=noninteractive apt-get -y --allow-unauthenticated install ${INSTALL_LIST}
INSTALL_LIST="build-essential debconf debhelper devscripts dh-exec dh-systemd git wget libxml-checker-perl libxml-libxml-perl libio-socket-ssl-perl libperl-dev libssl-dev libxml2-dev txt2man zlib1g-dev libpq-dev"
until DEBIAN_FRONTEND=noninteractive apt-get -y --allow-unauthenticated install ${INSTALL_LIST}; do
sleep 1
echo "waiting"
done
apt-get -y --allow-unauthenticated install libmysqlclient-dev || true
apt-get -y --allow-unauthenticated install default-libmysqlclient-dev || true
fi
return;
}
get_tar(){
TARBALL=$1
TARFILE=$(basename $(find $WORKDIR/$TARBALL -name 'percona-pg-stat-monitor*.tar.gz' | sort | tail -n1))
if [ -z $TARFILE ]
then
TARFILE=$(basename $(find $CURDIR/$TARBALL -name 'percona-pg-stat-monitor*.tar.gz' | sort | tail -n1))
if [ -z $TARFILE ]
then
echo "There is no $TARBALL for build"
exit 1
else
cp $CURDIR/$TARBALL/$TARFILE $WORKDIR/$TARFILE
fi
else
cp $WORKDIR/$TARBALL/$TARFILE $WORKDIR/$TARFILE
fi
return
}
get_deb_sources(){
param=$1
echo $param
FILE=$(basename $(find $WORKDIR/source_deb -name "percona-pg-stat-monitor*.$param" | sort | tail -n1))
if [ -z $FILE ]
then
FILE=$(basename $(find $CURDIR/source_deb -name "percona-pg-stat-monitor*.$param" | sort | tail -n1))
if [ -z $FILE ]
then
echo "There is no sources for build"
exit 1
else
cp $CURDIR/source_deb/$FILE $WORKDIR/
fi
else
cp $WORKDIR/source_deb/$FILE $WORKDIR/
fi
return
}
build_srpm(){
if [ $SRPM = 0 ]
then
echo "SRC RPM will not be created"
return;
fi
if [ "x$OS" = "xdeb" ]
then
echo "It is not possible to build src rpm here"
exit 1
fi
cd $WORKDIR
get_tar "source_tarball"
rm -fr rpmbuild
ls | grep -v tar.gz | xargs rm -rf
TARFILE=$(find . -name 'percona-pg-stat-monitor*.tar.gz' | sort | tail -n1)
SRC_DIR=${TARFILE%.tar.gz}
#
mkdir -vp rpmbuild/{SOURCES,SPECS,BUILD,SRPMS,RPMS}
tar vxzf ${WORKDIR}/${TARFILE} --wildcards '*/rpm' --strip=1
#
cp -av rpm/* rpmbuild/SOURCES
cp -av rpm/*.spec rpmbuild/SPECS
#
mv -fv ${TARFILE} ${WORKDIR}/rpmbuild/SOURCES
rpmbuild -bs --define "_topdir ${WORKDIR}/rpmbuild" --define "dist .generic" \
--define "version ${VERSION}" rpmbuild/SPECS/pg-stat-monitor.spec
mkdir -p ${WORKDIR}/srpm
mkdir -p ${CURDIR}/srpm
cp rpmbuild/SRPMS/*.src.rpm ${CURDIR}/srpm
cp rpmbuild/SRPMS/*.src.rpm ${WORKDIR}/srpm
return
}
build_rpm(){
if [ $RPM = 0 ]
then
echo "RPM will not be created"
return;
fi
if [ "x$OS" = "xdeb" ]
then
echo "It is not possible to build rpm here"
exit 1
fi
SRC_RPM=$(basename $(find $WORKDIR/srpm -name 'percona-pg-stat-monitor*.src.rpm' | sort | tail -n1))
if [ -z $SRC_RPM ]
then
SRC_RPM=$(basename $(find $CURDIR/srpm -name 'percona-pg-stat-monitor*.src.rpm' | sort | tail -n1))
if [ -z $SRC_RPM ]
then
echo "There is no src rpm for build"
echo "You can create it using key --build_src_rpm=1"
exit 1
else
cp $CURDIR/srpm/$SRC_RPM $WORKDIR
fi
else
cp $WORKDIR/srpm/$SRC_RPM $WORKDIR
fi
cd $WORKDIR
rm -fr rpmbuild
mkdir -vp rpmbuild/{SOURCES,SPECS,BUILD,SRPMS,RPMS}
cp $SRC_RPM rpmbuild/SRPMS/
cd rpmbuild/SRPMS/
#
cd $WORKDIR
RHEL=$(rpm --eval %rhel)
ARCH=$(echo $(uname -m) | sed -e 's:i686:i386:g')
if [ -f /opt/rh/devtoolset-7/enable ]; then
source /opt/rh/devtoolset-7/enable
source /opt/rh/llvm-toolset-7/enable
fi
export LIBPQ_DIR=/usr/pgsql-11/
export LIBRARY_PATH=/usr/pgsql-11/lib/:/usr/pgsql-11/include/
rpmbuild --define "_topdir ${WORKDIR}/rpmbuild" --define "dist .$OS_NAME" --define "version ${VERSION}" --rebuild rpmbuild/SRPMS/$SRC_RPM
return_code=$?
if [ $return_code != 0 ]; then
exit $return_code
fi
mkdir -p ${WORKDIR}/rpm
mkdir -p ${CURDIR}/rpm
cp rpmbuild/RPMS/*/*.rpm ${WORKDIR}/rpm
cp rpmbuild/RPMS/*/*.rpm ${CURDIR}/rpm
}
build_source_deb(){
if [ $SDEB = 0 ]
then
echo "source deb package will not be created"
return;
fi
if [ "x$OS" = "xrpm" ]
then
echo "It is not possible to build source deb here"
exit 1
fi
rm -rf percona-pg-stat-monitor*
get_tar "source_tarball"
rm -f *.dsc *.orig.tar.gz *.debian.tar.gz *.changes
#
TARFILE=$(basename $(find . -name 'percona-pg-stat-monitor*.tar.gz' | sort | tail -n1))
DEBIAN=$(lsb_release -sc)
ARCH=$(echo $(uname -m) | sed -e 's:i686:i386:g')
tar zxf ${TARFILE}
BUILDDIR=${TARFILE%.tar.gz}
#
mv ${TARFILE} percona-pg-stat-monitor_${VERSION}.orig.tar.gz
cd ${BUILDDIR}
cd debian
rm -rf changelog
echo "percona-pg-stat-monitor (${VERSION}-${RELEASE}) unstable; urgency=low" >> changelog
echo " * Initial Release." >> changelog
echo " -- Oleksandr Miroshnychenko <alex.miroshnychenko@percona.com> $(date -R)" >> changelog
cd ../
dch -D unstable --force-distribution -v "${VERSION}-${RELEASE}" "Update to new percona-pg-stat-monitor version ${VERSION}"
dpkg-buildpackage -S
cd ../
mkdir -p $WORKDIR/source_deb
mkdir -p $CURDIR/source_deb
cp *.debian.tar.* $WORKDIR/source_deb
cp *_source.changes $WORKDIR/source_deb
cp *.dsc $WORKDIR/source_deb
cp *.orig.tar.gz $WORKDIR/source_deb
cp *.debian.tar.* $CURDIR/source_deb
cp *_source.changes $CURDIR/source_deb
cp *.dsc $CURDIR/source_deb
cp *.orig.tar.gz $CURDIR/source_deb
}
build_deb(){
if [ $DEB = 0 ]
then
echo "source deb package will not be created"
return;
fi
if [ "x$OS" = "xrmp" ]
then
echo "It is not possible to build source deb here"
exit 1
fi
for file in 'dsc' 'orig.tar.gz' 'changes' 'debian.tar*'
do
get_deb_sources $file
done
cd $WORKDIR
rm -fv *.deb
#
export DEBIAN=$(lsb_release -sc)
export ARCH=$(echo $(uname -m) | sed -e 's:i686:i386:g')
#
echo "DEBIAN=${DEBIAN}" >> pg-stat-monitor.properties
echo "ARCH=${ARCH}" >> pg-stat-monitor.properties
#
DSC=$(basename $(find . -name '*.dsc' | sort | tail -n1))
#
dpkg-source -x ${DSC}
#
cd percona-pg-stat-monitor-${VERSION}
dch -m -D "${DEBIAN}" --force-distribution -v "1:${VERSION}-${RELEASE}.${DEBIAN}" 'Update distribution'
unset $(locale|cut -d= -f1)
dpkg-buildpackage -rfakeroot -us -uc -b
mkdir -p $CURDIR/deb
mkdir -p $WORKDIR/deb
cp $WORKDIR/*.*deb $WORKDIR/deb
cp $WORKDIR/*.*deb $CURDIR/deb
}
#main
CURDIR=$(pwd)
VERSION_FILE=$CURDIR/pg-stat-monitor.properties
args=
WORKDIR=
SRPM=0
SDEB=0
RPM=0
DEB=0
SOURCE=0
OS_NAME=
ARCH=
OS=
INSTALL=0
RPM_RELEASE=1
DEB_RELEASE=1
REVISION=0
BRANCH="master"
REPO="https://github.com/Percona-Lab/pg_stat_monitor.git"
PRODUCT=percona-pg-stat-monitor
DEBUG=0
parse_arguments PICK-ARGS-FROM-ARGV "$@"
VERSION='1.0.0'
RELEASE='1'
PRODUCT_FULL=${PRODUCT}-${VERSION}-${RELEASE}
check_workdir
get_system
install_deps
get_sources
build_srpm
build_source_deb
build_rpm
build_deb