Skip to content

Commit 6314cc7

Browse files
committed
CI/CD: Gather code coverage.
Gather code review data to help guide the code review process. This is currently limited to i686 and x86_64 Linux because these are the targets I could get working. More investigation is needed to figure out how to collect coverage data for ARM targets.
1 parent db664fa commit 6314cc7

File tree

3 files changed

+163
-54
lines changed

3 files changed

+163
-54
lines changed

.github/workflows/ci.yml

+58
Original file line numberDiff line numberDiff line change
@@ -251,3 +251,61 @@ jobs:
251251

252252
- run: |
253253
${{ matrix.webdriver }} mk/cargo.sh test -vv --target=${{ matrix.target }} ${{ matrix.features }} ${{ matrix.mode }}
254+
255+
coverage:
256+
# Don't run duplicate `push` jobs for the repo owner's PRs.
257+
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
258+
259+
runs-on: ${{ matrix.host_os }}
260+
261+
strategy:
262+
matrix:
263+
features:
264+
- # Default
265+
266+
# TODO: targets
267+
target:
268+
- i686-unknown-linux-gnu
269+
- x86_64-unknown-linux-musl
270+
271+
mode:
272+
- # debug
273+
274+
# Coverage collection is Nightly-only
275+
rust_channel:
276+
- nightly
277+
278+
# TODO: targets
279+
include:
280+
- target: i686-unknown-linux-gnu
281+
host_os: ubuntu-18.04
282+
283+
- target: x86_64-unknown-linux-musl
284+
host_os: ubuntu-18.04
285+
286+
steps:
287+
- uses: actions/checkout@v2
288+
289+
- if: ${{ !contains(matrix.host_os, 'windows') }}
290+
run: mk/install-build-tools.sh --target=${{ matrix.target }} ${{ matrix.features }}
291+
292+
- uses: actions-rs/toolchain@v1
293+
with:
294+
override: true
295+
target: ${{ matrix.target }}
296+
toolchain: ${{ matrix.rust_channel }}
297+
298+
- if: ${{ matrix.target == 'aarch64-apple-darwin' }}
299+
run: echo "DEVELOPER_DIR=/Applications/Xcode_12.2.app/Contents/Developer" >> $GITHUB_ENV
300+
301+
- if: ${{ !contains(matrix.host_os, 'windows') }}
302+
env:
303+
RING_COVERAGE: 1
304+
run: |
305+
mk/cargo.sh +${{ matrix.rust_channel }} test -vv --target=${{ matrix.target }} ${{ matrix.cargo_options }} ${{ matrix.features }} ${{ matrix.mode }}
306+
307+
- uses: codecov/codecov-action@v1
308+
with:
309+
file: ./target/${{ matrix.target }}/debug/coverage/coverage.txt
310+
fail_ci_if_error: true
311+
verbose: true

mk/cargo.sh

+96-54
Original file line numberDiff line numberDiff line change
@@ -30,64 +30,106 @@ fi
3030

3131
for arg in $*; do
3232
case $arg in
33-
--target=aarch64-linux-android)
34-
export CC_aarch64_linux_android=$android_tools/aarch64-linux-android21-clang
35-
export AR_aarch64_linux_android=$android_tools/aarch64-linux-android-ar
36-
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=$android_tools/aarch64-linux-android21-clang
37-
;;
38-
--target=aarch64-unknown-linux-gnu)
39-
export CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc
40-
export AR_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc-ar
41-
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc
42-
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUNNER="$qemu_aarch64"
43-
;;
44-
--target=aarch64-unknown-linux-musl)
45-
export CC_aarch64_unknown_linux_musl=clang-10
46-
export AR_aarch64_unknown_linux_musl=llvm-ar-10
47-
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUSTFLAGS="$rustflags_self_contained"
48-
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUNNER="$qemu_aarch64"
49-
;;
50-
--target=arm-unknown-linux-gnueabihf)
51-
export CC_arm_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc
52-
export AR_arm_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc-ar
53-
export CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc
54-
export CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_RUNNER="$qemu_arm"
55-
;;
56-
--target=armv7-linux-androideabi)
57-
export CC_armv7_linux_androideabi=$android_tools/armv7a-linux-androideabi18-clang
58-
export AR_armv7_linux_androideabi=$android_tools/arm-linux-androideabi-ar
59-
export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER=$android_tools/armv7a-linux-androideabi18-clang
60-
;;
61-
--target=armv7-unknown-linux-musleabihf)
62-
export CC_armv7_unknown_linux_musleabihf=clang-10
63-
export AR_armv7_unknown_linux_musleabihf=llvm-ar-10
64-
export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_RUSTFLAGS="$rustflags_self_contained"
65-
export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_RUNNER="$qemu_arm"
66-
;;
67-
--target=i686-unknown-linux-gnu)
68-
export CC_i686_unknown_linux_gnu=clang-10
69-
export AR_i686_unknown_linux_gnu=llvm-ar-10
70-
export CARGO_TARGET_I686_UNKNOWN_LINUX_GNU_LINKER=clang-10
71-
;;
72-
--target=i686-unknown-linux-musl)
73-
export CC_i686_unknown_linux_musl=clang-10
74-
export AR_i686_unknown_linux_musl=llvm-ar-10
75-
export CARGO_TARGET_I686_UNKNOWN_LINUX_MUSL_LINKER=clang-10
76-
;;
77-
--target=x86_64-unknown-linux-musl)
78-
export CC_x86_64_unknown_linux_musl=clang-10
79-
export AR_x86_64_unknown_linux_musl=llvm-ar-10
80-
export CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=clang-10
81-
;;
82-
--target=wasm32-unknown-unknown)
83-
# The first two are only needed for when the "wasm_c" feature is enabled.
84-
export CC_wasm32_unknown_unknown=clang-10
85-
export AR_wasm32_unknown_unknown=llvm-ar-10
86-
export CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER=wasm-bindgen-test-runner
33+
--target=*)
34+
target=${arg#*=}
8735
;;
8836
*)
8937
;;
9038
esac
9139
done
9240

