Created
June 2, 2011 15:35
-
-
Save git2samus/1004653 to your computer and use it in GitHub Desktop.
buildhuman
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash -l | |
shopt -s nullglob | |
enqueue() { | |
for rev; do | |
echo -n "$rev" > "$(mktemp "$queuedir/$(date +%s).XXXXXX")" | |
done | |
} | |
run_tests_for() { | |
local name=$1 command=$2 | |
local previous_logs=("$LOGSDIR"/*-"$revision"-"$name".log) | |
if ! ((${#previous_logs[@]})); then | |
bundle exec 'rake db:reset && rake db:test:prepare' || exit | |
echo "running $name" | |
{ bundle exec "$command" 2>"$lockdir/stderr" | |
echo; echo; echo "STDERR:"; echo | |
cat "$lockdir/stderr"; echo | |
} | tee "$lockdir/$date-$revision-$name.log" | |
echo "done" | |
mv "$lockdir/$date-$revision-$name.log" "$LOGSDIR/$date-$revision-$name.log" | |
echo " log: $LOGSDIR/$date-$revision-$name.log" | |
else | |
echo "logs for $name on revision $revision already exist, skipping." | |
fi | |
} | |
echo "starting..." | |
echo " pid: $$" | |
# setup rvm and cwd to project's dir | |
rvm rvmrc trust "$WORKSPACE" && cd "$WORKSPACE" || exit | |
echo " saving logs to: ${LOGSDIR:=$PWD}" | |
lockdir=/tmp/monaqasat_tests.lock | |
queuedir=$lockdir/queue | |
# atomic lock acquisition | |
if mkdir "$lockdir"; then | |
# remove lock on exit | |
trap 'rm -rf "$lockdir"' 0 | |
# dir to save scheduled runs | |
mkdir -p "$queuedir" | |
# enqueue current args or schedule master | |
enqueue "${@:-origin/master}" | |
while true; do | |
queue=("$queuedir"/*) | |
if ((${#queue[@]})); then | |
rev=$(<"${queue[0]}") | |
# refresh repository | |
GIT_SSH=ssh-wrapper git fetch && git checkout -f "$rev" || exit | |
# update gems | |
bundle install || exit | |
# run tests | |
date=$(date +%Y-%m-%d) revision=$(git rev-parse HEAD) | |
run_tests_for rspec 'rspec spec' | |
run_tests_for cucumber 'cucumber --require features' | |
# remove scheduled run and search again | |
rm "${queue[0]}" | |
else | |
break | |
fi | |
done | |
else | |
if (($#)); then | |
echo "lock found, scheduling..." | |
enqueue "$@" | |
else | |
echo "cannot acquire lock, aborting." >&2 | |
fi | |
exit | |
fi | |
echo "finished." |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment