- set USER to LOGNAME if cron does not
[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 # $Id: build.sh,v 1.24 2005/02/14 15:09:07 mlhuang Exp $
8 #
9
10 # Set defaults
11 CVSROOT=:pserver:anon@cvs.planet-lab.org:/cvs
12 CVS_RSH=ssh
13 MODULE=build
14 TAG=HEAD
15 BASE=$PWD
16
17 # cron does not set USER?
18 [ -z "$USER" ] && USER=$LOGNAME
19
20 # Export certain variables
21 export CVS_RSH
22
23 # Get options
24 while getopts "d:r:m:b:x:h" opt ; do
25     case $opt in
26         d)
27             CVSROOT=$OPTARG
28             ;;
29         r)
30             TAG=$OPTARG
31             ;;
32         m)
33             MAILTO=$OPTARG
34             ;;
35         b)
36             BASE=$OPTARG
37             ;;
38         x)
39             BUILDS=$OPTARG
40             ;;
41         h|*)
42             echo "usage: `basename $0` [OPTION]..."
43             echo "      -d directory    CVS repository root (default $CVSROOT)"
44             echo "      -r revision     CVS revision to checkout (default $TAG)"
45             echo "      -m address      Notify recipient of failures (default: none)"
46             echo "      -b base         Run operations in specified base directory (default $BASE)"
47             echo "      -x N            Remove all but the last N runs from the base directory (default: none)"
48             exit 1
49             ;;
50     esac
51 done
52
53 # Base operations in specified directory
54 mkdir -p $BASE
55 cd $BASE || exit $?
56
57 # Remove old runs
58 if [ -n "$BUILDS" ] ; then
59     ls -t | sed -n ${BUILDS}~1p | xargs rm -rf
60 fi
61
62 # Create a unique build base
63 BASE=${TAG/HEAD/`date +%Y.%m.%d`}
64 i=
65 while ! mkdir ${BASE}${i} 2>/dev/null ; do
66     [ -z ${i} ] && BASE=${BASE}.
67     i=$((${i}+1))
68     if [ $i -gt 100 ] ; then
69         echo "$0: Failed to create release directory `pwd`/${BASE}${i}"
70         exit 1
71     fi
72 done
73 BASE=${BASE}${i}
74
75 # Redirect output from here
76 exec 2>&1
77 exec &>${BASE}/log
78
79 # Build
80 cvs -d ${CVSROOT} export -r ${TAG} -d ${BASE} ${MODULE}
81 make -C ${BASE}
82 rc=$?
83
84 if [ $rc -ne 0 ] ; then
85     # Notify recipient of failure
86     if [ -n "$MAILTO" ] ; then
87         tail -100 ${BASE}/log | mail -s "Failures for ${BASE}" $MAILTO
88     fi
89     exit $rc
90 fi
91
92 # XXX For debugging
93 set -x
94
95 # XXX Should check out a tagged version of yumgroups.xml
96 echo "$(date) Getting yumgroups.xml"
97 cvs -d ${CVSROOT} checkout -p alpina/groups/v3_yumgroups.xml > ${BASE}/RPMS/yumgroups.xml
98
99 # Create package manifest
100 echo "$(date) Creating package manifest"
101 URLBASE=$(cd ${BASE} && pwd -P)
102 URLBASE="http://build.planet-lab.org/${URLBASE##$HOME/}/SRPMS"
103 ${BASE}/packages.sh -b ${URLBASE} ${BASE}/SRPMS > ${BASE}/SRPMS/packages.xml
104
105 # Upload packages to boot server
106 SERVER=build@boot.planet-lab.org
107 ARCHIVE=/var/www/html/install-rpms/archive
108 # Put nightly alpha builds in a subdirectory
109 if [ "$TAG" = "HEAD" ] ; then
110     ARCHIVE=$ARCHIVE/planetlab-alpha
111     REPOS=/var/www/html/install-rpms/planetlab-alpha
112 fi
113
114 # Remove old runs
115 if [ -n "$BUILDS" ] ; then
116     echo "$(date) Removing old runs"
117     echo "cd $ARCHIVE && ls -t | sed -n ${BUILDS}~1p | xargs rm -rf" | ssh $SERVER /bin/bash -s
118 fi
119
120 # Populate repository
121 echo "$(date) Populating repository"
122 for RPMS in RPMS SRPMS ; do
123     ssh $SERVER mkdir -p $ARCHIVE/$BASE/$RPMS/
124     find $BASE/$RPMS/ -type f | xargs -i scp {} $SERVER:$ARCHIVE/$BASE/$RPMS/
125     ssh $SERVER yum-arch $ARCHIVE/$BASE/$RPMS/ >/dev/null
126 done
127
128 # Update nightly alpha symlink
129 echo "$(date) Updating symlink"
130 if [ "$TAG" = "HEAD" ] ; then
131     ssh $SERVER ln -nsf $ARCHIVE/$BASE/RPMS/ $REPOS
132 fi
133
134 echo "$(date) $BASE done"
135
136 exit 0