From 9124aa17d56e506804efa5a3209034d5296f0382 Mon Sep 17 00:00:00 2001 From: Sergey Vanyushkin Date: Wed, 13 May 2026 21:22:17 +0300 Subject: [PATCH] feat: add pr-comment step to post CI results on pull requests Adds a Woodpecker pipeline step that posts a formatted comment with test results and coverage to Gitea PRs after CI completes. Comment includes: commit SHA (linked), source/target branches, pipeline link, and a status table for lint, type check, unit tests, integration tests, e2e tests, and coverage percentage. --- .woodpecker/pipeline.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/.woodpecker/pipeline.yml b/.woodpecker/pipeline.yml index 984e418..eff2017 100644 --- a/.woodpecker/pipeline.yml +++ b/.woodpecker/pipeline.yml @@ -115,3 +115,33 @@ steps: - uv run --no-sync coverage combine .coverage.unit .coverage.integration - uv run --no-sync coverage report --fail-under=70 --include=app/* - uv run --no-sync coverage html + + - name: pr-comment + image: python:3.13 + volumes: + - /tmp/uv-cache:/root/.cache/uv + environment: + UV_CACHE_DIR: /root/.cache/uv + UV_LINK_MODE: copy + UV_PYTHON: "3.13" + GITEA_API_TOKEN: + from_secret: gitea_api_token + depends_on: [coverage, lint, type] + when: + event: [pull_request] + commands: + - pip install uv + - | + SHA7=$(printf '%.7s' "${CI_COMMIT_SHA:-unknown}") + COMMIT_URL="${CI_FORGE_URL}/${CI_REPO_OWNER}/${CI_REPO_NAME}/commit/${CI_COMMIT_SHA}" + SOURCE="${CI_COMMIT_SOURCE:-${CI_COMMIT_SOURCE_BRANCH:-?}}" + TARGET="${CI_COMMIT_TARGET:-${CI_COMMIT_TARGET_BRANCH:-?}}" + PIPELINE_URL="${CI_PIPELINE_URL:-}" + COVER=$(uv run --no-sync coverage report --include='app/*' | tail -1 | awk '{print $NF}') + if [ -z "$GITEA_API_TOKEN" ]; then + echo "pr-comment: GITEA_API_TOKEN not set, skipping" + exit 0 + fi + FMT='{"body": "## CI Summary\n\n**Commit:** [`%s`](%s)\n**Branch:** `%s` → `%s`\n**Pipeline:** [View](%s)\n\n### Checks\n\n| Check | Status |\n|-------|--------|\n| Lint (ruff + isort) | ✅ |\n| Type check (mypy) | ✅ |\n| Unit tests | ✅ |\n| Integration tests | ✅ |\n| E2E tests | ✅ |\n| Coverage | **%s** |\n\n---\n*Reported by Woodpecker CI*"}' + BODY=$(printf "$FMT" "$SHA7" "$COMMIT_URL" "$SOURCE" "$TARGET" "$PIPELINE_URL" "$COVER") + curl -s -X POST "${CI_FORGE_URL}/api/v1/repos/${CI_REPO_OWNER}/${CI_REPO_NAME}/issues/${CI_COMMIT_PULL_REQUEST}/comments" -H "Authorization: token $${GITEA_API_TOKEN}" -H "Content-Type: application/json" --data-binary "$BODY"