e39f0366594c5b651debdcbec253e0d5f65a1ad4
[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 $(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     if [ -f /build/$DISTROMAKETAGS ] ; then
127         echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $DISTROMAKETAGS"
128         cat /build/$DISTROMAKETAGS
129     else
130         echo "no tags definition yet - probably out of vserver"
131     fi
132     echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
133 }
134
135 function usage () {
136     echo "Usage: $COMMAND [option] make-targets"
137     echo "This is revision $REVISION"
138     echo "Supported options"
139     echo " -n dry-run : -n passed to make - no mail sent"
140     echo " -d PLDISTRO"
141     echo " -b BASE - may include @, then replaced with current date"
142     echo " -t PLDISTROMAKETAGS"
143     echo " -r TAGSRELEASE - a release number that refers to PLDISTROMAKETAGS - defaults to HEAD"
144     echo " -s SVNPATH - where to fetch the build module"
145     echo " -f FC_DISTRO - defaults to $DEFAULT_FC_DISTRO"
146     echo " -u : uses directory given as BASE as is, even if already exists"
147     echo " -s MAKEVAR=value"
148     echo " -m MAILTO"
149     echo " -B : run build only"
150     echo " -T : run test only"
151     exit 1
152 }
153
154 function main () {
155
156     set -x
157
158     # preserve arguments for passing them again later
159     declare -a argv
160     for arg in "$@"; do argv=(${argv[@]} "$arg") ; done
161     # xxx 
162     for x in "${argv[@]}"; do echo 'argv>'$x'<' ; done
163     
164     # parse arguments
165     MAKEVARS=()
166     MAKEOPTS=()
167     DO_BUILD=true
168     DO_TEST=true
169     while getopts "f:b:ud:t:r:s:nm:s:BTh" opt ; do
170         case $opt in
171             f) FC_DISTRO=$OPTARG ;;
172             b) BASE=$OPTARG ;;
173             u) USEOLD=true ;;
174             d) DISTRO=$OPTARG ;;
175             t) DISTROMAKETAGS=$OPTARG ;;
176             r) TAGSRELEASE=$OPTARG ;;
177             s) MAKEVARS=(${MAKEVARS[@]} "$OPTARG") ;;
178             n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
179             m) MAILTO=$OPTARG ;;
180             s) SVNPATH=$OPTARG ;;
181             B) DO_TEST= ;;
182             T) DO_BUILD= ; USEOLD=true ;;
183             h|*) usage ;;
184         esac
185     done
186         
187     shift $(($OPTIND - 1))
188     
189     [ -z "$FC_DISTRO" ] && FC_DISTRO=$DEFAULT_FC_DISTRO
190     MAKETARGETS="$@"
191         
192     ### set BASE from DISTRO, if unspecified
193     [ -z "$BASE" ] && BASE=${DISTRO}-${FC_DISTRO}
194     BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
195     
196     if [ -d /vservers ] ; then
197         # we run in the root context : 
198         # (*) create or check for the vserver to use
199         # (*) copy this command in the vserver
200         # (*) invoke it
201         
202         if [ -n "$USEOLD" ] ; then
203             ### Re-use a vserver (finish an unfinished build..)
204             if [ ! -d /vservers/${BASE} ] ; then
205                 echo $COMMAND : cannot find vserver $BASE
206                 exit 1
207             fi
208             # update build
209             LOG=/vservers/${BASE}.log
210             echo "XXXXXXXXXX $COMMAND: using existing vserver $BASE" $(date) >> $LOG 2>&1
211             vserver ${BASE} exec svn update /build >> $LOG 2>&1
212         else
213             # create vserver: check it does not exist yet
214             i=
215             while [ -d /vservers/${BASE}${i} ] ; do
216                 # we name subsequent builds <base>-n<i> so the logs and builds get sorted properly
217                 [ -z ${i} ] && BASE=${BASE}-n
218                 i=$((${i}+1))
219                 if [ $i -gt 100 ] ; then
220                     echo "$COMMAND: Failed to create build vserver /vservers/${BASE}${i}"
221                     exit 1
222                 fi
223             done
224             BASE=${BASE}${i}
225             LOG=/vservers/${BASE}.log
226             echo "XXXXXXXXXX $COMMAND: creating vserver $BASE" $(date) >> $LOG 2>&1
227             show_env >> $LOG 2>&1
228             ### extract vbuild.setup and run it
229             svn cat $SVNPATH/vbuild.setup > /tmp/vbuild-$$  2>> $LOG
230             svn cat $SVNPATH/${DISTRO}-devel.lst > /tmp/${DISTRO}-devel.lst  2>> $LOG
231             # Create vserver
232             cd /tmp
233             chmod +x vbuild-$$
234             /tmp/vbuild-$$ ${BASE} ${FC_DISTRO} ${DISTRO} >> $LOG 2>&1
235             cd - > /dev/null
236             # Extract build
237             vserver ${BASE} exec svn checkout ${SVNPATH} /build  >> $LOG 2>&1
238         fi
239
240         echo "XXXXXXXXXX $COMMAND: preparation of vserver $BASE done" $(date) >> $LOG 2>&1
241         cp $COMMANDPATH /vservers/${BASE}/
242         # invoke this command in the vserver
243         vserver ${BASE} exec /$COMMAND "${argv[@]}"  >> $LOG 2>&1
244
245     else
246         if [ -n "$DO_BUILD" ] ; then 
247             build 
248             touch /build-ok
249         fi
250     
251         # xxx - need to gather builds under the build index before we can re-enable this
252         #if [ -n "$DO_TEST" ] ; then 
253         #runtest ${BUILD} 
254         #fi
255     
256         success 
257
258     fi
259
260     # todo : gather results from various vservers into a single build index
261     #ROOT=$ROOT/$DISTRO
262     #BUILD=$ROOT/$BASE
263         
264 }  
265
266 ##########
267 main "$@"