Skip to content

Commit

Permalink
Add a script to get failures for hydra eval /cc @globin
Browse files Browse the repository at this point in the history
  • Loading branch information
domenkozar committed Jan 28, 2017
1 parent 8a29566 commit 4c22b95
Showing 1 changed file with 89 additions and 0 deletions.
89 changes: 89 additions & 0 deletions maintainers/scripts/hydra-eval-failures.py
@@ -0,0 +1,89 @@
#!/usr/bin/env nix-shell
#!nix-shell -i python -p pythonFull pythonPackages.requests pythonPackages.pyquery pythonPackages.click

# To use, just execute this script with --help to display help.

import subprocess
import json

import click
import requests
from pyquery import PyQuery as pq


maintainers_json = subprocess.check_output([
'nix-instantiate',
'lib/maintainers.nix',
'--eval',
'--json'])
maintainers = json.loads(maintainers_json)
MAINTAINERS = {v: k for k, v in maintainers.iteritems()}


def get_response_text(url):
return pq(requests.get(url).text) # IO

EVAL_FILE = {
'nixos': 'nixos/release.nix',
'nixpkgs': 'pkgs/top-level/release.nix',
}


def get_maintainers(attr_name):
nixname = attr_name.split('.')
meta_json = subprocess.check_output([
'nix-instantiate',
'--eval',
'--strict',
'-A',
'.'.join(nixname[1:]) + '.meta',
EVAL_FILE[nixname[0]],
'--json'])
meta = json.loads(meta_json)
if meta.get('maintainers'):
return [MAINTAINERS[name] for name in meta['maintainers'] if MAINTAINERS.get(name)]


@click.command()
@click.option(
'--jobset',
default="nixos/release-16.09",
help='Hydra project like nixos/release-16.09')
def cli(jobset):
"""
Given a Hydra project, inspect latest evaluation
and print a summary of failed builds
"""

url = "http://hydra.nixos.org/jobset/{}".format(jobset)

# get the last evaluation
click.echo(click.style(
'Getting latest evaluation for {}'.format(url), fg='green'))
d = get_response_text(url)
evaluations = d('#tabs-evaluations').find('a[class="row-link"]')
latest_eval_url = evaluations[0].get('href')

# parse last evaluation page
click.echo(click.style(
'Parsing evaluation {}'.format(latest_eval_url), fg='green'))
d = get_response_text(latest_eval_url + '?full=1')

# TODO: aborted evaluations
# TODO: dependency failed without propagated builds
for tr in d('img[alt="Failed"]').parents('tr'):
a = pq(tr)('a')[1]
print "- [ ] [{}]({})".format(a.text, a.get('href'))

This comment has been minimized.

Copy link
@FRidh

FRidh Feb 3, 2017

Member

print statement 😱

This comment has been minimized.

Copy link
@domenkozar

domenkozar Feb 3, 2017

Author Member

Yeah sorry this was written a long time ago and wasn't mean to be published, but since I got no time to clean it up I published it anyway for @globin :)

This comment has been minimized.

Copy link
@Mic92

Mic92 Feb 3, 2017

Member

python3.6 style:

print(f"- [ ] [{a.text}]({a.get('href')})")

maintainers = get_maintainers(a.text)
if maintainers:
print " - maintainers: {}".format(", ".join(map(lambda u: '@' + u, maintainers)))
# TODO: print last three persons that touched this file
# TODO: pinpoint the diff that broke this build, or maybe it's transient or maybe it never worked?


if __name__ == "__main__":
try:
cli()
except:
import pdb;pdb.post_mortem()

0 comments on commit 4c22b95

Please sign in to comment.