seen strange stuff with the planetlab distro - added to log
[infrastructure.git] / scripts / nightly-build-vserver.sh
1 #!/bin/bash
2 REVISION=$(echo '$Revision$' | sed -e 's,\$,,g' -e 's,^\w*:\s,,' )
3
4 COMMANDPATH=$0
5 COMMAND=$(basename $0)
6 #ROOT=/build
7
8 # default values, tunable with command-line options
9 DEFAULT_FC_DISTRO=fc6
10 SVNPATH="http://svn.one-lab.org/build/trunk"
11 DISTRO=onelab
12 MAILTO="onelab-build@one-lab.org"
13 DISTROMAKETAGS=onelab-tags.mk
14 PLEBOX=root@planet-lab.eu
15 TESTBUILDURL="http://build.one-lab.org/"
16 TESTBOX=onelab-test.inria.fr
17 TESTBOXSSH=root@onelab-test.inria.fr
18 TESTSVNPATH="http://svn.one-lab.org/new_plc_api/trunk/plctest"
19 TESTSCRIPT=TestMain.py
20 TESTSEND=TestSendMail
21 ####################
22 # plc chroot runs in UTC
23 DATE=$(date -u +'%Y.%m.%d')
24
25 # Notify recipient of failure or success, manage various stamps 
26 function failure() {
27     set -x
28     (echo -n "============================== $COMMAND: failure at" ; date ; tail -c 20k /log-build.txt) >> /build.broken
29     if [ -n "$MAILTO" ] ; then
30         tail -c 8k /log-build.txt | mail -s "Failures for ${BASE}" $MAILTO
31     fi
32     exit 1
33 }
34
35 function success () {
36     set -x
37     touch /build.ok
38     if [ -n "$MAILTO" ] ; then
39         (echo "http://build.one-lab.org/$DISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build for ${BASE}" $MAILTO
40     fi
41 #    cd ${ROOT}
42 #    rm -f latest
43 #    ln -s $BASE latest
44     exit 0
45 }
46
47 function build () {
48     set -x
49     set -e
50     trap failure ERR INT
51
52     echo -n "============================== Starting $COMMAND:build on "
53     date
54
55     cd /
56 #    svn checkout $SVNPATH $BASE
57
58   # if TAGSRELEASE specified : update DISTROMAKETAGS with this tag
59     if [ -n "$TAGSRELEASE" ] ; then
60         cd build
61         svn up -r $TAGSRELEASE $DISTROMAKETAGS
62         cd - > /dev/null
63     fi
64
65     show_env
66     
67     echo "Running make IN build $(pwd)"
68     make stage1=true ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C /build
69     # in case we use an older build
70     set +e
71     make ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C /build versions
72     set -e
73     make ${MAKEOPTS[@]} DISTROMAKETAGS=${DISTROMAKETAGS} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C /build $MAKETARGETS
74
75     # restore silent mode - otherwise cron gets it
76     set +x
77 }
78
79 function runtest () {
80     set -x
81     set -e
82     trap failure ERR INT
83
84     echo -n"==============================> testing the sendmail service on PLE"
85     ssh ${PLEBOX} python -u /root/${TESTSEND} 
86
87     echo -n "============================== Starting $COMMAND:runtest on "
88     date
89     
90
91     ### compute URL to the myplc package
92     build=$1; shift
93     buildname=$(basename $build)
94     cd $build
95     rpm=$(find RPMS -name myplc\*.rpm )
96     url=${TESTBUILDURL}${DISTRO}/${buildname}/${rpm}
97   ### checkout the test material
98     svn co ${TESTSVNPATH} plctest
99   # compute test directory name on test box
100     testdir=plctest-${buildname}
101   # rsync/push test material onto the test box
102     ssh ${TESTBOXSSH} mkdir -p ${testdir}
103     rsync -a -v plctest/ ${TESTBOXSSH}:${testdir}
104   # invoke test on testbox
105     ssh ${TESTBOXSSH} python -u ${testdir}/${TESTSCRIPT} ${url} 
106    #invoke make install from build to the testbox
107     make install PLCHOST=${TESTBOX}
108         
109   if [ "$?" != 0 ] ; then
110         failure
111     fi
112
113     set +x
114 }
115
116 function show_env () {
117 #    echo ROOT=$ROOT
118     echo FC_DISTRO=$FC_DISTRO
119     echo DISTRO=$DISTRO
120     echo BASE=$BASE
121     echo SVNPATH=$SVNPATH
122     echo MAKEVARS="${MAKEVARS[@]}"
123     echo MAKEOPTS="${MAKEOPTS[@]}"
124     echo DISTROMAKETAGS="$DISTROMAKETAGS"
125     echo TAGSRELEASE="$TAGSRELEASE"
126     echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $DISTROMAKETAGS"
127     cat /build/$DISTROMAKETAGS
128     echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
129 }
130
131 function usage () {
132     echo "Usage: $COMMAND [option] make-targets"
133     echo "This is revision $REVISION"
134     echo "Supported options"
135     echo " -f FC_DISTRO - defaults to $DEFAULT_FC_DISTRO"
136     echo " -b BASE - may include @, then replaced with current date"
137     echo " -u : uses directory given as BASE as is, even if already exists"
138     echo " -d PLDISTRO"
139     echo " -t PLDISTROMAKETAGS"
140     echo " -r TAGSRELEASE - a release number that refers to PLDISTROMAKETAGS - defaults to HEAD"
141     echo " -s MAKEVAR=value - spaces in value are not supported"
142     echo " -n dry-run : -n passed to make - no mail sent"
143     echo " -m MAILTO"
144     echo " -s SVNPATH"
145     echo " -B : run build only"
146     echo " -T : run test only"
147     exit 1
148 }
149
150 function main () {
151
152     # parse arguments
153     MAKEVARS=()
154     MAKEOPTS=()
155     DO_BUILD=true
156     DO_TEST=true
157     while getopts "f:b:ud:t:r:s:nm:s:BTh" opt ; do
158         case $opt in
159             f) FC_DISTRO=$OPTARG ;;
160             b) BASE=$OPTARG ;;
161             u) USEOLD=true ;;
162             d) DISTRO=$OPTARG ;;
163             t) DISTROMAKETAGS=$OPTARG ;;
164             r) TAGSRELEASE=$OPTARG ;;
165             s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
166             n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
167             m) MAILTO=$OPTARG ;;
168             s) SVNPATH=$OPTARG ;;
169             B) DO_TEST= ;;
170             T) DO_BUILD= ; USEOLD=true ;;
171             h|*) usage ;;
172         esac
173     done
174         
175     shift $(($OPTIND - 1))
176     
177     [ -z "$FC_DISTRO" ] && FC_DISTRO=$DEFAULT_FC_DISTRO
178     MAKETARGETS="$@"
179         
180     ### set BASE from DISTRO, if unspecified
181     [ -z "$BASE" ] && BASE=${DISTRO}-${FC_DISTRO}
182     BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
183     
184     # if we run in the root context : 
185     # (*) create or check for the vserver to use
186     # (*) copy this command in the vserver
187     # (*) invoke it
188
189     if [ -d /vservers ] ; then
190         
191         if [ -n "$USEOLD" ] ; then
192             ### Re-use a vserver (finish an unfinished build..)
193             if [ ! -d /vservers/${BASE} ] ; then
194                 echo $COMMAND : cannot find vserver $BASE
195                 exit 1
196             fi
197             # update build
198             LOG=/vservers/${BASE}.log
199             echo "XXXXXXXXXX $COMMAND: using existing vserver $BASE" $(date) >> $LOG 2>&1
200             vserver ${BASE} exec svn update /build >> $LOG 2>&1
201         else
202             # create vserver: check it does not exist yet
203             i=
204             while [ -d /vservers/${BASE}${i} ] ; do
205                 # we name subsequent builds <base>-n<i> so the logs and builds get sorted properly
206                 [ -z ${i} ] && BASE=${BASE}-n
207                 i=$((${i}+1))
208                 if [ $i -gt 100 ] ; then
209                     echo "$COMMAND: Failed to create build vserver /vservers/${BASE}${i}"
210                     exit 1
211                 fi
212             done
213             BASE=${BASE}${i}
214             LOG=/vservers/${BASE}.log
215             echo "XXXXXXXXXX $COMMAND: creating vserver $BASE" $(date) >> $LOG 2>&1
216             show_env >> $LOG 2>&1
217             ### extract vbuild.setup and run it
218             svn cat $SVNPATH/vbuild.setup > /tmp/vbuild-$$  2>> $LOG
219             svn cat $SVNPATH/${DISTRO}-devel.lst > /tmp/${DISTRO}-devel.lst  2>> $LOG
220             # Create vserver
221             cd /tmp
222             chmod +x vbuild-$$
223             /tmp/vbuild-$$ ${BASE} ${FC_DISTRO} ${DISTRO} >> $LOG 2>&1
224             cd - > /dev/null
225             # Extract build
226             vserver ${BASE} exec svn checkout ${SVNPATH} /build  >> $LOG 2>&1
227         fi
228
229         echo "XXXXXXXXXX $COMMAND: preparation of vserver $BASE done" $(date) >> $LOG 2>&1
230         cp $COMMANDPATH /vservers/${BASE}/
231         # invoke this command in the vserver
232         vserver ${BASE} exec /$COMMAND "$@"  >> $LOG 2>&1
233
234     else
235         echo "In vserver : got args" "$@"
236         if [ -n "$DO_BUILD" ] ; then 
237             build 
238             touch /build-ok
239         fi
240     
241         # xxx - need to gather builds under the build index before we can re-enable this
242         #if [ -n "$DO_TEST" ] ; then 
243         #runtest ${BUILD} 
244         #fi
245     
246         success 
247
248     fi
249
250     # todo : gather results from various vservers into a single build index
251     #ROOT=$ROOT/$DISTRO
252     #BUILD=$ROOT/$BASE
253         
254 }  
255
256 ##########
257 main "$@"