Report instances of intermittent failures to a tracker.

This commit is contained in:
Josh Matthews 2017-05-18 17:40:47 -04:00
parent c0f85579c5
commit c469cbbe72

View file

@ -14,13 +14,16 @@ import re
import sys import sys
import os import os
import os.path as path import os.path as path
import platform
import copy import copy
from collections import OrderedDict from collections import OrderedDict
from time import time from time import time
import json import json
import urllib2 import urllib2
import urllib
import base64 import base64
import shutil import shutil
import subprocess
from mach.registrar import Registrar from mach.registrar import Registrar
from mach.decorators import ( from mach.decorators import (
@ -519,7 +522,9 @@ class MachCommands(CommandBase):
help='File containing basic authorization credentials for Github API (format `username:password`)') help='File containing basic authorization credentials for Github API (format `username:password`)')
@CommandArgument('--tracker-api', default=None, action='store', @CommandArgument('--tracker-api', default=None, action='store',
help='The API endpoint for tracking known intermittent failures.') help='The API endpoint for tracking known intermittent failures.')
def filter_intermittents(self, summary, log_filteredsummary, log_intermittents, auth, tracker_api): @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 encoded_auth = None
if auth: if auth:
with open(auth, "r") as file: with open(auth, "r") as file:
@ -536,7 +541,7 @@ class MachCommands(CommandBase):
if tracker_api: if tracker_api:
if tracker_api == 'default': if tracker_api == 'default':
tracker_api = "http://build.servo.org/intermittent-tracker" tracker_api = "http://build.servo.org/intermittent-tracker"
else if tracker_api.endswith('/'): elif tracker_api.endswith('/'):
tracker_api = tracker_api[0:-1] tracker_api = tracker_api[0:-1]
query = urllib2.quote(failure['test'], safe='') query = urllib2.quote(failure['test'], safe='')
@ -561,6 +566,37 @@ class MachCommands(CommandBase):
else: else:
intermittents += [failure] intermittents += [failure]
if reporter_api:
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: if log_intermittents:
with open(log_intermittents, "w") as intermittents_file: with open(log_intermittents, "w") as intermittents_file:
for intermittent in intermittents: for intermittent in intermittents: