first attempt to run tests after build
[infrastructure.git] / scripts / nightly-build.sh
1 #!/bin/bash
2
3 # use svn propset svn:keywords Revision to enable this
4 REVISION=$(echo '$Revision$' | sed -e 's,\$,,g' -e 's,^\w*:\s,,' )
5
6 COMMAND=$(basename $0)
7 ROOT=/build
8 CHROOTBINDIR=/root/bin
9
10 # default values, tunable with command-line options
11 SVNPATH="svn+ssh://build@svn.one-lab.org/svn/build/trunk"
12 DISTRO=onelab
13 MAILTO="onelab-build@one-lab.org"
14 TAGSFILE=onelab-tags.mk
15
16 TESTBUILDURL="http://onelab-build.inria.fr/"
17 TESTBOX=onelab-test.inria.fr
18 TESTSCRIPT=plctest/TestMain.py
19
20 ####################
21 # plc chroot runs in UTC
22 DATE=$(date -u +'%Y.%m.%d')
23
24 ### in the root context
25 function do_chroot () {
26   chroot /plc/devel/root su - build <<EOF
27 $CHROOTBINDIR/$COMMAND $@
28 EOF
29 }
30
31 # Notify recipient of failure
32 function failure() {
33   touch ${BUILD}.broken
34   if [ -n "$MAILTO" ] ; then
35     tail -c 8k ${BUILD}/log-build.txt | mail -s "Failures for ${BUILD}" $MAILTO
36   fi
37   exit 1
38 }
39
40 function success () {
41   touch ${BUILD}.ok
42   if [ -n "$MAILTO" ] ; then
43     (echo "http://build.one-lab.org/$DISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build in ${BUILD}" $MAILTO
44   fi
45   exit 0
46 }
47
48 function create_base () {
49   i=
50   while ! mkdir ${BASE}${i} 2>/dev/null ; do
51     [ -z ${i} ] && BASE=${BASE}.
52     i=$((${i}+1))
53     if [ $i -gt 100 ] ; then
54       echo "$0: Failed to create release directory `pwd`/${BASE}${i}"
55       exit 1
56     fi
57   done
58   BASE=${BASE}${i}
59 }
60
61 function use_base () {
62   [ ! -d $BASE ] && mkdir $BASE
63   if [ ! -d $BASE ] ; then
64     echo $COMMAND failed to create base $BASE
65     exit 1
66   fi
67 }
68
69 function build () {
70   trap failure ERR INT
71   set -x
72
73   echo -n "============================== Starting $COMMAND on "
74   date
75
76   cd $ROOT
77   svn co $SVNPATH $BASE
78
79   # if TAGSTAG specified : update TAGSFILE with this tag
80   if [ -n "$TAGSTAG" ] ; then
81     cd $BASE
82     svn up -r $TAGSTAG $TAGSFILE
83     cd -
84   fi
85
86   show_env
87     
88   echo "Running make IN build $(pwd)"
89   make stage1=true ${MAKEOPTS[@]} TAGSFILE=${TAGSFILE} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
90   make ${MAKEOPTS[@]} TAGSFILE=${TAGSFILE} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
91
92   # only if successful
93   rm -f latest
94   ln -s $BASE latest
95
96 }
97
98 function runtest () {
99   set -x
100   build=$1; shift
101   buildname=$(dirname $build)
102   distroname=$(dirname $(dirname $build))
103   cd build
104   rpm=$(find . -name myplc\*.rpm )
105   url=${TESTBUILDURL}${distroname}/${buildname}/${rpm}
106   ssh root@${TESTBOX} ${TESTSCRIPT} ${URL}
107   return $?
108 }
109
110 function show_env () {
111   echo ROOT=$ROOT
112   echo DISTRO=$DISTRO
113   echo BASE=$BASE
114   echo SVNPATH=$SVNPATH
115   echo MAKEVARS="${MAKEVARS[@]}"
116   echo MAKEOPTS="${MAKEOPTS[@]}"
117   echo TAGSFILE="$TAGSFILE"
118   echo TAGSTAG="$TAGSTAG"
119   echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $TAGSFILE"
120   cat $BASE/$TAGSFILE
121   echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
122 }
123
124 function usage () {
125   echo "Usage: $COMMAND [option] make-targets"
126   echo "This is revision $REVISION"
127   echo "Supported options"
128   echo " -b BASE - may include @, then replaced with current date"
129   echo " -u : uses directory given as BASE as is, even if already exists"
130   echo " -e : exits (does nothing) if BASE already exists"
131   echo " -d DISTRO"
132   echo " -t TAGSFILE"
133   echo " -r TAGSTAG - a tag that refers to TAGSFILE - defaults to HEAD"
134   echo " -s MAKEVAR=value - spaces in value are not supported"
135   echo " -n passed to make"
136   echo " -v verbose"
137   echo " -m MAILTO"
138   echo " -s SVNPATH"
139   exit 1
140 }
141
142 function main () {
143
144   if [ -d /plc/devel/data ] ; then
145     do_chroot "$@"
146   else
147     MAKEVARS=()
148     MAKEOPTS=()
149     while getopts "b:ued:t:r:B:s:nvm:s:h" opt ; do
150       case $opt in
151         b) BASE=$OPTARG ;;
152         u) USEOLD=true ;;
153         e) EXITIFOLD=true ;;
154         d) DISTRO=$OPTARG ;;
155         t) TAGSFILE=$OPTARG ;;
156         r) TAGSTAG=$OPTARG ;;
157         s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
158         n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
159         v) set -x ;;
160         m) MAILTO=$OPTARG ;;
161         s) SVNPATH=$OPTARG ;;
162         h|*) usage ;;
163       esac
164     done
165
166     shift $(($OPTIND - 1))
167     
168     ROOT=$ROOT/$DISTRO
169     cd $ROOT
170
171     MAKETARGETS="$@"
172
173     ### set BASE from DISTRO, if unspecified
174     [ -z "$BASE" ] && BASE=${DISTRO}
175     BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
176
177     if [ -n "$EXITIFOLD" -a -d "$BASE" ] ; then
178       echo "$COMMAND: -e : exits on existing base directory $BASE"
179       BUILD=$ROOT/$BASE
180       failure
181       exit 1
182     fi
183     
184     if [ -n "$USEOLD" ] ; then
185       use_base $BASE
186     else
187       create_base
188     fi
189     BUILD=$ROOT/$BASE
190     
191     build >> ${BUILD}/log-build.txt 2>&1
192
193     runtest ${BUILD} >> ${BUILD}/log-build.txt 2>&1
194
195     success
196
197   fi
198 }  
199
200 ##########
201 main "$@"