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