mirror of
https://github.com/openhwgroup/cva6.git
synced 2025-06-28 09:16:22 -04:00
155 lines
5.2 KiB
Python
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)
|