auto compiling
hy.
here are my auto compiling script. there is a bit more management in it,
and i seperated the whole thing in two scripts (the basic idea was, that
they could run on seperated machine, or the build script could run in a
chroot environment for security...).
i only tried to compile my own packages (i don't have a debian source
mirror here, and also no access to a pc with such a mirror).
i started the scripts with :
cd /home/devel
if [ -f builder.pid ]
then
kill `cat builder.pid`
rm builder.pid
fi
if [ -f manager.pid ]
then
kill `cat manager.pid`
rm manager.pid
fi
bin/builder -W/home/devel/Work > debug.builder 2>&1 &
bin/manager -I/home/devel/Incoming -O/home/devel/Done -W/home/devel/Work \
-F/home/devel/Failed -L/home/devel/Logs > debug.manager 2>&1 &
regards, andreas
#!/bin/bash
set -e
version="0.1"
progname="`basename \"$0\"`"
pidfile="${progname}.pid"
workdir=""
arch="`dpkg --print-architecture`"
clean=""
target="binary"
targetparam=""
makeflags=--silent
usageversion () {
cat >&2 <<END
Debian GNU/Linux builder ${version}. Copyright (C) 1996,97 Ian Jackson,
Lars Wirzenius, Andreas Jellinghaus. This is free software; see the GNU
General Public Licence version 2 or later for copying conditions. There
is NO warranty.
Usage: ${progname} [options]
Options: -B binary-only, no arch-indep files
-p<pidfile> pidfile (default ${pidfile})
-W<workdir> work directory
-a<arch> architectute used in file names (default ${arch})
-c also log cleanup
-v verbose, don't set MAKEFLAGS to --silent
-d debug mode (set -x)
-h print this message
END
}
while [ $# != 0 ]
do
value="`echo x\"$1\" | sed -e 's/^x-.//'`"
case "$1" in
-h) usageversion; exit 0 ;;
-B) target="binary-arch"; targetparam="-B" ;;
-p*) pidfile="${value}" ;;
-W*) workdir="${value}" ;;
-a*) arch="${value}" ;;
-v) makeflags="" ;;
-c) clean="true" ;;
-d) set -x ;;
*) echo >&2 "${progname}: unknown option or argument $1"
usageversion; exit 2 ;;
esac
shift
done
if [ -z "${workdir}" ]; then
echo "you must specify a workdir with -W" >&2
exit 1
fi
if ! [ -d ${workdir} ]; then
echo "no such directory : ${workdir}" >&2
exit 1
fi
if [ -e "${pidfile}" ]; then
echo "pidfile already exists : ${pidfile}" >&2
exit 1
fi
trap "rm -f ${pidfile}" 1 2 3 15
echo $$ > ${pidfile}
if [ -n "${makeflags}" ]; then export MAKEFLAGS="${makeflags}"; fi
cd ${workdir}
while true
do
while ! test -e todo
do
sleep 10
done
file="`cat todo`"
fdir="`dirname ${file}`"
file="`basename ${file}`"
package="`echo ${file} |cut -d_ -f1`"
suffix="`echo ${file} |cut -d_ -f2`"
version="`basename ${suffix} .dsc`"
dirver="`echo ${version}|cut -d- -f1`"
dir="${package}-${dirver}"
changes="${package}_${version}_${arch}.changes"
orig="${package}_${dirver}.orig.tar.gz"
logfile="${package}_${version}_${arch}.buildlog"
cleanlog="/dev/null"
rm todo
if [ -n "${clean}" ]; then cleanlog="${logfile}" ; fi
rm -rf *
echo "BUILD : extracting ${package} ${version}" >> ${logfile}
if ! dpkg-source -x ${fdir}/${file} 2>&1 >> ${logfile}
then
rm -rf ${dir}
echo "BUILD : Couldn't extract ${file}" >> ${logfile}
echo "BUILD : failed ${package} ${version}" >> ${logfile}
echo "failed" > result
continue
fi
rm ${orig}
echo "BUILD : building ${package} ${version}" >> ${logfile}
cd ${dir}
if ! debian/rules build 2>> ../${logfile} >> ../${logfile}
then
build clean 2>> ../${cleanlog} >> ../${cleanlog}
cd ..
rm -rf $DIR
echo "BUILD : Couldn't compile ${file}" >> ${logfile}
echo "BUILD : failed ${package} ${version}" >> ${logfile}
echo "failed" > result
continue
fi
echo "BUILD : packaging ${package} ${version}" >> ../${logfile}
if ! build $target 2>> ../${logfile} >> ../${logfile}
then
build clean 2>> ../${cleanlog} >> ../${cleanlog}
cd ..
rm -rf ${dir}
echo "BUILD : Couldn't package ${file}" >> ${logfile}
echo "BUILD : failed ${package} ${version}" >> ${logfile}
echo "failed" > result
continue
fi
echo "BUILD : changes file ${package} ${version}" >> ../${logfile}
if ! dpkg-genchanges -b ${targetparam} > ../${changes} 2>> ../${logfile}
then
build clean 2>> ../${cleanlog} >> ../${cleanlog}
cd ..
rm -rf $DIR ${changes}
echo "BUILD : Couldn't generate changes ${file}" >> ${logfile}
echo "BUILD : failed ${package} ${version}" >> ${logfile}
echo "failed" > result
continue
fi
build clean 2>> ../${logfile} >> ../${logfile}
cd ..
rm -rf ${dir}
echo "BUILD : files builded ${package} ${version}" >> ${logfile}
ls >> ${logfile}
echo "BUILD : ok ${package} ${version}" >> ${logfile}
echo "ok" > result
done
#!/bin/bash
set -e
version="0.1"
progname="`basename \"$0\"`"
pidfile="${progname}.pid"
logfile="${progname}.log"
pkgfile="${progname}.dat"
pgpring=/usr/doc/dpkg/developer-keys.pgp
pgpfile=.pgp/phrase
arch="`dpkg --print-architecture`"
incoming=""
outgoing=""
workdir=""
usageversion () {
cat >&2 <<END
Debian GNU/Linux builder ${version}. Copyright (C) 1996,97 Ian Jackson,
Lars Wirzenius, Andreas Jellinghaus. This is free software; see the GNU
General Public Licence version 2 or later for copying conditions. There
is NO warranty.
Usage: ${progname} [options]
Options:
-p<pidfile> pidfile (default ${pidfile})
-l<logfile> logfile (default ${logfile})
-R<pgpring> pgp ring of valid developers
(default ${pgpring})
-P<passphrase> file with pgp phrase (default ${pgpfile})
-a<arch> set architecure (default ${arch})
-D<pkgfile> list of packages processed (default ${pkgfile})
-I<incoming> directory with source packages
-O<outgoing> directory for new packages
-W<workdir> directory where the builder works
-F<faileddir> directory with logfiles if build failed
-L<logdir> directory with logfiles if build succeded
-d debug mode (set -x)
-h print this message
END
}
while [ $# != 0 ]
do
value="`echo x\"$1\" | sed -e 's/^x-.//'`"
case "$1" in
-h) usageversion; exit 0 ;;
-p*) pidfile="${value}" ;;
-l*) logfile="${value}" ;;
-R*) pgpring="${value}" ;;
-P*) pgpfile="${value}" ;;
-a*) arch="${value}" ;;
-d) set -x ;;
-D*) pkgfile="${value}" ;;
-I*) incoming="${value}" ;;
-O*) outgoing="${value}" ;;
-W*) workdir="${value}" ;;
-F*) faileddir="${value}" ;;
-L*) logdir="${value}" ;;
*) echo >&2 "${progname}: unknown option or argument $1"
usageversion; exit 2 ;;
esac
shift
done
if [ -z "${incoming}" ]; then
echo "you must specify a source dir with -I" >&2
exit 1
fi
if ! [ -d "${incoming}" ]; then
echo "directory ${incoming} does not exist" >&2
exit 1
fi
if [ -z "${outgoing}" ]; then
echo "you must specify a package dir with -O" >&2
exit 1
fi
if ! [ -d "${outgoing}" ]; then
echo "directory ${outgoing} does not exist" >&2
exit 1
fi
if [ -z "${workdir}" ]; then
echo "you must specify a workdir with -W" >&2
exit 1
fi
if ! [ -d "${workdir}" ]; then
echo "directory ${workdir} does not exist" >&2
exit 1
fi
if [ -n "${pgpfile}" ]; then
export PGPPASS="`cat ${pgpfile}`"
fi
if [ -e "${pidfile}" ]; then
echo "pidfile already exixts : ${pidfile}" >&2
exit 1
fi
trap "rm -f ${pidfile}" 1 2 3 15
echo $$ > ${pidfile}
log () {
echo $@ >> ${logfile}
}
addfile () {
echo $@.${arch} >> ${pkgfile}
log "marked as proceded : $@"
}
while true
do
for file in `ls ${incoming}/*.dsc`
do
file="`basename ${file}`"
if grep -q "${file}.${arch}" ${pkgfile}
then
continue
fi
if ! grep -q "BEGIN PGP SIGNED MESSAGE" ${incoming}/${file}
then
log "No pgp signature found in : ${file}"
addfile ${file}
continue
fi
if ! pgp +batchmode < ${incoming}/${file} > /dev/null
then
log "PGP signature invalid : ${file}"
addfile ${file}
continue
fi
echo ${incoming}/${file} > ${workdir}/todo
addfile ${file}
while ! test -e ${workdir}/result
do
sleep 10
done
echo "geschaft !"
if ! test "`cat ${workdir}/result`" == "ok" ;
then
rm ${workdir}/result
mv ${workdir}/*buildlog ${failed}
log "failed to build : ${file}"
continue
fi
echo "Ok"
rm ${workdir}/result
changes=`ls ${workdir}/*changes`
if test -z "${changes}"
then
mv ${workdir}/*buildlog ${failed}
log "no changes file found : ${file}"
continue
fi
if ! pgp -sat ${changes}
then
rm ${changes}.asc ${changes}
mv ${workdir}/*buildlog ${failed}
mv ${workdir}/*buildlog ${failed}
log "pgp signing failed : ${file}"
continue
fi
mv ${changes}.asc ${changes}
mv ${workdir}/* ${outgoing}
done
done
Reply to: