cva6/.gitlab-ci/scripts/merge_job_reports.py

155 lines
5.2 KiB
Python

# Copyright 2022 Thales Silicon Security
#
# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0
# You may obtain a copy of the License at https://solderpad.org/licenses/
#
# Original Author: Yannick Casamatta (yannick.casamatta@thalesgroup.com)
from yaml import safe_load
import os
import re
import pprint
import yaml
import datetime
import sys
import subprocess
import github_integration as gh
# arguments: inputdir outputfile
cwd = os.getcwd()
dashboard_url = os.environ['DASHBOARD_URL']
git_email = os.environ['DASHBOARD_USER_EMAIL']
git_name = os.environ['DASHBOARD_USER_NAME']
pipeline_creation_timestamp = int(datetime.datetime.strptime(os.environ['CI_PIPELINE_CREATED_AT'], '%Y-%m-%dT%H:%M:%S%z').timestamp())
pipeline_end_timestamp = int(datetime.datetime.now().timestamp())
pipeline_duration = pipeline_end_timestamp - pipeline_creation_timestamp
try:
workflow_type = os.environ['WORKFLOW_TYPE'].strip('\'\"')
except KeyError:
workflow_type = "gitlab"
workflow_action = os.environ['CI_PIPELINE_SOURCE'].strip('\'\"')
if workflow_type == 'github': # (from wrapper)
workflow_uid = os.environ['WORKFLOW_RUN_ID'].strip('\'\"')
workflow_repo_owner = os.environ['WORKFLOW_REPO_OWNER'].strip('\'\"')
workflow_repo = os.environ['WORKFLOW_REPO'].strip('\'\"') # cvv or cva6
workflow_commit_subject = os.environ['WORKFLOW_COMMIT_MESSAGE'].strip('\'\"')
workflow_commit_author = os.environ['WORKFLOW_COMMIT_AUTHOR'].strip('\'\"')
cvv_branch = os.environ['CORE_V_VERIF_BRANCH'].strip('\'\"')
cvv_sha = os.environ['CORE_V_VERIF_HASH'].strip('\'\"')
cva6_branch = os.environ['CVA6_BRANCH'].strip('\'\"')
cva6_sha = os.environ['CVA6_HASH'].strip('\'\"')
else: # gitlab
workflow_uid = os.environ['CI_PIPELINE_ID'].strip('\'\"')
workflow_repo = 'cva6'
cvv_branch = 'none'
cvv_sha = '0000000'
cva6_branch = os.environ['CI_COMMIT_REF_NAME'].strip('\'\"')
cva6_sha = os.environ['CI_COMMIT_SHA'].strip('\'\"')
workflow_commit_subject = os.environ['CI_COMMIT_MESSAGE'].strip('\'\"')
workflow_commit_author = os.environ['CI_COMMIT_AUTHOR'].strip('\'\"')
if len(workflow_commit_subject) > 60:
title = workflow_commit_subject[0:60] + '...'
else :
title = workflow_commit_subject
# limit injection through commit message, could be improved!
title = re.sub('[<>\n]*', '', title)
if workflow_repo == "cva6":
workflow_commit_ref_name = cva6_branch
workflow_commit_sha = cva6_sha
else: # workflow_repo == "cvv":
workflow_commit_ref_name = cvv_branch
workflow_commit_sha = cvv_sha
pipeline = {
'token': 'YC' + str(pipeline_creation_timestamp).replace('.', ''),
'pipeline_url': os.environ["CI_PIPELINE_URL"],
'timestamp': pipeline_creation_timestamp,
'runtime': pipeline_duration,
'workflow_action': workflow_action,
'workflow_uid': workflow_uid,
'workflow_repo': workflow_repo,
'title': title,
'description': "",
'ref_name': workflow_commit_ref_name,
'author': workflow_commit_author,
'sha': workflow_commit_sha,
'env': {
'cva6': {
'sha': cva6_sha,
'branch': cva6_branch
},
'core-v-verif': {
'sha': cvv_sha,
'branch': cvv_branch
}
},
'status': "pass", # overridden when jobs are loaded
'label': "PASS", # overridden when jobs are loaded
'jobs': []
}
success = True
dir_list = os.listdir(sys.argv[1])
for f in dir_list:
with open(sys.argv[1] + "/" + f, 'r') as job_report:
report = safe_load(job_report)
pipeline["jobs"].append(report)
if report['status'] != 'pass':
success = False
pipeline["status"] = 'fail'
pipeline["label"] = 'FAIL'
pprint.pprint(pipeline)
filename = re.sub('[^\w\.]', '', sys.argv[2])
print(filename)
with open(f'{sys.argv[1]}/{filename}', 'w+') as f:
yaml.dump(pipeline, f)
try:
quoted_title = "'" + title.replace("'", "'\"'\"'") + "'"
print(subprocess.check_output(f'''
rm -r .gitlab-ci/dashboard_tmp || echo "nothing to do"
git clone {dashboard_url} .gitlab-ci/dashboard_tmp
mkdir -p .gitlab-ci/dashboard_tmp/pipelines_{workflow_repo}
ls -al {sys.argv[1]}
cp {sys.argv[1]}/{filename} .gitlab-ci/dashboard_tmp/pipelines_{workflow_repo}/
cd .gitlab-ci/dashboard_tmp
git config user.email {git_email}
git config user.name {git_name}
git add pipelines_{workflow_repo}/{filename}
git commit -m '{workflow_repo}: '{quoted_title} || echo "commit fail"
git push
cd -
''', shell=True))
except subprocess.CalledProcessError as e:
print(f"Error: {e.output}")
def find_pr(branch, prs):
match = re.search(r'(.*)_PR_([a-zA-Z0-9](?:[a-zA-Z0-9]|[-_](?=[a-zA-Z0-9])){0,38})', branch)
if match:
label = f'{match.group(2)}:{match.group(1)}'
for pr in prs:
if label == pr['head']['label']:
return pr
return None
pulls = gh.pulls('openhwgroup', workflow_repo)
pr = find_pr(workflow_commit_ref_name, pulls)
if pr is not None:
ref_branch = pr['base']['ref']
wf = gh.DashboardDone('openhwgroup', workflow_repo, ref_branch)
response = wf.send(pr['number'], success)
print(response.text)