41+
case $target in
42+
aarch64-linux-android)
43+
export CC_aarch64_linux_android=$android_tools/aarch64-linux-android21-clang
44+
export AR_aarch64_linux_android=$android_tools/aarch64-linux-android-ar
45+
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=$android_tools/aarch64-linux-android21-clang
46+
;;
47+
aarch64-unknown-linux-gnu)
48+
export CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc
49+
export AR_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc-ar
50+
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc
51+
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUNNER="$qemu_aarch64"
52+
;;
53+
aarch64-unknown-linux-musl)
54+
export CC_aarch64_unknown_linux_musl=clang-10
55+
export AR_aarch64_unknown_linux_musl=llvm-ar-10
56+
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUSTFLAGS="$rustflags_self_contained"
57+
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUNNER="$qemu_aarch64"
58+
;;
59+
arm-unknown-linux-gnueabihf)
60+
export CC_arm_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc
61+
export AR_arm_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc-ar
62+
export CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc
63+
export CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_RUNNER="$qemu_arm"
64+
;;
65+
armv7-linux-androideabi)
66+
export CC_armv7_linux_androideabi=$android_tools/armv7a-linux-androideabi18-clang
67+
export AR_armv7_linux_androideabi=$android_tools/arm-linux-androideabi-ar
68+
export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER=$android_tools/armv7a-linux-androideabi18-clang
69+
;;
70+
armv7-unknown-linux-musleabihf)
71+
export CC_armv7_unknown_linux_musleabihf=clang-10
72+
export AR_armv7_unknown_linux_musleabihf=llvm-ar-10
73+
export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_RUSTFLAGS="$rustflags_self_contained"
74+
export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_RUNNER="$qemu_arm"
75+
;;
76+
i686-unknown-linux-gnu)
77+
export CC_i686_unknown_linux_gnu=clang-10
78+
export AR_i686_unknown_linux_gnu=llvm-ar-10
79+
export CARGO_TARGET_I686_UNKNOWN_LINUX_GNU_LINKER=clang-10
80+
;;
81+
i686-unknown-linux-musl)
82+
export CC_i686_unknown_linux_musl=clang-10
83+
export AR_i686_unknown_linux_musl=llvm-ar-10
84+
export CARGO_TARGET_I686_UNKNOWN_LINUX_MUSL_LINKER=clang-10
85+
;;
86+
x86_64-unknown-linux-musl)
87+
export CC_x86_64_unknown_linux_musl=clang-10
88+
export AR_x86_64_unknown_linux_musl=llvm-ar-10
89+
export CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=clang-10
90+
;;
91+
wasm32-unknown-unknown)
92+
# The first two are only needed for when the "wasm_c" feature is enabled.
93+
export CC_wasm32_unknown_unknown=clang-10
94+
export AR_wasm32_unknown_unknown=llvm-ar-10
95+
export CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER=wasm-bindgen-test-runner
96+
;;
97+
*)
98+
;;
99+
esac
100+
101+
if [ -n "${RING_COVERAGE-}" ]; then
102+
# XXX: Collides between release and debug.
103+
coverage_dir=$PWD/target/$target/debug/coverage
104+
mkdir -p "$coverage_dir"
105+
rm -f "$coverage_dir/*.profraw"
106+
107+
export RING_BUILD_EXECUTABLE_LIST="$coverage_dir/executables"
108+
truncate --size=0 "$RING_BUILD_EXECUTABLE_LIST"
109+
110+
export LLVM_PROFILE_FILE="$coverage_dir/%m.profraw"
111+
112+
# ${target} with hyphens replaced by underscores, lowercase and uppercase.
113+
target_lower=${target//-/_}
114+
target_upper=${target_lower^^}
115+
116+
cflags_var=CFLAGS_${target_lower}
117+
declare -x "${cflags_var}=-fprofile-instr-generate -fcoverage-mapping ${!cflags_var-}"
118+
119+
runner_var=CARGO_TARGET_${target_upper}_RUNNER
120+
declare -x "${runner_var}=mk/runner ${!runner_var-}"
121+
122+
rustflags_var=CARGO_TARGET_${target_upper}_RUSTFLAGS
123+
declare -x "${rustflags_var}=-Zinstrument-coverage ${!rustflags_var-}"
124+
fi
125+
93126
cargo "$@"
127+
128+
if [ -n "${RING_COVERAGE-}" ]; then
129+
llvm-profdata-10 merge -sparse "$coverage_dir"/*.profraw -o "$coverage_dir"/merged.profdata
130+
xargs --arg-file="$RING_BUILD_EXECUTABLE_LIST" \
131+
llvm-cov-10 export \
132+
--instr-profile "$coverage_dir"/merged.profdata \
133+
--format lcov \
134+
> "$coverage_dir"/coverage.txt
135+
fi

mk/runner

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/bin/bash
2+
set -eux -o pipefail
3+
IFS=$'\n\t'
4+
5+
if [ -n "$RING_BUILD_EXECUTABLE_LIST" ]; then
6+
echo $1 >> "$RING_BUILD_EXECUTABLE_LIST"
7+
fi
8+
9+
$*

0 commit comments

Comments
 (0)