-
Notifications
You must be signed in to change notification settings - Fork 0
123 lines (101 loc) · 4.84 KB
/
code-coverage.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
---
name: Code Coverage
"on":
push:
branches:
- trunk
pull_request:
branches:
- trunk
jobs:
generate:
name: Generate
permissions:
id-token: write
contents: read
runs-on: ubuntu-latest
env:
RUST_BACKTRACE: 1
CARGO_NET_GIT_FETCH_WITH_CLI: true
CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
steps:
- name: Checkout repository
uses: actions/[email protected]
- name: Install nightly Rust toolchain
uses: artichoke/setup-rust/[email protected]
- name: Setup grcov
run: |
release_url="$(curl \
--url https://api.github.com/repos/mozilla/grcov/releases \
--header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' \
--header 'content-type: application/json' \
--silent \
--fail \
--retry 5 \
| jq -r '.[0].assets
| map(select(.browser_download_url | test(".*x86_64-unknown-linux-musl.tar.bz2$")))
| .[0].browser_download_url'
)"
curl -sL "$release_url" | sudo tar xvj -C /usr/local/bin/
- name: Show grcov version
run: grcov --version
- name: Generate coverage
env:
LLVM_PROFILE_FILE: "roe-%m-%p.profraw"
RUSTFLAGS: "-C instrument-coverage"
# Unstable feature: `--persist-doctests`: persist doctest executables after running
# https://rustwiki.org/en/rustdoc/unstable-features.html#--persist-doctests-persist-doctest-executables-after-running
#
# Used to allow grcov to use these sources to generate coverage metrics.
RUSTDOCFLAGS: "-C instrument-coverage -Z unstable-options --persist-doctests target/debug/doctests"
run: cargo test
- name: Generate HTML report
run: grcov roe*.profraw --source-dir . --keep-only 'src/**/*.rs' --binary-path target/debug -t html --filter covered -o target/coverage
- name: Generate detailed JSON report
run: grcov roe*.profraw --source-dir . --keep-only 'src/**/*.rs' --binary-path target/debug -t covdir --filter covered -o target/coverage/coverage.json
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
if: github.ref == 'refs/heads/trunk'
with:
aws-region: us-west-2
role-to-assume: arn:aws:iam::447522982029:role/gha-roe-s3-backup-20220820215201568000000007
role-session-name: GitHubActionsRustCodeCoverage@roe
- name: Show AWS caller identity
if: github.ref == 'refs/heads/trunk'
run: aws sts get-caller-identity
- name: Upload archives to S3
if: github.ref == 'refs/heads/trunk'
run: |
aws s3 sync target/coverage/ s3://artichoke-forge-code-coverage-us-west-2/roe/ --delete --sse AES256 --exclude '*' --include '*.svg' --content-type 'image/svg+xml'
aws s3 sync target/coverage/ s3://artichoke-forge-code-coverage-us-west-2/roe/ --delete --sse AES256 --exclude '*' --include '*.html' --content-type 'text/html'
aws s3 sync target/coverage/ s3://artichoke-forge-code-coverage-us-west-2/roe/ --delete --sse AES256 --exclude '*' --include '*.json' --content-type 'application/json'
aws s3 sync target/coverage/ s3://artichoke-forge-code-coverage-us-west-2/roe/ --delete --sse AES256 --include '*' --exclude '*.svg' --exclude '*.html' --exclude '*.json'
- name: Check missed lines
shell: python
run: |
import json
from urllib.request import urlopen
trunk_coverage_url = "https://codecov.artichokeruby.org/roe/coverage.json"
def print_report(coverage, *, on=None):
if on is None:
raise ValueError("must provide `on` kwarg")
print(f"On {on}:")
print("coveragePercent =", coverage["coveragePercent"])
print("linesCovered =", coverage["linesCovered"])
print("linesMissed =", coverage["linesMissed"])
print("linesTotal =", coverage["linesTotal"])
print("")
if "${{ github.ref_name }}" == "trunk":
# We don't need to compare trunk coverage to itself
exit(0)
with urlopen(trunk_coverage_url, data=None, timeout=3) as remote:
trunk_coverage = json.load(remote)
print_report(trunk_coverage, on="branch trunk")
with open("target/coverage/coverage.json") as local:
branch_coverage = json.load(local)
on = None
if "${{ github.event_name }}" == "pull_request":
on = "PR artichoke/roe#${{ github.event.number }}"
print_report(branch_coverage, on=on)
is_ok = branch_coverage["linesMissed"] <= trunk_coverage["linesMissed"]
exit(0) if is_ok else exit(1)