Roughly this time last year I set up Hudson at the office to do Oxford Nanopore’s continuous integration builds. It’s been a pleasure to roll-out the automated-testing work-ethic for developers and (perhaps surprisingly) there’s been less resistance than I expected. Hudson is a great weapon in the arsenal and is dead easy to set up as a master server. This week though I’ve had to do something new – configure one of our product simulators as my first Hudson slave server. Again this proved to be a doddle – thanks Hudson!
My slave server is called “device2” – Here’s what I needed to set up on the master (ci.example.net).
“Manage Hudson” => “Manage Nodes” => “New Node” => node name = “device2”, type is “dumb slave” => number of executors = 1, remote fs root = “/home/hudson/ci”, leave for tied jobs only, launch by JNLP.
Then on device2:
adduser hudson
su hudson
cd
mkdir ci
cd ci
wget http://ci.example.net/jnlpJars/slave.jar
Made a new file /etc/init.d/hudson-slave with these contents:
#!/bin/bash
#
# Init file for hudson server daemon
#
# chkconfig: 2345 65 15
# description: Hudson slave
. /etc/rc.d/init.d/functions
RETVAL=0
NODE_NAME="device2"
HUDSON_HOST=ci.example.net
USER=hudson
LOG=/home/hudson/ci/hudson.log
SLAVE_JAR=/home/hudson/ci/slave.jar
pid_of_hudson() {
ps auxwww | grep java | grep hudson | grep -v grep | awk '{ print $2 }'
}
start() {
echo -n $"Starting hudson: "
COMMAND="java -jar $SLAVE_JAR -jnlpUrl \
http://${HUDSON_HOST}/computer/${NODE_NAME}/slave-agent.jnlp \
2>$LOG.err \
>$LOG.out"
su ${USER} -c "$COMMAND" &
sleep 1
pid_of_hudson > /dev/null
RETVAL=$?
[ $RETVAL = 0 ] && success || failure
echo
}
stop() {
echo -n "Stopping hudson slave: "
pid=`pid_of_hudson`
[ -n "$pid" ] && kill $pid
RETVAL=$?
cnt=10
while [ $RETVAL = 0 -a $cnt -gt 0 ] &&
{ pid_of_hudson > /dev/null ; } ; do
sleep 1
((cnt--))
done
[ $RETVAL = 0 ] && success || failure
echo
}
status() {
pid=`pid_of_hudson`
if [ -n "$pid" ]; then
echo "hudson (pid $pid) is running..."
return 0
fi
echo "hudson is stopped"
return 3
}
#Switch on called
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 (start|stop|restart|status}"
exit 1
esac
exit $RETVAL
chkconfig --add hudson-slave
chkconfig hudson-slave on
service hudson-slave start
and that’s pretty much all there was to it – refreshing the node-status page on the hudson master showed the slave had registered itself, then reconfiguring one of the existing jobs to be tied to the “device2” slave immediately started assigning jobs to it. Tremendous!