CI for a Coding Dojo
Suppose you're hosting a coding dojo and want to do continuous integration; that is, you want to always show the state of the tests while editing code. Here's a pretty stable solution I came up with after a few tries.
I want to use two projectors: one for showing the test state, the other for
showing the code under development. This means using two computers, and that I
need to sync between them. If you're using a single machine, then you
can still use the same setup, or just leave out the rsync part. A quick
summary of what's going in; if you feel like it, this is enough to roll your
own:
inotifywatch / fswatch
|
|
rsync|client
| dev machine
---------+--------------------------------------
| ci machine
rsync|server
|
|
inotifywatch / fswatch
|
|
compile, test
The things that need to happen in order, when a change is saved on the development machine:
1. inotifywatch / fswatch starts an rsync operation
#!/bin/sh
remote=$1
fswatch . "date +%H:%M:%S && rsync -viru --delete . rsync://$remote/dojo"
This will start fswatch (on OSX; use inotifywatch on Linux), set it to watch
pwd, and start an rsync of the directory to the rsync server running on the
CI machine. You'll need to pass the host:port of the rsync server to this
script. dojo is the name of the rsync module configured on the server (see
below).
2. rsync sends changes to the server
An rsync server needs to be running on the CI machine. You can start one
simply by doing rsync --daemon --no-detach --config=./rsyncd.conf. The
interesting stuff is in ./rsyncd.conf:
pid file = /tmp/dojo-rsyncd.pid
log file = /tmp/dojo-rsyncd.log
address = 0.0.0.0
port = 8873
use chroot = false
[dojo]
path = /tmp/dojo-ci-server
uid = abesto
read only = no
The dojo section is what I hinted at in the previous section. Most of this is
pretty self-explanatory. Note that the rsync server logs only to the log file
you set here, never to STDOUT. Make sure the directory /tmp/dojo-ci-server
is created before you start the server, and that it's writable by the user
running the rsync server.
3. The change should trigger build/test on the CI machine
Simply using fswatch:
#!/bin/sh
cd /tmp/dojo-ci-server
fswatch . build-and-test.sh
4. Build, test
This will depend on what technology you're using in the dojo. Using
figlet to have a big, nice, ASCII status saying ERROR
or FAIL or PASS works very well (the font banner3 is one that's pretty good
for this).
Other things I've tried
sshfswithosxfuse: almost there, but it seems that the mounted file system doesn't support events on OSX, sofswatchdoesn't pick up the changes.- Dropbox: works, but there's a longish delay between the save and the build/test run.
Finally, an example of the whole thing: https://github.com/abesto/bphug-dojo/tree/master/ci