CI #2738
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: CI | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
branches: | |
- main | |
merge_group: | |
schedule: | |
# run every morning at 3:17am | |
- cron: '17 3 * * *' | |
jobs: | |
build: | |
runs-on: ubuntu-24.04 | |
env: | |
SCCACHE_GHA_ENABLED: "true" | |
RUSTC_WRAPPER: "sccache" | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
# clang-sys and thus bindgen is sensitive to multiple installed versions | |
# around, see eg. https://github.com/rust-lang/rust-bindgen/issues/2682 | |
# | |
# CLANG_PATH should be set to the most recent clang installed, no matter | |
# what /usr/bin/clang is, for some parts of the code will go for the | |
# newest standard library. It may also need to be aligned with the clang | |
# version which Xtensa provides. | |
CLANG_PATH: /usr/bin/clang-18 | |
strategy: | |
fail-fast: false | |
matrix: | |
partition: ["1/20", "2/20", "3/20", "4/20", "5/20", "6/20", "7/20", "8/20", "9/20", "10/20", "11/20", "12/20", "13/20", "14/20", "15/20", "16/20", "17/20", "18/20", "19/20", "20/20"] | |
steps: | |
- name: Check out repository code | |
uses: actions/checkout@v4 | |
- name: Get git tree hash | |
id: get-tree-hash | |
run: | | |
git rev-parse HEAD^{tree} > .tree-hash | |
echo "hash=$(cat .tree-hash)" >> $GITHUB_OUTPUT | |
- uses: actions/cache@v4 | |
id: result-cache | |
with: | |
path: .tree-hash | |
key: success-${{ steps.get-tree-hash.outputs.hash }}-${{ matrix.partition }}-${{ github.event_name == 'schedule' && 'full' || 'limited' }} | |
- name: Run sccache-cache | |
if: steps.result-cache.outputs.cache-hit != 'true' | |
uses: mozilla-actions/[email protected] | |
- id: get_toolchain | |
run: echo "toolchain=$(scripts/rust-toolchain.sh)" >> $GITHUB_OUTPUT | |
- name: Install toolchain | |
if: steps.result-cache.outputs.cache-hit != 'true' | |
uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: ${{ steps.get_toolchain.outputs.toolchain }} | |
targets: riscv32imc-unknown-none-elf,riscv32imac-unknown-none-elf,thumbv6m-none-eabi,thumbv7m-none-eabi,thumbv7em-none-eabi,thumbv8m.main-none-eabi | |
# rust-src: Used for -Zbuild-std. | |
# rustfmt: Used by bindgen for liboscore | |
components: rust-src, rustfmt | |
- name: Install Rust for Xtensa | |
uses: esp-rs/[email protected] | |
with: | |
buildtargets: esp32s3 | |
- name: Keep general build environment clean of Xtensa peculiarities | |
# The Xtensa setup unconditionally sets LIBCLANG_PATH in GITHUB_ENV -- | |
# we can't undo that. (It also sets it in ~/exports, but that is just | |
# what it uses internally to get that data around into the action | |
# script) | |
# | |
# As the shell apparently does not source any files, and until | |
# https://github.com/actions/runner/issues/1126 is fixed by GitHub, the | |
# best remedy is to stow the workaround and source it wherever we can. | |
run: | | |
set -x | |
echo 'unset LIBCLANG_PATH' >> ~/source-this-first.sh | |
- name: rust cache | |
if: steps.result-cache.outputs.cache-hit != 'true' | |
uses: Swatinem/rust-cache@v2 | |
with: | |
key: "${{ matrix.partition }}" | |
- uses: taiki-e/install-action@v2 | |
if: steps.result-cache.outputs.cache-hit != 'true' | |
with: | |
tool: cargo-binstall | |
- name: "installing prerequisites" | |
if: steps.result-cache.outputs.cache-hit != 'true' | |
run: | | |
source ~/source-this-first.sh | |
git config --global init.defaultBranch main | |
git config --global user.email "[email protected]" | |
git config --global user.name "CI" | |
cargo binstall --no-confirm --no-symlinks --force --no-discover-github-token laze | |
echo "$HOME/.cargo/bin" >> $GITHUB_PATH | |
sudo apt-get install ninja-build gcc-arm-none-eabi | |
- name: "Show installed versions" | |
run: | | |
set -x | |
set +e | |
env | |
llvm-config --libs | |
cargo version | |
laze --version | |
arm-none-eabi-gcc --version | |
clang --version | |
set +x | |
# Check which alternative versions are installed | |
IFS=":"; for p in $PATH; do ls $p/llvm-config-* $p/clang-* 2>/dev/null; done | |
sha256sum /usr/lib/llvm-*/lib/clang/*/include/stdint.h | |
true | |
- name: "limit build unless nightly build" | |
if: github.event_name != 'schedule' | |
run: | | |
source ~/source-this-first.sh | |
echo "LAZE_BUILDERS=ai-c3,espressif-esp32-c6-devkitc-1,espressif-esp32-s3-wroom-1,microbit-v2,nrf52840dk,nrf5340dk,rpi-pico,rpi-pico-w,st-nucleo-h755zi-q,st-nucleo-wb55" >> "$GITHUB_ENV" | |
- name: "riot-rs compilation test" | |
if: steps.result-cache.outputs.cache-hit != 'true' | |
run: | | |
source ~/source-this-first.sh | |
sccache --start-server || true # work around https://github.com/ninja-build/ninja/issues/2052 | |
CONFIG_WIFI_NETWORK='test' CONFIG_WIFI_PASSWORD='password' laze build --global --partition hash:${{ matrix.partition }} | |
cargo-test: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Check out repository code | |
uses: actions/checkout@v4 | |
- id: get_toolchain | |
run: echo "toolchain=$(scripts/rust-toolchain.sh)" >> $GITHUB_OUTPUT | |
- name: Install toolchain | |
uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: ${{ steps.get_toolchain.outputs.toolchain }} | |
# TODO: we'll eventually want to test the whole workspace with --workspace | |
# TODO: we'll eventually want to enable relevant features | |
- name: Run crate tests | |
run: | | |
cargo test \ | |
--no-default-features \ | |
--features " | |
external-interrupts, | |
i2c, | |
no-boards, | |
spi, | |
" \ | |
-p riot-rs \ | |
-p riot-rs-embassy \ | |
-p riot-rs-embassy-common \ | |
-p riot-rs-identity \ | |
-p riot-rs-macros \ | |
-p riot-rs-runqueue \ | |
-p riot-rs-threads \ | |
cargo test \ | |
-p coapcore \ | |
-p rbi \ | |
-p ringbuffer \ | |
# We need to set `RUSTDOCFLAGS` as well in the following jobs, because it | |
# is used for doc tests. | |
- name: cargo test for RP | |
run: | | |
RUSTDOCFLAGS='--cfg context="rp2040"' RUSTFLAGS='--cfg context="rp2040"' cargo test \ | |
--features " | |
embassy-rp/rp2040, | |
external-interrupts, | |
i2c, | |
spi, | |
" \ | |
-p riot-rs-rp | |
- name: cargo test for nRF | |
run: | | |
RUSTDOCFLAGS='--cfg context="nrf52840"' RUSTFLAGS='--cfg context="nrf52840"' cargo test \ | |
--features " | |
embassy-nrf/nrf52840, | |
external-interrupts, | |
i2c, | |
spi, | |
" \ | |
-p riot-rs-nrf | |
- name: cargo test for STM32 | |
run: | | |
RUSTDOCFLAGS='--cfg context="stm32wb55rgvx"' RUSTFLAGS='--cfg context="stm32wb55rgvx"' cargo test \ | |
--features " | |
embassy-stm32/stm32wb55rg, | |
external-interrupts, | |
i2c, | |
spi, | |
" \ | |
-p riot-rs-stm32 | |
lint: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Check out repository code | |
uses: actions/checkout@v4 | |
- id: get_toolchain | |
run: echo "toolchain=$(scripts/rust-toolchain.sh)" >> $GITHUB_OUTPUT | |
- name: Install toolchain | |
uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: ${{ steps.get_toolchain.outputs.toolchain }} | |
# Required for checking riot-rs-esp | |
targets: riscv32imac-unknown-none-elf | |
components: clippy, rustfmt | |
- name: rust cache | |
uses: Swatinem/rust-cache@v2 | |
- uses: taiki-e/install-action@v2 | |
with: | |
tool: cargo-binstall | |
# Should run as soon as possible to avoid using unwanted crates | |
# `--force`ing is required as the installed binary could have been | |
# restored from cache. | |
- name: cargo-deny | |
run: | | |
cargo binstall --no-confirm --no-discover-github-token --force cargo-deny | |
cargo deny check bans licenses sources | |
# Must run after the cargo-deny job as it requires the downloaded | |
# cargo-deny binary. | |
- name: cargo-deny advisories | |
run: cargo deny check advisories | |
# Prevent sudden announcement of a new advisory from failing CI | |
continue-on-error: true | |
# TODO: we'll eventually want to check the whole workspace with --workspace | |
# TODO: we'll eventually want to check relevant feature combinations | |
# TODO: we may want to use --no-deps as well | |
- name: clippy | |
uses: clechasseur/rs-clippy-check@v3 | |
with: | |
args: | | |
--verbose | |
--locked | |
--features " | |
external-interrupts, | |
net, | |
no-boards, | |
spi, | |
storage, | |
" | |
-p riot-rs | |
-p riot-rs-arch | |
-p riot-rs-boards | |
-p riot-rs-chips | |
-p riot-rs-coap | |
-p riot-rs-debug | |
-p riot-rs-embassy | |
-p riot-rs-embassy-common | |
-p riot-rs-identity | |
-p riot-rs-macros | |
-p riot-rs-random | |
-p riot-rs-rt | |
-p riot-rs-storage | |
-p riot-rs-threads | |
-p riot-rs-utils | |
-- | |
--deny warnings | |
- run: echo 'RUSTFLAGS=--cfg context="esp32c6"' >> $GITHUB_ENV | |
- name: clippy for ESP32 | |
uses: clechasseur/rs-clippy-check@v3 | |
with: | |
args: | | |
--verbose | |
--locked | |
--target=riscv32imac-unknown-none-elf | |
--features " | |
esp-hal-embassy/esp32c6, | |
esp-hal/esp32c6, | |
external-interrupts, | |
i2c, | |
spi, | |
" | |
-p riot-rs-esp | |
-- | |
--deny warnings | |
- run: echo 'RUSTFLAGS=--cfg context="rp2040"' >> $GITHUB_ENV | |
- name: clippy for RP | |
uses: clechasseur/rs-clippy-check@v3 | |
with: | |
args: | | |
--verbose | |
--locked | |
--features " | |
embassy-rp/rp2040, | |
external-interrupts, | |
i2c, | |
spi, | |
" | |
-p riot-rs-rp | |
-- | |
--deny warnings | |
- run: echo 'RUSTFLAGS=--cfg context="nrf52840"' >> $GITHUB_ENV | |
- name: clippy for nRF | |
uses: clechasseur/rs-clippy-check@v3 | |
with: | |
args: | | |
--verbose | |
--locked | |
--features " | |
embassy-nrf/nrf52840, | |
external-interrupts, | |
i2c, | |
spi, | |
" | |
-p riot-rs-nrf | |
-- | |
--deny warnings | |
- run: echo 'RUSTFLAGS=--cfg context="stm32wb55rgvx"' >> $GITHUB_ENV | |
- name: clippy for STM32 | |
uses: clechasseur/rs-clippy-check@v3 | |
with: | |
args: | | |
--verbose | |
--locked | |
--features " | |
embassy-stm32/stm32wb55rg, | |
external-interrupts, | |
i2c, | |
spi, | |
" | |
-p riot-rs-stm32 | |
-- | |
--deny warnings | |
# Reset `RUSTFLAGS` | |
- run: echo 'RUSTFLAGS=' >> $GITHUB_ENV | |
- name: rustdoc | |
run: | | |
RUSTDOCFLAGS='-D warnings' cargo doc \ | |
-p riot-rs \ | |
--features " | |
bench, | |
coap, | |
csprng, | |
executor-thread, | |
external-interrupts, | |
hwrng, | |
i2c, | |
net, | |
no-boards, | |
random, | |
riot-rs-coap/doc, | |
spi, | |
storage, | |
threading, | |
usb, | |
" | |
- name: rustdoc for ESP32 | |
run: | | |
RUSTDOCFLAGS='-D warnings --cfg context="esp32c6"' cargo doc \ | |
--target=riscv32imac-unknown-none-elf \ | |
--features " | |
esp-hal-embassy/esp32c6, | |
esp-hal/esp32c6, | |
external-interrupts, | |
i2c, | |
spi, | |
" \ | |
-p riot-rs-esp | |
- name: rustdoc for RP | |
run: | | |
RUSTDOCFLAGS='-D warnings --cfg context="rp2040"' cargo doc \ | |
--features " | |
embassy-rp/rp2040, | |
external-interrupts, | |
i2c, | |
spi, | |
" \ | |
-p riot-rs-rp | |
- name: rustdoc for nRF | |
run: | | |
RUSTDOCFLAGS='-D warnings --cfg context="nrf52840"' cargo doc \ | |
--features " | |
embassy-nrf/nrf52840, | |
external-interrupts, | |
i2c, | |
spi, | |
" \ | |
-p riot-rs-nrf | |
- name: rustdoc for STM32 | |
run: | | |
RUSTDOCFLAGS='-D warnings --cfg context="stm32wb55rgvx"' cargo doc \ | |
--features " | |
embassy-stm32/stm32wb55rg, | |
external-interrupts, | |
i2c, | |
spi, | |
" \ | |
-p riot-rs-stm32 | |
- name: rustfmt | |
run: cargo fmt --check --all | |
- name: yamllint | |
uses: karancode/yamllint-github-action@master | |
with: | |
yamllint_comment: true # Insert inline PR comments | |
yamllint_strict: true # Set error code on warnings | |
- name: Install taplo | |
run: cargo binstall --no-confirm --no-symlinks --no-discover-github-token --force taplo-cli | |
- name: Check toml formatting | |
run: taplo fmt --check | |
# TODO: cargo-sort is disabled for now, as it won't stop formatting / failing perfectly sorted Cargo.toml files. | |
# - name: Install cargo-sort | |
# run: cargo install --git=https://github.com/DevinR528/cargo-sort --rev 55ec89082466f6bb246d870a8d56d166a8e1f08b cargo-sort | |
# - name: Check item order of Cargo.toml files | |
# run: cargo sort --check --grouped --workspace --no-format | |
- name: Ruff | |
uses: chartboost/ruff-action@v1 | |
with: | |
args: format --check # Only check formatting for now | |
- name: typos | |
uses: crate-ci/[email protected] | |
- name: Check that the HTML support matrix is up to date | |
run: ./doc/gen_support_matrix_html.rs check doc/support_matrix.yml book/src/support_matrix.html | |
CI-success: | |
if: ${{ always() }} | |
runs-on: ubuntu-latest | |
name: Final Results | |
needs: [build] | |
steps: | |
- run: | | |
result="${{ needs.build.result }}" | |
if [[ $result == "success" || $result == "skipped" ]]; then | |
exit 0 | |
else | |
exit 1 | |
fi | |
- name: Report nightly failure | |
if: failure() && github.event_name == 'schedule' && github.repository == 'future-proof-iot/RIOT-rs' | |
uses: s3krit/[email protected] | |
with: | |
room_id: ${{ secrets.MATRIX_ROOM_ID }} | |
access_token: ${{ secrets.MATRIX_ACCESS_TOKEN }} | |
message: "The nightly build [failed](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})." | |
server: "matrix.org" |