From e24acd68b9af0236a4affa4cd1585496d461f3c3 Mon Sep 17 00:00:00 2001 From: Connor Catlett Date: Wed, 27 Sep 2023 17:18:25 +0000 Subject: [PATCH] Add Github actions code coverage CI job Signed-off-by: Connor Catlett --- .github/workflows/generate-code-coverage.yaml | 51 +++++++++++++ .github/workflows/output-code-coverage.yaml | 71 +++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 .github/workflows/generate-code-coverage.yaml create mode 100644 .github/workflows/output-code-coverage.yaml diff --git a/.github/workflows/generate-code-coverage.yaml b/.github/workflows/generate-code-coverage.yaml new file mode 100644 index 0000000000..5bb1fa318c --- /dev/null +++ b/.github/workflows/generate-code-coverage.yaml @@ -0,0 +1,51 @@ +name: Generate Code Coverage +on: [pull_request] + +jobs: + cover-base: + name: Generate Base Coverage + runs-on: ubuntu-latest + steps: + - name: Checkout base + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.base.ref }} + + - name: Set up go + uses: actions/setup-go@v4 + with: + go-version: '^1.20.2' + + - name: Generate report + run: | + go test -coverprofile base-coverage.tmp ./cmd/... ./pkg/... + cat base-coverage.tmp | grep -v "mock_" > base-coverage.out + + - name: Upload report + uses: actions/upload-artifact@v3 + with: + name: base-coverage + path: base-coverage.out + + cover-pr: + name: Generate PR Coverage + runs-on: ubuntu-latest + steps: + - name: Checkout PR + uses: actions/checkout@v3 + + - name: Set up go + uses: actions/setup-go@v4 + with: + go-version: '^1.20.2' + + - name: Generate report + run: | + go test -coverprofile pr-coverage.tmp ./cmd/... ./pkg/... + cat pr-coverage.tmp | grep -v "mock_" > pr-coverage.out + + - name: Upload report + uses: actions/upload-artifact@v3 + with: + name: pr-coverage + path: pr-coverage.out diff --git a/.github/workflows/output-code-coverage.yaml b/.github/workflows/output-code-coverage.yaml new file mode 100644 index 0000000000..6b338f3c2a --- /dev/null +++ b/.github/workflows/output-code-coverage.yaml @@ -0,0 +1,71 @@ +name: Output Code Coverage +on: + workflow_run: + workflows: [Generate Code Coverage] + types: [completed] + +jobs: + output-code-coverage: + name: Output Code Coverage + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + steps: + # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#using-data-from-the-triggering-workflow + - name: 'Download reports' + uses: actions/github-script@v6 + with: + script: | + let fs = require('fs'); + let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: context.payload.workflow_run.id, + }); + for (const artifact of allArtifacts.data.artifacts) { + let download = await github.rest.actions.downloadArtifact({ + owner: context.repo.owner, + repo: context.repo.repo, + artifact_id: artifact.id, + archive_format: 'zip', + }); + fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/${artifact.id}.zip`, Buffer.from(download.data)); + } + + - name: 'Determine source PR' + uses: potiuk/get-workflow-origin@v1_1 + id: source-run-info + with: + token: ${{ secrets.GITHUB_TOKEN }} + sourceRunId: ${{ github.event.workflow_run.id }} + + - name: Set up go + uses: actions/setup-go@v4 + with: + go-version: '^1.20.2' + + - name: Install coverage tool + run: go install k8s.io/test-infra/robots/coverage@latest + + - name: Generate comment + id: generate-comment + run: | + unzip \*.zip + echo 'comment<> $GITHUB_OUTPUT + echo '' >> $GITHUB_OUTPUT + echo '## Code Coverage Diff' >> $GITHUB_OUTPUT + COVERAGE_DIFF=$(coverage diff base-coverage.out pr-coverage.out | sed -e '1,5d') + if [[ -n "${COVERAGE_DIFF}" ]]; then + printf -- "%s\n" "${COVERAGE_DIFF}" >> $GITHUB_OUTPUT + else + echo 'This PR does not change the code coverage' >> $GITHUB_OUTPUT + fi + echo 'EOF' >> $GITHUB_OUTPUT + + - name: Create or update comment + uses: edumserrano/find-create-or-update-comment@v1 + with: + issue-number: ${{ steps.source-run-info.outputs.pullRequestNumber }} + body-includes: '' + comment-author: 'github-actions[bot]' + body: ${{ steps.generate-comment.outputs.comment }} + edit-mode: replace