Add a code coverage check to the CI pipeline #84

Merged
wojtek merged 5 commits from 83---add-a-code-coverage-check-to-the-ci-pipeline into main 2024-01-06 19:49:41 +01:00
4 changed files with 56 additions and 7 deletions

View File

@ -1,6 +1,12 @@
FROM docker.io/library/rust:1.75
RUN rustup component add clippy rustfmt
RUN rustup component add \
clippy \
llvm-tools-preview \
rustfmt
RUN cargo install \
grcov
RUN apt-get update && apt-get install -y \
beets \

View File

@ -0,0 +1,23 @@
import argparse
import json
def main(coverage_file, fail_under):
with open(coverage_file, encoding="utf-8") as f:
coverage_json = json.load(f)
coverage = float(coverage_json["message"][:-1])
return coverage >= fail_under
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Check coverage output by grcov")
parser.add_argument("--coverage-file", type=str, required=True,
help="Path to the coverage.json file output by grcov")
parser.add_argument("--fail-under", type=float, default=100.,
help="Threshold under which coverage is insufficient")
args = parser.parse_args()
if not main(args.coverage_file, args.fail_under):
exit(2)

View File

@ -8,21 +8,40 @@ on:
env:
CARGO_TERM_COLOR: always
BEETSDIR: ./
CARGO_TERM_VERBOSE: true
jobs:
build_and_test:
name: Build and Test
container: docker.io/drrobot/musichoard-ci:rust-1.75
env:
BEETSDIR: ./
LLVM_PROFILE_FILE: target/debug/profraw/musichoard-%p-%m.profraw
RUSTFLAGS: -C instrument-coverage
steps:
- uses: actions/checkout@v3
- run: cargo build --verbose --all-features --all-targets
- run: cargo test --verbose --all-features --all-targets --no-fail-fast
- run: cargo build --all-features --all-targets
- run: cargo test --all-features --all-targets --no-fail-fast
- run: >-
grcov target/debug/profraw
--binary-path target/debug/
--output-types html
--source-dir .
--ignore-not-existing
--ignore "tests/*"
--ignore "src/main.rs"
--excl-start "GRCOV_EXCL_START|mod tests \{"
--excl-stop "GRCOV_EXCL_STOP"
--output-path ./target/debug/coverage/
- run: >-
python3 .gitea/scripts/coverage.py
--coverage-file ./target/debug/coverage/coverage.json
--fail-under 100.00
lint:
name: Lint
container: docker.io/drrobot/musichoard-ci:rust-1.75
steps:
- uses: actions/checkout@v3
- run: cargo clippy --verbose --all-features --all-targets -- -D warnings
- run: cargo fmt --verbose -- --check
- run: cargo clippy --all-features --all-targets -- -D warnings
- run: cargo fmt -- --check

View File

@ -23,6 +23,7 @@ env CARGO_TARGET_DIR=codecov \
env RUSTFLAGS="-C instrument-coverage" \
LLVM_PROFILE_FILE="codecov/debug/profraw/musichoard-%p-%m.profraw" \
CARGO_TARGET_DIR=codecov \
BEETSDIR=./ \
cargo test --all-features --all-targets
grcov codecov/debug/profraw \
--binary-path ./codecov/debug/ \
@ -31,7 +32,7 @@ grcov codecov/debug/profraw \
--ignore-not-existing \
--ignore "tests/*" \
--ignore "src/main.rs" \
--excl-start "mod tests \{|GRCOV_EXCL_START" \
--excl-start "GRCOV_EXCL_START|mod tests \{" \
--excl-stop "GRCOV_EXCL_STOP" \
--output-path ./codecov/debug/coverage/
xdg-open codecov/debug/coverage/index.html