Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/scripts/coverage/compare-coverage.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ fi

CURR_TOTAL=$(jq -r '.total_pct' "$CURRENT")
PREV_TOTAL=$(jq -r '.total_pct' "$PREVIOUS")
TOTAL_DELTA=$(echo "$CURR_TOTAL - $PREV_TOTAL" | bc -l)
TOTAL_DELTA=$(bc -l <<<"$CURR_TOTAL - $PREV_TOTAL")

CURR_REF=$(jq -r '.ref // "head"' "$CURRENT")
PREV_REF=$(jq -r '.ref // "base"' "$PREVIOUS")
Expand Down
37 changes: 37 additions & 0 deletions .github/scripts/coverage/download-previous.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/usr/bin/env bash

set -euo pipefail

REPO="${REPO:?Required environment variable REPO}"
BRANCH="${BRANCH:?Required environment variable BRANCH}"
CURRENT_RUN_ID="${CURRENT_RUN_ID:?Required environment variable CURRENT_RUN_ID}"
OUTPUT_DIR="${1:-previous}"

mkdir -p "$OUTPUT_DIR"

# Find last successful CI run on this branch (excluding current)
PREV_RUN_ID=$(gh api "repos/${REPO}/actions/workflows/ci.yml/runs?branch=${BRANCH}&status=success&per_page=5" \
--jq "[.workflow_runs[] | select(.id != ${CURRENT_RUN_ID})][0].id")

if [[ -z "$PREV_RUN_ID" || "$PREV_RUN_ID" == "null" ]]; then
echo "No previous successful run found on $BRANCH"
echo "has_previous=false"
exit 0
fi

echo "Previous run: $PREV_RUN_ID"

# Find the coverage-summary.json artifact in that run
ARTIFACT_ID=$(gh api "repos/${REPO}/actions/runs/${PREV_RUN_ID}/artifacts" \
--jq '.artifacts[] | select(.name == "coverage-summary.json") | .id')

if [[ -z "$ARTIFACT_ID" || "$ARTIFACT_ID" == "null" ]]; then
echo "No coverage artifact in previous run"
echo "has_previous=false"
exit 0
fi

# Download and extract
gh api "repos/${REPO}/actions/artifacts/${ARTIFACT_ID}/zip" >/tmp/prev-coverage.zip
unzip -o /tmp/prev-coverage.zip -d "$OUTPUT_DIR/"
echo "has_previous=true"
53 changes: 53 additions & 0 deletions .github/scripts/coverage/write-summary-compare.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/usr/bin/env bash

set -euo pipefail

REPORT="${1:-comparison-report.json}"
BASE_REF="${BASE_REF:-base}"
HEAD_REF="${HEAD_REF:-head}"
SUMMARY_FILE="${GITHUB_STEP_SUMMARY:-/dev/stdout}"

if [[ ! -f "$REPORT" ]]; then
echo "No comparison report found, skipping summary."
exit 0
fi

# Sanitize user inputs for markdown injection
BASE_REF=$(echo "$BASE_REF" | tr -d '<>|`\n\r')
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NIT: Useless echo

HEAD_REF=$(echo "$HEAD_REF" | tr -d '<>|`\n\r')

CURR=$(jq -r '.current_total' "$REPORT")
PREV=$(jq -r '.previous_total' "$REPORT")
DELTA=$(jq -r '.total_delta' "$REPORT")

{
echo "## Coverage Comparison: ${BASE_REF} vs ${HEAD_REF}"
echo ""
echo "| Ref | Coverage |"
echo "|-----|----------|"
echo "| ${BASE_REF} (base) | ${PREV}% |"
echo "| ${HEAD_REF} (head) | ${CURR}% |"
echo "| Delta | ${DELTA}% |"
echo ""
} >>"$SUMMARY_FILE"

DROPS=$(jq -r '.top_drops[:10][] | "| \(.package) | \(.previous)% | \(.current)% | \(.delta)% |"' "$REPORT" 2>/dev/null || true)
if [[ -n "$DROPS" ]]; then
{
echo "### Top Drops"
echo "| Package | Base | Head | Delta |"
echo "|---------|------|------|-------|"
echo "$DROPS"
} >>"$SUMMARY_FILE"
fi

