Auto merge of #16946 - jdm:report, r=Manishearth

Add intermittent failure reporting to filter-intermittents

We need to address https://github.com/servo/saltfs/issues/671 before this can be enabled by default on the builders, but I got the pieces working locally. This collects relevant information about each recorded intermittent failure encountered during a test run and posts them to a webapp which stores them in a database for later investigation. This will allow us to track over time which intermittent test failures are the most frequent, as well as whether they only happen on a particular builder or operating system.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/16946)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2017-11-07 13:05:12 -06:00 committed by GitHub
commit 693c3dcfb2
2 changed files with 57 additions and 14 deletions

View file

@ -3,7 +3,7 @@ mac-rel-wpt1:
- env PKG_CONFIG_PATH=/usr/local/opt/zlib/lib/pkgconfig ./mach build --release
- ./mach test-wpt-failure
- ./mach test-wpt --release --processes 4 --total-chunks 6 --this-chunk 1 --log-raw test-wpt.log --log-errorsummary wpt-errorsummary.log --always-succeed
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --use-tracker
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --tracker-api default --reporter-api default
- ./mach test-wpt --release --binary-arg=--multiprocess --processes 8 --log-raw test-wpt-mp.log --log-errorsummary wpt-mp-errorsummary.log eventsource
- bash ./etc/ci/lockfile_changed.sh
- bash ./etc/ci/manifest_changed.sh
@ -12,22 +12,22 @@ mac-rel-wpt2:
- ./mach clean-nightlies --keep 3 --force
- env PKG_CONFIG_PATH=/usr/local/opt/zlib/lib/pkgconfig ./mach build --release
- ./mach test-wpt --release --processes 4 --total-chunks 6 --this-chunk 2 --log-raw test-wpt.log --log-errorsummary wpt-errorsummary.log --always-succeed
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --use-tracker
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --tracker-api default --reporter-api default
- env PKG_CONFIG_PATH=/usr/local/opt/zlib/lib/pkgconfig ./mach build-geckolib --release
mac-rel-wpt3:
- ./mach clean-nightlies --keep 3 --force
- env PKG_CONFIG_PATH=/usr/local/opt/zlib/lib/pkgconfig ./mach build --release
- ./mach test-wpt --release --processes 4 --total-chunks 6 --this-chunk 3 --log-raw test-wpt.log --log-errorsummary wpt-errorsummary.log --always-succeed
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --use-tracker
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --tracker-api default --reporter-api default
mac-rel-wpt4:
- ./mach clean-nightlies --keep 3 --force
- env PKG_CONFIG_PATH=/usr/local/opt/zlib/lib/pkgconfig ./mach build --release
- ./mach test-wpt --release --processes 4 --total-chunks 6 --this-chunk 4 --log-raw test-wpt.log --log-errorsummary wpt-errorsummary.log --always-succeed
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --use-tracker
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --tracker-api default --reporter-api default
- ./mach test-wpt --release --pref dom.servoparser.async_html_tokenizer.enabled --processes=8 --log-raw test-async-parsing.log --log-errorsummary async-parsing-errorsummary.log --always-succeed domparsing html/syntax html/dom/documents html/dom/dynamic-markup-insertion
- ./mach filter-intermittents async-parsing-errorsummary.log --log-intermittents async-parsing-intermittents.log --log-filteredsummary filtered-async-parsing-errorsummary.log --use-tracker
- ./mach filter-intermittents async-parsing-errorsummary.log --log-intermittents async-parsing-intermittents.log --log-filteredsummary filtered-async-parsing-errorsummary.log --tracker-api default --reporter-api default
mac-dev-unit:
- ./mach clean-nightlies --keep 3 --force
@ -43,7 +43,7 @@ mac-rel-css1:
- ./mach clean-nightlies --keep 3 --force
- env PKG_CONFIG_PATH=/usr/local/opt/zlib/lib/pkgconfig ./mach build --release
- ./mach test-wpt --release --processes 4 --total-chunks 6 --this-chunk 5 --log-raw test-wpt.log --log-errorsummary wpt-errorsummary.log --always-succeed
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --use-tracker
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --tracker-api default --reporter-api default
- bash ./etc/ci/lockfile_changed.sh
- bash ./etc/ci/manifest_changed.sh
@ -51,7 +51,7 @@ mac-rel-css2:
- ./mach clean-nightlies --keep 3 --force
- env PKG_CONFIG_PATH=/usr/local/opt/zlib/lib/pkgconfig ./mach build --release
- ./mach test-wpt --release --processes 4 --total-chunks 6 --this-chunk 6 --log-raw test-wpt.log --log-errorsummary wpt-errorsummary.log --always-succeed
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --use-tracker
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --tracker-api default --reporter-api default
mac-nightly:
- ./mach clean-nightlies --keep 3 --force
@ -95,14 +95,14 @@ linux-rel-wpt:
- ./mach build --release --with-debug-assertions
- ./mach test-wpt-failure
- ./mach test-wpt --release --processes 24 --total-chunks 2 --this-chunk 1 --log-raw test-wpt.log --log-errorsummary wpt-errorsummary.log --always-succeed
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --use-tracker
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --tracker-api default --reporter-api default
- ./mach test-wpt --release --binary-arg=--multiprocess --processes 24 --log-raw test-wpt-mp.log --log-errorsummary wpt-mp-errorsummary.log eventsource
linux-rel-css:
- ./mach clean-nightlies --keep 3 --force
- ./mach build --release --with-debug-assertions
- ./mach test-wpt --release --processes 24 --total-chunks 2 --this-chunk 2 --log-raw test-wpt.log --log-errorsummary wpt-errorsummary.log --always-succeed
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --use-tracker
- ./mach filter-intermittents wpt-errorsummary.log --log-intermittents intermittents.log --log-filteredsummary filtered-wpt-errorsummary.log --tracker-api default --reporter-api default
- ./mach build-geckolib --release
- ./mach test-stylo --release
- bash ./etc/ci/lockfile_changed.sh

