Code Coverage (llvm-cov) #82
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Code Coverage (llvm-cov) | |
on: | |
schedule: | |
- cron: "0 1 * * *" # every day at 1am (UTC) | |
workflow_dispatch: | |
jobs: | |
llvm-cov: | |
name: Generate code coverage | |
runs-on: self-hosted | |
timeout-minutes: 180 | |
env: | |
# Don't emit giant backtraces in the CI logs. | |
RUST_BACKTRACE: short | |
# Rustup | |
RUSTUP_MAX_RETRIES: 10 | |
# Cargo | |
CARGO_TERM_COLOR: always | |
CARGO_INCREMENTAL: 0 | |
# Find a good balance between runtime performance and accurate code coverage analysis. | |
CARGO_PROFILE_TEST_OPT_LEVEL: 1 | |
CARGO_PROFILE_TEST_DEBUG: true | |
CARGO_PROFILE_TEST_DEBUG_ASSERTIONS: true | |
CARGO_PROFILE_TEST_OVERFLOW_CHECKS: false | |
CARGO_PROFILE_TEST_LTO: off | |
CARGO_PROFILE_TEST_CODEGEN_UNITS: 1 | |
# Allow more retries for network requests in cargo (downloading crates) and | |
# rustup (installing toolchains). This should help to reduce flaky CI failures | |
# from transient network timeouts or other issues. | |
CARGO_NET_RETRY: 10 | |
steps: | |
- uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # pin@v4 | |
- uses: bmwill/rust-cache@fb63fcd7a959767755b88b5af2f5cbf65fb8a127 # pin@v1 | |
- name: Install cargo-llvm-cov | |
uses: taiki-e/install-action@125e82eef6e60d2b0c20d4d1f4cf81db37f68bf3 # pin@cargo-llvm-cov | |
- name: Install nextest | |
uses: taiki-e/install-action@7e58f89e24a544d88f7a74c6eed8a3df3fd4c658 # pin@nextest | |
- name: Set Swap Space | |
uses: actionhippie/swap-space@v1 | |
with: | |
size: 256G | |
- name: Install llvm-tools | |
run: | | |
# TOOLCHAIN=$(rustup show active-toolchain | cut -d ' ' -f 1) | |
TOOLCHAIN=nightly-x86_64-unknown-linux-gnu | |
rustup component add llvm-tools --toolchain "$TOOLCHAIN" | |
LLVM_PROFDATA=$HOME/.rustup/toolchains/$TOOLCHAIN/lib/rustlib/x86_64-unknown-linux-gnu/bin/llvm-profdata | |
echo "LLVM_PROFDATA=$LLVM_PROFDATA" >> $GITHUB_ENV | |
if [ -x "$LLVM_PROFDATA" ]; then | |
$LLVM_PROFDATA --version | |
else | |
echo "Error: llvm-profdata not found at $LLVM_PROFDATA or not executable." | |
exit 1 | |
fi | |
- name: Compute code coverage (nextest.profdata) | |
run: | | |
cargo +nightly llvm-cov clean --profraw-only | |
echo "Computing nextest code coverage." | |
set +e | |
IOTA_SKIP_SIMTESTS=1 cargo +nightly llvm-cov \ | |
--branch \ | |
--ignore-run-fail \ | |
--no-report \ | |
nextest -vv | |
echo "Scanning for corrupted .profraw files. This might take a while." | |
find target/llvm-cov-target -name '*.profraw' | while read file; do | |
if ! "$LLVM_PROFDATA" show "$file" > /dev/null 2>&1; then | |
echo "Removing corrupted file: $file" | |
rm "$file" | |
fi | |
done | |
find target/llvm-cov-target -name '*.profraw' -print0 | xargs -0 $LLVM_PROFDATA merge --failure-mode=warn --sparse --output target/nextest.profdata | |
[ -f "target/nextest.profdata" ] || exit 1 | |
# - name: Compute code coverage (simtest.profdata) | |
# run: | | |
# cargo +nightly llvm-cov clean --profraw-only | |
# git clean -fd | |
# set +e | |
# ./scripts/simtest/simtest-cov.sh | |
# # For now we accept failing simtest coverage | |
# # [ -f "target/simtest.profdata" ] || exit 1 | |
# if [ ! -f "target/simtest.profdata" ]; then | |
# echo "Error: failed to create simtest.profdata." | |
# fi | |
# exit 0 | |
- name: Create html report (report.tgz) | |
run: | | |
cd target | |
if [ -d "report" ]; then | |
echo "Cleaning old report." | |
rm -rf report | |
fi | |
echo "Creating html report." | |
if [ -f "simtest.profdata" ]; then | |
$LLVM_PROFDATA merge --failure-mode=warn --sparse nextest.profdata simtest.profdata --output merged.profdata | |
else | |
mv nextest.profdata merged.profdata | |
fi | |
[ -f "merged.profdata" ] || exit 1 | |
LLVM_PROFILE_FILE="merged.profdata" cargo +nightly llvm-cov report \ | |
--html \ | |
--output-dir . \ | |
--ignore-filename-regex 'external-crates/.*' | |
[ -d "html" ] || exit 1 | |
mv html report | |
echo "Packaging html report." | |
[ -d "report" ] || exit 1 | |
tar -czf report.tgz report | |
[ -f "report.tgz" ] || exit 1 | |
- name: Publish html report and trigger update | |
run: | | |
rsync -av target/report.tgz ${{ secrets.CODEGOV_REPORT_HOST }}:transfer/cargo-llvm-cov/ | |
ssh ${{ secrets.CODEGOV_REPORT_HOST }} | |
- name: Backup html report | |
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # pin@v4 | |
if: always() | |
with: | |
name: report | |
path: target/report.tgz | |
if-no-files-found: error | |
retention-days: 30 |