|
| 1 | +#!/usr/bin/env bash |
| 2 | +## |
| 3 | +## Post code coverage summary as a PR comment on GitHub. |
| 4 | +## |
| 5 | +## Minimizes previous coverage comments before posting a new one. |
| 6 | +## |
| 7 | +## Environment variables: |
| 8 | +## CIRCLE_PULL_REQUEST - CircleCI PR URL. |
| 9 | +## GITHUB_TOKEN - GitHub token for API access. |
| 10 | +## CIRCLE_PROJECT_USERNAME - GitHub org/user. |
| 11 | +## CIRCLE_PROJECT_REPONAME - GitHub repo name. |
| 12 | +## |
| 13 | +## Usage: |
| 14 | +## .circleci/post-coverage-comment.sh /path/to/coverage.txt |
| 15 | + |
| 16 | +set -euo pipefail |
| 17 | + |
| 18 | +COVERAGE_FILE="${1:-}" |
| 19 | + |
| 20 | +if [ -z "${COVERAGE_FILE}" ] || [ ! -f "${COVERAGE_FILE}" ]; then |
| 21 | + echo "ERROR: Coverage file not found: ${COVERAGE_FILE}" >&2 |
| 22 | + exit 1 |
| 23 | +fi |
| 24 | + |
| 25 | +if [ -z "${CIRCLE_PULL_REQUEST:-}" ]; then |
| 26 | + echo "Not a pull request. Skipping." |
| 27 | + exit 0 |
| 28 | +fi |
| 29 | + |
| 30 | +if [ -z "${GITHUB_TOKEN:-}" ]; then |
| 31 | + echo "GITHUB_TOKEN is not set. Skipping." |
| 32 | + exit 0 |
| 33 | +fi |
| 34 | + |
| 35 | +COVERAGE_CONTENT=$(sed '/./,$!d' "${COVERAGE_FILE}") |
| 36 | +PR_NUMBER=$(echo "${CIRCLE_PULL_REQUEST}" | cut -d'/' -f 7) |
| 37 | +REPO_SLUG="${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}" |
| 38 | + |
| 39 | +MARKER="<!-- coverage-circleci -->" |
| 40 | + |
| 41 | +BODY="$(jq -n --arg body "**Code coverage (CircleCI)** |
| 42 | +\`\`\` |
| 43 | +${COVERAGE_CONTENT} |
| 44 | +\`\`\` |
| 45 | +${MARKER}" '{body: $body}')" |
| 46 | + |
| 47 | +# Minimize previous coverage comments. |
| 48 | +EXISTING_IDS=$(curl -s \ |
| 49 | + -H "Authorization: token ${GITHUB_TOKEN}" \ |
| 50 | + -H "Accept: application/vnd.github.v3+json" \ |
| 51 | + "https://api.github.com/repos/${REPO_SLUG}/issues/${PR_NUMBER}/comments?per_page=100" | |
| 52 | + jq -r '.[] | select(.body | contains("<!-- coverage-circleci -->")) | .node_id') |
| 53 | + |
| 54 | +for NODE_ID in ${EXISTING_IDS}; do |
| 55 | + curl -s -X POST \ |
| 56 | + -H "Authorization: bearer ${GITHUB_TOKEN}" \ |
| 57 | + -H "Content-Type: application/json" \ |
| 58 | + "https://api.github.com/graphql" \ |
| 59 | + -d "$(jq -n --arg id "${NODE_ID}" '{query: "mutation($id:ID!){minimizeComment(input:{subjectId:$id,classifier:OUTDATED}){minimizedComment{isMinimized}}}", variables: {id: $id}}')" |
| 60 | +done |
| 61 | + |
| 62 | +# Post new coverage comment. |
| 63 | +curl -s -X POST \ |
| 64 | + -H "Authorization: token ${GITHUB_TOKEN}" \ |
| 65 | + -H "Accept: application/vnd.github.v3+json" \ |
| 66 | + "https://api.github.com/repos/${REPO_SLUG}/issues/${PR_NUMBER}/comments" \ |
| 67 | + -d "${BODY}" |
0 commit comments