]> git.pond.sub.org Git - empserver/blob - src/scripts/nightly/nightlybuild.sh
Fix nightly's sandbox cleanup not to hang when stdin is a tty
[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__)' $f >$f.patched
188 mv $f.patched $f
189 fi
190 done
191 git add include/emptime.h src/lib/gen/emptime.c
192 echo "Done applying controlled time patch."
193 echo ""
194 git pull --quiet
195 sh ./bootstrap
196 ./configure --prefix ${BOXDIR}/${WORKDIR}/emp4 ${CONFIGURE_OPTIONS}
197
198                 ;;
199 esac
200 #
201 # END PATCH
202 #
203
204 #
205 # START BUILD
206 #
207 case "${NIGHTLY_SKIP_STEP}"
208 in
209         *BUILD*) ;;
210         *)
211
212
213 # Start the build
214 echo "Building server"
215 if make -k install >/dev/null
216 then
217         warn "make did not return 0"
218 fi
219 echo "Done (make)."
220 echo ""
221
222                 ;;
223 esac
224 #
225 # END BUILD
226 #
227
228 cd "${BOXDIR}/${WORKDIR}" || err "Could not cd to ${BOXDIR}/${WORKDIR}"
229 # Try to run startup utilities
230 for onetime in 1
231 do
232         #
233         # START GENERATE
234         #
235         case "${NIGHTLY_SKIP_STEP}"
236         in
237                 *GENERATE*) ;;
238                 *)
239
240         if [ -d emp4 -a -d emp4/bin -a -d emp4/sbin -a -d emp4/var/empire ]
241         then
242                 echo "Directory structure is ok"
243         else
244                 warn "Directory structure is NOT ok"
245                 break
246         fi
247
248         if [ ! -f emp4/etc/empire/schedule ]
249         then
250                 warn "schedule file is missing"
251                 break
252         fi
253
254         if [ ! -f emp4/etc/empire/econfig ]
255         then
256                 warn "econfig file is missing"
257                 break
258         fi
259
260         if ! emp4/sbin/pconfig >emp4/etc/empire/econfig
261         then
262                 warn "pconfig failed to create econfig file"
263                 break
264         fi
265 echo "Applying global econfig patches from ${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/patches/All"
266 for i in "${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/patches/All"/*.econfig
267 do
268         [ -r "${i}" ] || continue
269         if "${i}" >>emp4/etc/empire/econfig
270         then
271                 echo "${i}: OK"
272         else
273                 echo "========== ${i}: NOT OK! ${?} =========="
274         fi
275 done
276 echo "Done (econfig patch All)."
277 echo ""
278
279 LOCALPATCHDIRECTORY="${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/patches/${INSTANCE}"
280 if [ -n "${LOCALPATCHDIRECTORY}" -a -d "${LOCALPATCHDIRECTORY}/." ]
281 then
282         echo "Applying system specific econfig patches from ${LOCALPATCHDIRECTORY}:"
283         for i in "${LOCALPATCHDIRECTORY}"/*.econfig
284         do
285                 [ -r "${i}" ] || continue
286                 if "${i}" >>emp4/etc/empire/econfig
287                 then
288                         echo "${i}: OK"
289                 else
290                         echo "========== ${i}: NOT OK! ${?} =========="
291                 fi
292         done
293         echo "Done (econfig patch specific)."
294         echo ""
295 fi
296
297         cd emp4/bin || err "Could not cd to emp4/bin"
298
299         echo "Determining type of files in bin directory"
300         file *
301         echo "Done (file *)."
302         echo ""
303
304         cd ../sbin || err "Could not cd to ../sbin"
305
306         echo "Determining type of files in sbin directory"
307         file *
308         echo "Done (file *)."
309         echo ""
310
311         echo "Running files and fairland"
312         echo y | ./files -e ../etc/empire/econfig || warn "Error running files"
313         ./fairland -R 1 -e ../etc/empire/econfig 10 30 >/dev/null || { warn "Error running fairland" ; break ; }
314         [ -s "newcap_script" ] || { warn "fairland did not produce newcap_script" ; break ; }
315         echo "Done (files & fairland)."
316         echo ""
317
318                         ;;
319         esac
320         #
321         # END GENERATE
322         #
323
324         #
325         # START SERVERSTART
326         #
327         case "${NIGHTLY_SKIP_STEP}"
328         in
329                 *SERVERSTART*) ;;
330                 *)
331
332         echo "Removing existing server.log and journal.log"
333         if [ -f "../var/empire/server.log" ]
334         then
335             rm "../var/empire/server.log"
336         fi
337         if [ -f "../var/empire/journal.log" ]
338         then
339             rm "../var/empire/journal.log"
340         fi
341         echo "Removing existing schedule"
342         if [ -f "../etc/empire/schedule" ]
343         then
344             >../etc/empire/schedule
345         fi
346         echo "Starting server with -d in the background"
347         ./emp_server -R 1 -e ../etc/empire/econfig -d 2>/dev/null &
348         PID="$!"
349         sleep 1
350         kill -0 "${PID}" || { warn "emp_server not running ?" ; break ; }
351         echo "Done (emp_server)."
352         echo ""
353
354                         ;;
355         esac
356         #
357         # END SERVERSTART
358         #
359
360         #
361         # START GENERATE (2nd part)
362         #
363         case "${NIGHTLY_SKIP_STEP}"
364         in
365                 *GENERATE*) ;;
366                 *)
367
368 export EMPIRE_PATH=${BOXDIR}/${WORKDIR}/emp4/bin
369         echo "Running newcap_script through empire"
370         runfeed POGO peter < newcap_script >/dev/null 2>&1 ||
371                 {
372                         warn "Could not run newcap_script"
373                         echo "Stopping server"
374                         trykill $PID
375                         break
376                 }
377         echo "Done (newcap_script / empire)."
378         echo ""
379
380                         ;;
381         esac
382         #
383         # END GENERATE (2nd part)
384         #
385
386         #
387         # START TESTSCRIPT
388         #
389         case "${NIGHTLY_SKIP_STEP}"
390         in
391                 *TESTSCRIPT*) ;;
392                 *)
393
394 echo "Applying tests from ${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/tests"
395 cd ${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/tests
396 for i in *
397 do
398         [ -d "$i" ] || continue
399         cd  "$i"
400         if [ "$i" -ne "00" ]
401         then
402                 echo "Update Turn $i starting"
403                 if ../update
404                 then
405                         echo "Update Turn $i completed successfully"
406                 else
407                         echo "Update Turn $i failed"
408                 fi
409
410         fi
411         for j in *
412         do
413                 [ -x "$j" ] || continue
414                 echo "Player $j Turn $i starting"
415                 if ./"$j"
416                 then
417                         echo "Player $j Turn $i completed successfully"
418                 else
419                         echo "Player $j Turn $i failed"
420                 fi
421         done
422         cd ..
423 done
424 echo "Done tests."
425 echo ""
426
427                         ;;
428         esac
429         #
430         # END TESTSCRIPT
431         #
432
433         #
434         # START SERVERSTOP
435         #
436         case "${NIGHTLY_SKIP_STEP}"
437         in
438                 *SERVERSTOP*) ;;
439                 *)
440                         case "${NIGHTLY_SKIP_STEP}"
441                         in
442                                 *SERVERSTART*) ;;
443                                 *)
444
445         echo "Stopping server"
446         trykill "${PID}"
447         echo "Done (kill)."
448 cd "${BOXDIR}/${WORKDIR}/emp4/var/empire" || err "Could not cd to ${BOXDIR}/${WORKDIR}/emp4/var/empire"
449         echo "-- Start Server Log --"
450         cat server.log
451         echo "-- End of Server Log --"
452         echo "-- Start Journal Log --"
453         cat journal.log
454         echo "-- End of Journal Log --"
455         echo "Server stopped"
456                                         ;;
457                         esac
458                         ;;
459         esac
460         #
461         # END SERVERSTOP
462         #
463 done
464
465 #
466 # START CLEANUP
467 #
468 case "${NIGHTLY_SKIP_STEP}"
469 in
470         *CLEANUP*) ;;
471         *)
472
473 echo "Cleaning sandbox"
474 cd "${BOXDIR}" || err "Could not cd back to sandbox root !"
475 case "${NIGHTLY_SKIP_STEP}"
476 in
477         *REMOVE_REPOSITORY*)
478 rm -rf `find "${WORKDIR}" -maxdepth 1 ! -name .git` || warn "Directory ${WORKDIR} could not be forcibly removed !"
479                 ;;
480         *)
481 rm -rf "${WORKDIR}" || warn "Directory ${WORKDIR} could not be forcibly removed !"
482 [ -d "${WORKDIR}/." ] && warn "Directory ${WORKDIR} still present"
483                 ;;
484 esac
485 echo "Done (cleaning)."
486                 ;;
487 esac
488 #
489 # END CLEANUP
490 #
491
492 echo "Nightly build finished at `date`"
493
494 exit 0