GAINS=$(jq -r '.top_gains[:5][] | "| \(.package) | \(.previous)% | \(.current)% | +\(.delta)% |"' "$REPORT" 2>/dev/null || true)
if [[ -n "$GAINS" ]]; then
{
echo ""
echo "### Top Gains"
echo "| Package | Base | Head | Delta |"
echo "|---------|------|------|-------|"
echo "$GAINS"
} >>"$SUMMARY_FILE"
fi
58 changes: 58 additions & 0 deletions .github/scripts/coverage/write-summary.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#!/usr/bin/env bash

set -euo pipefail

REPORT="${1:-comparison-report.json}"
SUMMARY_FILE="${GITHUB_STEP_SUMMARY:-/dev/stdout}"

if [[ ! -f "$REPORT" ]]; then
echo "No comparison report found, skipping summary."
exit 0
fi

BASELINE=$(jq -r '.baseline' "$REPORT")

if [[ "$BASELINE" == "true" ]]; then
{
echo "## Coverage Baseline Established"
echo ""
echo "Total: $(jq -r '.current_total' "$REPORT")%"
} >>"$SUMMARY_FILE"
exit 0
fi

CURR=$(jq -r '.current_total' "$REPORT")
PREV=$(jq -r '.previous_total' "$REPORT")
DELTA=$(jq -r '.total_delta' "$REPORT")

{
echo "## :bar_chart: Coverage Diff"
echo ""
echo "| Metric | Value |"
echo "|--------|-------|"
echo "| Current | ${CURR}% |"
echo "| Previous | ${PREV}% |"
echo "| Delta | ${DELTA}% |"
echo ""
} >>"$SUMMARY_FILE"

DROPS=$(jq -r '.top_drops[:5][] | "| \(.package) | \(.previous)% | \(.current)% | \(.delta)% |"' "$REPORT" 2>/dev/null || true)
if [[ -n "$DROPS" ]]; then
{
echo "### Top Drops"
echo "| Package | Previous | Current | Delta |"
echo "|---------|----------|---------|-------|"
echo "$DROPS"
} >>"$SUMMARY_FILE"
fi

GAINS=$(jq -r '.top_gains[:5][] | "| \(.package) | \(.previous)% | \(.current)% | +\(.delta)% |"' "$REPORT" 2>/dev/null || true)
if [[ -n "$GAINS" ]]; then
{
echo ""
echo "### Top Gains"
echo "| Package | Previous | Current | Delta |"
echo "|---------|----------|---------|-------|"
echo "$GAINS"
} >>"$SUMMARY_FILE"
fi
79 changes: 11 additions & 68 deletions .github/workflows/coverage-compare-main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,39 +24,19 @@ jobs:
id: prev
env:
GH_TOKEN: ${{ github.token }}
REPO: ${{ github.repository }}
BRANCH: ${{ github.ref_name }}
CURRENT_RUN_ID: ${{ github.run_id }}
run: |
mkdir -p previous

BRANCH="${GITHUB_REF_NAME}"
echo "Branch: $BRANCH"

# Find last successful CI run on this branch (excluding current)
PREV_RUN_ID=$(gh api "repos/${{ github.repository }}/actions/workflows/ci.yml/runs?branch=${BRANCH}&status=success&per_page=5" \
--jq "[.workflow_runs[] | select(.id != ${{ github.run_id }})][0].id")

if [[ -z "$PREV_RUN_ID" || "$PREV_RUN_ID" == "null" ]]; then
echo "No previous successful run found on $BRANCH"
echo "has_previous=false" >> "$GITHUB_OUTPUT"
exit 0
fi

echo "Previous run: $PREV_RUN_ID"

# Find the coverage-summary.json artifact in that run
ARTIFACT_ID=$(gh api "repos/${{ github.repository }}/actions/runs/${PREV_RUN_ID}/artifacts" \
--jq '.artifacts[] | select(.name == "coverage-summary.json") | .id')

if [[ -z "$ARTIFACT_ID" || "$ARTIFACT_ID" == "null" ]]; then
echo "No coverage artifact in previous run"
OUTPUT=$(./.github/scripts/coverage/download-previous.sh previous)
echo "$OUTPUT"
# Extract has_previous from script output
if echo "$OUTPUT" | grep -q "has_previous=true"; then
echo "has_previous=true" >> "$GITHUB_OUTPUT"
else
echo "has_previous=false" >> "$GITHUB_OUTPUT"
exit 0
fi

