typo in BootstrapFS dependency
[build.git] / build.sh
1 #!/bin/bash
2 #
3 # PlanetLab release build script. Intended to be used by scripts and
4 # crontabs to build nightly releases (default). Can also be invoked
5 # manually to build a tagged release (-r) in the current directory.
6 #
7 # Mark Huang <mlhuang@cs.princeton.edu>
8 # Copyright (C) 2003-2005 The Trustees of Princeton University
9 #
10 # $Id: build.sh,v 1.43 2007/02/01 16:03:33 mlhuang Exp $
11 #
12
13 PATH=/sbin:/bin:/usr/sbin:/usr/bin
14
15 # Set defaults
16 SVNPATH=https://svn.planet-lab.org/svn
17 TAG=trunk
18 MODULE=build
19 BASE=$PWD
20 PLDISTRO=planetlab
21 VSERVER=
22
23 # cron does not set USER?
24 [ -z "$USER" ] && export USER=$LOGNAME
25
26 # Get options
27 while getopts "d:r:m:f:b:x:v:h" opt ; do
28     case $opt in
29         d)
30             SVNPATH=$OPTARG
31             ;;
32         r)
33             TAG=$OPTARG
34             ;;
35         m)
36             MAILTO=$OPTARG
37             ;;
38         f)
39             PLDISTRO="$OPTARG"
40             ;;
41         b)
42             BASE=$OPTARG
43             ;;
44         x)
45             BUILDS=$OPTARG
46             ;;
47         v)
48             VSERVER=$OPTARG
49             ;;
50         h|*)
51             echo "usage: `basename $0` [OPTION]..."
52             echo "      -d directory    SVN repository root (default $SVNPATH)"
53             echo "      -r revision     SVN revision to checkout (default $TAG)"
54             echo "      -v Vserver      Vserver reference to build within (optional)"
55             echo "      -m address      Notify recipient of failures (default: none)"
56             echo "      -f distro       Distribution to build (default: $PLDISTRO)"
57             echo "      -b base         Run operations in specified base directory (default $BASE)"
58             echo "      -x N            Remove all but the last N runs from the base directory (default: none)"
59             exit 1
60             ;;
61     esac
62 done
63 shift $(($OPTIND - 1))
64
65 # Base operations in specified directory
66 mkdir -p $BASE
67 cd $BASE || exit $?
68 BASEDIR=$(pwd)
69
70 # Remove old runs
71 if [ -n "$BUILDS" ] ; then
72     ls -t | sed -n ${BUILDS}~1p | xargs rm -rf
73 fi
74
75 # Create a unique build base
76 BASE=build_${TAG/trunk/`date +%Y.%m.%d`}
77 [ -n "${VSERVER}" ] && BASE=${VSERVER}_${BASE}
78 i=
79 while ! mkdir ${BASE}${i} 2>/dev/null ; do
80     [ -z ${i} ] && BASE=${BASE}.
81     i=$((${i}+1))
82     if [ $i -gt 100 ] ; then
83         echo "$0: Failed to create release directory `pwd`/${BASE}${i}"
84         exit 1
85     fi
86 done
87 BASE=${BASE}${i}
88
89 # Redirect output from here
90 exec 2>&1
91 exec &>${BASE}/log
92
93 failure() {
94     # Notify recipient of failure
95     if [ -n "$MAILTO" ] ; then
96         tail -c 8k ${BASE}/log | mail -s "Failures for ${BASE}" $MAILTO
97     fi
98     exit 1
99 }
100
101 vfailure() {
102     # Notify recipient of failure
103     vnamespace -e $BASE umount ${BASEDIR}/${BASE}/data
104     vserver $BASE stop
105     vserver --silent $BASE delete
106     failure
107     exit 1
108 }
109
110 trap failure ERR INT
111
112 set -x
113
114 VCMDPREFIX=
115 if [ -n "$VSERVER" ] ; then
116     vserver $BASE build -m clone --rootdir ${BASEDIR} -- --source /vservers/${VSERVER}
117     vserver $BASE start
118     trap vfailure ERR INT
119     if [ -d /data ] ; then
120         vnamespace -e $BASE mount -o ro --bind /data ${BASEDIR}/${BASE}/data
121     fi
122
123     # Checkout build directory
124     VSUEXEC="vserver $BASE exec su - build -c"
125
126     $VSUEXEC "svn checkout ${SVNPATH}/${MODULE}/${TAG} ${MODULE}"
127
128     # Build
129     #XXX vserver $BASE suexec build ${MODULE}/make.sh TAG=${TAG} PLDISTRO=${PLDISTRO}
130
131     # Install to boot server
132     # XXX not yet
133
134     trap - ERR INT
135     vnamespace -e $BASE umount ${BASEDIR}/${BASE}/data
136     vserver $BASE stop
137 else
138     # Checkout build directory
139     svn checkout ${SVNPATH}/${MODULE}/${TAG} ${BASE}
140
141     # Build myplc-devel-native, install it to ensure we've got the right packages, and let it rip
142     make TAG=${TAG} PLDISTRO=${PLDISTRO} -C ${BASE} BASE=$BASE BUILDS=$BUILDS MyPLC-devel-native
143     sudo yum -y localinstall RPMS/i386/MyPLC-devel-native-*.*.rpm 
144
145     # Build everything
146     make TAG=${TAG} PLDISTRO=${PLDISTRO} -C ${BASE} BASE=$BASE BUILDS=$BUILDS
147
148     # Install to boot server
149     # XXX not yet
150     #make TAG=${TAG} PLDISTRO=${PLDISTRO} -C ${BASE} install BASE=$BASE BUILDS=$BUILDS
151 fi
152
153 exit 0