567a7266552710558bfff1b15d2eefc03566e197
[infrastructure.git] / scripts / nightly-build.sh
1 #!/bin/bash
2
3 COMMAND=$(basename $0)
4 ROOT=/build
5 CVSROOT=":pserver:anon@cvs.planet-lab.org:/cvs"
6 DISTRO=onelab
7 MAILTO="thierry.parmentelat@sophia.inria.fr"
8 TAG=HEAD
9 CHROOTDIR=/root/bin
10
11 # plc chroot runs in UTC
12 date=$(date -u +'%Y.%m.%d')
13
14 function usage () {
15   echo "$COMMAND [option]"
16   echo " -d CVSROOT"
17   echo " -r TAG"
18   echo " -m MAILTO"
19   echo " -f DISTRO"
20   echo " -b BASE"
21   exit 1
22 }
23
24 ### in the root context
25 function do_chroot () {
26   chroot /plc/devel/root su - build <<EOF
27 $CHROOTDIR/$COMMAND $@
28 EOF
29 }
30
31 # Notify recipient of failure
32 function failure() {
33   if [ -n "$MAILTO" ] ; then
34     tail -c 8k ${BUILD}/log-build.txt | mail -s "Failures for ${BUILD}" $MAILTO
35   fi
36   exit 1
37 }
38
39 function success () {
40   if [ -n "$MAILTO" ] ; then
41     date | mail -s "Successfull build in ${BUILD}" $MAILTO
42   fi
43   exit 0
44 }
45
46 function create_base () {
47   BASE=${TAG/HEAD/`date +%Y.%m.%d`}
48   i=
49   while ! mkdir ${BASE}${i} 2>/dev/null ; do
50     [ -z ${i} ] && BASE=${BASE}.
51     i=$((${i}+1))
52     if [ $i -gt 100 ] ; then
53       echo "$0: Failed to create release directory `pwd`/${BASE}${i}"
54       exit 1
55     fi
56   done
57   BASE=${BASE}${i}
58 }
59
60 function use_base () {
61   [ ! -d $BASE ] && mkdir $BASE
62   if [ ! -d $BASE ] ; then
63     echo $COMMAND failed to create base $BASE
64     exit 1
65   fi
66 }
67
68 function manage_distro () {
69
70   echo manage_distro disabled
71
72 # both .mk and .xml inserted into princeton's cvs
73
74 #  DISTROFILE=$BUILD/$DISTRO.mk
75 #
76 #  if [ -f $DISTROFILE ] ; then
77 #    echo Using $DISTROFILE
78 #  elif [ -f $ROOT/$DISTRO.mk ] ; then
79 #    echo Using $ROOT/$DISTRO.mk
80 #    ln -s $ROOT/$DISTRO.mk $DISTROFILE
81 #  else
82 #    echo Could not locate $DISTRO.mk
83 #    exit 1
84 #  fi
85 #
86 #  if [ "$DISTRO" != planetlab ] ; then
87 #    DISTROFILE=$BUILD/$DISTRO.xml
88 #
89 #    if [ -f $DISTROFILE ] ; then
90 #      echo Using $DISTROFILE
91 #    elif [ -f $ROOT/$DISTRO.xml ] ; then
92 #      echo Using $ROOT/$DISTRO.xml
93 #      ln -s $ROOT/$DISTRO.xml $DISTROFILE
94 #    else
95 #      echo Could not locate $DISTRO.xml
96 #      exit 1
97 #    fi
98 #  fi
99
100 }
101
102 function build () {
103   trap failure ERR INT
104   set -x
105
106   echo -n "============================== Starting $COMMAND on "
107   date
108
109   show_env
110     
111   cd $ROOT
112   cvs -d $CVSROOT co -d $BASE build
113
114   manage_distro
115
116   echo "Running make IN build $(pwd)"
117   make TAG=${TAG} PLDISTRO=${DISTRO} -C $BASE
118
119   # only if successful
120   rm -f latest
121   ln -s $BASE latest
122
123   success
124 }
125
126 function show_env () {
127   echo ROOT=$ROOT
128   echo BASE=$BASE
129   echo TAG=$TAG
130   echo DISTRO=$DISTRO
131 }
132
133 function main () {
134
135   if [ -d /plc/devel/data ] ; then
136     do_chroot "$@"
137   else
138     while getopts "d:r:m:f:b:h" opt ; do
139       case $opt in
140         d) CVSROOT=$OPTARG ;;
141         r) TAG=$OPTARG ;;
142         m) MAILTO=$OPTARG ;;
143         f) DISTRO=$OPTARG ;;
144         b) BASE=$OPTARG ;;
145         h) usage ;;
146       esac
147     done
148     shift $(($OPTIND - 1))
149
150     cd $ROOT
151     ### determine BASE
152     # if specified, use it, otherwise create from date
153     if [ -z "$BASE" ] ; then
154       create_base
155     else
156       use_base $BASE
157     fi
158     BUILD=$ROOT/$BASE
159     
160     build >> ${BUILD}/log-build.txt 2>&1
161   fi
162 }  
163
164 ##########
165 main "$@"