rename -t into -T
[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=$(basename $build)
102   distroname=$(basename $(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   echo " -T : run test only"
140   exit 1
141 }
142
143 function main () {
144
145   if [ -d /plc/devel/data ] ; then
146     do_chroot "$@"
147   else
148     MAKEVARS=()
149     MAKEOPTS=()
150     while getopts "b:ued:t:r:B:s:nvm:s:Th" opt ; do
151       case $opt in
152         b) BASE=$OPTARG ;;
153         u) USEOLD=true ;;
154         e) EXITIFOLD=true ;;
155         d) DISTRO=$OPTARG ;;
156         t) TAGSFILE=$OPTARG ;;
157         r) TAGSTAG=$OPTARG ;;
158         s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
159         n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
160         v) set -x ;;
161         m) MAILTO=$OPTARG ;;
162         s) SVNPATH=$OPTARG ;;
163         T) TESTONLY=true ; USEOLD=true ;;
164         h|*) usage ;;
165       esac
166     done
167
168     shift $(($OPTIND - 1))
169     
170     ROOT=$ROOT/$DISTRO
171     cd $ROOT
172
173     MAKETARGETS="$@"
174
175     ### set BASE from DISTRO, if unspecified
176     [ -z "$BASE" ] && BASE=${DISTRO}
177     BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
178
179     if [ -n "$EXITIFOLD" -a -d "$BASE" ] ; then
180       echo "$COMMAND: -e : exits on existing base directory $BASE"
181       BUILD=$ROOT/$BASE
182       failure
183       exit 1
184     fi
185     
186     if [ -n "$USEOLD" ] ; then
187       use_base $BASE
188     else
189       create_base
190     fi
191     BUILD=$ROOT/$BASE
192     
193     if [ -z "$TESTONLY" ] ; then 
194       build >> ${BUILD}/log-build.txt 2>&1
195     fi
196
197     runtest ${BUILD} >> ${BUILD}/log-build.txt 2>&1
198
199     success
200
201   fi
202 }  
203
204 ##########
205 main "$@"