Merge pull request 'feat: furtherer' work and refinements' (#3) from annotation-cleanup into development
Reviewed-on: #3
This commit is contained in:
15
dockerfile
15
dockerfile
@ -1,3 +1,4 @@
|
||||
ARG GIT_EVENT_RULEBOOK_NAME='problem_matcher'
|
||||
|
||||
FROM python:3.11-alpine3.22 AS Build
|
||||
|
||||
@ -49,9 +50,13 @@ RUN cd /tmp/python_modules; \
|
||||
|
||||
|
||||
|
||||
|
||||
FROM python:3.11-alpine3.22
|
||||
|
||||
|
||||
ARG GIT_EVENT_RULEBOOK_NAME
|
||||
|
||||
|
||||
RUN apk --no-cache update; \
|
||||
apk --no-cache add \
|
||||
openjdk21-jdk
|
||||
@ -63,6 +68,8 @@ ENV ANSIBLE_INVENTORY hosts.yaml
|
||||
|
||||
ENV JAVA_HOME /usr/lib/jvm/java-21-openjdk
|
||||
|
||||
ENV GIT_EVENT_RULEBOOK_NAME ${GIT_EVENT_RULEBOOK_NAME}
|
||||
|
||||
|
||||
COPY includes/ /
|
||||
|
||||
@ -80,6 +87,7 @@ RUN pip install --no-cache-dir /tmp/python_builds/*; \
|
||||
rm -rf /home/eda/.ansible/collections/ansible_collections/nofusscomputing/git_events/includes; \
|
||||
mv /usr/bin/annotations.py /usr/bin/annotations; \
|
||||
chmod +x /usr/bin/annotations; \
|
||||
chmod +x /entrypoint.sh; \
|
||||
chown eda:eda -R /home/eda;
|
||||
|
||||
|
||||
@ -89,9 +97,4 @@ WORKDIR /home/eda
|
||||
USER eda
|
||||
|
||||
|
||||
CMD [ \
|
||||
"ansible-rulebook", \
|
||||
"-r", "nofusscomputing.git_events.webhook", \
|
||||
"--env-vars", "PROBLEM_MATCHER_PORT,PROBLEM_MATCHER_TOKEN", \
|
||||
"-v" \
|
||||
]
|
||||
ENTRYPOINT [ "/entrypoint.sh" ]
|
||||
|
@ -20,7 +20,10 @@
|
||||
actions:
|
||||
|
||||
- debug:
|
||||
msg: "Received workflow_job event with action of {{ event.payload.action }}"
|
||||
msg: |-
|
||||
Received workflow_job event from {{ event.payload.sender.username + ' ' -}}
|
||||
for repository {{ event.payload.repository.full_name + ' ' -}}
|
||||
with action of {{ event.payload.action }}
|
||||
|
||||
|
||||
- name: Process Completed workflow_job
|
18
includes/entrypoint.sh
Normal file
18
includes/entrypoint.sh
Normal file
@ -0,0 +1,18 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
|
||||
cd ${HOME};
|
||||
|
||||
ansible-rulebook \
|
||||
-r nofusscomputing.git_events.${GIT_EVENT_RULEBOOK_NAME} \
|
||||
--env-vars PROBLEM_MATCHER_PORT,PROBLEM_MATCHER_TOKEN \
|
||||
-v;
|
||||
|
||||
else
|
||||
|
||||
exec "$@"
|
||||
|
||||
fi
|
@ -8,42 +8,40 @@ import os
|
||||
|
||||
|
||||
|
||||
def default_matcher( entry ) -> dict:
|
||||
def default_matcher( entry, tool_name = '' ) -> dict:
|
||||
|
||||
if tool_name == 'default':
|
||||
tool_name = ''
|
||||
else:
|
||||
tool_name = tool_name + ' '
|
||||
|
||||
filename = str(entry['file'])
|
||||
|
||||
msg_type = str(entry['type']).upper()
|
||||
|
||||
if msg_type in type_count:
|
||||
|
||||
type_count[msg_type] += 1
|
||||
|
||||
else:
|
||||
|
||||
type_count[msg_type] = 1
|
||||
|
||||
if filename.startswith('./'):
|
||||
|
||||
filename = str(entry['file'])[2:]
|
||||
|
||||
body = f"> [!NOTE]\n>\n> **{msg_type} in file: {filename}** " \
|
||||
f"_Line: {str(entry['line'])} Column: {str(entry['column'])}_" \
|
||||
f"\n>\n> _{str(entry['text'])}_\n>"
|
||||
admonition_level = 'NOTE'
|
||||
if str(entry['type']).upper() in [ 'ERROR' ]:
|
||||
|
||||
if msg_type in [ 'ERROR' ]:
|
||||
admonition_level = 'IMPORTANT'
|
||||
|
||||
|
||||
elif str(entry['type']).upper() in [ 'WARNING' ]:
|
||||
|
||||
body = f"> [!IMPORTANT]\n>\n> **{msg_type} in file: {filename}** " \
|
||||
f"_Line: {str(entry['line'])} Column: {str(entry['column'])}_" \
|
||||
f"\n>\n> _{str(entry['text'])}_\n>"
|
||||
admonition_level = 'WARNING'
|
||||
|
||||
elif msg_type in [ 'WARNING' ]:
|
||||
|
||||
body = f"> [!WARNING]\n>\n> **{msg_type} in file: {filename}** " \
|
||||
f"_Line: {str(entry['line'])} Column: {str(entry['column'])}_" \
|
||||
f"\n>\n> _{str(entry['text'])}_\n>"
|
||||
body =str (
|
||||
f"> [!{admonition_level}]"
|
||||
"\n>"
|
||||
f"\n> **{tool_name}Severity:** _{str(entry['type']).lower()}_ "
|
||||
f"\n> **file**: _{filename}_ "
|
||||
f"**Line**: _{str(entry['line'])}_ **Column**: _{str(entry['column'])}_"
|
||||
"\n>"
|
||||
f"\n> {str(entry['text'])}"
|
||||
"\n>"
|
||||
)
|
||||
|
||||
return {
|
||||
"body": body,
|
||||
@ -65,20 +63,20 @@ def pylint_matcher( entry ) -> dict:
|
||||
comment_line = int(entry.get('line', int(1)))
|
||||
|
||||
severity = str(entry['severity']).lower()
|
||||
default_admonition_level = 'NOTE'
|
||||
admonition_level = 'NOTE'
|
||||
|
||||
if severity in [ 'major' ]:
|
||||
|
||||
default_admonition_level = 'IMPORTANT'
|
||||
admonition_level = 'IMPORTANT'
|
||||
|
||||
if severity in [ 'minor' ]:
|
||||
|
||||
default_admonition_level = 'WARNING'
|
||||
admonition_level = 'WARNING'
|
||||
|
||||
body = str(
|
||||
f"> [!{default_admonition_level}] "
|
||||
f"> [!{admonition_level}] "
|
||||
f"\n> "
|
||||
f"\n>**Severity**: {severity} "
|
||||
f"\n>**PyLint Severity**: {severity} "
|
||||
f"\n>**file**: _{entry['path']}_ "
|
||||
f"**Line**: _{entry.get('line', 0)}_ "
|
||||
f"\n>"
|
||||
@ -160,11 +158,11 @@ NFC_PROBLEM_MATCHER = False
|
||||
pull_request: int = None
|
||||
|
||||
matcher = re.compile(r'NFC_PROBLEM_MATCHER=(?P<pull_number>\d+)')
|
||||
matcher_type = re.compile(r'NFC_PROBLEM_MATCHER_TYPE=(?P<type>[a-z_-]+)')
|
||||
matcher_type = re.compile(r'NFC_PROBLEM_MATCHER_TYPE=(?P<type>[a-zA-Z_-]+)')
|
||||
|
||||
regex_type = 'default'
|
||||
pattern = re.compile( regex[regex_type] )
|
||||
|
||||
matcher_name = 'Default Matcher'
|
||||
|
||||
for line in sys.stdin:
|
||||
|
||||
@ -172,12 +170,19 @@ for line in sys.stdin:
|
||||
|
||||
if match_matcher_type:
|
||||
regex_type = match_matcher_type['type']
|
||||
pattern = re.compile( regex[regex_type] )
|
||||
matcher_name = match_matcher_type['type']
|
||||
|
||||
if regex_type in regex:
|
||||
|
||||
pattern = re.compile( regex[regex_type] )
|
||||
|
||||
else:
|
||||
|
||||
pattern = re.compile( regex['default'] )
|
||||
|
||||
match = pattern.finditer(line)
|
||||
|
||||
problem_matcher = matcher.search(line,)
|
||||
problem_matcher = matcher.search(line)
|
||||
|
||||
if problem_matcher:
|
||||
|
||||
@ -188,13 +193,13 @@ for line in sys.stdin:
|
||||
|
||||
if match:
|
||||
|
||||
if regex_type not in results:
|
||||
results[regex_type] = []
|
||||
if matcher_name not in results:
|
||||
results[matcher_name] = []
|
||||
|
||||
|
||||
for obj in match:
|
||||
|
||||
results[regex_type].append(obj.groupdict())
|
||||
results[matcher_name].append(obj.groupdict())
|
||||
|
||||
|
||||
|
||||
@ -222,32 +227,62 @@ for tool, tool_results in results.items():
|
||||
|
||||
for entry in tool_results:
|
||||
|
||||
if tool == 'default':
|
||||
|
||||
api_body['comments'] += [ default_matcher( entry ) ]
|
||||
|
||||
elif tool == 'pylint-json':
|
||||
if tool == 'pylint-json':
|
||||
|
||||
api_body['comments'] += [ pylint_matcher( entry ) ]
|
||||
|
||||
else:
|
||||
|
||||
api_body['comments'] += [ default_matcher( entry, tool_name = tool ) ]
|
||||
|
||||
if tool not in type_count:
|
||||
|
||||
type_count[tool] = 1
|
||||
|
||||
else:
|
||||
|
||||
type_count[tool] += 1
|
||||
|
||||
|
||||
review_body = {
|
||||
'header': str(
|
||||
'## :no_entry_sign: Annotations found \n' \
|
||||
f'@{os.getenv("GITHUB_ACTOR")}, \n\n'
|
||||
'I found some issues that need addressing. \n\n'
|
||||
)
|
||||
}
|
||||
|
||||
review_body = '## :no_entry_sign: Annotations found\n\n' \
|
||||
f'@{os.getenv("GITHUB_ACTOR")}, found some issues.\n\n' \
|
||||
'| Type | Count | \n|:---|:---:| \n'
|
||||
|
||||
for msg_type, cnt in type_count.items():
|
||||
|
||||
review_body += f'| {msg_type} | {cnt} | \n'
|
||||
if msg_type not in review_body:
|
||||
|
||||
review_body[msg_type] = str('| Type | Count | \n|:---|:---:| \n')
|
||||
|
||||
review_body[msg_type] += f'| {msg_type} | {cnt} | \n'
|
||||
|
||||
|
||||
api_body['body'] = review_body + '\n'
|
||||
api_body['body'] = review_body['header']
|
||||
|
||||
|
||||
for msg_type, value in review_body.items():
|
||||
|
||||
if msg_type != 'header':
|
||||
|
||||
api_body['body'] += str(
|
||||
f'### {msg_type} issues found '
|
||||
'\n'
|
||||
f'{value}\n'
|
||||
'\n'
|
||||
)
|
||||
|
||||
|
||||
data = {
|
||||
"pull_request": pull_request,
|
||||
"api_body": api_body
|
||||
}
|
||||
|
||||
print(json.dumps(data))
|
||||
print(json.dumps(data, indent=4))
|
||||
|
||||
|
||||
# URL = os.getenv("GITHUB_API_URL") + '/repos/' + os.getenv("GITHUB_REPOSITORY") + '/pulls/' + os.getenv("GITHUB_REF_NAME") + '/reviews?token=' + str(os.getenv("AGITHUB_TOKEN"))
|
||||
|
Reference in New Issue
Block a user