From d4fba87e13b56950a7e48ce7b066724d1c4911d5 Mon Sep 17 00:00:00 2001 From: Thilo Schwarz Date: Sun, 28 Jun 2026 13:09:05 +0200 Subject: [PATCH] Migrate GitHub Actions workflows and custom actions to Gitea, replacing `.github` directory with `.gitea`. --- .../actions/publish-report/action.yml | 20 +++++----- .../actions/setup-java-maven/action.yml | 0 .../workflows/build-and-analyse.yml | 7 ++-- .woodpecker/maven.yml | 15 -------- docs/codeberg.png | Bin 19865 -> 0 bytes reports/index.md | 36 ------------------ 6 files changed, 13 insertions(+), 65 deletions(-) rename {.github => .gitea}/actions/publish-report/action.yml (97%) rename {.github => .gitea}/actions/setup-java-maven/action.yml (100%) rename {.github => .gitea}/workflows/build-and-analyse.yml (76%) delete mode 100644 .woodpecker/maven.yml delete mode 100644 docs/codeberg.png delete mode 100644 reports/index.md diff --git a/.github/actions/publish-report/action.yml b/.gitea/actions/publish-report/action.yml similarity index 97% rename from .github/actions/publish-report/action.yml rename to .gitea/actions/publish-report/action.yml index 5bf2fa0..8755751 100644 --- a/.github/actions/publish-report/action.yml +++ b/.gitea/actions/publish-report/action.yml @@ -25,12 +25,12 @@ runs: mkdir -p reports python3 - <<'EOF' import glob, xml.etree.ElementTree as ET - + # --- JUnit --- files = glob.glob("junit-short/*.xml") total_tests = total_failures = total_errors = total_skipped = 0 test_rows = [] - + for f in sorted(files): tree = ET.parse(f) r = tree.getroot() @@ -48,10 +48,10 @@ runs: total_errors += errors total_skipped += skipped test_rows.append(f"| {status} | {name} | {tests} | {passed} | {failures + errors} | {skipped} |") - + total_passed = total_tests - total_failures - total_errors - total_skipped overall = "✅ All tests passed" if (total_failures + total_errors) == 0 else "❌ Some tests failed" - + # --- JaCoCo --- def counter(el, type_): c = next((x for x in el.findall("counter") if x.get("type") == type_), None) @@ -60,10 +60,10 @@ runs: covered = int(c.get("covered", 0)) missed = int(c.get("missed", 0)) return covered, covered + missed - + cov_rows = [] jacoco_files = glob.glob("**/target/site/jacoco/jacoco.xml", recursive=True) - + for jf in sorted(jacoco_files): tree = ET.parse(jf) root = tree.getroot() @@ -74,7 +74,7 @@ runs: line_pct = f"{100 * line_cov / line_total:.0f}%" if line_total else "n/a" branch_pct = f"{100 * branch_cov / branch_total:.0f}%" if branch_total else "n/a" cov_rows.append(f"| {name} | {line_pct} ({line_cov}/{line_total}) | {branch_pct} ({branch_cov}/{branch_total}) |") - + # --- Markdown zusammenbauen --- md = ( "# Test Report\n\n" @@ -87,7 +87,7 @@ runs: "| Status | Suite | Tests | Passed | Failed | Skipped |\n" "|---|---|---|---|---|---|\n" ) + "\n".join(test_rows) + "\n\n" - + if cov_rows: md += ( "## Coverage\n\n" @@ -96,7 +96,7 @@ runs: ) + "\n".join(cov_rows) + "\n" else: md += "_No JaCoCo report found._\n" - + with open("reports/test.md", "w") as out: out.write(md) print(md) @@ -117,4 +117,4 @@ runs: git add reports/ git diff --cached --quiet && echo "No changes" && exit 0 git commit -m "ci: update test report [skip ci]" - git push origin ${{ github.ref_name }} \ No newline at end of file + git push origin ${{ github.ref_name }} diff --git a/.github/actions/setup-java-maven/action.yml b/.gitea/actions/setup-java-maven/action.yml similarity index 100% rename from .github/actions/setup-java-maven/action.yml rename to .gitea/actions/setup-java-maven/action.yml diff --git a/.github/workflows/build-and-analyse.yml b/.gitea/workflows/build-and-analyse.yml similarity index 76% rename from .github/workflows/build-and-analyse.yml rename to .gitea/workflows/build-and-analyse.yml index 61c3769..e259b21 100644 --- a/.github/workflows/build-and-analyse.yml +++ b/.gitea/workflows/build-and-analyse.yml @@ -17,19 +17,18 @@ jobs: build-and-analyse: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Setup Java and Maven - uses: ./.github/actions/setup-java-maven + uses: ./.gitea/actions/setup-java-maven - name: Build and test run: mvn -B verify - name: Publish Test Report - uses: ./.github/actions/publish-report/ + uses: ./.gitea/actions/publish-report if: ${{ always() }} with: token: ${{ secrets.GITHUB_TOKEN }} - report-name: Summary of JUnit Tests diff --git a/.woodpecker/maven.yml b/.woodpecker/maven.yml deleted file mode 100644 index da10043..0000000 --- a/.woodpecker/maven.yml +++ /dev/null @@ -1,15 +0,0 @@ - -when: - - event: push - branch: develop - -steps: -# - name: hello -# image: alpine -# commands: -# - echo "Hello World!" - - - name: maven verify - image: maven:3-amazoncorretto-17-alpine - commands: - - mvn -B verify \ No newline at end of file diff --git a/docs/codeberg.png b/docs/codeberg.png deleted file mode 100644 index a36522b3fa7caa8641e5d819b054af34374d3b10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19865 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