Commit a0855325 authored by Ralf Jung's avatar Ralf Jung

fix gitlab extractor to be more robust

parent 71788212
Pipeline #234 passed with stage
...@@ -4,7 +4,7 @@ import requests ...@@ -4,7 +4,7 @@ import requests
import parse_log import parse_log
def last(it): def last(it):
r = first(it) # errors out if it is empty r = None
for i in it: for i in it:
r = i r = i
return r return r
...@@ -12,7 +12,7 @@ def last(it): ...@@ -12,7 +12,7 @@ def last(it):
def first(it): def first(it):
for i in it: for i in it:
return i return i
raise Exception("The iterator is empty") return None
def req(path): def req(path):
url = '%s/api/v3/%s' % (args.server, path) url = '%s/api/v3/%s' % (args.server, path)
...@@ -47,20 +47,29 @@ if args.commits is None: ...@@ -47,20 +47,29 @@ if args.commits is None:
projects = req("projects") projects = req("projects")
project = first(filter(lambda p: p['path_with_namespace'] == args.project, projects.json())) project = first(filter(lambda p: p['path_with_namespace'] == args.project, projects.json()))
if project is None:
sys.stderr.write("Project not found.\n")
sys.exit(1)
for commit in parse_log.parse_git_commits(args.commits): for commit in parse_log.parse_git_commits(args.commits):
print("Fetching {}...".format(commit)) print("Fetching {}...".format(commit))
commit_data = req("/projects/{}/repository/commits/{}".format(project['id'], commit))
if commit_data.status_code != 200:
raise Exception("Commit not found?")
builds = req("/projects/{}/repository/commits/{}/builds".format(project['id'], commit)) builds = req("/projects/{}/repository/commits/{}/builds".format(project['id'], commit))
if builds.status_code != 200: if builds.status_code != 200:
continue
try:
build = first(sorted(builds.json(), key = lambda b: -int(b['id'])))
except Exception:
# no build # no build
continue continue
build = first(sorted(builds.json(), key = lambda b: -int(b['id'])))
assert build is not None
if build['status'] == 'failed':
# build failed
continue
# now fetch the build times
build_times = requests.get("{}/builds/{}/artifacts/file/build-time.txt".format(project['web_url'], build['id'])) build_times = requests.get("{}/builds/{}/artifacts/file/build-time.txt".format(project['web_url'], build['id']))
if build_times.status_code != 200: if build_times.status_code != 200:
continue raise Exception("No artifact at build?")
# Output in the log file format # Output in the log file format
log_file.write("# {}\n".format(commit)) log_file.write("# {}\n".format(commit))
log_file.write(build_times.text) log_file.write(build_times.text)
log_file.flush()
...@@ -35,7 +35,7 @@ def parse(file, parse_times = True): ...@@ -35,7 +35,7 @@ def parse(file, parse_times = True):
# nothing else we know about # nothing else we know about
raise Exception("Unexpected line: {}".format(line)) raise Exception("Unexpected line: {}".format(line))
# end of file. previous commit, if any, is done now. # end of file. previous commit, if any, is done now.
if times is not None: if commit is not None:
yield Result(commit, times) yield Result(commit, times)
def parse_git_commits(commits): def parse_git_commits(commits):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment