The push for ARM to become primary arch is not as easy as one might think. Everyone in the community is working hard to prove how ARM is as capable in most areas to that of the machines in primary architecture. Anyway, here are a couple of scripts one could use to help determine some basic stats about ones current build process.
To find out the current error counts and types (and unbuilt packages) of a given tag:
(could help to show how far off one is in keeping up with primary and where the errors are)
#!/bin/bash tagname="f17" tagnumb=`echo "${tagname}" | sed -e 's/[^0-9]//g'` if [ ! -f pripkgs.txt -o "$1" == "f" ] then koji --server=http://koji.fedoraproject.org/kojihub list-tagged ${tagname} --inherit --latest --quiet | awk '{ print $1 }' | sed -e 's/-[^-]*-[^-]*$//g' > pripkgs.txt fi if [ ! -f armpkgs.txt -o "$1" == "f" ] then koji --server=http://arm.koji.fedoraproject.org/kojihub list-tagged ${tagname} --inherit --latest --quiet | awk '{ print $1 }' | sed -e 's/-[^-]*-[^-]*$//g' > armpkgs.txt fi builtnum=0; builtstr="" archnumb=0; archstri="" depsnumb=0; depsstri="" reqsnumb=0; reqsstri="" confnumb=0; confstri="" buildnum=0; buildstr="" makenumb=0; makestri="" unknnumb=0; unknstri="" ubuilnum=0; ubuilstr="" outpstri="" while read pkgname do pkgtagged=`cat armpkgs.txt | grep "${pkgname}"` if [ "${pkgtagged}" == "" ] then echo "[p] ${pkgname}" 1>&2 pkgstat=`curl -Ls "http://arm.koji.fedoraproject.org/koji/search?match=glob&type=package&terms=${pkgname}" | tr -d '\t\r\n' | sed -e 's/<tr/\t<tr/g' | tr '\t' '\n' | grep -i "^<tr.*buildinfo.buildID" | sed -e 's/<a[^>]*buildinfo.buildID=\([0-9]*\)[^>]*>/ \1 /g' -e 's/<img[^>]*alt=.\([a-zA-Z]*\).[^>]*>/ \1 /g' -e 's/<[^>]*>/ /g' | grep -i "fc${tagnumb}" | sed -e 's/^[ \t]*//g' -e 's/[ \t]*$//g'` builtstat=`echo "${pkgstat}" | grep -i "complete$" | head -n 1` failstat=`echo "${pkgstat}" | grep -i "failed$" | head -n 1` if [ "${builtstat}" != "" ] then if [ "$2" == "p" ] then let builtnum="${builtnum} + 1" builtstr="${builtstr}${pkgname} http://arm.koji.fedoraproject.org/koji/search?match=glob&type=package&terms=${pkgname}\n" else outpstri="${outpstri}\n\"${pkgname}\":[\"complete\", \"\", 0]" fi elif [ "${failstat}" != "" ] then pkgnumb=`echo "${failstat}" | awk '{ print $1 }'` tasknumb=`curl -Ls "http://arm.koji.fedoraproject.org/koji/buildinfo?buildID=${pkgnumb}" | tr -d '\t\r\n' | sed -e 's/<a/\t<a/g' | tr '\t' '\n' | grep -i "^<a.*taskinfo.taskID" | sed -e 's/<a[^>]*taskinfo.taskID=\([0-9]*\)[^>]*>/ \1 /g' | awk '{ print $1 }' | head -n 1` failnumb=`curl -Ls "http://arm.koji.fedoraproject.org/koji/taskinfo?taskID=${tasknumb}" | tr -d '\t\r\n' | sed -e 's/<a/\t<a/g' | tr '\t' '\n' | grep -i "^<a.*taskinfo.taskID.*failed" | sed -e 's/<a[^>]*taskinfo.taskID=\([0-9]*\)[^>]*>/ \1 /g' | awk '{ print $1 }' | head -n 1` logsoutp=`koji --server=http://arm.koji.fedoraproject.org/kojihub watch-logs "${failnumb}"` archerro=`echo "${logsoutp}" | grep -i 'error: architecture is excluded' | head -n 1` depserro=`echo "${logsoutp}" | grep -i 'error: no package found for' | head -n 1` reqserro=`echo "${logsoutp}" | grep -i 'error: package' -A 1 | head -n 2 | tr -d '\t\r\n' | tr -s ' '` conferro=`echo "${logsoutp}" | grep -i 'error: bad exit status from' | head -n 1` builderr=`echo "${logsoutp}" | grep -i 'error: file not found' | head -n 1` makeerro=`echo "${logsoutp}" | grep -i 'make: .* error' | head -n 1` if [ "${archerro}" != "" ] then if [ "$2" == "p" ] then let archnumb="${archnumb} + 1" archstri="${archstri}${pkgname} http://arm.koji.fedoraproject.org/koji/taskinfo?taskID=${failnumb}\n" else outpstri="${outpstri}\"${pkgname}\":[\"arch-error\", \"${archerro}\", ${failnumb}]\n" fi elif [ "${depserro}" != "" ] then if [ "$2" == "p" ] then let depsnumb="${depsnumb} + 1" depsstri="${depsstri}${pkgname} http://arm.koji.fedoraproject.org/koji/taskinfo?taskID=${failnumb}\n" else outpstri="${outpstri}\"${pkgname}\":[\"dep-error\", \"${depserro}\", ${failnumb}]\n" fi elif [ "${reqserro}" != "" ] then if [ "$2" == "p" ] then let reqsnumb="${reqsnumb} + 1" reqsstri="${reqsstri}${pkgname} http://arm.koji.fedoraproject.org/koji/taskinfo?taskID=${failnumb}\n" else outpstri="${outpstri}\"${pkgname}\":[\"req-error\", \"${reqserro}\", ${failnumb}]\n" fi elif [ "${builderr}" != "" ] then if [ "$2" == "p" ] then let buildnum="${buildnum} + 1" buildstr="${buildstr}${pkgname} http://arm.koji.fedoraproject.org/koji/taskinfo?taskID=${failnumb}\n" else outpstri="${outpstri}\"${pkgname}\":[\"build-error\", \"${builderr}\", ${failnumb}]\n" fi elif [ "${makeerro}" != "" ] then if [ "$2" == "p" ] then let makenumb="${makenumb} + 1" makestri="${makestri}${pkgname} http://arm.koji.fedoraproject.org/koji/taskinfo?taskID=${failnumb}\n" else outpstri="${outpstri}\"${pkgname}\":[\"make-error\", \"${makeerro}\", ${failnumb}]\n" fi elif [ "${conferro}" != "" ] then if [ "$2" == "p" ] then let confnumb="${confnumb} + 1" confstri="${confstri}${pkgname} http://arm.koji.fedoraproject.org/koji/taskinfo?taskID=${failnumb}\n" else outpstri="${outpstri}\"${pkgname}\":[\"config-error\", \"${conferro}\", ${failnumb}]\n" fi else if [ "$2" == "p" ] then let unknnumb="${unknnumb} + 1" unknstri="${unknstri}${pkgname} http://arm.koji.fedoraproject.org/koji/taskinfo?taskID=${failnumb}\n" else outpstri="${outpstri}\"${pkgname}\":[\"unknown-error\", \"Error could not be interpreted.\", ${failnumb}]\n" fi fi else if [ "$2" == "p" ] then let ubuilnum="${ubuilnum} + 1" ubuilstr="${ubuilstr}${pkgname}\n" else outpstri="${outpstri}\"${pkgname}\":[\"unbuilt\", \"\", 0]\n" fi fi fi done < pripkgs.txt extranum=0; extrastr="" while read pkgname do pkgtagged=`cat pripkgs.txt | grep "${pkgname}"` if [ "${pkgtagged}" == "" ] then echo "[s] ${pkgname}" 1>&2 if [ "$2" == "p" ] then let extranum="${extranum} + 1" extrastr="${extrastr}${pkgname}\n" else outpstri="${outpstri}\"${pkgname}\":[\"extra\", \"\", 0]\n" fi fi done < armpkgs.txt if [ "$2" == "p" ] then printf '%10s|%10s|%10s|%10s|%10s|%10s|%10s\n' "Arch" "Deps" "Reqs" "Config" "Build" "Make" "Unknown" for i in `seq 1 80` ; do printf '-' ; done ; printf '\n' printf '%10s|%10s|%10s|%10s|%10s|%10s|%10s\n' "${archnumb}" "${depsnumb}" "${reqsnumb}" "${confnumb}" "${buildnum}" "${makenumb}" "${unknnumb}" echo if [ "${archstri}" != "" ] ; then echo -e "Arch-Errors:" ; echo -e "${archstri}" ; fi if [ "${depsstri}" != "" ] ; then echo -e "Dep-Errors:" ; echo -e "${depsstri}" ; fi if [ "${reqsstri}" != "" ] ; then echo -e "Require-Errors:" ; echo -e "${reqsstri}" ; fi if [ "${confstri}" != "" ] ; then echo -e "Config-Errors:" ; echo -e "${confstri}" ; fi if [ "${buildstr}" != "" ] ; then echo -e "Build-Errors:" ; echo -e "${buildstr}" ; fi if [ "${makestri}" != "" ] ; then echo -e "Make-Errors:" ; echo -e "${makestri}" ; fi if [ "${unknstri}" != "" ] ; then echo -e "Unknown-Errors:" ; echo -e "${unknstri}" ; fi if [ "${builtstr}" != "" ] ; then echo -e "Built but un-tagged/blocked pkgs = ${builtnum}" ; echo -e "${builtstr}" ; fi echo -e "Number of unbuilt/cancelled/building pkgs = ${ubuilnum}\n" if [ "${extrastr}" != "" ] ; then echo -e "Pkgs tagged in arm and not primary = ${extranum}" ; echo -e "${extrastr}" ; fi echo else echo -e "${outpstri}" echo fi
This script can help to compare build times between your various machines and primary:
(could help to compare how quickly ones build farm could keep up with primaries)
#!/bin/bash function taskinfo { roottask=`koji --server="$1/kojihub" buildinfo "$2" | grep -i '^task:' | awk '{ print $2 }'` curl -Ls "$1/koji/taskinfo?taskID=${roottask}" | tr -d '\t\r\n' | sed -e 's/<a/\t<a/g' | tr '\t' '\n' | grep -i 'taskinfo.taskID=.*buildArch' | sed -e 's/^.*taskinfo.taskID=\([0-9]*\).*$/ \1 /g' > /tmp/koji.task.$4.txt while read tasknumb do taskinfo=`curl -Ls "$1/koji/taskinfo?taskID=${tasknumb}" | tr -d '\t\r\n' | sed -e 's/<tr/\t<tr/g' | tr '\t' '\n'` begtime=`echo "${taskinfo}" | grep -i '^<tr>.*<th>.*Started.*</th>' | sed -e 's/^.*<td>//g' -e 's/<[^>]*>/ /g' -e 's/^[ \t]*//g' -e 's/[ \t]*$//g'` endtime=`echo "${taskinfo}" | grep -i '^<tr>.*<th>.*Completed.*</th>' | sed -e 's/^.*<td>//g' -e 's/<[^>]*>/ /g' -e 's/^[ \t]*//g' -e 's/[ \t]*$//g'` archname=`echo "${taskinfo}" | grep -i "^<tr>.*<th>.*Arch.*</th>" | sed -e 's/^.*<td>//g' -e 's/<[^>]*>/ /g' -e 's/^[ \t]*//g' -e 's/[ \t]*$//g'` hostname=`echo "${taskinfo}" | grep -i "^<tr>.*<th>.*Host.*</th>.*<td>.*$3.*</td>" | sed -e 's/^.*<td>//g' -e 's/<[^>]*>/ /g' -e 's/^[ \t]*//g' -e 's/[ \t]*$//g'` if [ "${begtime}" != "" -a "${endtime}" != "" -a "${archname}" != "" -a "${hostname}" != "" ] then begepoch=`date --date="${begtime}" '+%s'` endepoch=`date --date="${endtime}" '+%s'` hourdiff=`echo "(${endepoch} - ${begepoch}) / 3600" | bc` if [ ${hourdiff} -lt 10 ] ; then hourdiff="0${hourdiff}" ; fi mindiff=`echo "((${endepoch} - ${begepoch}) / 60) % 60" | bc` if [ ${mindiff} -lt 10 ] ; then mindiff="0${mindiff}" ; fi echo "${archname} ${hourdiff}:${mindiff}" fi done < /tmp/koji.task.$4.txt } tagname="f17" tagnumb=`echo "${tagname}" | sed -e 's/[^0-9]//g'` if [ ! -f primary.built.txt ] then koji --server=http://koji.fedoraproject.org/kojihub list-tagged ${tagname} --inherit --latest --quiet | awk '{ print $1 }' > primary.built.txt fi tempfile="$1" uniqname=`head -c 1024 /dev/urandom | md5sum | awk '{ print $1 }'` if [ "${tempfile}" == "" ] then koji --server=http://arm.koji.fedoraproject.org/kojihub list-tagged ${tagname} --inherit --latest --quiet | awk '{ print $1 }' > arm.built.txt tempfile="arm.built.txt" fi builder="$2" if [ "${builder}" == "" ] then builder="cdot.trimslice" fi printf '%-40s | %10s | %10s | %10s | %10s | %20s\n' "Package Name" "x86" "x64" "ARMvSFP" "ARMvHFP" "(Time = HH:MM)" for i in `seq 1 95` ; do printf '-' ; done ; printf '\n' while read srpmname do pkgname=`echo "${srpmname}" | sed -e 's/-[^-]*-[^-]*$//g'` primpkg=`cat primary.built.txt | grep "^${pkgname}-[0-9\.][0-9\.]*-" | head -n 1` arminfo=`taskinfo "http://arm.koji.fedoraproject.org" "${srpmname}" "${builder}" "${uniqname}"` if [ "${arminfo}" != "" ] then priminfo=`taskinfo "http://koji.fedoraproject.org" "${primpkg}" ".*" "${uniqname}"` tttime=`echo "${priminfo}" | grep -i '^i386 ' | awk '{ print $2 }' | head -n 1` sftime=`echo "${priminfo}" | grep -i '^x86_64 ' | awk '{ print $2 }' | head -n 1` astime=`echo "${arminfo}" | grep -i '^arm ' | awk '{ print $2 }' | head -n 1` ahtime=`echo "${arminfo}" | grep -i '^armhfp ' | awk '{ print $2 }' | head -n 1` printf '%-40s | %10s | %10s | %10s | %10s |\n' "${pkgname}" "${tttime}" "${sftime}" "${astime}" "${ahtime}" fi done < ${tempfile}