diff --git a/.github/workflows/post-coverage-comment.yml b/.github/workflows/post-coverage-comment.yml new file mode 100644 index 00000000..70d927a2 --- /dev/null +++ b/.github/workflows/post-coverage-comment.yml @@ -0,0 +1,141 @@ +name: Post Coverage Comment + +on: + workflow_run: + workflows: ["PR Code Coverage"] + types: + - completed + +jobs: + post-comment: + runs-on: ubuntu-latest + if: > + github.event.workflow_run.event == 'pull_request' && + github.event.workflow_run.conclusion == 'success' + permissions: + pull-requests: write + contents: read + + steps: + - name: Download coverage data + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh run download ${{ github.event.workflow_run.id }} \ + --repo ${{ github.repository }} \ + --name coverage-comment-data + + - name: Read coverage data + id: coverage + run: | + if [[ ! -f pr-info.json ]]; then + echo "❌ pr-info.json not found" + exit 1 + fi + + cat pr-info.json + + # Extract values from JSON with proper quoting + PR_NUMBER="$(jq -r '.pr_number' pr-info.json)" + COVERAGE_PCT="$(jq -r '.coverage_percentage' pr-info.json)" + COVERED_LINES="$(jq -r '.covered_lines' pr-info.json)" + TOTAL_LINES="$(jq -r '.total_lines' pr-info.json)" + PATCH_PCT="$(jq -r '.patch_coverage_pct' pr-info.json)" + LOW_COV_FILES="$(jq -r '.low_coverage_files' pr-info.json)" + PATCH_SUMMARY="$(jq -r '.patch_coverage_summary' pr-info.json)" + ADO_URL="$(jq -r '.ado_url' pr-info.json)" + + # Export to env for next step (single-line values) + echo "PR_NUMBER=${PR_NUMBER}" >> $GITHUB_ENV + echo "COVERAGE_PERCENTAGE=${COVERAGE_PCT}" >> $GITHUB_ENV + echo "COVERED_LINES=${COVERED_LINES}" >> $GITHUB_ENV + echo "TOTAL_LINES=${TOTAL_LINES}" >> $GITHUB_ENV + echo "PATCH_COVERAGE_PCT=${PATCH_PCT}" >> $GITHUB_ENV + echo "ADO_URL=${ADO_URL}" >> $GITHUB_ENV + + # Handle multiline values with proper quoting + { + echo "LOW_COVERAGE_FILES<> $GITHUB_ENV + + { + echo "PATCH_COVERAGE_SUMMARY<> $GITHUB_ENV + + - name: Comment coverage summary on PR + uses: marocchino/sticky-pull-request-comment@v2 + with: + number: ${{ env.PR_NUMBER }} + header: Code Coverage Report + message: | + # 📊 Code Coverage Report + + + + + + + +
+ + ### 🔥 Diff Coverage + ### **${{ env.PATCH_COVERAGE_PCT }}** +
+
+ + ### 🎯 Overall Coverage + ### **${{ env.COVERAGE_PERCENTAGE }}** +
+
+ + **📈 Total Lines Covered:** `${{ env.COVERED_LINES }}` out of `${{ env.TOTAL_LINES }}` + **📁 Project:** `mssql-python` + +
+ + --- + + ${{ env.PATCH_COVERAGE_SUMMARY }} + + --- + ### 📋 Files Needing Attention + +
+ 📉 Files with overall lowest coverage (click to expand) +
+ + ```diff + ${{ env.LOW_COVERAGE_FILES }} + ``` + +
+ + --- + ### 🔗 Quick Links + + + + + + + + + + +
+ ⚙️ Build Summary + + 📋 Coverage Details +
+ + [View Azure DevOps Build](${{ env.ADO_URL }}) + + + + [Browse Full Coverage Report](${{ env.ADO_URL }}&view=codecoverage-tab) + +
diff --git a/.github/workflows/pr-code-coverage.yml b/.github/workflows/pr-code-coverage.yml index d00666b9..54e36b6d 100644 --- a/.github/workflows/pr-code-coverage.yml +++ b/.github/workflows/pr-code-coverage.yml @@ -417,7 +417,49 @@ jobs: echo "PATCH_COVERAGE_SUMMARY=Patch coverage report could not be generated." >> $GITHUB_ENV fi + - name: Save coverage data for comment + run: | + mkdir -p coverage-comment-data + jq -n \ + --arg pr_number "${{ github.event.pull_request.number }}" \ + --arg coverage_percentage "${{ env.COVERAGE_PERCENTAGE }}" \ + --arg covered_lines "${{ env.COVERED_LINES }}" \ + --arg total_lines "${{ env.TOTAL_LINES }}" \ + --arg patch_coverage_pct "${{ env.PATCH_COVERAGE_PCT }}" \ + --arg low_coverage_files "${{ env.LOW_COVERAGE_FILES }}" \ + --arg patch_coverage_summary "${{ env.PATCH_COVERAGE_SUMMARY }}" \ + --arg ado_url "${{ env.ADO_URL }}" \ + '{ + pr_number: $pr_number, + coverage_percentage: $coverage_percentage, + covered_lines: $covered_lines, + total_lines: $total_lines, + patch_coverage_pct: $patch_coverage_pct, + low_coverage_files: $low_coverage_files, + patch_coverage_summary: $patch_coverage_summary, + ado_url: $ado_url + }' > coverage-comment-data/pr-info.json + + # Validate JSON before uploading + echo "Validating generated JSON..." + jq . coverage-comment-data/pr-info.json > /dev/null || { + echo "❌ Invalid JSON generated" + cat coverage-comment-data/pr-info.json + exit 1 + } + echo "✅ JSON validation successful" + cat coverage-comment-data/pr-info.json + + - name: Upload coverage comment data + uses: actions/upload-artifact@v4 + with: + name: coverage-comment-data + path: coverage-comment-data/ + retention-days: 1 + - name: Comment coverage summary on PR + # Skip for forked PRs due to token permission restrictions + if: github.event.pull_request.head.repo.full_name == github.repository uses: marocchino/sticky-pull-request-comment@v2 with: header: Code Coverage Report diff --git a/main.py b/main.py index 2f8cf28c..f7404ffb 100644 --- a/main.py +++ b/main.py @@ -4,7 +4,8 @@ # Clean one-liner: set level and output mode together setup_logging(output="both") - +print("Logging is set up.") +print("This is a test PR for mssql-python.") conn_str = os.getenv("DB_CONNECTION_STRING") conn = connect(conn_str) cursor = conn.cursor() @@ -15,4 +16,4 @@ print(f"Database ID: {row[0]}, Name: {row[1]}") cursor.close() -conn.close() \ No newline at end of file +conn.close()