gecko-dev/taskcluster/docker/recipes/xvfb.sh

76 строки
2.1 KiB
Bash

#! /bin/bash -x
set -x
fail() {
echo # make sure error message is on a new line
echo "[xvfb.sh:error]" "${@}"
exit 1
}
cleanup_xvfb() {
# When you call this script with START_VNC or TASKCLUSTER_INTERACTIVE
# we make sure we do not kill xvfb so you do not lose your connection
local xvfb_pid=`pidof Xvfb`
local vnc=${START_VNC:-false}
local interactive=${TASKCLUSTER_INTERACTIVE:-false}
if [ -n "$xvfb_pid" ] && [[ $vnc == false ]] && [[ $interactive == false ]] ; then
kill $xvfb_pid || true
screen -XS xvfb quit || true
fi
}
# Attempt to start xvfb in a screen session with the given resolution and display
# number. Up to 5 attempts will be made to start xvfb with a short delay
# between retries
try_xvfb() {
screen -dmS xvfb Xvfb :$2 -nolisten tcp -screen 0 $1 \
> ~/artifacts/xvfb/xvfb.log 2>&1
export DISPLAY=:$2
# Only error code 255 matters, because it signifies that no
# display could be opened. As long as we can open the display
# tests should work. We'll retry a few times with a sleep before
# failing.
local retry_count=0
local max_retries=5
xvfb_test=0
until [ $retry_count -gt $max_retries ]; do
xvinfo || xvfb_test=$?
if [ $xvfb_test != 255 ]; then
retry_count=$(($max_retries + 1))
else
retry_count=$(($retry_count + 1))
echo "Failed to start Xvfb, retry: $retry_count"
sleep 2
fi
done
if [ $xvfb_test == 255 ]; then
return 1
else
return 0
fi
}
start_xvfb() {
set +e
mkdir -p ~/artifacts/xvfb
local retry_count=0
local max_retries=2
local success=1
until [ $retry_count -gt $max_retries ]; do
try_xvfb $1 $2
success=$?
if [ $success -eq 0 ]; then
retry_count=$(($max_retries + 1))
else
retry_count=$(($retry_count + 1))
sleep 10
fi
done
set -e
if [ $success -eq 1 ]; then
fail "Could not start xvfb after ${max_retries} attempts"
fi
}