Various CI pipeline improvements #204
Workflow file for this run
This file contains hidden or 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: CI Status | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
branches: | |
- main | |
env: | |
CARGO_TERM_COLOR: always | |
RUST_TEST_TIME_UNIT: 60,120 | |
RUST_TEST_TIME_INTEGRATION: 60,120 | |
RUST_TEST_TIME_DOCTEST: 60,120 | |
jobs: | |
test: | |
name: test | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
crate: [ libcoap-sys, libcoap-rs ] | |
dtls_backend: [ openssl, gnutls, tinydtls, mbedtls ] | |
rust_version: [ msrv, stable, nightly ] | |
env: | |
LLVM_PROFILE_FILE: 'target/debug/coverage/${{ matrix.crate }}-%p-%m.profraw' | |
RUSTFLAGS: "${{ matrix.rust_version == 'nightly' && '-Cinstrument-coverage -Cpanic=abort -Zpanic_abort_tests' || ' ' }}" | |
RUSTDOCFLAGS: "${{ matrix.rust_version == 'nightly' && '-C instrument-coverage -Cpanic=abort -Zpanic_abort_tests -Z unstable-options --persist-doctests target/debug/' || ' ' }}" | |
LIBRARY_FEATURES: | | |
${{ (matrix.crate == 'libcoap-rs' && 'tcp,vendored,rand') | |
|| (matrix.crate == 'libcoap-sys' && 'default') | |
|| 'vendored' | |
}} | |
DTLS_LIBRARY_FEATURES: | | |
${{ (matrix.crate == 'libcoap-rs' && matrix.dtls_backend == 'tinydtls' && 'tcp,dtls-psk,dtls-rpk,dtls_tinydtls_vendored') | |
|| (matrix.crate == 'libcoap-rs' && matrix.dtls_backend == 'mbedtls' && 'tcp,dtls-psk,dtls-pki,dtls_mbedtls_vendored') | |
|| (matrix.crate == 'libcoap-rs' && matrix.dtls_backend == 'openssl' && 'tcp,dtls-psk,dtls-pki,dtls_openssl_vendored') | |
|| (matrix.crate == 'libcoap-rs' && matrix.dtls_backend == 'gnutls' && 'tcp,dtls-psk,dtls-pki,dtls-rpk,dtls_gnutls') | |
|| (matrix.crate == 'libcoap-sys' && matrix.dtls_backend == 'tinydtls' && 'dtls,dtls_backend_tinydtls,dtls_backend_tinydtls_vendored') | |
|| (matrix.crate == 'libcoap-sys' && matrix.dtls_backend == 'mbedtls' && 'dtls,dtls_backend_mbedtls,dtls_backend_mbedtls_vendored') | |
|| (matrix.crate == 'libcoap-sys' && matrix.dtls_backend == 'openssl' && 'dtls,dtls_backend_openssl,dtls_backend_openssl_vendored') | |
|| (matrix.crate == 'libcoap-sys' && matrix.dtls_backend == 'gnutls' && 'dtls,dtls_backend_gnutls') | |
|| 'vendored' | |
}} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- uses: dtolnay/rust-toolchain@stable | |
with: | |
components: rust-src, rustc, rust-std, cargo, llvm-tools, llvm-tools-preview | |
toolchain: ${{ matrix.rust_version == 'msrv' && '1.77' || matrix.rust_version }} | |
- if: matrix.dtls_backend == 'gnutls' | |
uses: awalsh128/cache-apt-pkgs-action@latest | |
with: | |
packages: libgnutls28-dev libgnutls30 | |
version: 1.0 | |
- run: cargo test -p ${{ matrix.crate }} --no-default-features --features "$LIBRARY_FEATURES" --features "$DTLS_LIBRARY_FEATURES" --no-fail-fast | |
- if: matrix.rust_version == 'nightly' | |
run: | | |
mkdir -p target/debug/test-binaries | |
cp $(cargo test --no-run --message-format=json --no-default-features --features "$LIBRARY_FEATURES" --features "$DTLS_LIBRARY_FEATURES" --no-fail-fast \ | |
| jq -r "select(.profile.test == true) | .filenames[]" \ | |
| grep -v dSYM -) target/debug/test-binaries/ | |
- if: matrix.rust_version == 'nightly' | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 1 | |
name: test-coverage-data-${{ matrix.crate }}-${{ matrix.dtls_backend }} | |
path: | | |
target/debug/coverage/ | |
target/debug/test-binaries/ | |
lint: | |
name: lint | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
crate: [ libcoap-sys, libcoap-rs ] | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- uses: dtolnay/rust-toolchain@stable | |
with: | |
components: clippy | |
- uses: giraffate/clippy-action@main | |
with: | |
reporter: 'github-check' | |
clippy_flags: -p ${{ matrix.crate }} --no-deps --all-features | |
level: warning | |
fail_on_error: true | |
tool_name: clippy (${{ matrix.crate }}) | |
fmt: | |
name: rustfmt | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
crate: [ libcoap-sys, libcoap-rs ] | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: dtolnay/rust-toolchain@stable | |
with: | |
components: rustfmt | |
- run: cargo fmt -p ${{ matrix.crate }} -- --check | |
coverage: | |
name: coverage | |
runs-on: ubuntu-latest | |
needs: [ test ] | |
if: always() | |
outputs: | |
report: ${{ steps.cov-report.outputs.summary }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- uses: actions/download-artifact@v4 | |
with: | |
pattern: test-coverage-data-* | |
merge-multiple: true | |
path: coverage-data | |
- uses: dtolnay/rust-toolchain@nightly | |
with: | |
components: llvm-tools, llvm-tools-preview | |
- uses: baptiste0928/cargo-install@v3 | |
with: | |
crate: grcov | |
- run: mkdir -p ./coverage | |
- run: grcov ./coverage-data/coverage/ . --binary-path ./coverage-data/test-binaries --commit-sha ${GITHUB_SHA} --ignore "$HOME/.cargo/**" --ignore "$HOME/.rustup/**" --ignore "./target/**" --ignore-not-existing --ignore "/*" -t cobertura,markdown,html --branch -o ./coverage/ | |
- id: cov-report | |
name: Produce the coverage report | |
uses: pulsastrix/coverage-action@always_generate_comment_body | |
with: | |
path: ./coverage/cobertura.xml | |
threshold: 80.0 | |
fail: false | |
publish: false | |
diff: true | |
togglable-report: true | |
coverage-summary-title: "Code Coverage Report" | |
pr-comment: | |
name: pr-comment | |
runs-on: ubuntu-latest | |
if: ${{ always() && github.event_name == 'pull_request' }} | |
needs: [ lint, coverage ] | |
env: | |
LINT_OUTPUT: ${{ needs.lint.result }} | |
COV_OUTPUT: ${{ needs.coverage.outputs.report }} | |
steps: | |
- name: "Generate Markdown Report" | |
run: | | |
# Snippet taken from https://github.com/marocchino/sticky-pull-request-comment#append-after-comment-every-time-it-runs | |
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) | |
echo "report<<$EOF" >> "$GITHUB_ENV" | |
echo "# Workflow Status Report" >> "$GITHUB_ENV" | |
echo "Generated for commit ${{ github.sha }} on `date -u`." >> "$GITHUB_ENV" | |
echo "" >> "$GITHUB_ENV" | |
echo "[](https://github.com/namib-project/libcoap-rs/actions/workflows/ci.yml?query=branch%3A${GITHUB_HEAD_REF})" >> "$GITHUB_ENV" | |
echo "" >> "$GITHUB_ENV" | |
echo "## Linting Report" >> "$GITHUB_ENV" | |
echo "" >> "$GITHUB_OUTPUT" | |
echo "Clippy check result: $LINT_OUTPUT" >> "$GITHUB_ENV" | |
echo "" >> "$GITHUB_ENV" | |
echo "Refer to [the \"Files Changed\" tab](./${{ github.event.number }}/files/) for identified issues." >> "$GITHUB_ENV" | |
echo "" >> "$GITHUB_ENV" | |
echo "$COV_OUTPUT" >> "$GITHUB_ENV" | |
echo "$EOF" >> "$GITHUB_ENV" | |
- if: github.event_name == 'pull_request' | |
uses: marocchino/sticky-pull-request-comment@v2 | |
with: | |
message: ${{ env.report }} |