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
sshfs
withosxfuse
: almost there, but it seems that the mounted file system doesn't support events on OSX, sofswatch
doesn'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