From 541acf33e94a7fee8dc48cbcca4f067ed866a8d7 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Tue, 7 Aug 2018 17:33:19 -0400 Subject: [PATCH 01/18] [infra] Validate pull requests in TaskCluster --- .taskcluster.yml | 187 ++++++++++++++++++++++++++----------- tools/ci/ci_taskcluster.sh | 44 ++++++++- tools/docker/Dockerfile | 6 ++ 3 files changed, 179 insertions(+), 58 deletions(-) diff --git a/.taskcluster.yml b/.taskcluster.yml index 70bde33c354105..71267779ca411b 100644 --- a/.taskcluster.yml +++ b/.taskcluster.yml @@ -2,42 +2,106 @@ version: 1 policy: pullRequests: collaborators tasks: - $if: tasks_for == "github-push" - then: - $if: event.ref == "refs/heads/master" - then: - $flattenDeep: + $flattenDeep: + - $if: tasks_for == "github-push" + then: + $if: event.ref == "refs/heads/master" + then: + $map: [{name: firefox, channel: nightly}, {name: chrome, channel: dev}] + each(browser): + $map: + - [testharness, 1, 15] + - [testharness, 2, 15] + - [testharness, 3, 15] + - [testharness, 4, 15] + - [testharness, 5, 15] + - [testharness, 6, 15] + - [testharness, 7, 15] + - [testharness, 8, 15] + - [testharness, 9, 15] + - [testharness, 10, 15] + - [testharness, 11, 15] + - [testharness, 12, 15] + - [testharness, 13, 15] + - [testharness, 14, 15] + - [testharness, 15, 15] + - [reftest, 1, 10] + - [reftest, 2, 10] + - [reftest, 3, 10] + - [reftest, 4, 10] + - [reftest, 5, 10] + - [reftest, 6, 10] + - [reftest, 7, 10] + - [reftest, 8, 10] + - [reftest, 9, 10] + - [reftest, 10, 10] + - [wdspec, 1, 1] + each(chunk): + taskId: {$eval: 'as_slugid(browser.name + browser.channel + chunk[0] + str(chunk[1]))'} + taskGroupId: {$eval: 'as_slugid("task group")'} + created: {$fromNow: ''} + deadline: {$fromNow: '24 hours'} + provisionerId: aws-provisioner-v1 + # Contributors interested in configurating TaskCluster to run + # against their fork of WPT should change the `workerType` to + # "github-worker". + workerType: wpt-docker-worker + metadata: + name: wpt-${browser.name}-${browser.channel}-${chunk[0]}-${chunk[1]} + description: >- + A subset of WPT's "${chunk[0]}" tests (chunk number ${chunk[1]} + of ${chunk[2]}), run in the ${browser.channel} release of + ${browser.name}. + owner: ${event.pusher.email} + source: ${event.repository.url} + payload: + image: jugglinmike/web-platform-tests:0.18 + maxRunTime: 7200 + artifacts: + public/results: + path: /home/test/artifacts + type: directory + command: + - /bin/bash + - --login + - -c + - set -ex; + ~/start.sh + ${event.repository.url} + ${event.ref[len('refs/heads/'):]} + ${event.after} + ${browser.name}-${browser.channel}; + cd ~/web-platform-tests; + ./tools/ci/ci_taskcluster.sh + --test-type=${chunk[0]} + --this-chunk=${chunk[1]} + --total-chunks=${chunk[2]} + ${browser.name}; + - $if: tasks_for == "github-pull-request" + then: $map: [{name: firefox, channel: nightly}, {name: chrome, channel: dev}] each(browser): $map: - - [testharness, 1, 15] - - [testharness, 2, 15] - - [testharness, 3, 15] - - [testharness, 4, 15] - - [testharness, 5, 15] - - [testharness, 6, 15] - - [testharness, 7, 15] - - [testharness, 8, 15] - - [testharness, 9, 15] - - [testharness, 10, 15] - - [testharness, 11, 15] - - [testharness, 12, 15] - - [testharness, 13, 15] - - [testharness, 14, 15] - - [testharness, 15, 15] - - [reftest, 1, 10] - - [reftest, 2, 10] - - [reftest, 3, 10] - - [reftest, 4, 10] - - [reftest, 5, 10] - - [reftest, 6, 10] - - [reftest, 7, 10] - - [reftest, 8, 10] - - [reftest, 9, 10] - - [reftest, 10, 10] - - [wdspec, 1, 1] - each(chunk): - taskId: {$eval: 'as_slugid(browser.name + browser.channel + chunk[0] + str(chunk[1]))'} + - name: wpt-${browser.name}-${browser.channel}-stability + description: >- + Verify that all tests affected by a pull request are stable + when executed in ${browser.name}. + command: + echo $affected | + base64 -d | + xargs -0 ./tools/ci/ci_taskcluster.sh --verify ${browser.name} + creates_artifacts: false + - name: wpt-${browser.name}-${browser.channel}-results + description: >- + Collect results for all tests affected by a pull request in + ${browser.name}. + command: + echo $affected | + base64 -d | + xargs -0 ./tools/ci/ci_taskcluster.sh ${browser.name} + creates_artifacts: true + each(operation): + taskId: {$eval: 'as_slugid(operation.name)'} taskGroupId: {$eval: 'as_slugid("task group")'} created: {$fromNow: ''} deadline: {$fromNow: '24 hours'} @@ -47,31 +111,48 @@ tasks: # "github-worker". workerType: wpt-docker-worker metadata: - name: wpt-${browser.name}-${browser.channel}-${chunk[0]}-${chunk[1]} - description: >- - A subset of WPT's "${chunk[0]}" tests (chunk number ${chunk[1]} - of ${chunk[2]}), run in the ${browser.channel} release of - ${browser.name}. - owner: ${event.pusher.email} + name: ${operation.name} + description: ${operation.description} + owner: ${event.pull_request.user.login}@users.noreply.github.com source: ${event.repository.url} payload: - image: gsnedders/web-platform-tests:0.13 + image: jugglinmike/web-platform-tests:0.18 maxRunTime: 7200 artifacts: - public/results: - path: /home/test/artifacts - type: directory + $if: operation.creates_artifacts + then: + public/results: + path: /home/test/artifacts + type: directory + # Bash removes null bytes from string values when set as + # environment variables. This invalidates the output of `wpt + # affected-tests` because it uses the null byte as a separator + # between test names. The list of effected tests is + # Base64-encoded in order to preserve the null bytes. command: - /bin/bash - --login - -c - - "~/start.sh ${event.repository.url} ${event.ref[len('refs/heads/'):]} ${event.after} ${browser.name}-${browser.channel} && - cd ~/web-platform-tests && - ./tools/ci/ci_taskcluster.sh ${browser.name} ${chunk[0]} ${chunk[1]} ${chunk[2]}" - else: [] - # > NOTE: A well-designed template should produce `tasks: []` for any - # > unrecognized `task_for` values; this allows later expansion of this - # > service to handle more events. - # - # https://docs.taskcluster.net/docs/reference/integrations/taskcluster-github/docs/taskcluster-yml-v1 - else: [] + - set -ex; + ~/start.sh + ${event.repository.clone_url} + ${event.pull_request.base.ref} + ${event.pull_request.base.sha} + ${browser.name}-${browser.channel}; + cd ~/web-platform-tests; + ./wpt manifest-download || true; + git fetch + ${event.repository.clone_url} + refs/pull/${event.number}/head; + git checkout FETCH_HEAD; + affected=$(./wpt tests-affected + --null + ${event.pull_request.base.sha}... + | base64 --wrap 0); + if [ -z $(echo $affected | base64 -d) ]; then + echo Zero tests affected.; + exit 0; + fi; + echo Affected tests:; + echo $affected | base64 -d | sed 's/\x0/\n/g'; + ${operation.command} diff --git a/tools/ci/ci_taskcluster.sh b/tools/ci/ci_taskcluster.sh index 118243881a938b..0db8b9db31741f 100755 --- a/tools/ci/ci_taskcluster.sh +++ b/tools/ci/ci_taskcluster.sh @@ -2,9 +2,43 @@ ./wpt manifest-download -if [ $1 == "firefox" ]; then - ./wpt run firefox --log-tbpl=../artifacts/log_tbpl.log --log-tbpl-level=info --log-wptreport=../artifacts/wpt_report.json --log-mach=- --this-chunk=$3 --total-chunks=$4 --test-type=$2 -y --install-browser --no-pause --no-restart-on-unexpected --reftest-internal --install-fonts --no-fail-on-unexpected -elif [ $1 == "chrome" ]; then - ./wpt run chrome --log-tbpl=../artifacts/log_tbpl.log --log-tbpl-level=info --log-wptreport=../artifacts/wpt_report.json --log-mach=- --this-chunk=$3 --total-chunks=$4 --test-type=$2 -y --no-pause --no-restart-on-unexpected --install-fonts --no-fail-on-unexpected +# The first script argument that is not prefixed with a dash (`-`) is assumed +# to be the name of the browser under test. This restricts the syntax available +# to consumers: value-accepting options must be specified using the equals sign +# (`=`). +for argument in $@; do + if [ ${argument:0:1} = '-' ]; then + continue + fi + + browser_name=$argument + + break +done + +browser_specific_args='' + +if [ $browser_name = 'firefox' ]; then + browser_specific_args='--install-browser --reftest-internal' fi -gzip ../artifacts/wpt_report.json + +./wpt run \ + --log-tbpl=../artifacts/log_tbpl.log \ + --log-tbpl-level=info \ + --log-wptreport=../artifacts/wpt_report.json \ + --log-mach=- \ + -y \ + --no-pause \ + --no-restart-on-unexpected \ + --install-fonts \ + --no-fail-on-unexpected \ + $browser_specific_args \ + $@ + +run_status=$? + +if [ -f ../artifacts/wpt_report.json ]; then + gzip ../artifacts/wpt_report.json +fi + +exit $run_status diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile index b0541dc6c98337..2362ef39623600 100644 --- a/tools/docker/Dockerfile +++ b/tools/docker/Dockerfile @@ -69,4 +69,10 @@ WORKDIR /home/test/ COPY .bashrc /home/test/.bashrc +# Ubuntu inserts a logout script which exits with a non-zero status. This makes +# it impossible to use the `exit` built-in from a login shell where the `-e` +# option has been set. Since the script is intended to clear the console for +# interactive sessions, it may safely be removed. +RUN rm /home/test/.bash_logout + COPY start.sh /home/test/start.sh From c3f109bdfa187c17042ec2d0074f4ea0b5bf13b4 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Thu, 23 Aug 2018 12:49:08 -0400 Subject: [PATCH 02/18] [infra] Temporarily ignore stability status in CI --- .taskcluster.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.taskcluster.yml b/.taskcluster.yml index 71267779ca411b..2d7ac4e0a27e6d 100644 --- a/.taskcluster.yml +++ b/.taskcluster.yml @@ -85,12 +85,16 @@ tasks: - name: wpt-${browser.name}-${browser.channel}-stability description: >- Verify that all tests affected by a pull request are stable - when executed in ${browser.name}. + when executed in ${browser.name}. As of 2018-08-23, this task + is being vetted for correctness, so its outcome will not + influence the status of the pull request. command: + status=PASS; echo $affected | base64 -d | - xargs -0 ./tools/ci/ci_taskcluster.sh --verify ${browser.name} - creates_artifacts: false + xargs -0 ./tools/ci/ci_taskcluster.sh --verify ${browser.name} || status=FAIL; + echo $status > ../artifacts/stability-status.txt + creates_artifacts: true - name: wpt-${browser.name}-${browser.channel}-results description: >- Collect results for all tests affected by a pull request in From a1f01d0ddcbb61a7efc84ab00dbb038fbb6736f0 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Thu, 23 Aug 2018 20:39:35 -0400 Subject: [PATCH 03/18] Demonstrate task with zero affected tests From ee8d57d48a28d3f1d9c738964e640a4dcbc1e92d Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Thu, 23 Aug 2018 18:13:15 -0400 Subject: [PATCH 04/18] DO NOT MERGE Introduce instability --- dom/events/CustomEvent.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dom/events/CustomEvent.html b/dom/events/CustomEvent.html index abc6c370fd2e87..45b5cbefbd2f13 100644 --- a/dom/events/CustomEvent.html +++ b/dom/events/CustomEvent.html @@ -4,6 +4,10 @@