diff options
Diffstat (limited to 'bin/reproducible_maintenance.sh')
-rwxr-xr-x | bin/reproducible_maintenance.sh | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/bin/reproducible_maintenance.sh b/bin/reproducible_maintenance.sh new file mode 100755 index 00000000..efdd9985 --- /dev/null +++ b/bin/reproducible_maintenance.sh @@ -0,0 +1,224 @@ +#!/bin/bash + +# Copyright 2014-2015 Holger Levsen <holger@layer-acht.org> +# released under the GPLv=2 + +DEBUG=false +. /srv/jenkins/bin/common-functions.sh +common_init "$@" + +# common code defining db access +. /srv/jenkins/bin/reproducible_common.sh + +DIRTY=false + +# prepare backup +REP_RESULTS=/srv/reproducible-results +mkdir -p $REP_RESULTS/backup +cd $REP_RESULTS/backup + +# keep 30 days and the 1st of the month +DAY=(date -d "30 day ago" '+%d') +DATE=$(date -d "30 day ago" '+%Y-%m-%d') +if [ "$DAY" != "01" ] && [ -f reproducible_$DATE.db.xz ] ; then + rm -f reproducible_$DATE.db.xz +fi + +# actually do the backup +DATE=$(date '+%Y-%m-%d') +if [ ! -f reproducible_$DATE.db.xz ] ; then + cp -v $PACKAGES_DB . + DATE=$(date '+%Y-%m-%d') + mv -v reproducible.db reproducible_$DATE.db + xz reproducible_$DATE.db +fi + +# provide copy for external backups +cp -v $PACKAGES_DB /var/lib/jenkins/userContent/ + +# delete old temp directories +OLDSTUFF=$(find $REP_RESULTS -maxdepth 1 -type d -name "tmp.*" -mtime +2 -exec ls -lad {} \;) +if [ ! -z "$OLDSTUFF" ] ; then + echo + echo "Warning: old temp directories found in $REP_RESULTS" + find $REP_RESULTS -maxdepth 1 -type d -name "tmp.*" -mtime +2 -exec rm -rv {} \; + echo "These old directories have been deleted." + echo + DIRTY=true +fi + +# find old schroots +OLDSTUFF=$(find /schroots/ -maxdepth 1 -type d -name "reproducible-*-*" -mtime +2 -exec ls -lad {} \;) +if [ ! -z "$OLDSTUFF" ] ; then + echo + echo "Warning: old schroots found in /schroots, which have been deleted:" + find /schroots/ -maxdepth 1 -type d -name "reproducible-*-*" -mtime +2 -exec sudo rm -rf {} \; + echo "$OLDSTUFF" + echo + DIRTY=true +fi + +# find and warn about pbuild leftovers +OLDSTUFF=$(find /var/cache/pbuilder/result/ -mtime +1 -exec ls -lad {} \;) +if [ ! -z "$OLDSTUFF" ] ; then + # delete known files, see #777537 + cd /var/cache/pbuilder/result/ + echo "Attempting file detection..." + for i in $(find . -maxdepth 1 -mtime +1 -type f -exec basename {} \;) ; do + case $i in + stderr|stdout) rm -v $i + ;; + seqan-*.bed) rm -v $i # leftovers reported in #766741 + ;; + bootlogo) rm -v $i + ;; + org.daisy.paper.CustomPaperCollection.obj) rm -v $i + ;; + debian-faq.pdf.gz|debian-faq.ps.gz|debian-faq.txt.gz) rm -v $i + ;; + sumo_doxygen_lastrun.log) rm -v $i + ;; + *) ;; + esac + done + cd - + # report the rest + OLDSTUFF=$(find /var/cache/pbuilder/result/ -mtime +1 -exec ls -lad {} \;) + if [ ! -z "$OLDSTUFF" ] ; then + echo "Warning: old files or directories found in /var/cache/pbuilder/result/" + echo "$OLDSTUFF" + echo "Please cleanup manually." + fi + echo + DIRTY=true +fi + +# find failed builds due to network problems and reschedule them +# only grep through the last 5h (300 minutes) of builds... +# (ignore "*None.rbuild.log" because these are build which were just started) +# this job runs every 4h +FAILED_BUILDS=$(find /var/lib/jenkins/userContent/rbuild -type f ! -name "*None.rbuild.log" ! -mmin +300 -exec egrep -l -e 'E: Failed to fetch.*(Connection failed|Size mismatch|Cannot initiate the connection to)' {} \; || true) +if [ ! -z "$FAILED_BUILDS" ] ; then + echo + echo "Warning: the following failed builds have been found" + echo "$FAILED_BUILDS" + echo + echo "Rescheduling packages: " + for SUITE in $(echo $FAILED_BUILDS | sed "s# #\n#g" | cut -d "/" -f7 | sort -u) ; do + CANDIDATES=$(for PKG in $(echo $FAILED_BUILDS | sed "s# #\n#g" | grep "/$SUITE/" | cut -d "/" -f9 | cut -d "_" -f1) ; do echo -n "$PKG " ; done) + check_candidates + if [ $TOTAL -ne 0 ] ; then + echo " - in $SUITE: $CANDIDATES" + # '0' here means the artifacts will not be saved + schedule_packages 0 $PACKAGE_IDS + fi + done + DIRTY=true +fi + +# find+terminate processes which should not be there +HAYSTACK=$(mktemp) +RESULT=$(mktemp) +PBUIDS="1234 1111 2222" +ps axo pid,user,size,pcpu,cmd > $HAYSTACK +for i in $PBUIDS ; do + for PROCESS in $(pgrep -u $i -P 1 || true) ; do + # faked-sysv comes and goes... + grep ^$PROCESS $HAYSTACK | grep -v faked-sysv >> $RESULT 2> /dev/null || true + done +done +if [ -s $RESULT ] ; then + echo + echo "Warning: processes found which should not be there, maybe killing them now:" + cat $RESULT + echo + for PROCESS in $(cat $RESULT | cut -d " " -f1 | xargs echo) ; do + AGE=$(ps -p $PROCESS -o etimes= || echo 0) + # a single build may only take half a day, so... + if [ $AGE -gt 43200 ] ; then + sudo kill -9 $PROCESS 2>&1 + echo "'kill -9 $PROCESS' done." + else + echo "Did not kill $PROCESS as it is only $AGE seconds old." + fi + done + echo + DIRTY=true +fi +rm $HAYSTACK $RESULT + +# find packages which build didnt end correctly +QUERY=" + SELECT s.id, s.name, p.date_scheduled, p.date_build_started + FROM schedule AS p JOIN sources AS s ON p.package_id=s.id + WHERE p.date_scheduled != '' + AND p.date_build_started != '' + AND p.date_build_started < datetime('now', '-36 hours') + ORDER BY p.date_scheduled + " +PACKAGES=$(mktemp) +sqlite3 -init $INIT ${PACKAGES_DB} "$QUERY" > $PACKAGES 2> /dev/null || echo "Warning: SQL query '$QUERY' failed." +if grep -q '|' $PACKAGES ; then + echo + echo "Warning: packages found where the build was started more than 36h ago:" + echo "pkg_id|name|date_scheduled|date_build_started" + echo + cat $PACKAGES + echo + for PKG in $(cat $PACKAGES | cut -d "|" -f1) ; do + echo "sqlite3 ${PACKAGES_DB} \"DELETE FROM schedule WHERE package_id = '$PKG';\"" + sqlite3 -init $INIT ${PACKAGES_DB} "DELETE FROM schedule WHERE package_id = '$PKG';" + done + echo "Packages have been removed from scheduling." + echo + DIRTY=true +fi +rm $PACKAGES + +# find packages which have been removed from unstable +# commented out for now. This can't be done using the database anymore +QUERY="SELECT source_packages.name FROM source_packages + WHERE source_packages.name NOT IN + (SELECT sources.name FROM sources) + LIMIT 25" +#PACKAGES=$(sqlite3 -init $INIT ${PACKAGES_DB} "$QUERY") +PACKAGES='' +if [ ! -z "$PACKAGES" ] ; then + echo + echo "Removing these removed packages from database:" + echo $PACKAGES + echo + QUERY="DELETE FROM source_packages + WHERE source_packages.name NOT IN + (SELECT sources.name FROM sources) + LIMIT 25" + sqlite3 -init $INIT ${PACKAGES_DB} "$QUERY" + cd /var/lib/jenkins/userContent + for i in PACKAGES ; do + find rb-pkg/ rbuild/ notes/ dbd/ -name "${i}_*" -exec rm -v {} \; + done + cd - +fi + +# delete jenkins html logs from reproducible_builder_* jobs as they are mostly redundant +# (they only provide the extended value of parsed console output, which we dont need here.) +OLDSTUFF=$(find /var/lib/jenkins/jobs/reproducible_builder_* -maxdepth 3 -mtime +0 -name log_content.html -exec rm -v {} \; | wc -l) +if [ ! -z "$OLDSTUFF" ] ; then + echo + echo "Removed $OLDSTUFF jenkins html logs." + echo +fi + +# remove artifacts older than 3 days +ARTIFACTS=$(find /var/lib/jenkins/userContent/artifacts/* -maxdepth 1 -type d -mtime +3 -exec ls -lad {} \; || true) +if [ ! -z "$ARTIFACTS" ] ; then + echo + echo "Removed old artifacts:" + find /var/lib/jenkins/userContent/artifacts/* -maxdepth 1 -type d -mtime +3 -exec rm -rv {} \; + echo +fi + +if ! $DIRTY ; then + echo "Everything seems to be fine." + echo +fi |