Initially I set up dirty-haskell.org (which is currently powered by hakyll) to rsync the results of compiling up onto my server whenever I intone dirty-haskell deploy
.
In my ever continuing quest to have my life consist mostly of an array of git repositories however this didn’t seem satisfactory. Therefore I configured my gitolite instance to automatically compile und publish the current git version whenever I push to master
.
Gitolite provides us with facilities to install githooks. Publishing will be handled by post-update
:
#!/usr/bin/env zsh
touchedMaster=false
for ref ($@); do
[[ ${ref} =~ .*/master$ ]] || continue
touchedMaster=true
break
done
$touchedMaster || exit 0
{
checkoutDir=/srv/git/checkouts/$(basename $(pwd))
print ${checkoutDir}
mkdir -p $(dirname ${checkoutDir})
unset GIT_DIR
if [[ -d ${checkoutDir} ]]; then
git -C ${checkoutDir} fetch origin
else
rm -rf ${checkoutDir}
git clone --depth 1 file://$(pwd) ${checkoutDir}
fi
git -C ${checkoutDir} checkout -f origin/master
{
umask 0022
cd ${checkoutDir}
script=$(mktemp)
delScript() {
rm -v ${script}
}
trap delScript EXIT
chmod +x ${script}
>${script} <<EOF
#! /usr/bin/env nix-shell
#! nix-shell -i sh ${checkoutDir}/shell.nix
dirty-haskell build && dirty-haskell deploy
EOF
${script}
}
} 2>&1 | stdbuf -o 0 tr '\r' '\n' | logger --id=$$ -p daemon.info -t dirty-haskell
The script checks if the master branch was moved to a new commit or otherwise touched and, if so, clones a copy of the repo to a temporary directory and runs hakyll´s deploy command in it, which is set to rsync the compiled version to a folder where it´ll be picked up by nginx.
It works.