Various CI pipeline improvements #233
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-rs] | |
#dtls_backend: [ gnutls ] | |
#rust_version: [nightly] | |
crate: [ libcoap-sys, libcoap-rs ] | |
dtls_backend: [ openssl, gnutls, tinydtls, mbedtls ] | |
rust_version: [ msrv, stable, nightly ] | |
env: | |
LLVM_PROFILE_FILE: "${{ github.workspace }}/coverage-data/coverage/libcoap-rs-%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/doctests' || ' ' }}" | |
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.81' || 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 coverage-data/test-binaries | |
mkdir -p target/debug/doctests | |
cp $(cargo test -p ${{ matrix.crate }} --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 -) coverage-data/test-binaries/ | |
cp -r target/debug/doctests coverage-data/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: | | |
coverage-data/ | |
lint: | |
name: lint | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
crate: [ libcoap-sys, libcoap-rs ] | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- uses: reviewdog/action-setup@v1 | |
with: | |
reviewdog_version: latest | |
- uses: dtolnay/rust-toolchain@stable | |
with: | |
components: clippy | |
- uses: baptiste0928/cargo-install@v3 | |
with: | |
crate: clippy-reviewdog-filter | |
- run: reviewdog -reporter=github-pr-check | |
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 }} | |
- name: Generate PR suggestions from rustfmt changes | |
uses: reviewdog/action-suggester@v1 | |
with: | |
tool_name: rustfmt | |
fail_on_error: true | |
reviewdog_flags: "-reporter=github-pr-check" | |
coverage: | |
name: coverage | |
runs-on: ubuntu-latest | |
needs: [ test ] | |
if: always() | |
env: | |
LLVM_PROFILE_FILE: './coverage-data/coverage/libcoap-rs-%p-%m.profraw' | |
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/ -s . --binary-path ./coverage-data/test-binaries --commit-sha ${GITHUB_SHA} --ignore-not-existing --ignore "/*" -t markdown,html --branch --log-level TRACE -o ./coverage/ | |
- id: cov-report | |
name: "Set coverage report as job output" | |
run: | | |
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64) | |
{ | |
echo "summary<<$EOF" | |
cat ./coverage/markdown.md | |
echo "$EOF" | |
} >> "$GITHUB_OUTPUT" | |
- uses: peaceiris/actions-gh-pages@v4 | |
with: | |
github_token: ${{ secrets.GITHUB_TOKEN }} | |
publish_dir: ./coverage/html | |
publish_branch: _gh_pages | |
destination_dir: coverage/${{ github.ref_name }} | |
pr-comment: | |
name: pr-comment | |
runs-on: ubuntu-latest | |
if: ${{ always() && github.event_name == 'pull_request' }} | |
needs: [ lint, coverage, fmt ] | |
env: | |
LINT_OUTPUT: ${{ needs.lint.result }} | |
FMT_OUTPUT: ${{ needs.fmt.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" | |
echo "# Workflow Status Report" | |
echo "Generated for commit ${{ github.sha }} on `date -u`." | |
echo "" | |
echo "[](https://github.com/namib-project/libcoap-rs/actions/workflows/ci.yml?query=branch%3A${GITHUB_HEAD_REF})" | |
echo "" | |
echo "## Linting Report" | |
echo "" | |
echo "Clippy check result: $LINT_OUTPUT" | |
echo "" | |
echo "Rustfmt check result: $FMT_OUTPUT" | |
echo "" | |
echo "In case of failure, required changes are automatically added as review comments." | |
echo "" | |
echo "## Code Coverage Report" | |
echo "[](https://namib-project.github.io/libcoap-rs/coverage/${{ github.ref_name }})" | |
echo "" | |
echo "<emph>Coverage target is 80%.</emph>" | |
echo "" | |
echo "Click on the coverage badge to access the full coverage report including a source code view." | |
echo "" | |
echo "<details>" | |
echo "<summary>Expand to view coverage statistics</summary>" | |
echo "" | |
echo "$COV_OUTPUT" | |
echo "</details>" | |
echo "$EOF" | |
} >> "$GITHUB_ENV" | |
- if: github.event_name == 'pull_request' | |
uses: marocchino/sticky-pull-request-comment@v2 | |
with: | |
message: ${{ env.report }} |