# Download and extract
gh api "repos/${{ github.repository }}/actions/artifacts/${ARTIFACT_ID}/zip" > /tmp/prev-coverage.zip
unzip -o /tmp/prev-coverage.zip -d previous/
echo "has_previous=true" >> "$GITHUB_OUTPUT"

- name: Compare Coverage
run: |
PREV_FILE="previous/coverage-summary.json"
Expand All @@ -67,44 +47,7 @@ jobs:

- name: Write Summary
if: always()
run: |
if [[ -f comparison-report.json ]]; then
BASELINE=$(jq -r '.baseline' comparison-report.json)
if [[ "$BASELINE" == "true" ]]; then
echo "## Coverage Baseline Established" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "Total: $(jq -r '.current_total' comparison-report.json)%" >> "$GITHUB_STEP_SUMMARY"
else
CURR=$(jq -r '.current_total' comparison-report.json)
PREV=$(jq -r '.previous_total' comparison-report.json)
DELTA=$(jq -r '.total_delta' comparison-report.json)
echo "## :bar_chart: Coverage Diff" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "| Metric | Value |" >> "$GITHUB_STEP_SUMMARY"
echo "|--------|-------|" >> "$GITHUB_STEP_SUMMARY"
echo "| Current | ${CURR}% |" >> "$GITHUB_STEP_SUMMARY"
echo "| Previous | ${PREV}% |" >> "$GITHUB_STEP_SUMMARY"
echo "| Delta | ${DELTA}% |" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"

DROPS=$(jq -r '.top_drops[:5][] | "| \(.package) | \(.previous)% | \(.current)% | \(.delta)% |"' comparison-report.json 2>/dev/null || true)
if [[ -n "$DROPS" ]]; then
echo "### Top Drops" >> "$GITHUB_STEP_SUMMARY"
echo "| Package | Previous | Current | Delta |" >> "$GITHUB_STEP_SUMMARY"
echo "|---------|----------|---------|-------|" >> "$GITHUB_STEP_SUMMARY"
echo "$DROPS" >> "$GITHUB_STEP_SUMMARY"
fi

GAINS=$(jq -r '.top_gains[:5][] | "| \(.package) | \(.previous)% | \(.current)% | +\(.delta)% |"' comparison-report.json 2>/dev/null || true)
if [[ -n "$GAINS" ]]; then
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "### Top Gains" >> "$GITHUB_STEP_SUMMARY"
echo "| Package | Previous | Current | Delta |" >> "$GITHUB_STEP_SUMMARY"
echo "|---------|----------|---------|-------|" >> "$GITHUB_STEP_SUMMARY"
echo "$GAINS" >> "$GITHUB_STEP_SUMMARY"
fi
fi
fi
run: ./.github/scripts/coverage/write-summary.sh comparison-report.json

- name: Upload comparison-report.json
if: always()
Expand All @@ -123,7 +66,7 @@ jobs:
retention-days: 30

- name: Notify Slack
if: always() && hashFiles('comparison-report.json') != '' && github.ref == 'refs/heads/main'
if: always() && hashFiles('comparison-report.json') != '' && github.ref == 'refs/heads/main' && env.COVERAGE_SLACK_WEBHOOK_URL != ''
env:
COVERAGE_SLACK_WEBHOOK_URL: ${{ secrets.COVERAGE_SLACK_WEBHOOK_URL }}
TAG_NAME: ${{ github.ref_name }}@${{ github.sha }}
Expand Down
38 changes: 2 additions & 36 deletions .github/workflows/coverage-compare.yml
Original file line number Diff line number Diff line change
Expand Up @@ -202,41 +202,7 @@ jobs:
env:
BASE_REF: ${{ inputs.base_ref }}
HEAD_REF: ${{ inputs.head_ref }}
run: |
# Sanitize user inputs for markdown injection
BASE_REF=$(echo "$BASE_REF" | tr -d '<>|`\n\r')
HEAD_REF=$(echo "$HEAD_REF" | tr -d '<>|`\n\r')

echo "## Coverage Comparison: ${BASE_REF} vs ${HEAD_REF}" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"

CURR=$(jq -r '.current_total' comparison-report.json)
PREV=$(jq -r '.previous_total' comparison-report.json)
DELTA=$(jq -r '.total_delta' comparison-report.json)

