diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 67d3422..98d7899 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,6 @@ stages: - lint + - report - build # Reusable definitions @@ -17,16 +18,34 @@ checkstyle: image: gradle:9.3.1-jdk25 script: - gradle checkstyleMain checkstyleTest + allow_failure: true artifacts: when: always paths: - - build/reports/checkstyle/main.html - - build/reports/checkstyle/test.html + - build/reports/checkstyle/main.html + - build/reports/checkstyle/main.xml + - build/reports/checkstyle/test.html + - build/reports/checkstyle/test.xml expose_as: 'Checkstyle Report' expire_in: 1 week rules: - when: manual +checkstyle-report: + stage: report + image: python:3.14 + needs: + - job: checkstyle + artifacts: true + optional: true + script: + - python3 scripts/convert-checkstyle-gl-report.py + artifacts: + when: always + reports: + codequality: gl-code-quality-report.json + expire_in: 1 week + compile-check: <<: *gradle-cache stage: build diff --git a/scripts/convert-checkstyle-gl-report.py b/scripts/convert-checkstyle-gl-report.py new file mode 100644 index 0000000..990cff6 --- /dev/null +++ b/scripts/convert-checkstyle-gl-report.py @@ -0,0 +1,29 @@ +# Skript to convert findings of checkstyle into code quality report for gitlab +import xml.etree.ElementTree as ET, json, hashlib + +findings = [] +for source in ["main", "test"]: + try: + tree = ET.parse(f"build/reports/checkstyle/{source}.xml") + for file in tree.findall("file"): + path = file.get("name") + for error in file.findall("error"): + line = int(error.get("line", 1)) + msg = error.get("message", "") + fingerprint = hashlib.md5(f"{path}{line}{msg}".encode()).hexdigest() + findings.append({ + "type": "issue", + "check_name": error.get("source", "checkstyle"), + "description": msg, + "severity": "minor", + "fingerprint": fingerprint, + "location": { + "path": "src/" + path.split("/src/")[1] if "/src/" in path else path, + "lines": {"begin": line} + } + }) + except FileNotFoundError: + pass + +with open("gl-code-quality-report.json", "w") as f: + json.dump(findings, f)