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