View file

@ -14,13 +14,16 @@ import re
import sys
import os
import os.path as path
import platform
import copy
from collections import OrderedDict
from time import time
import json
import urllib2
import urllib
import base64
import shutil
import subprocess
from mach.registrar import Registrar
from mach.decorators import (
@ -517,9 +520,11 @@ class MachCommands(CommandBase):
help='Print intermittents to file')
@CommandArgument('--auth', default=None,
help='File containing basic authorization credentials for Github API (format `username:password`)')
@CommandArgument('--use-tracker', default=False, action='store_true',
help='Use https://www.joshmatthews.net/intermittent-tracker')
def filter_intermittents(self, summary, log_filteredsummary, log_intermittents, auth, use_tracker):
@CommandArgument('--tracker-api', default=None, action='store',
help='The API endpoint for tracking known intermittent failures.')
@CommandArgument('--reporter-api', default=None, action='store',
help='The API endpoint for reporting tracked intermittent failures.')
def filter_intermittents(self, summary, log_filteredsummary, log_intermittents, auth, tracker_api, reporter_api):
encoded_auth = None
if auth:
with open(auth, "r") as file:
@ -533,9 +538,14 @@ class MachCommands(CommandBase):
actual_failures = []
intermittents = []
for failure in failures:
if use_tracker:
if tracker_api:
if tracker_api == 'default':
tracker_api = "http://build.servo.org/intermittent-tracker"
elif tracker_api.endswith('/'):
tracker_api = tracker_api[0:-1]
query = urllib2.quote(failure['test'], safe='')
request = urllib2.Request("http://build.servo.org/intermittent-tracker/query.py?name=%s" % query)
request = urllib2.Request("%s/query.py?name=%s" % (tracker_api, query))
search = urllib2.urlopen(request)
data = json.load(search)
if len(data) == 0:
@ -556,6 +566,39 @@ class MachCommands(CommandBase):
else:
intermittents += [failure]
if reporter_api:
if reporter_api == 'default':
reporter_api = "http://build.servo.org/intermittent-failure-tracker"
if reporter_api.endswith('/'):
reporter_api = reporter_api[0:-1]
reported = set()
proc = subprocess.Popen(
["git", "log", "--merges", "--oneline", "-1"],
stdout=subprocess.PIPE)
(last_merge, _) = proc.communicate()
# Extract the issue reference from "abcdef Auto merge of #NNN"
pull_request = int(last_merge.split(' ')[4][1:])
for intermittent in intermittents:
if intermittent['test'] in reported:
continue
reported.add(intermittent['test'])
data = {
'test_file': intermittent['test'],
'platform': platform.system(),
'builder': os.environ.get('BUILDER_NAME', 'BUILDER NAME MISSING'),
'number': pull_request,
}
request = urllib2.Request("%s/record.py" % reporter_api, urllib.urlencode(data))
request.add_header('Accept', 'application/json')
response = urllib2.urlopen(request)
data = json.load(response)
if data['status'] != "success":
print('Error reporting test failure: ' + data['error'])
if log_intermittents:
with open(log_intermittents, "w") as intermittents_file:
for intermittent in intermittents: