9398
|
1 |
#!/bin/bash
|
|
2 |
|
|
3 |
# Sample usage in crontab:
|
|
4 |
# Run, Mon-Fri at 1:30am. Add to build user's crontab.
|
|
5 |
# 30 1 * * 1-5 . /jds/cbe/bin/env.sh; I_KNOW_WHAT_IM_DOING=yes myEnv=nightly-beijing.env $0
|
|
6 |
#
|
|
7 |
# The same with a jail. Add to root's crontab. Example assumes 'gbuild' is the
|
|
8 |
# build user
|
|
9 |
# 30 1 * * 1-5 /usr/sbin/chroot /path/to/jail/root /usr/bin/su - gbuild -c ". /jds/cbe/bin/env.sh; I_KNOW_WHAT_IM_DOING=yes myEnv=nightly-beijing.env $0"
|
|
10 |
#
|
|
11 |
# Or - you may choose to only build a particular package
|
|
12 |
# 30 1 * * 1-5 . /jds/cbe/bin/env.sh; thisSpec=SUNWTiff.spec I_KNOW_WHAT_IM_DOING=yes myEnv=nightly-beijing.env $0
|
|
13 |
#
|
|
14 |
# History:
|
|
15 |
# --------
|
|
16 |
#
|
|
17 |
# Damien Carbery:
|
|
18 |
# cron-script.sh, original script
|
|
19 |
#
|
|
20 |
# Alexandre Berman:
|
|
21 |
# based on the original script, created cron-nightly.sh
|
|
22 |
# added/changed features:
|
|
23 |
# - added sub-routines for easy debugging, clarity
|
|
24 |
# - changed to SVN (original script used cvs)
|
|
25 |
# - took all site-dependent variable declarations out of the script and adopted it to use env file
|
|
26 |
# - added support for building individual components (must specify spec file), useful for debugging and others..
|
|
27 |
# - added more verbosity to the script for debugging and clarity
|
|
28 |
|
|
29 |
if [ -r $myEnv ]; then
|
|
30 |
. $myEnv # setup our env
|
|
31 |
else
|
|
32 |
echo "-- ENV is NOT defined ! Exiting..."
|
|
33 |
exit 1
|
|
34 |
fi
|
|
35 |
|
|
36 |
# host to rcp the rpms to
|
|
37 |
RHOST="$RHOST"
|
|
38 |
# user to rcp as (has to have root@<this host> in it's .rhosts file)
|
|
39 |
RUSER="$RUSER"
|
|
40 |
# other vars
|
|
41 |
TEMP_DIR="$TEMP_DIR"
|
|
42 |
SPECDIR="$SPECDIR"
|
|
43 |
BUILD_BASE="$BUILD_BASE"
|
|
44 |
PRODNAME="$PRODNAME"
|
|
45 |
# directory to copy rpms/srpms to on the remote host
|
|
46 |
RPMSDIR="$RPMSDIR"
|
|
47 |
LOCKFILE="$RPMSDIR/.build.lock"
|
|
48 |
# reply-to/to address to send the build log as/to
|
|
49 |
EMAIL_ERRORS_TO="$EMAIL_ERRORS_TO"
|
|
50 |
EMAIL_NOTIFICATION="$EMAIL_NOTIFICATION"
|
|
51 |
# document root of the web server
|
|
52 |
WEBROOT="$WEBROOT"
|
|
53 |
LOGDIR_BASE_URL="$LOGDIR_BASE_URL"
|
|
54 |
# tarballsdir
|
|
55 |
TARBALLSDIR="$TARBALLSDIR"
|
|
56 |
# subdir to keep logs and reports on the webserver
|
|
57 |
WEBDIR="$WEBDIR"
|
|
58 |
|
|
59 |
# date format appended to the Release tag in the spec files
|
|
60 |
# (passed to the date command on the cmd line)
|
|
61 |
RELEASE_DATE_FMT="%y%m%d"
|
|
62 |
# date format used for naming the directories
|
|
63 |
DIR_DATE_FMT="%Y-%m-%d"
|
|
64 |
RELEASE_DATE=`date +$RELEASE_DATE_FMT`
|
|
65 |
DIR_DATE=`date +$DIR_DATE_FMT`
|
|
66 |
LOGDIR="$WEBDIR/$DIR_DATE"
|
|
67 |
|
|
68 |
# ------------ nothing to configure below this line --------------
|
|
69 |
|
|
70 |
if [ "x$I_KNOW_WHAT_IM_DOING" != xyes ]; then
|
|
71 |
echo " ,---------------------------------------------------------------."
|
|
72 |
echo "| This script is intended to be run from cron for producing |"
|
|
73 |
echo "| official nightly builds (Beijing site). |"
|
|
74 |
echo "| It will mail responsible engineers |"
|
|
75 |
echo "| if any build failure occurs, sends build reports to |"
|
|
76 |
echo "| RE and update web pages. |"
|
|
77 |
echo "|"
|
|
78 |
echo "| Don't run it unless you know what you are doing. Thanks."
|
|
79 |
echo "|"
|
|
80 |
echo "| Mail [email protected] if you need more info."
|
|
81 |
echo ".................................................................+"
|
|
82 |
exit 1
|
|
83 |
fi
|
|
84 |
|
|
85 |
MYNAME="$0"
|
|
86 |
MYDIR=$(cd `dirname $0`; pwd)
|
|
87 |
shortName=`echo $MYNAME | sed -e 's|^.*\/||g'`
|
|
88 |
|
|
89 |
# remove temporary files on exit
|
|
90 |
clean_up () {
|
|
91 |
case "$MYNAME" in
|
|
92 |
/tmp/$shortName.copy.* )
|
|
93 |
rm -f $MYNAME
|
|
94 |
;;
|
|
95 |
esac
|
|
96 |
exit
|
|
97 |
}
|
|
98 |
|
|
99 |
trap clean_up HUP INT TERM QUIT EXIT
|
|
100 |
|
|
101 |
# make a copy of the cron script in /tmp and execute that in order to
|
|
102 |
# avoid disasters caused by cvs update.
|
|
103 |
case "$MYNAME" in
|
|
104 |
/tmp/*.copy.* )
|
|
105 |
;;
|
|
106 |
*)
|
|
107 |
cp $MYNAME /tmp/$shortName.copy.$$
|
|
108 |
chmod 755 /tmp/$shortName.copy.$$
|
|
109 |
cd /tmp
|
|
110 |
exec /tmp/$shortName.copy.$$ "$MYDIR"
|
|
111 |
;;
|
|
112 |
esac
|
|
113 |
|
|
114 |
fatal_error () {
|
|
115 |
echo "ERROR: $*"
|
|
116 |
exit 1
|
|
117 |
}
|
|
118 |
|
|
119 |
# prepare TEMP_DIR and repository - using SVN now
|
|
120 |
prep_repository() {
|
|
121 |
if [ -d $SPECDIR ]; then
|
|
122 |
cd $SPECDIR || fatal_error "$SPECDIR not found"
|
|
123 |
echo "-- updating SVN rep ..."
|
|
124 |
#revert any local changes
|
|
125 |
svn revert -R .
|
|
126 |
|
|
127 |
svn -q up > /dev/null 2>&1 || fatal_error "SVN update failed"
|
|
128 |
else
|
|
129 |
echo "-- checking out fresh copy of Spec files from SVN rep ..."
|
|
130 |
rm -rf $TEMP_DIR
|
|
131 |
mkdir $TEMP_DIR; cd $TEMP_DIR
|
|
132 |
svn -q checkout svn://dtsvn.ireland.sun.com/sgnome/svn/repos/jds-spec-files/trunk \
|
|
133 |
> /dev/null 2>&1 || fatal_error "SVN checkout failed"
|
|
134 |
fi
|
|
135 |
# if the script changed during repository update, restart with the updated script
|
|
136 |
if ! /usr/bin/cmp -s $SPECDIR/$shortName $MYNAME; then exec $SPECDIR/$shortName; fi
|
|
137 |
}
|
|
138 |
|
|
139 |
|
|
140 |
# uninstall all pkgs left behind by a previous build
|
|
141 |
do_uninst() {
|
|
142 |
echo "-- uninstalling packages..."
|
|
143 |
pkgtool uninstall-pkgs --with-l10n --with-tjds $thisSpec >/dev/null
|
|
144 |
# remove-gnome will now remove anything left from uninstall-pkgs in case
|
|
145 |
# of a packaging change for example
|
9401
|
146 |
$SPECDIR/scripts/remove-gnome --version jds -q -f --no_extras > /dev/null 2>&1
|
9398
|
147 |
}
|
|
148 |
|
|
149 |
do_clean_pkgs() {
|
|
150 |
rm -rf $BUILD_BASE/PKGS/*
|
|
151 |
rm -rf $BUILD_BASE/SPKGS/*
|
|
152 |
rm -rf $BUILD_BASE/BUILD/*
|
|
153 |
rm -rf /var/tmp/*-build
|
|
154 |
}
|
|
155 |
|
|
156 |
# if the log directory exists, open a new one with numbered suffix
|
|
157 |
do_log_dir() {
|
|
158 |
echo "-- setting up logs..."
|
|
159 |
NEW_LOGDIR=$LOGDIR
|
|
160 |
N=1
|
|
161 |
while [ -d $WEBROOT/$NEW_LOGDIR ]; do
|
|
162 |
NEW_LOGDIR=$LOGDIR.$N
|
|
163 |
N=`expr $N + 1`
|
|
164 |
echo "-- LOGDIR exists, changing to: $NEW_LOGDIR"
|
|
165 |
done
|
|
166 |
LOGDIR=$NEW_LOGDIR
|
|
167 |
echo "-- LOGDIR: $WEBROOT/$LOGDIR"
|
|
168 |
echo "-- LOGDIR URL: $LOGDIR_BASE_URL/$LOGDIR"
|
|
169 |
mkdir -p $WEBROOT/$LOGDIR || exit 5
|
|
170 |
}
|
|
171 |
|
|
172 |
# start the build
|
|
173 |
do_build() {
|
|
174 |
echo "-- build started, using log: /tmp/build.log.$$ ..."
|
|
175 |
cd $SPECDIR || fatal_error "$SPECDIR not found"
|
|
176 |
echo '' | rsh $RHOST -l $RUSER "mkdir -p $RPMSDIR; touch $LOCKFILE"
|
|
177 |
pkgtool -v --nightly --date "$RELEASE_DATE" build $thisSpec \
|
|
178 |
--logdir=$WEBROOT/$LOGDIR \
|
|
179 |
--summary-log=$WEBROOT/$LOGDIR.html \
|
|
180 |
--logdir-url=$LOGDIR_BASE_URL/$LOGDIR \
|
|
181 |
--mail-errors-to=$EMAIL_ERRORS_TO \
|
|
182 |
--prodname="${PRODNAME}/s${OSrel}${OSarch}" \
|
|
183 |
--live --with-l10n --with-tjds \
|
|
184 |
--norc \
|
|
185 |
--tarballdirs=$TARBALLSDIR \
|
|
186 |
--define "nightly 1" \
|
|
187 |
--summary-title="${PRODNAME} S${OSrel}/${OSarch_full} Nightly Build Report `date +'%d %B %Y'`" \
|
|
188 |
> /tmp/build.log.$$ 2>&1
|
|
189 |
# --rpm-url=file:///net/allstar.prc$RPMSDIR/all_pkgs \
|
|
190 |
# the number of failed pkgs is returned
|
|
191 |
FAILED=$?; export FAILED
|
|
192 |
}
|
|
193 |
|
|
194 |
# choose what to build ?
|
|
195 |
# coices are: everything or specific spec file
|
|
196 |
choose_build() {
|
|
197 |
if [ "x$thisSpec" = "x" ]; then
|
|
198 |
# no spec file was chosen, build everything
|
9401
|
199 |
thisSpec='*.spec closed/*.spec'; export thisSpec
|
9398
|
200 |
echo "-- building following components: $thisSpec"
|
|
201 |
else
|
|
202 |
# verify chosen spec file
|
|
203 |
if [ ! -f $SPECDIR/$thisSpec ]; then
|
|
204 |
fatal_error "chosen spec file ($thisSpec) does not exist in spec dir ($SPECDIR)"
|
|
205 |
fi
|
|
206 |
echo "-- building following components: $thisSpec"
|
|
207 |
fi
|
|
208 |
}
|
|
209 |
|
|
210 |
# rotate rpms dir
|
|
211 |
do_rotate_rpms() {
|
|
212 |
echo '' | rsh $RHOST -l $RUSER "rm -rf $RPMSDIR.prev; mv $RPMSDIR $RPMSDIR.prev; mkdir -p $RPMSDIR"
|
|
213 |
}
|
|
214 |
|
|
215 |
# make dist
|
|
216 |
do_make_dist() {
|
|
217 |
echo "-- making dist ..."
|
|
218 |
/sgnome/tools/re-scripts/jds-build/make-jds-dist /jds/packages/PKGS /jds/dist nightly- > /dev/null 2>&1
|
|
219 |
echo '' | rcp -r /jds/dist/nightly-/${OSarch_full}/* /jds/dist/nightly-/${OSarch_full}/.??* ${RUSER}@${RHOST}:$RPMSDIR
|
|
220 |
echo '' | rsh $RHOST -l $RUSER "chmod a+x $RPMSDIR/install-jds"
|
|
221 |
echo '' | rsh $RHOST -l $RUSER "mkdir -p $RPMSDIR/all_pkgs && cd $RPMSDIR/all_pkgs && ln -s ../*/*.tar.gz ."
|
|
222 |
rm -rf /jds/dist/nightly-
|
|
223 |
}
|
|
224 |
|
|
225 |
# web reports
|
|
226 |
do_web_reports() {
|
|
227 |
ALL_REPORTS=$WEBROOT/$WEBDIR/all_reports.html
|
|
228 |
echo "-- creating main report in: $ALL_REPORTS"
|
|
229 |
touch $ALL_REPORTS
|
|
230 |
cp $ALL_REPORTS $ALL_REPORTS.old
|
|
231 |
export ALL_REPORTS
|
|
232 |
# update web page
|
|
233 |
( echo "<A HREF=$LOGDIR_BASE_URL/$LOGDIR.html>$DIR_DATE</A> $FAILED package(s) failed<BR>"; \
|
|
234 |
cat $ALL_REPORTS.old ) > $ALL_REPORTS
|
|
235 |
}
|
|
236 |
|
|
237 |
# send warnings, errors and summary in email
|
|
238 |
do_email() {
|
|
239 |
grep -v '^INFO:' /tmp/build.log.$$ | \
|
|
240 |
mailx -s "${PRODNAME} S${OSrel} ${OSarch_full} nightly build: $FAILED pkgs failed" $EMAIL_NOTIFICATION
|
|
241 |
}
|
|
242 |
|
|
243 |
# final cleanup
|
|
244 |
do_finally() {
|
|
245 |
rm -f /tmp/build.log.$$
|
|
246 |
echo '' | rsh $RHOST -l $RUSER "rm $LOCKFILE"
|
|
247 |
}
|
|
248 |
|
|
249 |
# let's do it
|
|
250 |
choose_build
|
|
251 |
prep_repository
|
|
252 |
do_uninst
|
|
253 |
do_clean_pkgs
|
|
254 |
do_log_dir
|
|
255 |
do_build
|
|
256 |
do_rotate_rpms
|
|
257 |
do_make_dist
|
|
258 |
do_web_reports
|
|
259 |
do_email
|
|
260 |
do_finally
|
|
261 |
|
|
262 |
exit 0
|