]> git.pond.sub.org Git - empserver/blob - src/scripts/nightly/nightlybuild.sh
Add -k option to the make so more than one error can be found.
[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 cvs 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 #
19
20 PROGNAME="$0"
21 TERM="${TERM:-vt100}"
22 export TERM
23
24 usage() {
25         echo "Usage: ${PROGNAME} <configfile>" >&2;
26         exit 1;
27 }
28
29 [ $# -lt 1 ] && usage
30
31 [ -f "$1" ] || usage
32
33 # Source config file
34 case "$1"
35 in
36         */*)
37                 . "$1"
38                 ;;
39         *)
40                 . ./"$1"
41                 ;;
42 esac
43
44 [ -f "${SCRIPTDIR}/common.sh" ] || { echo "Broken config ?" >&2; exit 1; }
45 . "${SCRIPTDIR}"/common.sh
46
47
48 STAMP="`date +%Y%m%d%H%M%S`"
49 WORKDIR="${INSTANCE}"
50 [ -n "${EXTRASUFFIX}" ] && WORKDIR="${WORKDIR}.${EXTRASUFFIX}"
51 LOGFILE="${LOGDIR}/${WORKDIR}.${STAMP}"
52
53 #
54 # START REDIRECT
55 #
56 case "${NIGHTLY_SKIP_STEP}"
57 in
58         *REDIRECT*) ;;
59         *)
60
61 # Log everything
62 exec > "${LOGFILE}"
63 exec 2>&1
64
65                 ;;
66 esac
67 #
68 # END REDIRECT
69 #
70
71 case "${BOXDIR}"
72 in
73         /*)
74                 ;;
75         *)
76                 BOXDIR="${SCRIPTDIR}/${BOXDIR}"
77                 ;;
78 esac
79
80 cd "${BOXDIR}" || err "Could not chdir to ${BOXDIR}"
81
82 echo "Nightly build starting at `date`"
83
84
85 #
86 # START CHECKOUT
87 #
88 case "${NIGHTLY_SKIP_STEP}"
89 in
90         *CHECKOUT*) ;;
91         *)
92
93 # Make sandbox
94 mkdir "${WORKDIR}" || warn "Could not create ${BOXDIR}/${WORKDIR}"
95 cd "${WORKDIR}" || err "Could not cd to ${BOXDIR}/${WORKDIR}"
96
97 echo "Getting source from CVS:"
98 # Extract source
99 export CVS_RSH=${CVS_RSH:=ssh}
100 export CVSROOT=${CVSROOT:=:pserver:anonymous@empserver.cvs.sourceforge.net:/cvsroot/empserver}
101 RETR=0
102 while ! cvs -z3 co empserver >/dev/null
103 do
104         sleep "`expr 5 + ${RETR}`"
105         RETR="`expr 1 + ${RETR}`"
106         [ "${RETR}" -gt 5 ] && err "CVS Timeout after ${RETR} retres."
107 done
108 echo "Done (CVS)."
109 echo ""
110
111                 ;;
112 esac
113 #
114 # END CHECKOUT
115 #
116
117 #
118 # START PATCH
119 #
120 case "${NIGHTLY_SKIP_STEP}"
121 in
122         *PATCH*) ;;
123         *)
124
125 echo "Applying global patches from ${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/patches/All"
126 for i in "${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/patches/All"/*.patch
127 do
128         [ -r "${i}" ] || continue
129         if ${PATCH:=patch} -Np0 < "${i}" >/dev/null
130         then
131                 echo "${i}: OK"
132         else
133                 echo "========== ${i}: NOT OK! ${?} =========="
134         fi
135 done
136 echo "Done (patch All)."
137 echo ""
138
139 LOCALPATCHDIRECTORY="${BOXDIR}/${WORKDIR}/empserver/src/scripts/nightly/patches/${INSTANCE}"
140 if [ -n "${LOCALPATCHDIRECTORY}" -a -d "${LOCALPATCHDIRECTORY}/." ]
141 then
142         echo "Applying system specific patches from ${LOCALPATCHDIRECTORY}:"
143         for i in "${LOCALPATCHDIRECTORY}"/*.patch
144         do
145                 [ -r "${i}" ] || continue
146                 if ${PATCH:=patch} -Np0 < "${i}" >/dev/null
147                 then
148                         echo "${i}: OK"
149                 else
150                         echo "========== ${i}: NOT OK! ${?} =========="
151                 fi
152         done
153         echo "Done (patch specific)."
154         echo ""
155 fi
156
157 cd empserver || err "Could not cd to ${BOXDIR}/${WORKDIR}/empserver."
158
159 cvs up -d
160 sh ./bootstrap
161 ./configure --prefix ${BOXDIR}/${WORKDIR}/emp4
162
163                 ;;
164 esac
165 #
166 # END PATCH
167 #
168
169 #
170 # START BUILD
171 #
172 case "${NIGHTLY_SKIP_STEP}"
173 in
174         *BUILD*) ;;
175         *)
176
177
178 # Start the build
179 echo "Building server"
180 if make -k install >/dev/null
181 then
182         warn "make did not return 0"
183 fi
184 echo "Done (make)."
185 echo ""
186
187                 ;;
188 esac
189 #
190 # END BUILD
191 #
192
193 # Try to run startup utilities
194 for onetime in 1
195 do
196         #
197         # START GENERATE
198         #
199         case "${NIGHTLY_SKIP_STEP}"
200         in
201                 *GENERATE*) ;;
202                 *)
203
204         if [ -d ../emp4 -a -d ../emp4/bin -a -d ../emp4/sbin -a -d ../emp4/var/empire ]
205         then
206                 echo "Directory structure is ok"
207         else
208                 warn "Directory structure is NOT ok"
209                 break
210         fi
211
212         cd ../emp4/bin || err "Could not cd to ../emp4/bin"
213
214         echo "Determining type of files in bin directory"
215         file *
216         echo "Done (file *)."
217         echo ""
218
219         cd ../../emp4/sbin || err "Could not cd to ../../emp4/sbin"
220
221         echo "Determining type of files in sbin directory"
222         file *
223         echo "Done (file *)."
224         echo ""
225
226         echo "Running files and fairland"
227         echo y | ./files || warn "Error running files"
228         ./fairland -R 1 10 30 >/dev/null || { warn "Error running fairland" ; break ; }
229         [ -s "newcap_script" ] || { warn "fairland did not produce newcap_script" ; break ; }
230         echo "Done (files & fairland)."
231         echo ""
232
233                         ;;
234         esac
235         #
236         # END GENERATE
237         #
238
239         #
240         # START SERVERSTART
241         #
242         case "${NIGHTLY_SKIP_STEP}"
243         in
244                 *SERVERSTART*) ;;
245                 *)
246
247         echo "Starting server with -d in the background"
248         ./emp_server -R 1 -d &
249         PID="$!"
250         sleep 1
251         kill -0 "${PID}" || { warn "emp_server not running ?" ; break ; }
252         echo "Done (emp_server)."
253         echo ""
254
255                         ;;
256         esac
257         #
258         # END SERVERSTART
259         #
260
261         #
262         # START GENERATE (2nd part)
263         #
264         case "${NIGHTLY_SKIP_STEP}"
265         in
266                 *GENERATE*) ;;
267                 *)
268
269         ln -s ../bin/empire emp_client
270         echo "Running newcap_script through emp_client"
271         runfeed POGO peter < newcap_script >/dev/null 2>&1 ||
272                 {
273                         warn "Could not run newcap_script"
274                         echo "Stopping server"
275                         trykill $PID
276                         break
277                 }
278         echo "Done (newcap_script / emp_client)."
279         echo ""
280         
281         echo "TODO: Replace this with a real test script."
282         echo "Just do some rudimentary testing for now."
283         echo ""
284
285         echo "Prevent updates from happening without our consent."
286         runfeed POGO peter << EOF
287 disable
288 EOF
289         echo "Done (update stop)."
290         echo ""
291         
292                         ;;
293         esac
294         #
295         # END GENERATE (2nd part)
296         #
297
298         #
299         # START TESTSCRIPT
300         #
301         case "${NIGHTLY_SKIP_STEP}"
302         in
303                 *TESTSCRIPT*) ;;
304                 *)
305
306         for PLAYER in 2 3 4 5 6 7 8 9 10
307         do
308                 echo "explore for player ${PLAYER}"
309                 runfeed $PLAYER << EOF >/dev/null 2>&1
310 break
311 expl c 0,0 1 uh
312 desi 1,-1 +
313 mov c 0,0 205 uh
314 desi 1,-1 g
315 cen *
316 EOF
317                 echo "Done (explore)."
318                 echo ""
319         done
320
321         # Something more elaborate for player 1
322         echo "explore and more for player 1"
323         runfeed 1 << EOF >/dev/null 2>&1
324 break
325 expl c 0,0 1 uh
326 expl c 2,0 1 jh
327 expl c 2,0 1 uh
328 expl c 2,0 1 nh
329 expl c 2,0 1 bh
330 expl c 0,0 1 yh
331 expl c 0,0 1 gh
332 expl c 0,0 1 bh
333 desi * ?ne=- +
334 expl c 2,0 1 njh
335 expl c 2,0 1 nnh
336 expl c 2,0 1 bnh
337 expl c 0,0 1 bbh
338 expl c 0,0 1 yyh
339 expl c 0,0 1 yuh
340 expl c 0,0 1 bnh
341 expl c 2,0 1 yuh
342 expl c 2,0 1 uuh
343 expl c 2,0 1 juh
344 desi * ?ne=- +
345 expl c 2,0 1 nnnh
346 expl c 2,0 1 nnjh
347 expl c 2,0 1 njjh
348 expl c 2,0 1 uujh
349 expl c 0,0 1 bbnh
350 expl c 0,0 1 bnnh
351 expl c 0,0 1 yygh
352 expl c 0,0 1 yuuh
353 desi * ?ne=- +
354 expl c 2,0 1 nnjjh
355 desi * ?ne=- +
356 expl c 2,0 1 nnjjjh
357 desi * ?ne=- +
358 mov u 0,0 75 jh
359 demob 0:2,0 55 y
360 desi 2,0 m
361 mov c 0,0 767 -1,-1
362 desi -1,-1 g
363 mov c 0,0 275 1,-1
364 mov c 2,0 274 1,-1
365 desi 1,-1 m
366 deliver i 2,0 230 u
367 deliver i 1,-1 0 j
368 dist 4,0 2,0
369 thres i 2,0 1
370 EOF
371
372         echo "Run an update"
373         runfeed POGO peter << EOF
374 power new
375 cen * ?own#0
376 reso * ?own#0
377 enable
378 force 1
379 disable
380 EOF
381         echo "Done (force)."
382         echo ""
383
384         sleep 10
385         echo "Check player 1"
386         runfeed 1 << EOF
387 real 0 -8:12,-4:4
388 cen *
389 map #
390 read y
391 EOF
392         echo "Done (check)."
393         echo ""
394
395         echo "Check whether the update did anything"
396         runfeed POGO peter << EOF
397 power new
398 cen * ?own#0
399 reso * ?own#0
400 read
401 y
402 EOF
403         echo "Done (check update)."
404         echo ""
405
406         echo "Continue some updates for player 1"
407         echo ""
408
409         echo "Turn 2 for player 1"
410
411         runfeed 1 << EOF >/dev/null 2>&1
412 desi -1,-1 b
413 mov i 2,0 200 4,0
414 mov i 1,-1 4 jh
415 mov c -1,-1 435 4,0
416 deli i 2,0 0 j
417 deli i 1,-1 0 j
418 mov c -1,-1 80 3,-1
419 mov c 1,-1 256 4,0
420 mov c 2,0 230 5,-1
421 mov c 1,-1 409 3,-1
422 desi 4,0 k
423 desi 3,-1 j
424 dist # 5,-1
425 thre h 4,0 1
426 thre l 3,-1 1
427 desi 5,-1 h
428 EOF
429
430         echo "Run an update"
431         runfeed POGO peter << EOF
432 power new
433 cen * ?own#0
434 reso * ?own#0
435 enable
436 force 1
437 disable
438 EOF
439         echo "Done (force)."
440         echo ""
441         sleep 10
442
443         echo "Turn 3 for player 1"
444         runfeed 1 << EOF
445 cen *
446 map #
447 read y
448 build sh 5,-1 frg
449 mov l 5,-1 134 6,-2
450 mov c 4,0 377 6,-2
451 desi 6,-2 l
452 thre l 6,-2 150
453 mov c -1,-1 600 1,1
454 mov c 2,0 370 -2,2
455 deliver i 2,0 0 j
456 deliver i 1,-1 0 j
457 thres d 1,1 1
458 thres o -2,0 1
459 thres i 2,0 0
460 thres i 1,-1 0
461 desi -2,2 o
462 desi 1,1 g
463 prod *
464 EOF
465
466         echo "Run an update"
467         runfeed POGO peter << EOF
468 power new
469 cen * ?own#0
470 reso * ?own#0
471 enable
472 force 1
473 disable
474 EOF
475         echo "Done (force)."
476         echo ""
477         sleep 10
478
479         echo "Done (player 1)."
480         echo ""
481         echo "TODO: turn 4/5 (tech/assault)..."
482
483         echo "Done (Rudimentary tests)."
484         echo ""
485
486                         ;;
487         esac
488         #
489         # END TESTSCRIPT
490         #
491
492         #
493         # START SERVERSTOP
494         #
495         case "${NIGHTLY_SKIP_STEP}"
496         in
497                 *SERVERSTOP*) ;;
498                 *)
499                         case "${NIGHTLY_SKIP_STEP}"
500                         in
501                                 *SERVERSTART*) ;;
502                                 *)
503
504         echo "Stopping server"
505         trykill "${PID}"
506         echo "Done (kill)."
507         echo ""
508                                         ;;
509                         esac
510                         ;;
511         esac
512         #
513         # END SERVERSTOP
514         #
515 done
516
517 #
518 # START CLEANUP
519 #
520 case "${NIGHTLY_SKIP_STEP}"
521 in
522         *CLEANUP*) ;;
523         *)
524
525 echo "Cleaning sandbox"
526 cd "${BOXDIR}" || err "Could not cd back to sandbox root !"
527 rm -r "${WORKDIR}" || warn "Directory ${WORKDIR} could not be cleanly removed !"
528 rm -rf "${WORKDIR}" || warn "Directory ${WORKDIR} could not be forcibly removed !"
529 [ -d "${WORKDIR}/." ] && warn "Directory ${WORKDIR} still present"
530 echo "Done (cleaning)."
531
532                 ;;
533 esac
534 #
535 # END CLEANUP
536 #
537
538 echo "Nightly build finished at `date`"
539
540 exit 0