check_backuppc/build.sh

180 lines
5.7 KiB
Bash
Raw Normal View History

2024-10-07 12:39:38 +02:00
#!/bin/bash
# vim: shiftwidth=4 tabstop=4 expandtab
INSTALL_BUILD_DEPS=0
INSTALL_BUILD_DEPS_ONLY=0
PURGE_SOURCE_DIRECTORY=0
function usage() {
[ $# -gt 0 ] && echo -e "$*\n" > /dev/stderr
cat << EOF
Usage: $0 [-h|I|-O|-P|-x]
-h|--help Show this message
-I|--install-build-deps Install build dependencies before building package
-O|--install-build-deps-only Only install build dependencies
-P|--purge-sources-directory Purge debian package sources directory after building package
-x|--trace Enable bash tracing (set -x)
EOF
[ $# -gt 0 ] && exit 1
}
idx=1
while [ $idx -le $# ]; do
OPT=${!idx}
case $OPT in
-h|--help)
usage
;;
-I|--install-build-deps)
INSTALL_BUILD_DEPS=1
;;
-O|--install-build-deps-only)
INSTALL_BUILD_DEPS=1
INSTALL_BUILD_DEPS_ONLY=1
;;
-P|--purge-sources-directory)
PURGE_SOURCE_DIRECTORY=1
;;
-x|--trace)
set -x
;;
*)
usage "Unknown parameter '$OPT'"
esac
(( idx+=1 ))
done
# Enter source directory
cd "$( dirname "$0" )"
# Install build dependencies
if [ $INSTALL_BUILD_DEPS -eq 1 ]; then
apt-get update
apt-get install --no-install-recommends --yes devscripts equivs sed rsync git lsb-release \
wget ca-certificates bash-completion
fi
DEBIAN_RELEASE=$( lsb_release -r -s | sed 's/\..*$//' )
# Install build dependencies based on Debian release
if [ $INSTALL_BUILD_DEPS -eq 1 ]; then
# On Debian Stretch, install GitPython using pip because strect version of python3-git have bugs
if [ "$DEBIAN_RELEASE" -eq 9 ]; then
apt-get install --no-install-recommends --yes python3-pip
python3 -m pip install GitPython
else
apt-get install --no-install-recommends --yes python3-git
fi
fi
# Install GPG key (if provided)
if [ -n "$GPG_KEY" ]; then
[ $INSTALL_BUILD_DEPS -eq 1 ] && apt-get install --no-install-recommends --yes gnupg2
[ $INSTALL_BUILD_DEPS_ONLY -eq 0 ] && echo "$GPG_KEY" | base64 -d | gpg --import
fi
# Stop here on install build deps only mode
[ $INSTALL_BUILD_DEPS_ONLY -eq 1 ] && exit 0
# Retrieve source package name
SOURCE_PACKAGE_NAME=$( grep -E ^Source: debian/control | sed 's/^Source: //' )
# Generate EE debian codename
DEBIAN_CODENAME=$( lsb_release -c -s )
[ "$DEBIAN_RELEASE" -ge 9 ] && DEBIAN_CODENAME="${DEBIAN_CODENAME}-ee"
# Clean previous build
rm -fr dist
# Compute version using git describe
# Note : If no tag exist, git describe will fail: in this case, compute a 0.0 version with same
# format as git describe
VERSION="$( git describe --tags 2> /dev/null )" || \
VERSION="0.0-$( git log --oneline | wc -l )-$( git describe --tags --always )"
# Fix version format to match with Python specs
# See: https://peps.python.org/pep-0440/
# shellcheck disable=SC2001
VERSION=$( sed 's/[^0-9]*\([0-9][^-]*\)-\(.*\)/\1+\2/' <<< "$VERSION" )
# Compute debian package version by adding EE debian version suffix
DEB_VERSION_SUFFIX="~ee${DEBIAN_RELEASE}0+1"
DEB_VERSION="${VERSION}${DEB_VERSION_SUFFIX}"
# Create dist directory
mkdir dist
DIST_DIR=dist/$SOURCE_PACKAGE_NAME-$DEB_VERSION
rsync -av \
--exclude 'dist' \
--exclude '.*' \
--exclude 'build.sh' \
--exclude 'setup.cfg' \
./ "$DIST_DIR/"
# Set version in package files
mapfile -t FILES < <( awk '{print $1}' < "debian/install" )
[[ "${#FILES[@]}" -eq 0 ]] && echo "No file found in debian/install file!" && exit 1
for FILE in "${FILES[@]}"; do
case "$( mimetype -b "$FILE" )" in
application/x-perl)
echo " - in $FILE (perl)"
sed -i "s/^my \$version *=.*$/my \$version = '$VERSION';/" "$DIST_DIR/$( basename "$FILE" )"
;;
application/x-shellscript)
echo " - in $FILE (shellscript)"
sed -i "s/^VERSION *=.*$/VERSION = '$VERSION'/" "$DIST_DIR/$( basename "$FILE" )"
;;
esac
done
# Check gitdch is installed
GITDCH=$(which gitdch)
set -e
if [ -z "$GITDCH" ]; then
TMP_GITDCH=$(mktemp -d)
echo "Temporary install gitdch in $TMP_GITDCH"
wget -O "$TMP_GITDCH"/gitdch https://gitea.zionetrix.net/bn8/gitdch/raw/master/gitdch
chmod +x "$TMP_GITDCH"/gitdch
GITDCH=$TMP_GITDCH/gitdch
else
TMP_GITDCH=""
fi
# Compute gitdch extra args
GITDCH_EXTRA_ARGS=()
[ -n "$DEBFULLNAME" ] && GITDCH_EXTRA_ARGS+=( "--maintainer-name" "$DEBFULLNAME" )
[ -n "$DEBEMAIL" ] && GITDCH_EXTRA_ARGS+=( "--maintainer-email" "$DEBEMAIL" )
if [ -e debian/changelog ]; then
LAST_MANUAL_COMMIT_ID=$( git log --oneline -n1 -- debian/changelog | awk '{print $1}' )
GITDCH_EXTRA_ARGS+=( "--append" "--revision" "${LAST_MANUAL_COMMIT_ID}..HEAD" )
fi
# Generate debian changelog using generate_debian_changelog.py
$GITDCH \
--package-name "$SOURCE_PACKAGE_NAME" \
--version "${DEB_VERSION}" \
--version-suffix "${DEB_VERSION_SUFFIX}" \
--code-name "$DEBIAN_CODENAME" \
--output "$DIST_DIR"/debian/changelog \
--release-notes dist/release-notes.md \
--clean-tags-regex '\-ee[0-9]{2,3}$' \
--exclude "^CI: " \
--exclude "\.gitlab-ci(\.yml)?" \
--exclude "build(\.sh)?" \
--exclude "README(\.md)?" \
--exclude "^Merge branch " \
--verbose "${GITDCH_EXTRA_ARGS[@]}"
# Clean temporary gitdch installation
[ -n "$TMP_GITDCH" ] && rm -fr "$TMP_GITDCH"
# Build debian package
BUILD_ARGS=""
[ -z "$GPG_KEY" ] && BUILD_ARGS="--no-sign" || echo "GPG key provide, enable package signing."
cd "$DIST_DIR"/
if dpkg-buildpackage $BUILD_ARGS; then
# Handle PURGE_SOURCE_DIRECTORY option
[[ $PURGE_SOURCE_DIRECTORY -eq 0 ]] || rm -fr "../../$DIST_DIR"
fi