echo "| Ref | Coverage |" >> "$GITHUB_STEP_SUMMARY"
echo "|-----|----------|" >> "$GITHUB_STEP_SUMMARY"
echo "| ${BASE_REF} (base) | ${PREV}% |" >> "$GITHUB_STEP_SUMMARY"
echo "| ${HEAD_REF} (head) | ${CURR}% |" >> "$GITHUB_STEP_SUMMARY"
echo "| Delta | ${DELTA}% |" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"

DROPS=$(jq -r '.top_drops[:10][] | "| \(.package) | \(.previous)% | \(.current)% | \(.delta)% |"' comparison-report.json 2>/dev/null || true)
if [[ -n "$DROPS" ]]; then
echo "### Top Drops" >> "$GITHUB_STEP_SUMMARY"
echo "| Package | Base | Head | Delta |" >> "$GITHUB_STEP_SUMMARY"
echo "|---------|------|------|-------|" >> "$GITHUB_STEP_SUMMARY"
echo "$DROPS" >> "$GITHUB_STEP_SUMMARY"
fi

GAINS=$(jq -r '.top_gains[:5][] | "| \(.package) | \(.previous)% | \(.current)% | +\(.delta)% |"' comparison-report.json 2>/dev/null || true)
if [[ -n "$GAINS" ]]; then
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "### Top Gains" >> "$GITHUB_STEP_SUMMARY"
echo "| Package | Base | Head | Delta |" >> "$GITHUB_STEP_SUMMARY"
echo "|---------|------|------|-------|" >> "$GITHUB_STEP_SUMMARY"
echo "$GAINS" >> "$GITHUB_STEP_SUMMARY"
fi
run: ./.github/scripts/coverage/write-summary-compare.sh comparison-report.json

- name: Upload comparison-report.json
if: always()
Expand All @@ -255,7 +221,7 @@ jobs:
retention-days: 30

- name: Notify Slack
if: ${{ inputs.notify_slack }}
if: ${{ inputs.notify_slack && env.COVERAGE_SLACK_WEBHOOK_URL != '' }}
env:
COVERAGE_SLACK_WEBHOOK_URL: ${{ secrets.COVERAGE_SLACK_WEBHOOK_URL }}
BASE_REF: ${{ inputs.base_ref }}
Expand Down
32 changes: 2 additions & 30 deletions .github/workflows/coverage-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,38 +108,10 @@ jobs:

- name: Write Summary
if: always()
run: |
if [[ -f comparison-report.json ]]; then
BASELINE=$(jq -r '.baseline' comparison-report.json)
if [[ "$BASELINE" == "true" ]]; then
echo "## Coverage Baseline Established" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "Total: $(jq -r '.current_total' comparison-report.json)%" >> "$GITHUB_STEP_SUMMARY"
else
CURR=$(jq -r '.current_total' comparison-report.json)
PREV=$(jq -r '.previous_total' comparison-report.json)
DELTA=$(jq -r '.total_delta' comparison-report.json)
echo "## :bar_chart: Coverage Report" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "| Metric | Value |" >> "$GITHUB_STEP_SUMMARY"
echo "|--------|-------|" >> "$GITHUB_STEP_SUMMARY"
echo "| Current | ${CURR}% |" >> "$GITHUB_STEP_SUMMARY"
echo "| Previous | ${PREV}% |" >> "$GITHUB_STEP_SUMMARY"
echo "| Delta | ${DELTA}% |" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"

DROPS=$(jq -r '.top_drops[:5][] | "| \(.package) | \(.previous)% | \(.current)% | \(.delta)% |"' comparison-report.json 2>/dev/null || true)
if [[ -n "$DROPS" ]]; then
echo "### Top Drops" >> "$GITHUB_STEP_SUMMARY"
echo "| Package | Previous | Current | Delta |" >> "$GITHUB_STEP_SUMMARY"
echo "|---------|----------|---------|-------|" >> "$GITHUB_STEP_SUMMARY"
echo "$DROPS" >> "$GITHUB_STEP_SUMMARY"
fi
fi
fi
run: ./.github/scripts/coverage/write-summary.sh comparison-report.json

- name: Notify Slack
if: always() && hashFiles('comparison-report.json') != ''
if: always() && hashFiles('comparison-report.json') != '' && env.COVERAGE_SLACK_WEBHOOK_URL != ''
env:
COVERAGE_SLACK_WEBHOOK_URL: ${{ secrets.COVERAGE_SLACK_WEBHOOK_URL }}
TAG_NAME: ${{ github.event.release.tag_name || inputs.tag_name }}
Expand Down
Loading