oops
[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
7 # default values, tunable with command-line options
8 DEFAULT_FC_DISTRO=fc6
9 SVNPATH="http://svn.one-lab.org/build/trunk"
10 DISTRO=onelab
11 MAILTO="onelab-build@one-lab.org"
12 DISTROMAKETAGS=onelab-tags.mk
13
14 # web publishing results
15 WEBPATH=/build/@DISTRO@/@BUILD@
16 WEBLOG=/build/@DISTRO@/@BUILD@.txt
17
18 # for the test part
19 TESTBUILDURL="http://build.one-lab.org/"
20 TESTBOX=onelab-test.inria.fr
21 TESTBOXSSH=root@onelab-test.inria.fr
22 TESTSVNPATH="http://svn.one-lab.org/new_plc_api/trunk/plctest"
23 TESTSCRIPT=TestMain.py
24 ####################
25 # assuming vserver runs in UTC
26 DATE=$(date -u +'%Y.%m.%d')
27
28 # Notify recipient of failure or success, manage various stamps 
29 function failure() {
30     set -x
31     (echo -n "============================== $COMMAND: failure at" ; date ; tail -c 20k /log-build.txt) >> $LOG
32     if [ -n "$MAILTO" ] ; then
33         tail -c 8k /log-build.txt | mail -s "Failures for ${BASE}" $MAILTO
34     fi
35     exit 1
36 }
37
38 function success () {
39     set -x
40     touch $(dirname $LOG)/build.ok
41     if [ -n "$MAILTO" ] ; then
42         (echo "http://build.one-lab.org/$DISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build for ${BASE}" $MAILTO
43     fi
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 "============================== Starting $COMMAND:runtest on "
85     date
86     
87     ### compute URL to the myplc package
88     cd /build
89     rpm=$(find RPMS -name myplc\*.rpm )
90     url=${TESTBUILDURL}${DISTRO}/${BASE}/${rpm}
91   ### checkout the test material
92     svn co ${TESTSVNPATH} plctest
93   # compute test directory name on test box
94     testdir=plctest-${buildname}
95   # rsync/push test material onto the test box
96     ssh ${TESTBOXSSH} mkdir -p ${testdir}
97     rsync -a -v plctest/ ${TESTBOXSSH}:${testdir}
98   # invoke test on testbox
99     ssh ${TESTBOXSSH} python -u ${testdir}/${TESTSCRIPT} ${url} 
100    #invoke make install from build to the testbox
101     make install PLCHOST=${TESTBOX}
102         
103   if [ "$?" != 0 ] ; then
104         failure
105     fi
106
107     set +x
108 }
109
110 function show_env () {
111 #    echo ROOT=$ROOT
112     echo FC_DISTRO=$FC_DISTRO
113     echo DISTRO=$DISTRO
114     echo BASE=$BASE
115     echo SVNPATH=$SVNPATH
116     echo MAKEVARS="${MAKEVARS[@]}"
117     echo MAKEOPTS="${MAKEOPTS[@]}"
118     echo DISTROMAKETAGS="$DISTROMAKETAGS"
119     echo TAGSRELEASE="$TAGSRELEASE"
120     if [ -f /build/$DISTROMAKETAGS ] ; then
121         echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $DISTROMAKETAGS"
122         cat /build/$DISTROMAKETAGS
123     else
124         echo "no tags definition yet - probably out of vserver"
125     fi
126     echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
127 }
128
129 function usage () {
130     echo "Usage: $COMMAND [option] make-targets"
131     echo "This is revision $REVISION"
132     echo "Supported options"
133     echo " -n dry-run : -n passed to make - no mail sent"
134     echo " -d PLDISTRO"
135     echo " -b BASE - may include @, then replaced with current date"
136     echo " -t PLDISTROMAKETAGS"
137     echo " -r TAGSRELEASE - a release number that refers to PLDISTROMAKETAGS - defaults to HEAD"
138     echo " -s SVNPATH - where to fetch the build module"
139     echo " -f FC_DISTRO - defaults to $DEFAULT_FC_DISTRO"
140     echo " -u : uses directory given as BASE as is, even if already exists"
141     echo " -s MAKEVAR=value"
142     echo " -m MAILTO"
143     echo " -B : run build only"
144     echo " -T : run test only"
145     exit 1
146 }
147
148 function main () {
149
150     set -x
151     set -e
152
153     # preserve arguments for passing them again later
154     declare -a argv
155     for arg in "$@"; do argv=(${argv[@]} "$arg") ; done
156     
157     # parse arguments
158     MAKEVARS=()
159     MAKEOPTS=()
160     DO_BUILD=true
161     DO_TEST=true
162     while getopts "f:b:ud:t:r:s:nm:s:BTh" opt ; do
163         case $opt in
164             f) FC_DISTRO=$OPTARG ;;
165             b) BASE=$OPTARG ;;
166             u) USEOLD=true ;;
167             d) DISTRO=$OPTARG ;;
168             t) DISTROMAKETAGS=$OPTARG ;;
169             r) TAGSRELEASE=$OPTARG ;;
170             s) MAKEVARS=(${MAKEVARS[@]} "$OPTARG") ;;
171             n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
172             m) MAILTO=$OPTARG ;;
173             s) SVNPATH=$OPTARG ;;
174             B) DO_TEST= ;;
175             T) DO_BUILD= ; USEOLD=true ;;
176             h|*) usage ;;
177         esac
178     done
179         
180     shift $(($OPTIND - 1))
181     
182     [ -z "$FC_DISTRO" ] && FC_DISTRO=$DEFAULT_FC_DISTRO
183     MAKETARGETS="$@"
184         
185     ### set BASE from DISTRO, if unspecified
186     [ -z "$BASE" ] && BASE=${DISTRO}-${FC_DISTRO}
187     BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
188     
189     if [ -d /vservers ] ; then
190         # we run in the root context : 
191         # (*) create or check for the vserver to use
192         # (*) copy this command in the vserver
193         # (*) invoke it
194         
195         if [ -n "$USEOLD" ] ; then
196             ### Re-use a vserver (finish an unfinished build..)
197             if [ ! -d /vservers/${BASE} ] ; then
198                 echo $COMMAND : cannot find vserver $BASE
199                 exit 1
200             fi
201             # update build
202             LOG=/vservers/${BASE}/build/build-log.txt
203             mkdir $(dirname $LOG)
204             # redirect stdout and stderr from now on
205             exec > $LOG 2>&1 
206             echo "XXXXXXXXXX $COMMAND: using existing vserver $BASE" $(date)
207             vserver ${BASE} exec svn update /build
208         else
209             # create vserver: check it does not exist yet
210             i=
211             while [ -d /vservers/${BASE}${i} ] ; do
212                 # we name subsequent builds <base>-n<i> so the logs and builds get sorted properly
213                 [ -z ${i} ] && BASE=${BASE}-n
214                 i=$((${i}+1))
215                 if [ $i -gt 100 ] ; then
216                     echo "$COMMAND: Failed to create build vserver /vservers/${BASE}${i}"
217                     exit 1
218                 fi
219             done
220             BASE=${BASE}${i}
221             LOG=/vservers/${BASE}/build/build-log.txt
222             mkdir $(dirname $LOG)
223             # redirect stdout and stderr from now on
224             exec > $LOG 2>&1 
225             echo "XXXXXXXXXX $COMMAND: creating vserver $BASE" $(date)
226             show_env
227             ### extract vbuild.setup and run it
228             svn cat $SVNPATH/vbuild.setup > /tmp/vbuild-$$
229             svn cat $SVNPATH/${DISTRO}-devel.lst > /tmp/${DISTRO}-devel.lst
230             # Create vserver
231             cd /tmp
232             chmod +x vbuild-$$
233             /tmp/vbuild-$$ ${BASE} ${FC_DISTRO} ${DISTRO}
234             cd -
235             # Extract build
236             vserver ${BASE} exec svn checkout ${SVNPATH} /build
237         fi
238
239         echo "XXXXXXXXXX $COMMAND: preparation of vserver $BASE done" $(date)
240         cp $COMMANDPATH /vservers/${BASE}/
241         # invoke this command in the vserver
242         vserver ${BASE} exec /$COMMAND "${argv[@]}"
243
244         # publish
245         webpath=$(echo $WEBPATH | sed -e s,@DISTRO@,"$DISTRO",g -e s,@BUILD@,"$BASE",g)
246         weblog=$(echo $WEBLOG | sed -e s,@DISTRO@,"$DISTRO",g -e s,@BUILD@,"$BASE",g)
247         rm -f $webpath
248         ln -s /vservers/$BASE/build $webpath
249         rm -f $weblog
250         ln -s $LOG $weblog
251         
252     else
253         LOG=/build/build-log.txt
254         if [ -n "$DO_BUILD" ] ; then 
255             build 
256             touch /build-ok
257         fi
258     
259         if [ -n "$DO_TEST" ] ; then 
260             runtest
261         fi
262     
263         success 
264
265     fi
266
267 }  
268
269 ##########
270 main "$@"