diff --git a/testing/web-platform/tests/.taskcluster.yml b/testing/web-platform/tests/.taskcluster.yml index ae99c0960acc..1045e07c8df8 100644 --- a/testing/web-platform/tests/.taskcluster.yml +++ b/testing/web-platform/tests/.taskcluster.yml @@ -61,7 +61,7 @@ tasks: owner: ${event.pusher.email} source: ${event.repository.url} payload: - image: harjgam/web-platform-tests:0.26 + image: harjgam/web-platform-tests:0.29 maxRunTime: 7200 artifacts: public/results: @@ -136,7 +136,7 @@ tasks: owner: ${event.pull_request.user.login}@users.noreply.github.com source: ${event.repository.url} payload: - image: harjgam/web-platform-tests:0.26 + image: harjgam/web-platform-tests:0.29 maxRunTime: 7200 artifacts: public/results: diff --git a/testing/web-platform/tests/tools/docker/Dockerfile b/testing/web-platform/tests/tools/docker/Dockerfile index 53564ac135c9..0cb2352e5fdf 100644 --- a/testing/web-platform/tests/tools/docker/Dockerfile +++ b/testing/web-platform/tests/tools/docker/Dockerfile @@ -66,9 +66,13 @@ WORKDIR /home/test RUN sudo echo "" RUN mkdir -p /home/test/artifacts +RUN mkdir -p /home/test/bin + +ENV PATH="/home/test/bin:${PATH}" WORKDIR /home/test/ COPY .bashrc /home/test/.bashrc COPY start.sh /home/test/start.sh +COPY retry.py /home/test/bin/retry diff --git a/testing/web-platform/tests/tools/docker/retry.py b/testing/web-platform/tests/tools/docker/retry.py new file mode 100755 index 000000000000..6126b781bfad --- /dev/null +++ b/testing/web-platform/tests/tools/docker/retry.py @@ -0,0 +1,58 @@ +#! /usr/bin/env python +import argparse +import subprocess +import time +import sys + + +def get_args(): + parser = argparse.ArgumentParser() + parser.add_argument("--delay", action="store", type=float, default=3, help="Initial delay before retry, in seconds") + parser.add_argument("--count", action="store", type=int, default=5, help="Total number of tries") + parser.add_argument("--factor", action="store", type=float, default=2, help="Exponential backoff factor") + parser.add_argument("cmd", nargs=argparse.REMAINDER) + return parser + + +def iter_range(n): + i = 0 + while i < n: + yield i + i += 1 + + +def main(): + args = get_args().parse_args() + + if not args.cmd: + print("No command supplied") + sys.exit(1) + + retcode = None + + for n in iter_range(args.count): + try: + print("Running %s [try %d/%d]" % (" ".join(args.cmd), (n+1), args.count)) + subprocess.check_call(args.cmd) + except subprocess.CalledProcessError as e: + retcode = e.returncode + else: + print("Command succeeded") + retcode = 0 + break + + if args.factor == 0: + wait_time = (n+1) * args.delay + else: + wait_time = args.factor**n * args.delay + if n < args.count - 1: + print("Command failed, waiting %s seconds to retry" % wait_time) + time.sleep(wait_time) + else: + print("Command failed, out of retries") + + sys.exit(retcode) + + +if __name__ == "__main__": + main() diff --git a/testing/web-platform/tests/tools/docker/start.sh b/testing/web-platform/tests/tools/docker/start.sh index 52a5127892ca..bfc7e9960abf 100755 --- a/testing/web-platform/tests/tools/docker/start.sh +++ b/testing/web-platform/tests/tools/docker/start.sh @@ -26,13 +26,13 @@ git init git remote add origin ${REMOTE} # Initially we just fetch 50 commits in order to save several minutes of fetching -git fetch --quiet --depth=50 --tags origin ${REF} +retry git fetch --quiet --depth=50 --tags origin ${REF} if [[ ! `git rev-parse --verify -q ${REVISION}` ]]; then # But if for some reason the commit under test isn't in that range, we give in and # fetch everything - git fetch -q --unshallow ${REMOTE} + retry git fetch -q --unshallow ${REMOTE} git rev-parse --verify ${REVISION} fi git checkout -b build ${REVISION}