Skip to content
Snippets Groups Projects
Commit a0855325 authored by Ralf Jung's avatar Ralf Jung
Browse files

fix gitlab extractor to be more robust

parent 71788212
No related branches found
No related tags found
No related merge requests found
Pipeline #
...@@ -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):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment