index : builder | |
Archlinux32 build system | gitolite user |
summaryrefslogtreecommitdiff |
author | Andreas Baumann <mail@andreasbaumann.cc> | 2018-01-24 16:15:40 +0100 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2018-01-24 16:15:40 +0100 |
commit | ff768f012bfef1bf264d06214aead70a58c0ff90 (patch) | |
tree | 00fae2f78283cf61698b2b8fd2474a1f6a5802c8 /bin/return-assignment | |
parent | d5280828118b27372c5ea9be1c0cd8e55c818ff0 (diff) | |
parent | cb4eedcdca4fc5f58e83abe2aadc9abb59b4918c (diff) |
-rwxr-xr-x | bin/return-assignment | 115 |
diff --git a/bin/return-assignment b/bin/return-assignment index ebaa73a..cd6d30e 100755 --- a/bin/return-assignment +++ b/bin/return-assignment @@ -60,12 +60,14 @@ if [ "$5" = 'ERROR' ]; then fi # save sent build logs - tar -x \ - -C "${build_log_directory}/error" \ - --wildcards \ - --no-wildcards-match-slash \ - --transform="s|^|$1.$2.$3.$4.|" \ - '*.build-log.gz' + saved_build_logs=$( + tar -vx \ + -C "${build_log_directory}/error" \ + --wildcards \ + --no-wildcards-match-slash \ + --transform="s|^|$1.$2.$3.$4.|" \ + '*.build-log.gz' + ) if [ -f "${work_dir}/package-states/$1.$2.$3.$4.broken" ]; then was_broken_before=true @@ -76,20 +78,76 @@ if [ "$5" = 'ERROR' ]; then # shellcheck disable=SC2154 echo "${slave}" >> \ "${work_dir}/package-states/$1.$2.$3.$4.broken" - ${mysql_command} -e "$( - # shellcheck disable=SC2016 + # shellcheck disable=SC2016 + { + if [ -n "${saved_build_logs}" ]; then + printf 'CREATE TEMPORARY TABLE `failures` (' + printf '`%s` %s,' \ + 'date' 'DATETIME' \ + 'reason' 'SMALLINT' \ + 'log_file' 'VARCHAR(512)' | \ + sed 's/,$//' + printf ');\n' + printf 'INSERT INTO `failures` (`date`,`reason`,`log_file`) VALUES' + fail_reason_identifiers=$( + { + printf 'SELECT `fail_reasons`.`id`,replace(to_base64(`fail_reasons`.`identifier`),"\\n","")' + printf ' FROM `fail_reasons` ORDER BY `fail_reasons`.`severity`' + } | \ + ${mysql_command} --raw --batch | \ + sed '1d' + ) + for saved_build_log in ${saved_build_logs}; do + printf '%s' "${fail_reason_identifiers}" | \ + while read -r reason_id identifier; do + if zgrep -q "^$( + printf '%s' "${identifier}" | \ + base64 -d + )\$" \ + "${build_log_directory}/error/$1.$2.$3.$4.${saved_build_log}"; then + + printf ' (from_base64("%s"),%s,from_base64("%s")),' \ + "$( + printf '%s' "${saved_build_log}" | \ + sed 's|\.build-log\.gz$||;s|^.*\.||' | \ + base64 -w0 + )" \ + "${reason_id}" \ + "$( + printf '%s' "$1.$2.$3.$4.${saved_build_log}" | \ + base64 -w0 + )" + break + fi + done + done | \ + sed 's/,$//' + printf ';\n' + printf 'INSERT INTO `failed_builds` (`build_slave`,`build_assignment`,`date`,`reason`,`log_file`)' + printf ' SELECT ' + printf '`build_slaves`.`%s`,' \ + 'id' 'currently_building' + printf '`failures`.`%s`,' \ + 'date' 'reason' 'log_file' | \ + sed 's/,$//' + printf ' FROM `build_slaves` JOIN `failures`' + printf ' WHERE `build_slaves`.`name`=from_base64("%s");\n' \ + "$( + printf '%s' "${slave}" | \ + base64 -w0 + )" + printf 'DROP TABLE `failures`;\n' + fi printf 'UPDATE `build_assignments`' - # shellcheck disable=SC2016 printf ' JOIN `build_slaves` ON `build_slaves`.`currently_building`=`build_assignments`.`id`' - # shellcheck disable=SC2016 printf ' SET `build_assignments`.`is_broken`=1, `build_slaves`.`currently_building`=NULL' - # shellcheck disable=SC2016 printf ' WHERE `build_slaves`.`name`=from_base64("%s");\n' \ "$( printf '%s' "${slave}" | \ base64 -w0 )" - )" + } | \ + ${mysql_command} # shellcheck disable=SC2154 sed -i ' @@ -163,9 +221,8 @@ if [ "$5" = 'ERROR' ]; then sed 's/,$/./' fi printf '\n' - } | tee /dev/stderr > \ - "${irc_dir}/#archlinux-ports/in" - # why do we need tee there in order for the redirection to work??? + } | \ + sponge "${irc_dir}/#archlinux-ports/in" fi fi @@ -368,6 +425,34 @@ if ! [ "${destination}" = 'build-support' ]; then printf '%s\n' ${packages} > \ "${work_dir}/package-states/$1.$2.$3.$4.done" fi +# shellcheck disable=SC2016 +{ + printf 'UPDATE `build_assignments`' + printf ' JOIN `build_slaves` ON `build_slaves`.`currently_building`=`build_assignments`.`id`' + printf ' JOIN `binary_packages` ON `binary_packages`.`build_assignment`=`build_assignments`.`id`' + printf ' SET' + printf ' `build_assignments`.`is_broken`=0,' + printf ' `binary_packages`.`repository`=(SELECT `repositories`.`id` FROM `repositories` WHERE `repositories`.`name`=from_base64("%s")),' \ + "$( + printf '%s' "${destination}" | \ + base64 -w0 + )" + printf ' `binary_packages`.`has_issues`=0,' + printf ' `binary_packages`.`is_tested`=0' + printf ' WHERE `build_slaves`.`name`=from_base64("%s");\n' \ + "$( + printf '%s' "${slave}" | \ + base64 -w0 + )" + printf 'UPDATE `build_slaves` SET' + printf ' `build_slaves`.`currently_building`=NULL' + printf ' WHERE `build_slaves`.`name`=from_base64("%s");\n' \ + "$( + printf '%s' "${slave}" | \ + base64 -w0 + )" +} | \ + ${mysql_command} rm -f \ "${work_dir}/package-states/$1.$2.$3.$4.locked" \ "${work_dir}/package-states/$1.$2.$3.$4.broken" |