Skip to content

Commit

Permalink
Merge #1086: Fix coverage report workflow
Browse files Browse the repository at this point in the history
9d8174d ci: [#1075] fix coverage report (Jose Celano)
4dd6659 ci: [#1075] remove current coverage workflow (Jose Celano)

Pull request description:

  Fix coverage report workflow.

ACKs for top commit:
  josecelano:
    ACK 9d8174d

Tree-SHA512: da06fd95233b7accfff0d9e56dfd7b0beeff915696f740e146c79864af3ba8e199d54b74586444bbbeaa39bc43995a0464e2595b1fab85f3feea94960c30d08f
  • Loading branch information
josecelano committed Nov 15, 2024
2 parents a3ae7c2 + 9d8174d commit 2289c04
Show file tree
Hide file tree
Showing 5 changed files with 211 additions and 87 deletions.
1 change: 1 addition & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[alias]
cov = "llvm-cov"
cov-lcov = "llvm-cov --lcov --output-path=./.coverage/lcov.info"
cov-codecov = "llvm-cov --codecov --output-path=./.coverage/codecov.json"
cov-html = "llvm-cov --html"
time = "build --timings --all-targets"

Expand Down
85 changes: 0 additions & 85 deletions .github/workflows/coverage.yaml

This file was deleted.

87 changes: 87 additions & 0 deletions .github/workflows/generate_coverage.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
name: Generate Coverage Report

on:
push:
branches:
- develop
pull_request:
branches:
- develop

env:
CARGO_TERM_COLOR: always

jobs:
coverage:
name: Generate Coverage Report
environment: coverage
runs-on: ubuntu-latest
env:
CARGO_INCREMENTAL: "0"
RUSTFLAGS: "-Cinstrument-coverage"

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install LLVM tools
run: sudo apt-get update && sudo apt-get install -y llvm

- id: setup
name: Setup Toolchain
uses: dtolnay/rust-toolchain@nightly
with:
toolchain: nightly
components: llvm-tools-preview

- id: cache
name: Enable Workflow Cache
uses: Swatinem/rust-cache@v2

- id: tools
name: Install Tools
uses: taiki-e/install-action@v2
with:
tool: grcov,cargo-llvm-cov

- id: coverage
name: Generate Coverage Report
run: |
cargo clean
cargo llvm-cov --all-features --workspace --codecov --output-path ./codecov.json
- name: Store PR number and commit SHA
run: |
echo "Storing PR number ${{ github.event.number }}"
echo "${{ github.event.number }}" > pr_number.txt
echo "Storing commit SHA ${{ github.event.pull_request.head.sha }}"
echo "${{ github.event.pull_request.head.sha }}" > commit_sha.txt
# Workaround for https://github.com/orgs/community/discussions/25220
# Triggered sub-workflow is not able to detect the original commit/PR which is available
# in this workflow.
- name: Store PR number
uses: actions/upload-artifact@v4
with:
name: pr_number
path: pr_number.txt

- name: Store commit SHA
uses: actions/upload-artifact@v4
with:
name: commit_sha
path: commit_sha.txt

# This stores the coverage report in artifacts. The actual upload to Codecov
# is executed by a different workflow `upload_coverage.yml`. The reason for this
# split is because `on.pull_request` workflows don't have access to secrets.
- name: Store coverage report in artifacts
uses: actions/upload-artifact@v4
with:
name: codecov_report
path: ./codecov.json

- run: |
echo "The coverage report was stored in Github artifacts."
echo "It will be uploaded to Codecov using [upload_coverage.yml] workflow shortly."
119 changes: 119 additions & 0 deletions .github/workflows/upload_coverage.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
name: Upload Coverage Report

on:
# This workflow is triggered after every successfull execution
# of `Generate Coverage Report` workflow.
workflow_run:
workflows: ["Generate Coverage Report"]
types:
- completed

permissions:
actions: write
contents: write
issues: write
pull-requests: write

jobs:
coverage:
name: Upload Coverage Report
environment: coverage
runs-on: ubuntu-latest
steps:
- name: "Download existing coverage report"
id: prepare_report
uses: actions/github-script@v7
with:
script: |
var fs = require('fs');
// List artifacts of the workflow run that triggered this workflow
var artifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.payload.workflow_run.id,
});
let codecovReport = artifacts.data.artifacts.filter((artifact) => {
return artifact.name == "codecov_report";
});
if (codecovReport.length != 1) {
throw new Error("Unexpected number of {codecov_report} artifacts: " + codecovReport.length);
}
var download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: codecovReport[0].id,
archive_format: 'zip',
});
fs.writeFileSync('codecov_report.zip', Buffer.from(download.data));
let prNumber = artifacts.data.artifacts.filter((artifact) => {
return artifact.name == "pr_number";
});
if (prNumber.length != 1) {
throw new Error("Unexpected number of {pr_number} artifacts: " + prNumber.length);
}
var download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: prNumber[0].id,
archive_format: 'zip',
});
fs.writeFileSync('pr_number.zip', Buffer.from(download.data));
let commitSha = artifacts.data.artifacts.filter((artifact) => {
return artifact.name == "commit_sha";
});
if (commitSha.length != 1) {
throw new Error("Unexpected number of {commit_sha} artifacts: " + commitSha.length);
}
var download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: commitSha[0].id,
archive_format: 'zip',
});
fs.writeFileSync('commit_sha.zip', Buffer.from(download.data));
- id: parse_previous_artifacts
run: |
unzip codecov_report.zip
unzip pr_number.zip
unzip commit_sha.zip
echo "Detected PR is: $(<pr_number.txt)"
echo "Detected commit_sha is: $(<commit_sha.txt)"
# Make the params available as step output
echo "override_pr=$(<pr_number.txt)" >> "$GITHUB_OUTPUT"
echo "override_commit=$(<commit_sha.txt)" >> "$GITHUB_OUTPUT"
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ steps.parse_previous_artifacts.outputs.override_commit || '' }}
path: repo_root

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
with:
verbose: true
token: ${{ secrets.CODECOV_TOKEN }}
files: ${{ github.workspace }}/codecov.json
fail_ci_if_error: true
# Manual overrides for these parameters are needed because automatic detection
# in codecov-action does not work for non-`pull_request` workflows.
# In `main` branch push, these default to empty strings since we want to run
# the analysis on HEAD.
override_commit: ${{ steps.parse_previous_artifacts.outputs.override_commit || '' }}
override_pr: ${{ steps.parse_previous_artifacts.outputs.override_pr || '' }}
working-directory: ${{ github.workspace }}/repo_root
# Location where coverage report files are searched for
directory: ${{ github.workspace }}
6 changes: 4 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
.env
*.code-workspace
**/*.rs.bk
/.coverage/
/.idea/
Expand All @@ -12,5 +13,6 @@
/tracker.*
/tracker.toml
callgrind.out
perf.data*
*.code-workspace
codecov.json
lcov.info
perf.data*

0 comments on commit 2289c04

Please sign in to comment.