]> git.pond.sub.org Git - empserver/blob - src/scripts/nightly/nightlybuild.sh
Don't put file descriptor values in thread names
[empserver] / src / scripts / nightly / nightlybuild.sh
1 #!/bin/sh
2 #
3 # Blame it on marcolz
4 #
5 # Skip certain parts of this script by exporting the variable
6 # "NIGHTLY_SKIP_STEP" containing the following possible substrings,
7 # preventing the named behaviour:
8 #
9 # REDIRECT      -       Redirect all output to a logfile
10 # CHECKOUT      -       Fill the sandbox with a fresh checkout
11 # PATCH         -       Apply the patches for this system (global + specific)
12 # BUILD         -       Build everything
13 # GENERATE      -       Generate a new world
14 # SERVERSTART   -       Start the server
15 # TESTSCRIPT    -       Run the testscript
16 # SERVERSTOP    -       Stop the server if it was started by this script
17 # CLEANUP       -       Remove the contents of the sandbox
18 # REMOVE_REPOSITORY     Removes the git repository when cleaning up
19 #
20
21 PROGNAME="$0"
22 TERM="${TERM:-vt100}"
23 export TERM
24
25 usage() {
26         echo "Usage: ${PROGNAME} <configfile>" >&2;
27         exit 1;
28 }
29
30 [ $# -lt 1 ] && usage
31
32 [ -f "$1" ] || usage
33
34 # Source config file
35 case "$1"
36 in
37         */*)
38                 . "$1"
39                 ;;
40         *)
41                 . ./"$1"
42                 ;;
43 esac
44
45 [ -f "${SCRIPTDIR}/common.sh" ] || { echo "Broken config ?" >&2; exit 1; }
46 . "${SCRIPTDIR}"/common.sh
47 export SCRIPTDIR
48
49
50 STAMP="`date +%Y%m%d%H%M%S`"
51 WORKDIR="${INSTANCE}"
52 [ -n "${EXTRASUFFIX}" ] && WORKDIR="${WORKDIR}.${EXTRASUFFIX}"
53 LOGFILE="${LOGDIR}/${WORKDIR}.${STAMP}"
54
55 #
56 # START REDIRECT
57 #
58 case "${NIGHTLY_SKIP_STEP}"
59 in
60         *REDIRECT*) ;;
61         *)
62
63 # Log everything
64 exec > "${LOGFILE}"
65 exec 2>&1
66
67                 ;;
68 esac
69 #
70 # END REDIRECT
71 #
72
73 case "${BOXDIR}"
74 in
75         /*)
76                 ;;
77         *)
78                 BOXDIR="${SCRIPTDIR}/${BOXDIR}"
79                 ;;
80 esac
81
82 cd "${BOXDIR}" || err "Could not chdir to ${BOXDIR}"
83
84 echo "Nightly build starting at `date`"
85
86
87 #
88 # START CHECKOUT
89 #
90 case "${NIGHTLY_SKIP_STEP}"
91 in
92         *CHECKOUT*) ;;
93         *)
94
95 # Make sandbox
96 if [ -d "${WORKDIR}" ]
97 then
98         [ -d "${WORKDIR}"/empserver/.git ] || err "Invalid sandbox, missing .git directory"
99 else
100         echo making directory
101         mkdir "${WORKDIR}" || warn "Could not create ${BOXDIR}/${WORKDIR}"
102 fi
103 cd "${WORKDIR}" || err "Could not cd to ${BOXDIR}/${WORKDIR}"
104
105 echo "Getting source from GIT:"
106 # Extract source
107 export GITROOT=${GITROOT:= git://git.pond.sub.org/~armbru/empserver}
108 RETR=0
109 if ! [ -d empserver ]
110 then
111         while ! git clone --quiet $GITROOT empserver >/dev/null
112         do
113                 sleep "`expr 5 + ${RETR}`"
114                 RETR="`expr 1 + ${RETR}`"
115                 [ "${RETR}" -gt 5 ] && err "git clone Timeout after ${RETR} retres."
116         done
117         cd empserver || err "Could not cd to ${BOXDIR}/${WORKDIR}/empserver."
118 else
119         cd empserver || err "Could not cd to ${BOXDIR}/${WORKDIR}/empserver."
120         while ! git pull --quiet $GITROOT master >/dev/null
121         do
122                 sleep "`expr 5 + ${RETR}`"
123                 RETR="`expr 1 + ${RETR}`"
124                 [ "${RETR}" -gt 5 ] && err "GIT pull Timeout after ${RETR} retres."
125 done
126
127 fi
128
129 echo "Commit `git describe --match 'v*' --always`"
130 echo "Done (GIT)."
131 echo ""
132                 ;;
133 esac
134 #
135 # END CHECKOUT
136 #
137
138 #
139 # START PATCH
140 #
141 cd "${BOXDIR}/${WORKDIR}/empserver" || err "Could not cd to ${BOXDIR}/${WORKDIR}/empserver"
142 case "${NIGHTLY_SKIP_STEP}"
143 in
144         *PATCH*) ;;
145         *)
146
147 echo "Applying global patches from ${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/patches/All"
148 for i in "${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/patches/All"/*.patch
149 do
150         [ -r "${i}" ] || continue
151         if git apply "${i}" >/dev/null
152         then
153                 echo "${i}: OK"
154         else
155                 echo "========== ${i}: NOT OK! ${?} =========="
156         fi
157 done
158 echo "Done (patch All)."
159 echo ""
160
161 LOCALPATCHDIRECTORY="${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/patches/${INSTANCE}"
162 if [ -n "${LOCALPATCHDIRECTORY}" -a -d "${LOCALPATCHDIRECTORY}/." ]
163 then
164         echo "Applying system specific patches from ${LOCALPATCHDIRECTORY}:"
165         for i in "${LOCALPATCHDIRECTORY}"/*.patch
166         do
167                 [ -r "${i}" ] || continue
168                 if git apply "${i}" >/dev/null
169                 then
170                         echo "${i}: OK"
171                 else
172                         echo "========== ${i}: NOT OK! ${?} =========="
173                 fi
174         done
175         echo "Done (patch specific)."
176         echo ""
177 fi
178 echo "Apply controlled time patch."
179 for f in `git-ls-files | grep -E '\.[ch](\.in)?$' | xargs grep -l \>`
180 do
181  n=`grep -n '^[     ]*#[     ]*include\>' $f | tail -n 1 | sed 's/:.*//'`
182 if [ $n ]
183 then
184 sed "$n"'a\
185 #include "emptime.h"\
186 #undef time\
187 #define time(timer) emp_time((timer), __FUNCTION__)\
188 #undef gettimeofday\
189 #define gettimeofday(tv, tz) emp_gettimeofday((tv), (tz))' $f >$f.patched
190 mv $f.patched $f
191 fi
192 done
193 git add include/emptime.h src/lib/gen/emptime.c
194 echo "Done applying controlled time patch."
195 echo ""
196 git pull --quiet
197 sh ./bootstrap
198 ./configure --prefix ${BOXDIR}/${WORKDIR}/emp4 ${CONFIGURE_OPTIONS}
199
200                 ;;
201 esac
202 #
203 # END PATCH
204 #
205
206 #
207 # START BUILD
208 #
209 case "${NIGHTLY_SKIP_STEP}"
210 in
211         *BUILD*) ;;
212         *)
213
214
215 # Start the build
216 echo "Building server"
217 if make -k install >/dev/null
218 then
219         warn "make did not return 0"
220 fi
221 echo "Done (make)."
222 echo ""
223
224                 ;;
225 esac
226 #
227 # END BUILD
228 #
229
230 cd "${BOXDIR}/${WORKDIR}" || err "Could not cd to ${BOXDIR}/${WORKDIR}"
231 # Try to run startup utilities
232 for onetime in 1
233 do
234         #
235         # START GENERATE
236         #
237         case "${NIGHTLY_SKIP_STEP}"
238         in
239                 *GENERATE*) ;;
240                 *)
241
242         if [ -d emp4 -a -d emp4/bin -a -d emp4/sbin -a -d emp4/var/empire ]
243         then
244                 echo "Directory structure is ok"
245         else
246                 warn "Directory structure is NOT ok"
247                 break
248         fi
249
250         if [ ! -f emp4/etc/empire/schedule ]
251         then
252                 warn "schedule file is missing"
253                 break
254         fi
255
256         if [ ! -f emp4/etc/empire/econfig ]
257         then
258                 warn "econfig file is missing"
259                 break
260         fi
261
262         if ! emp4/sbin/pconfig >emp4/etc/empire/econfig
263         then
264                 warn "pconfig failed to create econfig file"
265                 break
266         fi
267 echo "Applying global econfig patches from ${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/patches/All"
268 for i in "${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/patches/All"/*.econfig
269 do
270         [ -r "${i}" ] || continue
271         if "${i}" >>emp4/etc/empire/econfig
272         then
273                 echo "${i}: OK"
274         else
275                 echo "========== ${i}: NOT OK! ${?} =========="
276         fi
277 done
278 echo "Done (econfig patch All)."
279 echo ""
280
281 LOCALPATCHDIRECTORY="${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/patches/${INSTANCE}"
282 if [ -n "${LOCALPATCHDIRECTORY}" -a -d "${LOCALPATCHDIRECTORY}/." ]
283 then
284         echo "Applying system specific econfig patches from ${LOCALPATCHDIRECTORY}:"
285         for i in "${LOCALPATCHDIRECTORY}"/*.econfig
286         do
287                 [ -r "${i}" ] || continue
288                 if "${i}" >>emp4/etc/empire/econfig
289                 then
290                         echo "${i}: OK"
291                 else
292                         echo "========== ${i}: NOT OK! ${?} =========="
293                 fi
294         done
295         echo "Done (econfig patch specific)."
296         echo ""
297 fi
298
299         cd emp4/bin || err "Could not cd to emp4/bin"
300
301         echo "Determining type of files in bin directory"
302         file *
303         echo "Done (file *)."
304         echo ""
305
306         cd ../sbin || err "Could not cd to ../sbin"
307
308         echo "Determining type of files in sbin directory"
309         file *
310         echo "Done (file *)."
311         echo ""
312
313         echo "Running files and fairland"
314         echo y | ./files -e ../etc/empire/econfig || warn "Error running files"
315         ./fairland -R 1 -e ../etc/empire/econfig 10 30 >/dev/null || { warn "Error running fairland" ; break ; }
316         [ -s "newcap_script" ] || { warn "fairland did not produce newcap_script" ; break ; }
317         echo "Done (files & fairland)."
318         echo ""
319
320                         ;;
321         esac
322         #
323         # END GENERATE
324         #
325
326         #
327         # START SERVERSTART
328         #
329         case "${NIGHTLY_SKIP_STEP}"
330         in
331                 *SERVERSTART*) ;;
332                 *)
333
334         echo "Removing existing server.log and journal.log"
335         if [ -f "../var/empire/server.log" ]
336         then
337             rm "../var/empire/server.log"
338         fi
339         if [ -f "../var/empire/journal.log" ]
340         then
341             rm "../var/empire/journal.log"
342         fi
343         echo "Removing existing schedule"
344         if [ -f "../etc/empire/schedule" ]
345         then
346             >../etc/empire/schedule
347         fi
348         echo "Starting server with -d in the background"
349         ./emp_server -R 1 -e ../etc/empire/econfig -d 2>/dev/null &
350         PID="$!"
351         sleep 1
352         kill -0 "${PID}" || { warn "emp_server not running ?" ; break ; }
353         echo "Done (emp_server)."
354         echo ""
355
356                         ;;
357         esac
358         #
359         # END SERVERSTART
360         #
361
362         #
363         # START GENERATE (2nd part)
364         #
365         case "${NIGHTLY_SKIP_STEP}"
366         in
367                 *GENERATE*) ;;
368                 *)
369
370 export EMPIRE_PATH=${BOXDIR}/${WORKDIR}/emp4/bin
371         echo "Running newcap_script through empire"
372         runfeed POGO peter < newcap_script >/dev/null 2>&1 ||
373                 {
374                         warn "Could not run newcap_script"
375                         echo "Stopping server"
376                         trykill $PID
377                         break
378                 }
379         echo "Done (newcap_script / empire)."
380         echo ""
381
382                         ;;
383         esac
384         #
385         # END GENERATE (2nd part)
386         #
387
388         #
389         # START TESTSCRIPT
390         #
391         case "${NIGHTLY_SKIP_STEP}"
392         in
393                 *TESTSCRIPT*) ;;
394                 *)
395
396 echo "Applying tests from ${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/tests"
397 cd ${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/tests
398 for i in *
399 do
400         [ -d "$i" ] || continue
401         cd  "$i"
402         if [ "$i" -ne "00" ]
403         then
404                 echo "Update Turn $i starting"
405                 if ../update
406                 then
407                         echo "Update Turn $i completed successfully"
408                 else
409                         echo "Update Turn $i failed"
410                 fi
411
412         fi
413         for j in *
414         do
415                 [ -x "$j" ] || continue
416                 echo "Player $j Turn $i starting"
417                 if ./"$j"
418                 then
419                         echo "Player $j Turn $i completed successfully"
420                 else
421                         echo "Player $j Turn $i failed"
422                 fi
423         done
424         cd ..
425 done
426 echo "Done tests."
427 echo ""
428
429                         ;;
430         esac
431         #
432         # END TESTSCRIPT
433         #
434
435         #
436         # START SERVERSTOP
437         #
438         case "${NIGHTLY_SKIP_STEP}"
439         in
440                 *SERVERSTOP*) ;;
441                 *)
442                         case "${NIGHTLY_SKIP_STEP}"
443                         in
444                                 *SERVERSTART*) ;;
445                                 *)
446
447         echo "Stopping server"
448         trykill "${PID}"
449         echo "Done (kill)."
450 cd "${BOXDIR}/${WORKDIR}/emp4/var/empire" || err "Could not cd to ${BOXDIR}/${WORKDIR}/emp4/var/empire"
451         echo "-- Start Server Log --"
452         cat server.log
453         echo "-- End of Server Log --"
454         echo "-- Start Journal Log --"
455         cat journal.log
456         echo "-- End of Journal Log --"
457         echo "Server stopped"
458                                         ;;
459                         esac
460                         ;;
461         esac
462         #
463         # END SERVERSTOP
464         #
465 done
466
467 #
468 # START CLEANUP
469 #
470 case "${NIGHTLY_SKIP_STEP}"
471 in
472         *CLEANUP*) ;;
473         *)
474
475 echo "Cleaning sandbox"
476 cd "${BOXDIR}" || err "Could not cd back to sandbox root !"
477 case "${NIGHTLY_SKIP_STEP}"
478 in
479         *REMOVE_REPOSITORY*)
480 rm -rf `find "${WORKDIR}" -maxdepth 1 ! -name .git` || warn "Directory ${WORKDIR} could not be forcibly removed !"
481                 ;;
482         *)
483 rm -rf "${WORKDIR}" || warn "Directory ${WORKDIR} could not be forcibly removed !"
484 [ -d "${WORKDIR}/." ] && warn "Directory ${WORKDIR} still present"
485                 ;;
486 esac
487 echo "Done (cleaning)."
488                 ;;
489 esac
490 #
491 # END CLEANUP
492 #
493
494 echo "Nightly build finished at `date`"
495
496 exit 0