9398
|
1 |
#!/bin/bash
|
|
2 |
|
|
3 |
# Sample usage in crontab:
|
|
4 |
# Run, Mon-Fri at 1:30am. Add to build user's crontab.
|
9401
|
5 |
# 30 1 * * 1-5 . /jds/cbe/bin/env.sh; cd /jds/spec-files; I_KNOW_WHAT_IM_DOING=yes ./cron-script.sh
|
9398
|
6 |
#
|
|
7 |
# The same with a jail. Add to root's crontab. Example assumes 'gbuild' is the
|
|
8 |
# build user
|
9401
|
9 |
# 30 1 * * 1-5 /usr/sbin/chroot /path/to/jail/root /usr/bin/su - gbuild -c ". /jds/cbe/bin/env.sh; cd /jds/spec-files; I_KNOW_WHAT_IM_DOING=yes ./cron-script.sh"
|
9398
|
10 |
#
|
|
11 |
# $Id$
|
|
12 |
|
|
13 |
|
|
14 |
OSrel=`uname -r | cut -f2 -d.`
|
|
15 |
OSarch_full=`uname -p`
|
|
16 |
if [ "x$OSarch_full" = "xsparc" ]; then
|
|
17 |
OSarch=s
|
|
18 |
else
|
|
19 |
OSarch_full=x86
|
|
20 |
OSarch=x
|
|
21 |
fi
|
|
22 |
|
|
23 |
PRODNAME="G2.18"
|
|
24 |
|
|
25 |
# directory to copy rpms/srpms to on the remote host
|
|
26 |
RPMSDIR=/sgnome/pkgs/gnome2.18/S${OSrel}${OSarch}/nightly
|
|
27 |
LOCKFILE=/sgnome/pkgs/gnome2.18/S${OSrel}${OSarch}/.build.lock
|
|
28 |
|
|
29 |
# reply-to/to address to send the build log as/to
|
|
30 |
[email protected]
|
|
31 |
[email protected]
|
|
32 |
|
|
33 |
# date format appended to the Release tag in the spec files
|
|
34 |
# (passed to the date command on the cmd line)
|
|
35 |
RELEASE_DATE_FMT="%y%m%d"
|
|
36 |
|
|
37 |
# date format used for naming the directories
|
|
38 |
DIR_DATE_FMT="%Y-%m-%d"
|
|
39 |
|
|
40 |
RELEASE_DATE=`date +$RELEASE_DATE_FMT`
|
|
41 |
DIR_DATE=`date +$DIR_DATE_FMT`
|
|
42 |
|
|
43 |
# document root of the web server
|
9652
|
44 |
WEBROOT=/net/jdsserv.ireland/webroots/jds.ireland/htdocs
|
9398
|
45 |
|
|
46 |
# subdir to keep logs and reports on the webserver
|
9652
|
47 |
WEBDIR=build_reports/nightly/S${OSrel}${OSarch}
|
9398
|
48 |
LOGDIR=$WEBDIR/$DIR_DATE
|
|
49 |
|
|
50 |
# ------------ nothing to configure below this line --------------
|
|
51 |
|
|
52 |
if [ "x$I_KNOW_WHAT_IM_DOING" != xyes ]; then
|
|
53 |
echo " ,---------------------------------------------------------------."
|
|
54 |
echo "| This script is intended to be run from cron for producing |"
|
|
55 |
echo "| official nightly builds. It will mail responsible engineers |"
|
|
56 |
echo "| if any build failure occurs, sends build reports to v"
|
|
57 |
echo "| RE and update web pages."
|
|
58 |
echo "|"
|
|
59 |
echo "| Don't run it unless you know what you are doing. Thanks."
|
|
60 |
echo "|"
|
|
61 |
echo "| Mail [email protected] if you need more info."
|
|
62 |
echo "\`------> +"
|
|
63 |
exit 1
|
|
64 |
fi
|
|
65 |
|
|
66 |
MYNAME="$0"
|
|
67 |
MYDIR=$(cd `dirname $0`; pwd)
|
|
68 |
|
|
69 |
if [ "x$1" != x ]; then
|
|
70 |
SPECDIR="$1"
|
|
71 |
else
|
|
72 |
SPECDIR="$MYDIR"
|
|
73 |
fi
|
|
74 |
|
|
75 |
# remove temporary files on exit
|
|
76 |
clean_up () {
|
|
77 |
case "$MYNAME" in
|
|
78 |
/tmp/cron-script.copy.* )
|
|
79 |
rm -f $MYNAME
|
|
80 |
;;
|
|
81 |
esac
|
|
82 |
exit
|
|
83 |
}
|
|
84 |
|
|
85 |
trap clean_up HUP INT TERM QUIT EXIT
|
|
86 |
|
|
87 |
# make a copy of the cron script in /tmp and execute that in order to
|
|
88 |
# avoid disasters caused by cvs update.
|
|
89 |
case "$MYNAME" in
|
|
90 |
/tmp/cron-script.copy.* )
|
|
91 |
;;
|
|
92 |
*)
|
|
93 |
cp $MYNAME /tmp/cron-script.copy.$$
|
|
94 |
chmod 755 /tmp/cron-script.copy.$$
|
|
95 |
cd /tmp
|
|
96 |
exec /tmp/cron-script.copy.$$ "$MYDIR"
|
|
97 |
;;
|
|
98 |
esac
|
|
99 |
|
|
100 |
fatal_error () {
|
|
101 |
echo "ERROR: $*"
|
|
102 |
exit 1
|
|
103 |
}
|
|
104 |
|
|
105 |
cd $SPECDIR || fatal_error "$SPECDIR not found"
|
|
106 |
|
|
107 |
#revert any local changes
|
|
108 |
svn revert -R .
|
|
109 |
|
|
110 |
# checkout-out SVN copy *MUST* be read-only, or "update" needs passwd
|
|
111 |
svn -q up > /dev/null 2>&1 || fatal_error "SVN update failed"
|
|
112 |
cd $SPECDIR
|
|
113 |
|
|
114 |
# if the script changed during cvs update, restart with the updated script
|
|
115 |
if ! /usr/bin/cmp -s ./cron-script.sh $MYNAME; then exec ./cron-script.sh; fi
|
|
116 |
|
|
117 |
# uninstall all pkgs left behind by a previous build
|
9493
|
118 |
pkgtool uninstall-pkgs --with-l10n --with-tjds --with-apoc-adapter closed/*.spec *.spec >/dev/null
|
9398
|
119 |
# remove-gnome will now remove anything left from uninstall-pkgs in case
|
|
120 |
# or a packaging change for example
|
9401
|
121 |
$SPECDIR/scripts/remove-gnome --version jds -q -f --no_extras > /dev/null 2>&1
|
9398
|
122 |
|
|
123 |
rm -rf /jds/packages/PKGS/*
|
|
124 |
rm -rf /jds/packages/SPKGS/*
|
|
125 |
rm -rf /jds/packages/BUILD/*
|
9401
|
126 |
rm -rf /var/tmp/pkgbuild-*/*
|
9398
|
127 |
|
|
128 |
# if the log directory exists, open a new one with numbered suffix
|
|
129 |
NEW_LOGDIR=$LOGDIR
|
|
130 |
N=1
|
|
131 |
while [ -d $WEBROOT/$NEW_LOGDIR ]; do
|
|
132 |
NEW_LOGDIR=$LOGDIR.$N
|
|
133 |
N=`expr $N + 1`
|
|
134 |
done
|
|
135 |
|
|
136 |
LOGDIR=$NEW_LOGDIR
|
|
137 |
mkdir -p $WEBROOT/$LOGDIR || exit 5
|
|
138 |
|
|
139 |
mkdir -p $RPMSDIR
|
|
140 |
touch $LOCKFILE
|
|
141 |
|
|
142 |
# Rebuild the manpage tarballs
|
|
143 |
cd $SPECDIR/manpages
|
|
144 |
make
|
9401
|
145 |
cd $SPECDIR/po-sun
|
9398
|
146 |
make clean
|
|
147 |
make
|
|
148 |
cd $SPECDIR
|
|
149 |
|
|
150 |
# start the build
|
9465
|
151 |
pkgtool -v --nightly --date "$RELEASE_DATE" build closed/SUNWevolution-bdb-devel.spec closed/*.spec *.spec \
|
9398
|
152 |
--logdir=$WEBROOT/$LOGDIR \
|
9652
|
153 |
--logdir-url=http://jds.ireland/$LOGDIR \
|
9398
|
154 |
[email protected] \
|
|
155 |
--prodname="${PRODNAME}/s${OSrel}${OSarch}" \
|
9493
|
156 |
--live --with-l10n --with-tjds --with-apoc-adapter \
|
9398
|
157 |
--define "nightly 1" \
|
|
158 |
--summary-log=$WEBROOT/$LOGDIR.html \
|
|
159 |
--summary-title="${PRODNAME} S${OSrel}/${OSarch_full} Nightly Build Report `date +'%d %B %Y'`" \
|
9648
|
160 |
--rpm-url=file:///net/jdsserv.ireland/$RPMSDIR/all_pkgs \
|
9398
|
161 |
> /tmp/build.log.$$ 2>&1
|
|
162 |
|
|
163 |
# the number of failed pkgs is returned
|
|
164 |
FAILED=$?
|
|
165 |
|
|
166 |
# rotate rpms dir
|
|
167 |
rm -rf $RPMSDIR.prev
|
|
168 |
mv $RPMSDIR $RPMSDIR.prev; mkdir -p $RPMSDIR
|
|
169 |
|
|
170 |
# make dist
|
|
171 |
/sgnome/tools/re-scripts/jds-build/make-jds-dist.pl -l /sgnome/tools/re-scripts/jds-build/vermillion-devel.lst /jds/packages/PKGS /jds/dist nightly- > /dev/null 2>&1
|
|
172 |
cp -r /jds/dist/nightly-/${OSarch_full}/* /jds/dist/nightly-/${OSarch_full}/.??* $RPMSDIR
|
|
173 |
chmod a+x $RPMSDIR/install-jds
|
|
174 |
mkdir -p $RPMSDIR/all_pkgs
|
|
175 |
cd $RPMSDIR/all_pkgs
|
|
176 |
ln -s ../*/*.tar.gz .
|
|
177 |
# Disable deletion of nightly- dir as network area often full - this is backup.
|
|
178 |
#rm -rf /jds/dist/nightly-
|
|
179 |
|
|
180 |
ALL_REPORTS=$WEBROOT/$WEBDIR/all_reports.html
|
|
181 |
touch $ALL_REPORTS
|
|
182 |
|
|
183 |
cp $ALL_REPORTS $ALL_REPORTS.old
|
|
184 |
export FAILED ALL_REPORTS
|
|
185 |
|
|
186 |
# update web page
|
|
187 |
( echo "<TR><TD><A HREF=/$LOGDIR.html>$DIR_DATE</A></TD>"; \
|
|
188 |
echo " <TD>$FAILED package(s) failed</TD></TR>"; \
|
|
189 |
cat $ALL_REPORTS.old ) > $ALL_REPORTS
|
|
190 |
|
|
191 |
# Report absolute symlinks. These are blockers for Solaris integration.
|
|
192 |
grep 'is an absolute symlink' $WEBROOT/$LOGDIR/*.log >>/tmp/build.log.$$
|
|
193 |
|
|
194 |
# Count the number of local patches.
|
9401
|
195 |
patch_count=`ls $SPECDIR/patches/*.diff | wc -l`
|
9398
|
196 |
echo "PATCH COUNT: $patch_count local patches used in this build.">>/tmp/build.log.$$
|
|
197 |
|
|
198 |
# send warnings, errors and summary in email
|
|
199 |
grep -v '^INFO:' /tmp/build.log.$$ | \
|
|
200 |
mailx -s "${PRODNAME} S${OSrel} ${OSarch_full} nightly build: $FAILED pkgs failed" $EMAIL_ADDR
|
|
201 |
|
|
202 |
rm -f /tmp/build.log.$$
|
|
203 |
|
|
204 |
# Email Beijing team to begin downloading packages.
|
9648
|
205 |
/usr/bin/echo "*Date: `date '+%Y-%m-%d'`*\n${PRODNAME} S${OSrel} ${OSarch_full} Development nightly build finished: jdsserv.ireland:${RPMSDIR}/download" |
|
9398
|
206 |
mailx -s "${PRODNAME} S${OSrel} ${OSarch_full} Development nightly build: $FAILED pkgs failed" "[email protected]"
|
|
207 |
|
|
208 |
|
|
209 |
rm $LOCKFILE
|
|
210 |
|
|
211 |
# find any differences from the prototype files saved after the
|
|
212 |
# last milestone build
|
|
213 |
cd /jds/spec-files/prototypes/${OSarch_full}
|
|
214 |
for f in *.proto; do
|
|
215 |
test -f /jds/packages/PKGMAPS/proto/$f || continue
|
|
216 |
cmp -s $f /jds/packages/PKGMAPS/proto/$f && continue
|
|
217 |
echo $f:
|
|
218 |
diff $f /jds/packages/PKGMAPS/proto/$f
|
|
219 |
echo
|
|
220 |
done > /tmp/proto-changes.$$
|
|
221 |
|
|
222 |
# if any diffs found mail the result to RE
|
|
223 |
test -s /tmp/proto-changes.$$ && {
|
|
224 |
( echo "Prototype changes found since the last milestone build:"
|
|
225 |
echo
|
|
226 |
cat /tmp/proto-changes.$$ ) | \
|
|
227 |
mailx -s "${PRODNAME} S${OSrel} ${OSarch_full} prototype changes" \
|
|
228 |
$EMAIL_ADDR
|
|
229 |
}
|
|
230 |
|
|
231 |
rm -f /tmp/proto-changes.$$
|
|
232 |
|
|
233 |
exit 0
|