f37 -> f39
[infrastructure.git] / scripts / trash / nightly-build-cvs.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 CVSROOT=":pserver:anon@cvs.planet-lab.org:/cvs"
12 DISTRO=onelab
13 MAILTO="onelab-build@onelab.eu"
14 TAGSFILE=onelab-tags.mk
15
16 ####################
17 # plc chroot runs in UTC
18 DATE=$(date -u +'%Y.%m.%d')
19
20 ### in the root context
21 function do_chroot () {
22   chroot /plc/devel/root su - build <<EOF
23 $CHROOTBINDIR/$COMMAND $@
24 EOF
25 }
26
27 # Notify recipient of failure
28 function failure() {
29   touch ${BUILD}.broken
30   if [ -n "$MAILTO" ] ; then
31     tail -c 8k ${BUILD}/log-build.txt | mail -s "Failures for ${BUILD}" $MAILTO
32   fi
33   exit 1
34 }
35
36 function success () {
37   touch ${BUILD}.ok
38   if [ -n "$MAILTO" ] ; then
39     (echo "http://build.onelab.eu/$DISTRO/$BASE" ; echo "Completed on $(date)" ) | mail -s "Successfull build in ${BUILD}" $MAILTO
40   fi
41   exit 0
42 }
43
44 function create_base () {
45   i=
46   while ! mkdir ${BASE}${i} 2>/dev/null ; do
47     [ -z ${i} ] && BASE=${BASE}.
48     i=$((${i}+1))
49     if [ $i -gt 100 ] ; then
50       echo "$0: Failed to create release directory `pwd`/${BASE}${i}"
51       exit 1
52     fi
53   done
54   BASE=${BASE}${i}
55 }
56
57 function use_base () {
58   [ ! -d $BASE ] && mkdir $BASE
59   if [ ! -d $BASE ] ; then
60     echo $COMMAND failed to create base $BASE
61     exit 1
62   fi
63 }
64
65 function build () {
66   trap failure ERR INT
67   set -x
68
69   echo -n "============================== Starting $COMMAND on "
70   date
71
72   cd $ROOT
73   cvs -d $CVSROOT co -r $BUILDTAG -d $BASE build
74
75   # if TAGSTAG specified : update TAGSFILE with this tag
76   if [ -n "$TAGSTAG" ] ; then
77     cd $BASE
78     cvs up -r $TAGSTAG $TAGSFILE
79     cd -
80   fi
81
82   show_env
83     
84   echo "Running make IN build $(pwd)"
85   make ${MAKEOPTS[@]} TAGSFILE=${TAGSFILE} PLDISTRO=${DISTRO} ${MAKEVARS[@]} -C $BASE $MAKETARGETS
86
87   # only if successful
88   rm -f latest
89   ln -s $BASE latest
90
91   success
92 }
93
94 function show_env () {
95   echo ROOT=$ROOT
96   echo DISTRO=$DISTRO
97   echo BASE=$BASE
98   echo MAKEVARS="${MAKEVARS[@]}"
99   echo MAKEOPTS="${MAKEOPTS[@]}"
100   echo BUILDTAG="$BUILDTAG"
101   echo TAGSFILE="$TAGSFILE"
102   echo TAGSTAG="$TAGSTAG"
103   echo "XXXXXXXXXXXXXXXXXXXX Contents of tags definition file $TAGSFILE"
104   cat $BASE/$TAGSFILE
105   echo "XXXXXXXXXXXXXXXXXXXX end tags definition"
106 }
107
108 function usage () {
109   echo "Usage: $COMMAND [option] make-targets"
110   echo "This is revision $REVISION"
111   echo "Supported options"
112   echo " -b BASE - may include @, then replaced with current date"
113   echo " -u : uses directory given as BASE as is, even if already exists"
114   echo " -e : exits (does nothing) if BASE already exists"
115   echo " -d DISTRO"
116   echo " -t TAGSFILE"
117   echo " -r TAGSTAG - a tag that refers to TAGSFILE - defaults to HEAD"
118   echo " -B BUILDTAG - the tag used to extract build/"
119   echo " -s MAKEVAR=value - spaces in value are not supported"
120   echo " -n passed to make"
121   echo " -v verbose"
122   echo " -m MAILTO"
123   echo " -c CVSROOT"
124   exit 1
125 }
126
127 function main () {
128
129   if [ -d /plc/devel/data ] ; then
130     do_chroot "$@"
131   else
132     MAKEVARS=()
133     MAKEOPTS=()
134     while getopts "b:ued:t:r:B:s:nvm:c:h" opt ; do
135       case $opt in
136         b) BASE=$OPTARG ;;
137         u) USEOLD=true ;;
138         e) EXITIFOLD=true ;;
139         d) DISTRO=$OPTARG ;;
140         t) TAGSFILE=$OPTARG ;;
141         r) TAGSTAG=$OPTARG ;;
142         B) BUILDTAG=$OPTARG ;;
143         s) MAKEVARS=(${MAKEVARS[@]} $OPTARG) ;;
144         n) MAILTO="" ; MAKEOPTS=(${MAKEOPTS[@]} -n) ;;
145         v) set -x ;;
146         m) MAILTO=$OPTARG ;;
147         c) CVSROOT=$OPTARG ;;
148         h|*) usage ;;
149       esac
150     done
151
152     shift $(($OPTIND - 1))
153     
154     ROOT=$ROOT/$DISTRO
155     cd $ROOT
156
157     MAKETARGETS="$@"
158
159     ### set BUILDTAG
160     [ -z "$BUILDTAG" ] && BUILDTAG=HEAD
161
162     ### set BASE from DISTRO, if unspecified
163     [ -z "$BASE" ] && BASE=${DISTRO}
164     BASE=$(echo ${BASE} | sed -e "s,@,${DATE},g")
165
166     if [ -n "$EXITIFOLD" -a -d "$BASE" ] ; then
167       echo "$COMMAND: -e : exits on existing base directory $BASE"
168       BUILD=$ROOT/$BASE
169       failure
170       exit 1
171     fi
172     
173     if [ -n "$USEOLD" ] ; then
174       use_base $BASE
175     else
176       create_base
177     fi
178     BUILD=$ROOT/$BASE
179     
180     build >> ${BUILD}/log-build.txt 2>&1
181   fi
182 }  
183
184 ##########
185 main "$@"