Skip to content
This repository was archived by the owner on Nov 3, 2025. It is now read-only.

Commit ddcd264

Browse files
authored
Merge pull request #492 from artichoke/lopopolo/sparse-protocol-codecov
Improve codecov GitHub Actions workflow
2 parents 260bc6f + e2c7872 commit ddcd264

2 files changed

Lines changed: 46 additions & 25 deletions

File tree

github-org-artichoke/repository_file_github_actions_rust_code_coverage_workflow.tf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
locals {
2-
// Set `force_bump_s3_backup` to true to create branches for PRs that update
3-
// the S3 backup workflow organization-wide.
2+
// Set `force_bump_rust_code_coverage` to true to create branches for PRs that
3+
// update the Rust code coverage workflow organization-wide.
44

55
force_bump_rust_code_coverage = false
66
rust_code_coverage_repos = [

github-org-artichoke/templates/rust-code-coverage.yaml

Lines changed: 44 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ jobs:
1717
env:
1818
RUST_BACKTRACE: 1
1919
CARGO_NET_GIT_FETCH_WITH_CLI: true
20+
CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
2021
steps:
2122
- name: Checkout repository
2223
uses: actions/checkout@v3.5.2
@@ -46,7 +47,10 @@ jobs:
4647
env:
4748
LLVM_PROFILE_FILE: "${github_repository}-%m-%p.profraw"
4849
RUSTFLAGS: "-C instrument-coverage"
49-
# Unstable feature: https://github.com/rust-lang/rust/issues/56925
50+
# Unstable feature: `--persist-doctests`: persist doctest executables after running
51+
# https://rustwiki.org/en/rustdoc/unstable-features.html#--persist-doctests-persist-doctest-executables-after-running
52+
#
53+
# Used to allow grcov to use these sources to generate coverage metrics.
5054
RUSTDOCFLAGS: "-C instrument-coverage -Z unstable-options --persist-doctests target/debug/doctests"
5155
run: cargo test
5256

@@ -77,26 +81,43 @@ jobs:
7781
aws s3 sync target/coverage/ s3://${s3_bucket}/${github_repository}/ --delete --sse AES256 --include '*' --exclude '*.svg' --exclude '*.html' --exclude '*.json'
7882
7983
- name: Check missed lines
84+
shell: python
8085
run: |
81-
curl -s https://codecov.artichokeruby.org/${github_repository}/coverage.json | python -c '\
82-
import sys, json; \
83-
\
84-
trunk_coverage = json.loads(sys.stdin.read()); \
85-
print("On trunk: "); \
86-
print("coveragePercent =", trunk_coverage["coveragePercent"]); \
87-
print("linesCovered =", trunk_coverage["linesCovered"]); \
88-
print("linesMissed =", trunk_coverage["linesMissed"]); \
89-
print("linesTotal =", trunk_coverage["linesTotal"]); \
90-
print(""); \
91-
\
92-
branch_coverage = json.load(open("target/coverage/coverage.json"))
93-
print("On PR branch: "); \
94-
print("coveragePercent =", branch_coverage["coveragePercent"]); \
95-
print("linesCovered =", branch_coverage["linesCovered"]); \
96-
print("linesMissed =", branch_coverage["linesMissed"]); \
97-
print("linesTotal =", branch_coverage["linesTotal"]); \
98-
print(""); \
99-
\
100-
is_ok = branch_coverage["linesMissed"] <= trunk_coverage["linesMissed"]; \
101-
exit(0) if is_ok else exit(1) \
102-
'
86+
import json
87+
from urllib.request import urlopen
88+
89+
trunk_coverage_url = "https://codecov.artichokeruby.org/${github_repository}/coverage.json"
90+
91+
92+
def print_report(coverage, *, on=None):
93+
if on is None:
94+
raise ValueError("must provide `on` kwarg")
95+
96+
print(f"On {on}:")
97+
print("coveragePercent =", coverage["coveragePercent"])
98+
print("linesCovered =", coverage["linesCovered"])
99+
print("linesMissed =", coverage["linesMissed"])
100+
print("linesTotal =", coverage["linesTotal"])
101+
print("")
102+
103+
104+
if "$${{ github.ref_name }}" == "trunk":
105+
# We don't need to compare trunk coverage to itself
106+
exit(0)
107+
108+
with urlopen(trunk_coverage_url, data=None, timeout=3) as remote:
109+
trunk_coverage = json.load(remote)
110+
111+
print_report(trunk_coverage, on="branch trunk")
112+
113+
with open("target/coverage/coverage.json") as local:
114+
branch_coverage = json.load(local)
115+
116+
on = None
117+
if "$${{ github.event_name }}" == "pull_request":
118+
on = "PR artichoke/${github_repository}#$${{ github.event.number }}"
119+
120+
print_report(branch_coverage, on=on)
121+
122+
is_ok = branch_coverage["linesMissed"] <= trunk_coverage["linesMissed"]
123+
exit(0) if is_ok else exit(1)

0 commit comments

Comments
 (0)