diff --git a/.cz.yaml b/.cz.yaml index 3b76791..7ed25d0 100644 --- a/.cz.yaml +++ b/.cz.yaml @@ -12,7 +12,9 @@ commitizen: - fix - test - refactor + # yamllint disable rule:line-length commit_parser: ^(?Pfeat|fix|test|refactor|perf|BREAKING CHANGE)(?:\((?P[^()\r\n]*)\)|\()?(?P!)?:\s(?P.*)? + # yamllint enable rule:line-length name: cz_customize prerelease_offset: 1 tag_format: $version diff --git a/.gitea/workflows/pull_request.yaml b/.gitea/workflows/pull_request.yaml new file mode 100644 index 0000000..629cd9f --- /dev/null +++ b/.gitea/workflows/pull_request.yaml @@ -0,0 +1,42 @@ +--- + +name: Lint (Pull Request) + + +on: + pull_request: {} + + +jobs: + + lint: + runs-on: ubuntu-latest + steps: + + + - name: Enable Matcher Service + run: | + echo "NFC_PROBLEM_MATCHER=${GITHUB_REF_NAME}"; + + + - uses: actions/checkout@v3 + + + - name: Install YAMLLint + run: pip install yamllint + + + - name: Run YAMLLint + run: | + echo "NFC_PROBLEM_MATCHER_TYPE=YAML-Lint" + yamllint -f github . || true + + + - name: Install Ansible-Lint + run: pip install ansible-lint + + + - name: Run Ansible-Lint + run: | + echo "NFC_PROBLEM_MATCHER_TYPE=pylint-json"; + ansible-lint -f json . || true diff --git a/.yamllint b/.yamllint new file mode 100644 index 0000000..67b7637 --- /dev/null +++ b/.yamllint @@ -0,0 +1,77 @@ +--- + +# extends: default + + +ignore: + - '.github/' + - '**/crd/**' + - mkdocs.yml + - '*PrometheusRule*' + - '**/source/**' + +rules: + braces: + level: error + max-spaces-inside: 1 + min-spaces-inside: 1 + min-spaces-inside-empty: 0 + max-spaces-inside-empty: 0 + + brackets: + level: error + max-spaces-inside: 1 + min-spaces-inside: 1 + min-spaces-inside-empty: 0 + max-spaces-inside-empty: 0 + + colons: + level: warning + max-spaces-after: 1 + + commas: + level: warning + + comments: + level: error + require-starting-space: true + ignore-shebangs: true + min-spaces-from-content: 4 + + comments-indentation: + level: error + + document-end: + level: error + present: false + + document-start: + level: error + present: true + + empty-lines: + level: error + max: 3 + max-start: 0 + max-end: 0 + + hyphens: + level: error + max-spaces-after: 1 + + indentation: + level: error + spaces: 2 + indent-sequences: true + check-multi-line-strings: true + + line-length: + level: warning + max: 100 + allow-non-breakable-inline-mappings: true + + new-lines: + level: error + type: unix + + truthy: disable diff --git a/extensions/eda/rulebooks/problem_matcher.yml b/extensions/eda/rulebooks/problem_matcher.yml index f16a7fb..2f12778 100644 --- a/extensions/eda/rulebooks/problem_matcher.yml +++ b/extensions/eda/rulebooks/problem_matcher.yml @@ -27,10 +27,12 @@ - name: Process Completed workflow_job + # yamllint disable rule:indentation condition: > event.meta.headers['X-GitHub-Event'] == 'workflow_job' and event.payload.action == 'completed' + # yamllint enable rule:indentation actions: - run_playbook: diff --git a/galaxy.yml b/galaxy.yml index 4755466..37c96d7 100644 --- a/galaxy.yml +++ b/galaxy.yml @@ -1,79 +1,46 @@ --- -### REQUIRED -# The namespace of the collection. This can be a company/brand/organization or product namespace under which all -# content lives. May only contain alphanumeric lowercase characters and underscores. Namespaces cannot start with -# underscores or numbers and cannot contain consecutive underscores namespace: nofusscomputing -# The name of the collection. Has the same character restrictions as 'namespace' name: git_events -# The version of the collection. Must be compatible with semantic versioning version: 0.0.1 -# The path to the Markdown (.md) readme file. This path is relative to the root of the collection readme: README.md -# A list of the collection's content authors. Can be just the name or in the format 'Full Name (url) -# @nicks:irc/im.site#channel' authors: - No Fuss Computing -### OPTIONAL but strongly recommended -# A short summary description of the collection description: Git[ea/hub] Problem matcher parser with PR Code Review - -# Either a single license or a list of licenses for content inside of a collection. Ansible Galaxy currently only -# accepts L(SPDX,https://spdx.org/licenses/) licenses. This key is mutually exclusive with 'license_file' license: - MIT -# The path to the license file for the collection. This path is relative to the root of the collection. This key is -# mutually exclusive with 'license' license_file: LICENCE -# A list of tags you want to associate with the collection for indexing/searching. A tag name has the same character -# requirements as 'namespace' and 'name' tags: - ci - event - rulebook - tools -# Collections that this collection requires to be installed for it to be usable. The key of the dict is the -# collection label 'namespace.name'. The value is a version range -# L(specifiers,https://python-semanticversion.readthedocs.io/en/latest/#requirement-specification). Multiple version -# range specifiers can be set and are separated by ',' dependencies: {} -# The URL of the originating SCM repository repository: https://nofusscomputing.com/git/ansible-collections/git-events -# The URL to any online docs documentation: https://nofusscomputing.com/git/ansible-collections/git-events -# The URL to the homepage of the collection/project homepage: https://nofusscomputing.com/git/ansible-collections/git-events -# The URL to the collection issue tracker issues: https://nofusscomputing.com/git/ansible-collections/git-events/issues -# A list of file glob-like patterns used to filter any files or directories that should not be included in the build -# artifact. A pattern is matched from the relative path of the file or directory of the collection directory. This -# uses 'fnmatch' to match the files or directories. Some directories and files like 'galaxy.yml', '*.pyc', '*.retry', -# and '.git' are always filtered. Mutually exclusive with 'manifest' build_ignore: [ '.ansible', artifacts/, + '.cz.yaml', + '.dockerignore', + 'dockerfile', '.git', 'galaxy.yml', '*.tmp.*' ] -# A dict controlling use of manifest directives used in building the collection artifact. The key 'directives' is a -# list of MANIFEST.in style -# L(directives,https://packaging.python.org/en/latest/guides/using-manifest-in/#manifest-in-commands). The key -# 'omit_default_directives' is a boolean that controls whether the default directives are used. Mutually exclusive -# with 'build_ignore' -# manifest: null diff --git a/includes/usr/bin/annotations.py b/includes/usr/bin/annotations.py index 733983b..431e218 100755 --- a/includes/usr/bin/annotations.py +++ b/includes/usr/bin/annotations.py @@ -6,7 +6,7 @@ import json # import requests import os - +# API Docs: https://docs.github.com/en/rest/pulls/reviews?apiVersion=2022-11-28#create-a-review-for-a-pull-request def default_matcher( entry, tool_name = '' ) -> dict: @@ -144,8 +144,8 @@ regex = { r'"description":\s*"(?P[^"]+)",\s*' r'"fingerprint":\s*"(?P[^"]+)",\s*' r'"location":\s*\{\s*"path":\s*"(?P[^"]+)".+?' - r'"line[s]?":.+?(?P\d+).*?\}},' - r'(?:\s"content":\s\{"body":\s"(?P.+?)")?' + r'"line[s]?":.+?(?P\d+).*?\}}' + r'(?:,\s"content":\s\{"body":\s"(?P.+?)")?' ) } @@ -205,7 +205,11 @@ for line in sys.stdin: if not NFC_PROBLEM_MATCHER: - sys.exit(2) + print(json.dumps({ + 'pull_request': '' + }, indent=4)) + + sys.exit(0) if not results: @@ -277,6 +281,14 @@ for msg_type, value in review_body.items(): ) +if len(api_body['comments']) == 0: + + api_body.update({ + 'body': "G'day, I didn't find any problems to report on", + 'event': 'APPROVE' + }) + + data = { "pull_request": pull_request, "api_body": api_body diff --git a/playbooks/problem_matcher.yaml b/playbooks/problem_matcher.yaml index 443d9d8..b8aff3f 100644 --- a/playbooks/problem_matcher.yaml +++ b/playbooks/problem_matcher.yaml @@ -18,19 +18,21 @@ ansible.builtin.set_fact: git_api_url: "{{ payload.repository.url }}" when: > - git_api_url == "" + git_api_url == "" - name: Set var gitea_replace_url if empty ansible.builtin.set_fact: gitea_replace_url: "{{ payload.repository.url }}" when: > - gitea_replace_url == "" + gitea_replace_url == "" - name: Set required Facts ansible.builtin.set_fact: - git_url_api: "{{ payload.repository.url | replace((gitea_replace_url | split('/api/'))[0], git_api_url) }}" + git_url_api: >- + {{ payload.repository.url | + replace((gitea_replace_url | split('/api/'))[0], git_api_url) }} git_url_path_jobs: 'actions/jobs' head_sha: "{{ payload.workflow_job.head_sha }}" @@ -51,7 +53,9 @@ - name: Fetch job log ansible.builtin.uri: - url: "{{ git_url_api + '/' + git_url_path_jobs + '/' + payload.workflow_job.id | string + '/logs' }}" + url: >- + {{ git_url_api + '/' + git_url_path_jobs + + '/' + payload.workflow_job.id | string + '/logs' }} dest: /tmp/job.log headers: Authorization: token {{ lookup('env', 'GIT_API_TOKEN') }} @@ -67,7 +71,9 @@ cmd: | set -o pipefail; - export GITHUB_ACTOR={{ payload.sender.username }} + export GITHUB_ACTOR={{ payload.sender.username }}; + + export GITHUB_SHA={{ payload.workflow_job.head_sha }}; cat /tmp/job.log | annotations > /tmp/annotations.json; @@ -94,11 +100,15 @@ validate_certs: false no_log: "{{ disable_logging }}" register: http_get_pull_request + when: > + annotations.pull_request | string - name: Trace - Display Pull Request State ansible.builtin.debug: msg: "{{ http_get_pull_request.json.state | default('No PR found') }}" + when: > + not http_get_pull_request.skipped | default(false) | bool - name: Post review @@ -113,7 +123,11 @@ timeout: 10 validate_certs: false no_log: "{{ disable_logging }}" + # yamllint disable rule:indentation when: > http_get_pull_request.json.state | default('-') != 'closed' and - http_get_pull_request.status == 200 + http_get_pull_request.status | default(0) == 200 + and + not http_get_pull_request.skipped | default(false) | bool + # yamllint enable rule:indentation