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