You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
231 lines
6.9 KiB
231 lines
6.9 KiB
#!/bin/sh
|
|
|
|
set -x
|
|
set -u
|
|
|
|
# make sure cowbuilder/pbuilder/... are available
|
|
PATH='/bin:/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin'
|
|
|
|
checks_and_defaults() {
|
|
if [ -r /etc/jenkins/debian_glue ] ; then
|
|
. /etc/jenkins/debian_glue
|
|
fi
|
|
|
|
if [ -z "${JOB_NAME:-}" ] ; then
|
|
echo "No JOB_NAME defined, please run it in jenkins." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "${architecture:-}" ] ; then
|
|
echo "*** No architecture defined. Consider running it with matrix configuration. ***"
|
|
architecture="$(dpkg-architecture -qDEB_HOST_ARCH)"
|
|
echo "*** Falling back to default, using host architecture ${architecture}. ***"
|
|
fi
|
|
|
|
if [ -z "${REPOSITORY:-}" ] ; then
|
|
REPOSITORY='/srv/repository'
|
|
fi
|
|
}
|
|
|
|
# make sure we don't leave files for next run
|
|
bailout() {
|
|
[ -n "${1:-}" ] && EXIT="${1}" || EXIT=0
|
|
[ -n "${2:-}" ] && echo "$2" >&2
|
|
|
|
exit $EXIT
|
|
}
|
|
|
|
get_base_directory() {
|
|
# FIXME
|
|
if [ -d "$WORKSPACE"/repos-data ] ; then
|
|
cd "$WORKSPACE"/repos-data/architecture=*,label=*/
|
|
BASE_DIR=$(pwd)
|
|
fi
|
|
|
|
# if [ -n "${workspace_binaries:-}" ] ; then
|
|
# cd $workspace_binaries
|
|
# cd ..
|
|
# archive=$(find configurations -name lastStable -type l | grep axis-label | head -1)/archive
|
|
# if [ -n "${archive:-}" ] ; then
|
|
# cd "$archive"
|
|
# BASE_DIR=$(pwd)
|
|
# fi
|
|
# fi
|
|
}
|
|
|
|
identify_package_name() {
|
|
PACKAGE=${JOB_NAME%-binaries*}
|
|
BINARY_PACKAGE=${PACKAGE%-test*}
|
|
if [ -z "${PACKAGE:-}" ] ; then
|
|
bailout 1 "Error: could not identify Debian package name based on job name ${JOB_NAME:-}."
|
|
else
|
|
echo "*** Building binary package $BINARY_PACKAGE ***"
|
|
fi
|
|
}
|
|
|
|
|
|
build_info() {
|
|
if [ -n "${REPOS:-}" ] ; then
|
|
echo "*** Using supplied repository name $REPOS ***"
|
|
else
|
|
REPOS="${JOB_NAME%-binaries*}"
|
|
if [ -z "${distribution:-}" ]; then
|
|
echo "*** No repository supplied, using repository name $REPOS ***"
|
|
else
|
|
REPOS="${REPOS}-${distribution}"
|
|
echo "*** No repository supplied but distribution has been set, using repository name $REPOS ***"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
identify_sourcefile() {
|
|
echo "*** Identifying package file ***"
|
|
sourcefile="${BASE_DIR}/"*.dsc
|
|
echo "*** Using $sourcefile ***"
|
|
}
|
|
|
|
remove_packages() {
|
|
echo "*** Removing previous versions from repository ***"
|
|
for p in $(dcmd "${BASE_DIR}/"*".changes") ; do
|
|
file="$(basename $p)"
|
|
binpackage="${file%%_*}"
|
|
binary_list="${binary_list:-} ${binpackage}"
|
|
|
|
# note: "removesrc" would remove foreign arch files (of different builds)
|
|
echo "*** Removing existing package ${binpackage} from repository ${REPOS} ***"
|
|
${SUDO_CMD:-} reprepro -v -b "${REPOSITORY}" --waitforlock 1000 remove "${REPOS}" "${binpackage}"
|
|
done
|
|
|
|
}
|
|
|
|
remove_missing_binary_packages() {
|
|
for p in $(${SUDO_CMD:-} reprepro -v -b "${REPOSITORY}" --waitforlock 1000 listmatched "${REPOS}" '*' | awk '{print $2}' | sort -u); do
|
|
echo "$binary_list" | grep -q "$p" || missing_packages="${missing_packages:-} $p"
|
|
done
|
|
|
|
if echo "${missing_packages:-}" | grep -q '[a-z0-9]' ; then
|
|
echo "*** Binary package(s) found, missing in build version: ${missing_packages:-} ***"
|
|
for p in $missing_packages ; do
|
|
echo "*** Removing $p from $REPOS to avoid out-of-date data ***"
|
|
${SUDO_CMD:-} reprepro -v -b "${REPOSITORY}" --waitforlock 1000 remove "${REPOS}" "${p}"
|
|
done
|
|
fi
|
|
}
|
|
|
|
reprepro_wrapper() {
|
|
if ! [ -d "$REPOSITORY" ] ; then
|
|
bailout 1 "Error: repository ${REPOSITORY} does not exist."
|
|
fi
|
|
|
|
remove_packages
|
|
remove_missing_binary_packages
|
|
|
|
archall=false
|
|
case $architecture in
|
|
all) archall=true
|
|
architecture='*' # support as file expansion in reprepro cmdline
|
|
;;
|
|
esac
|
|
|
|
echo "*** Including binary packages in repository $REPOS ***"
|
|
${SUDO_CMD:-} reprepro -v -b "${REPOSITORY}" --waitforlock 1000 --ignore=wrongdistribution \
|
|
include "${REPOS}" "${BASE_DIR}/"*".changes"
|
|
[ $? -eq 0 ] || bailout 1 "Error: Failed to include binary package in $REPOS repository."
|
|
|
|
# include the source package only in *one* architecture, being amd64
|
|
if [ "$architecture" = "amd64" ] || $archall ; then
|
|
echo "*** Including source package in repository $REPOS ***"
|
|
|
|
RC=0
|
|
if ! ${SUDO_CMD:-} reprepro -v -b "${REPOSITORY}" --waitforlock 1000 --ignore=wrongdistribution \
|
|
includedsc "${REPOS}" ${sourcefile} ; then
|
|
RC=1
|
|
|
|
# iff section/priority is empty then reprepro will complain
|
|
# about "No section and no priority for" and error out in the
|
|
# cmdline above, therefore we retry with -S and -P being set
|
|
${SUDO_CMD:-} reprepro -v -S unstable -P extra -b "${REPOSITORY}" --waitforlock 1000 \
|
|
--ignore=wrongdistribution \
|
|
includedsc "${REPOS}" ${sourcefile}
|
|
RC=$?
|
|
fi
|
|
[ $RC -eq 0 ] || bailout 1 "Error: Failed to include source package in $REPOS repository."
|
|
fi
|
|
}
|
|
|
|
trunk_release() {
|
|
# setting TRUNK_RELEASE=true enables release-trunk repository,
|
|
# to always get a copy of the package(s) to a central place
|
|
if [ -n "${TRUNK_RELEASE:-}" ] ; then
|
|
generate-reprepro-codename "$TRUNK_RELEASE"
|
|
|
|
${SUDO_CMD:-} reprepro -v -b "${REPOSITORY}" --waitforlock 1000 --ignore=wrongdistribution copymatched "$TRUNK_RELEASE" "$REPOS" '*'
|
|
[ $? -eq 0 ] || bailout 1 "Error: Failed to copy packages from ${REPOS} to ${TRUNK_RELEASE}."
|
|
fi
|
|
}
|
|
|
|
release_repos() {
|
|
echo "*** Environment variable 'release' is set, running through release steps. ***"
|
|
|
|
mkdir -p "${REPOSITORY}/incoming/${release}"
|
|
mkdir -p "${REPOSITORY}/conf"
|
|
|
|
if [ -n "${SUDO_CMD:-}" ] ; then
|
|
${SUDO_CMD:-} mkdir -p "${REPOSITORY}/incoming/${release}"
|
|
${SUDO_CMD:-} mkdir -p "${REPOSITORY}/conf"
|
|
${SUDO_CMD:-} chown -R "$(id -un)" "${REPOSITORY}/conf"
|
|
${SUDO_CMD:-} chown -R "$(id -un)" "${REPOSITORY}/incoming/${release}"
|
|
fi
|
|
|
|
cp "${BASE_DIR}/"* "${REPOSITORY}/incoming/${release}/"
|
|
[ $? -eq 0 ] || bailout 1 "Error: Failed to copy binary packages to release directory."
|
|
|
|
REPOSITORY=$REPOSITORY generate-reprepro-codename "${release}"
|
|
|
|
if ! grep -q "^Name: $release$" "${REPOSITORY}/conf/incoming" 2>/dev/null ; then
|
|
cat >> "${REPOSITORY}/conf/incoming" << EOF
|
|
|
|
Name: $release
|
|
IncomingDir: incoming/$release
|
|
TempDir: tmp
|
|
LogDir: log
|
|
MorgueDir: ${REPOSITORY}/morgue
|
|
Allow: unstable>$release
|
|
Cleanup: unused_files on_deny on_error
|
|
|
|
EOF
|
|
fi
|
|
|
|
${SUDO_CMD:-} reprepro -v -b "${REPOSITORY}" processincoming "${release}"
|
|
local RC=$?
|
|
|
|
echo "*** Gettind rid of *.tar.* and *.dsc files in incoming directory to avoid data leakage. ***"
|
|
rm -f ${REPOSITORY}/incoming/$release/*.tar.*
|
|
rm -f ${REPOSITORY}/incoming/$release/*.dsc
|
|
|
|
if [ $RC -ne 0 ] ; then
|
|
bailout 1 "Error: Failed to execute processincoming for release ${release}."
|
|
fi
|
|
}
|
|
|
|
deploy_to_releases() {
|
|
if [ -n "${release:-}" ] && [ "$release" != "none" ] && [ "$release" != "trunk" ] ; then
|
|
release_repos
|
|
else
|
|
reprepro_wrapper
|
|
trunk_release
|
|
fi
|
|
}
|
|
|
|
# main execution
|
|
trap bailout 1 2 3 3 6 9 14 15
|
|
|
|
checks_and_defaults
|
|
get_base_directory
|
|
identify_package_name
|
|
build_info
|
|
identify_sourcefile
|
|
deploy_to_releases
|
|
|
|
bailout 0
|