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.
 
 
 
 
 
 
debian-installer/build/daily-build

233 lines
5.1 KiB

#!/bin/bash
set -e
# Ensure all output is in English and consistent.
# Also needed because the output of some commands is tested.
export LANG=C
unset LC_ALL LANGUAGE
# Overridable environment variables for uploading.
# Setting RESTRICTED_SSH makes the upload be done by sending a
# tarball across ssh, which is slow. It's faster to not set it,
# and instead configure authorized_keys to run d-i-unpack-helper,
# now that d-i-unpack-helper supports rsync mode. (The name of this
# variable is a historical accident, since rsync mode with
# d-i-unpack-helper is just as restricted.)
RESTRICTED_SSH=
SSHKEY=
SSHKEY=${SSHKEY:+-i $SSHKEY}
HELPER=${HELPER:-d-i-unpack-helper}
if [ -z "$HOST" ]; then
HOST=people.debian.org
fi
if [ -z "$BASEDIR" ]; then
# Please don't change this. If you need it to be something else,
# override the variable.
BASEDIR=public_html/d-i/images
fi
if [ -z "$DIR" ]; then
DIR=$(date -u '+%Y%m%d-%H:%M')
fi
if [ "$HOST" = local ]; then
SYNC="rsync"
SYNC_BASEDIR="$BASEDIR"
else
CALL="ssh $SSHKEY $HOST"
SYNC="rsync"
SYNC_BASEDIR="$HOST:$BASEDIR"
HELPER="ssh $SSHKEY $HOST $HELPER"
fi
if [ -z "$NUM_KEEP" ]; then
# Default to keeping 30 days of builds. Set to zero to keep all.
NUM_KEEP=30
fi
# Overridable environment variables for building.
if [ -z "$ROOTCMD" ]; then
_ROOTCMD="fakeroot"
else
_ROOTCMD=$ROOTCMD
unset ROOTCMD
fi
# Internal environment variables to keep file attributes between targets
# when fakeroot is used.
# As we start with an empty file, we can use -i also on first invocation.
ROOTCMDOPTS=""
case "$_ROOTCMD" in
*fakeroot*)
FRSAVE="$(mktemp -t d-i_daily-build.XXXXXX)"
trap 'rm -f $FRSAVE' 0 HUP INT QUIT TERM
ROOTCMDOPTS="-i $FRSAVE -s $FRSAVE"
;;
esac
LOG_TO_STDOUT=${LOG_TO_STDOUT:-0}
overview () {
echo "$(dpkg --print-architecture) ($(date)) $(whoami)@$(hostname | cut -d . -f 1) $1" >> dest/overview.log
}
header () {
echo
echo $@
echo
}
do_build_helper () {
local t=$1
header BUILDING IMAGE FOR $t
gitver=$(git show-ref HEAD 2>/dev/null) || true
if [ -n "$gitver" ]; then
echo "debian-installer git tree version: $gitver"
elif [ -d ../.git ]; then
githead=$(cat ../.git/refs/heads/master) || true
echo "debian-installer git tree head: $githead"
fi
$_ROOTCMD $ROOTCMDOPTS make $t 2>&1
}
do_build () {
local t=$1
local err=0
if [ "$LOG_TO_STDOUT" = 1 ]; then
set -o pipefail
ROOTCMDOPTS=$ROOTCMDOPTS do_build_helper $t | tee -a dest/$t.log || err=$?
set +o pipefail
else
ROOTCMDOPTS=$ROOTCMDOPTS do_build_helper $t >> dest/$t.log || err=$?
fi
return $err
}
build () {
# Override $TARGETS with custom makefile targets.
if [ -z "$TARGETS" ]; then
TARGETS="$($_ROOTCMD make all_list | grep '^build')"
fi
$_ROOTCMD make reallyclean > /dev/null
mkdir dest
touch dest/overview.log
# Save file attributes within this loop if fakeroot is used
for t in $TARGETS; do
if do_build $t; then
overview "$t success"
else
overview "$t failed"
echo "building $t failed, see log file dest/$t.log for details" >&2
fi
done
$_ROOTCMD make stats > dest/stats.txt 2>&1 || true
make release > /dev/null
}
upload () {
(
header UPLOADING FILES
if [ -n "$RESTRICTED_SSH" ]; then
tar zcvf - -C dest/ . | $HELPER
else
$CALL mkdir -p $BASEDIR/${DIR}_RSYNC_IN_PROGRESS
$CALL test ! -d $BASEDIR/daily || $CALL cp -a $BASEDIR/daily/* $BASEDIR/${DIR}_RSYNC_IN_PROGRESS/
$SYNC --stats -rvl --safe-links --delete --rsh="ssh $SSHKEY" dest/ $SYNC_BASEDIR/${DIR}_RSYNC_IN_PROGRESS/
$CALL rm -rf $BASEDIR/$DIR
$CALL mv $BASEDIR/${DIR}_RSYNC_IN_PROGRESS $BASEDIR/$DIR
$CALL rm -rf $BASEDIR/daily
$CALL ln -sf $DIR $BASEDIR/daily
fi
) > dest/upload.log 2>&1
}
trim () {
if [ -z "$TRIM_LOG" ]; then
TRIM_LOG=dest/trim.log
fi
(
header TRIMMING OLD BUILDS
if [ -n "$RESTRICTED_SSH" ]; then
echo "(trim not implemented for RESTRICTED_SSH mode)"
elif [ -n "$NUM_KEEP" ] && [ "$NUM_KEEP" != 0 ]; then
DIR=$(dirname $0)
$CALL find $BASEDIR -maxdepth 1 | egrep '/[0-9][0-9][0-9][0-9]+-?[0-9][0-9]-?[0-9][0-9]-?[0-9]*:?[0-9]*$' | \
sort -n | "$DIR"/util/trim-daily-builds "$NUM_KEEP" | \
$CALL xargs rm -rf
else
echo "(keeping all old builds)"
fi
) > $TRIM_LOG 2>&1
}
UPDATED=""
update () {
if [ ! "$UPDATED" ]; then
git pull >/dev/null 2>&1 || true
UPDATED=1
fi
}
deps () {
temp=$(dpkg-checkbuilddeps -B ../debian/control 2>&1 || true)
packages=$(echo $temp | sed -e 's%dpkg-checkbuilddeps: Unmet build dependencies: %%')
apt-get update
if [ "$packages" ]; then
DEBIAN_PRIORITY=critical apt-get -y install $packages
fi
DEBIAN_PRIORITY=critical apt-get -y upgrade
}
usage () {
echo These subcommands are available:
awk -F\) '/subcommand$/ { print " ", $1 }' $0
echo
}
if [ ! -d pkg-lists ]; then
echo "You must run this from the build directory"
exit 1
fi
case $1 in
build-only) # subcommand
build
;;
build) # subcommand
update
build
;;
upload) # subcommand
upload
;;
trim) # subcommand
trim
;;
'') # no subcommand, for backwards compatability
update
build
upload
trim
;;
all) # subcommand
update
build
upload
trim
;;
update) # subcommand
update
;;
deps) # subcommand
deps
;;
*)
echo $1 is not a valid subcommand.
usage
exit 1
;;
esac