Report a skipped nightly build in a status file instead of by echoing text, such...
[mirror/scst/.git] / nightly / bin / nightly
1 #!/bin/sh
2
3 #----------------------------------------------------------------------------
4 # Automated build and test for SCST.  Compares SCST build from 24 hours
5 # ago with the current one.  See the README.txt on how to run it.
6 #----------------------------------------------------------------------------
7
8
9 #----------------------------------------------------------------------------
10 # Helper functions
11 #----------------------------------------------------------------------------
12
13 # Returns the revision number of the source files with date $1.
14 get_svn_revision() {
15   svn info -r "{$1}" "${scst_svn_repo}" | sed -n 's/^Revision: //p'
16 }
17
18 runcmd () {
19    logfile="$1"
20    str="$2"
21    shift 2
22
23    # Header in short logfile
24    printf "%-30s ..." "$str" >> ${logfile}.short
25
26    # Header and command in verbose logfile
27    { printf "%-30s ... " "$str"; echo "$*"; } >> ${logfile}.verbose
28
29    # Run the command
30    ("${ABT_EVAL}" "$*") >> ${logfile}.verbose 2>&1
31    res=$?
32
33    # Write result to the short logfile
34    if [ $res = 0 ]
35    then
36       echo "done"   >> ${logfile}.short
37    else
38       echo "failed" >> ${logfile}.short
39    fi
40
41    return $res
42 }
43
44 #----------------------------------------------------------------------------
45 # Startup
46 #----------------------------------------------------------------------------
47
48 scst_svn_repo="https://scst.svn.sourceforge.net/svnroot/scst/trunk"
49
50 # Must have exactly one argument
51 if [ "$#" -ne 1 ] ; then
52     echo "usage: $0 <tag>"
53     exit 1
54 fi
55
56 # Get args from command line
57 if [ "${arg0#/}" = "${arg0}" ]; then
58   scriptpath=`dirname $PWD/$0`
59 else
60   scriptpath=`dirname $0`
61 fi
62 ABT_TOP=`dirname ${scriptpath}`
63 ABT_MACHINE="$1"
64
65 # Get times and date
66 ABT_START=`date "+%F %H:%M:%S %Z"`
67
68 svn_old_date=`date --date=yesterday +%Y-%m-%dT%H:%M:%S`
69 svn_new_date=`date --date=today     +%Y-%m-%dT%H:%M:%S`
70
71 cd $ABT_TOP
72
73 # Clean up output files produced by a previous run.
74 rm -rf diffs diff.short final new.short new.verbose old.short old.verbose
75 rm -rf sendmail.log unchanged.log
76
77 # Setup any relevant environment variables from conf/<tag>.conf.
78 . conf/$ABT_MACHINE.conf
79 if [ "${ABT_JOBS}" = "" ]; then
80   ABT_JOBS=1
81 fi
82 if [ "${ABT_EVAL}" = "" ]; then
83   ABT_EVAL="eval"
84 fi
85 if [ "${ABT_TMPDIR}" = "" ]; then
86   ABT_TMPDIR="/tmp/scst-$$"
87 fi
88
89
90 #----------------------------------------------------------------------------
91 # Check out, build, test
92 #----------------------------------------------------------------------------
93
94 svn_old_rev="`get_svn_revision ${svn_old_date}`"
95 svn_new_rev="`get_svn_revision ${svn_new_date}`"
96 if [ "${svn_old_rev}" = "${svn_new_rev}" ]; then
97   echo "Both {$svn_old_date} and {$svn_new_date} correspond to r${svn_new_rev}"\
98        "-- skipping nightly build." >unchanged.log
99   exit 0
100 fi
101
102 # Do everything twice -- once for the 24 hours old SCST, and once 
103 # for the current one.
104 for logfile in old new ; do
105
106    # Remove the old scst directory.
107    rm -rf "${ABT_TMPDIR}"
108    mkdir -p "${ABT_TMPDIR}/scst"
109
110    # Remove old short and verbose log files, and start the new ones.
111    for ext in short verbose ; do
112       echo > ${logfile}.$ext
113    done
114
115    # Choose the current SCST, or one from 24 hours ago.
116    if [ ${logfile} = "old" ] ; then
117       svn_date="$svn_old_date"
118    else
119       svn_date="$svn_new_date"
120    fi
121
122    # Check out and run the tests.
123    runcmd ${logfile} \
124           "Checking out SCST source tree" \
125           "svn co -q -r {${svn_date}} ${scst_svn_repo} ${ABT_TMPDIR}/scst" && \
126    runcmd ${logfile} \
127           "Running regression tests" \
128           "cd ${ABT_TMPDIR}/scst && scripts/run-regression-tests -d ${ABT_TMPDIR}/regtest -j ${ABT_JOBS} -q ${ABT_KERNELS}"
129    runcmd ${logfile} \
130           "Cleaning up" \
131           "rm -rf ${ABT_TMPDIR}"
132
133    tail -n +4 ${logfile}.verbose >>${logfile}.short
134
135 done
136
137 #----------------------------------------------------------------------------
138 # Prepare results and send
139 #----------------------------------------------------------------------------
140
141 # 'final' shows the difference between the old and new results
142 echo                                                >  final
143 echo "Nightly build on $ABT_MACHINE ($ABT_DETAILS)" >> final
144 echo "started at $ABT_START and compared r${svn_old_rev} with r${svn_new_rev}." \
145                                                     >> final
146
147 # If the results differ from 24 hours ago, print extra stuff.
148 diff -u old.short new.short > diff.short
149 changed=$?
150
151 if [ $changed != 0 ] ; then
152    echo "Results differ from 24 hours ago"      >> final
153    changed_str=""
154 else
155    echo "Results unchanged from 24 hours ago"   >> final
156    changed_str="(unchanged) "
157 fi
158
159 if [ $changed != 0 ] ; then
160    echo "=================================================" >> final
161    echo "== Difference between 24 hours ago and now     ==" >> final
162    echo "=================================================" >> final
163    echo                                                     >> final
164    cat diff.short                                           >> final
165    echo                                                     >> final
166 fi
167
168 # Always show the current results.
169 echo                                                     >> final
170 echo "=================================================" >> final
171 echo "== Current results                             ==" >> final
172 echo "=================================================" >> final
173 cat new.short >> final
174 echo                                                     >> final
175
176 if [ $changed != 0 ] ; then
177    echo "=================================================" >> final
178    echo "== Results from 24 hours ago                   ==" >> final
179    echo "=================================================" >> final
180    cat old.short                                            >> final
181    echo                                                     >> final
182 fi
183
184 # Use the conf/<tag>.sendmail script to email the results.
185 conf/$ABT_MACHINE.sendmail \
186    "$changed_str$ABT_START nightly build ($ABT_MACHINE, $ABT_DETAILS)" \
187    final > sendmail.log 2>&1